Skip to content
Snippets Groups Projects
Commit cc83b272 authored by Harald Welte's avatar Harald Welte Committed by John Rigby
Browse files

fix USB devices with multiple configurations


This patch fixes bugs in usbdcore*.c related to the use of devices
with multiple configurations.

The original code made mistakes about the meaning of configuration value and
configuration index, and the resulting off-by-one errors resulted in:

* SET_CONFIGURATION always selected the first configuration, no matter what
  wValue is being passed.
* GET_DESCRIPTOR/CONFIGURATION always returned the descriptor for the first
  configuration (index 0).

Signed-off-by: default avatarHarald Welte <laforge@openmoko.org>
Acked-by: default avatarMarkus Klotzbuecher <mk@denx.de>
parent 06c53bea
No related branches found
No related tags found
No related merge requests found
...@@ -146,12 +146,9 @@ struct usb_string_descriptor *usbd_get_string (__u8 index) ...@@ -146,12 +146,9 @@ struct usb_string_descriptor *usbd_get_string (__u8 index)
static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device, static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device,
unsigned int port, unsigned int configuration) unsigned int port, unsigned int configuration)
{ {
/* XXX */ if (configuration >= device->configurations)
configuration = configuration ? configuration - 1 : 0;
if (configuration >= device->configurations) {
return NULL; return NULL;
}
return device->configuration_instance_array + configuration; return device->configuration_instance_array + configuration;
} }
......
...@@ -235,8 +235,8 @@ static int ep0_get_descriptor (struct usb_device_instance *device, ...@@ -235,8 +235,8 @@ static int ep0_get_descriptor (struct usb_device_instance *device,
return -1; return -1;
} }
/*dbg_ep0(2, "%d %d", index, device_descriptor->bNumConfigurations); */ /*dbg_ep0(2, "%d %d", index, device_descriptor->bNumConfigurations); */
if (index > device_descriptor->bNumConfigurations) { if (index >= device_descriptor->bNumConfigurations) {
dbg_ep0 (0, "index too large: %d > %d", index, dbg_ep0 (0, "index too large: %d >= %d", index,
device_descriptor-> device_descriptor->
bNumConfigurations); bNumConfigurations);
return -1; return -1;
...@@ -571,14 +571,8 @@ int ep0_recv_setup (struct urb *urb) ...@@ -571,14 +571,8 @@ int ep0_recv_setup (struct urb *urb)
case USB_REQ_SET_CONFIGURATION: case USB_REQ_SET_CONFIGURATION:
/* c.f. 9.4.7 - the top half of wValue is reserved */ /* c.f. 9.4.7 - the top half of wValue is reserved */
/* */ device->configuration = le16_to_cpu(request->wValue) & 0xff;
if ((device->configuration =
le16_to_cpu (request->wValue) & 0xFF80) != 0) {
/* c.f. 9.4.7 - zero is the default or addressed state, in our case this */
/* is the same is configuration zero */
serial_printf("error setting dev->config to zero!\n");
device->configuration = 0; /* TBR - ?????? */
}
/* reset interface and alternate settings */ /* reset interface and alternate settings */
device->interface = device->alternate = 0; device->interface = device->alternate = 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment