aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/hcd.c
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2010-01-05 14:33:29 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-02 14:54:04 -0800
commitd837e219daf3bf0cc84fcfb9781807d9fe8d03b5 (patch)
tree7b28362df13ca2807e66f31aefeb59599d3b648f /drivers/usb/core/hcd.c
parent46216e4fbe8c62059b5440dec0b236f386248a41 (diff)
downloadkernel_samsung_smdk4412-d837e219daf3bf0cc84fcfb9781807d9fe8d03b5.zip
kernel_samsung_smdk4412-d837e219daf3bf0cc84fcfb9781807d9fe8d03b5.tar.gz
kernel_samsung_smdk4412-d837e219daf3bf0cc84fcfb9781807d9fe8d03b5.tar.bz2
USB: Use bInterfaceNumber in bandwidth allocations.
USB devices do not have to sort interfaces in their descriptors based on the interface number, and they may choose to skip interface numbers. The USB bandwidth allocation code for installing a new configuration assumes the for loop variable will match the interface number. Make it use the interface number (bInterfaceNumber) in the descriptor instead. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/hcd.c')
-rw-r--r--drivers/usb/core/hcd.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 80995ef..cf0a098 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1670,11 +1670,16 @@ int usb_hcd_alloc_bandwidth(struct usb_device *udev,
}
}
for (i = 0; i < num_intfs; ++i) {
+ struct usb_host_interface *first_alt;
+ int iface_num;
+
+ first_alt = &new_config->intf_cache[i]->altsetting[0];
+ iface_num = first_alt->desc.bInterfaceNumber;
/* Set up endpoints for alternate interface setting 0 */
- alt = usb_find_alt_setting(new_config, i, 0);
+ alt = usb_find_alt_setting(new_config, iface_num, 0);
if (!alt)
/* No alt setting 0? Pick the first setting. */
- alt = &new_config->intf_cache[i]->altsetting[0];
+ alt = first_alt;
for (j = 0; j < alt->desc.bNumEndpoints; j++) {
ret = hcd->driver->add_endpoint(hcd, udev, &alt->endpoint[j]);