diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-02-02 01:05:22 -0700 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-02-02 01:05:22 -0700 |
commit | fb7899b1f0b748ef966071f5dc23c59ebd57d08f (patch) | |
tree | 2f13f9d8607871a60334608524e8b4e9447f5309 /drivers/usb/core/hcd.c | |
parent | 212b3c8b8ab94d983c2e0ee1821f17dd5b4e0859 (diff) | |
parent | abe94c756c08d50566c09a65b9c7fe72f83071c5 (diff) |
Merge commit 'v2.6.33-rc6' into secretlab/next-spi
Diffstat (limited to 'drivers/usb/core/hcd.c')
-rw-r--r-- | drivers/usb/core/hcd.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 0495fa65122..80995ef0868 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1684,6 +1684,24 @@ int usb_hcd_alloc_bandwidth(struct usb_device *udev, } } if (cur_alt && new_alt) { + struct usb_interface *iface = usb_ifnum_to_if(udev, + cur_alt->desc.bInterfaceNumber); + + if (iface->resetting_device) { + /* + * The USB core just reset the device, so the xHCI host + * and the device will think alt setting 0 is installed. + * However, the USB core will pass in the alternate + * setting installed before the reset as cur_alt. Dig + * out the alternate setting 0 structure, or the first + * alternate setting if a broken device doesn't have alt + * setting 0. + */ + cur_alt = usb_altnum_to_altsetting(iface, 0); + if (!cur_alt) + cur_alt = &iface->altsetting[0]; + } + /* Drop all the endpoints in the current alt setting */ for (i = 0; i < cur_alt->desc.bNumEndpoints; i++) { ret = hcd->driver->drop_endpoint(hcd, udev, |