USB: Use bInterfaceNumber in bandwidth allocations.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 5 Jan 2010 22:33:29 +0000 (14:33 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:54:04 +0000 (14:54 -0800)
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>
drivers/usb/core/hcd.c

index 80995ef0868c17e553dd6575a951b71973df27f1..cf0a098a543246a78b208867575392d130e7b933 100644 (file)
@@ -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]);