diff options
author | Michael Lauer <mickey@vanille-media.de> | 2007-12-28 13:10:28 +0000 |
---|---|---|
committer | Michael Lauer <mickey@vanille-media.de> | 2007-12-28 13:10:28 +0000 |
commit | be3e650d031916b132b4cef9d19e7844cca3440b (patch) | |
tree | 96dea5f2866a9c43bee966b9d01753467f19a9a3 /packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch | |
parent | 518fac47b16e548ace1e23d1bc6f4a38b44670bb (diff) |
rename uboot directory for more consistency
Diffstat (limited to 'packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch')
-rw-r--r-- | packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch b/packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch new file mode 100644 index 0000000000..339289699a --- /dev/null +++ b/packages/u-boot/u-boot-mkimage-openmoko-native/usbdcore-multiple_configs.patch @@ -0,0 +1,63 @@ +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> + +Index: u-boot/drivers/usbdcore_ep0.c +=================================================================== +--- u-boot.orig/drivers/usbdcore_ep0.c 2007-03-14 20:29:05.000000000 +0100 ++++ u-boot/drivers/usbdcore_ep0.c 2007-03-14 20:29:06.000000000 +0100 +@@ -233,8 +233,8 @@ + 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; +@@ -593,13 +593,8 @@ + + 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) & 0x7f) != 0) { +- /* c.f. 9.4.7 - zero is the default or addressed state, in our case this */ +- /* is the same is configuration zero */ +- device->configuration = 0; /* TBR - ?????? */ +- } ++ device->configuration = le16_to_cpu(request->wValue) & 0xff; ++ + /* reset interface and alternate settings */ + device->interface = device->alternate = 0; + +Index: u-boot/drivers/usbdcore.c +=================================================================== +--- u-boot.orig/drivers/usbdcore.c 2007-03-14 20:29:05.000000000 +0100 ++++ u-boot/drivers/usbdcore.c 2007-03-14 20:37:37.000000000 +0100 +@@ -147,12 +147,9 @@ + 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; + } + |