mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-29 08:01:08 +00:00
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: Harald Welte <laforge@openmoko.org> Acked-by: Markus Klotzbuecher <mk@denx.de>
This commit is contained in:
parent
06c53beae1
commit
cc83b27217
2 changed files with 6 additions and 15 deletions
|
@ -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,
|
||||
unsigned int port, unsigned int configuration)
|
||||
{
|
||||
/* XXX */
|
||||
configuration = configuration ? configuration - 1 : 0;
|
||||
|
||||
if (configuration >= device->configurations) {
|
||||
if (configuration >= device->configurations)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return device->configuration_instance_array + configuration;
|
||||
}
|
||||
|
||||
|
|
|
@ -235,8 +235,8 @@ static int ep0_get_descriptor (struct usb_device_instance *device,
|
|||
return -1;
|
||||
}
|
||||
/*dbg_ep0(2, "%d %d", index, device_descriptor->bNumConfigurations); */
|
||||
if (index > device_descriptor->bNumConfigurations) {
|
||||
dbg_ep0 (0, "index too large: %d > %d", index,
|
||||
if (index >= device_descriptor->bNumConfigurations) {
|
||||
dbg_ep0 (0, "index too large: %d >= %d", index,
|
||||
device_descriptor->
|
||||
bNumConfigurations);
|
||||
return -1;
|
||||
|
@ -571,14 +571,8 @@ int ep0_recv_setup (struct urb *urb)
|
|||
|
||||
case USB_REQ_SET_CONFIGURATION:
|
||||
/* c.f. 9.4.7 - the top half of wValue is reserved */
|
||||
/* */
|
||||
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 - ?????? */
|
||||
}
|
||||
device->configuration = le16_to_cpu(request->wValue) & 0xff;
|
||||
|
||||
/* reset interface and alternate settings */
|
||||
device->interface = device->alternate = 0;
|
||||
|
||||
|
|
Loading…
Reference in a new issue