USB: Make sure to fetch the BOS desc for roothubs.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 15 May 2012 23:58:45 +0000 (16:58 -0700)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Fri, 18 May 2012 22:41:53 +0000 (15:41 -0700)
The BOS descriptor is normally fetched and stored in the usb_device->bos
during enumeration.  USB 3.0 roothubs don't undergo enumeration, but we
need them to have a BOS descriptor, since each xHCI host has a different
U1 and U2 exit latency.  Make sure to fetch the BOS descriptor for USB
3.0 roothubs.  It will be freed when the roothub usb_device is released.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: Andiry Xu <andiry.xu@amd.com>
drivers/usb/core/hcd.c

index 0cd2daacacbe3a5b4a48d85fc2c8c7d2c1d9e2d2..190b1ec7bdcbba1d3881421cd91b1195fea4808e 100644 (file)
@@ -997,6 +997,15 @@ static int register_root_hub(struct usb_hcd *hcd)
                                dev_name(&usb_dev->dev), retval);
                return (retval < 0) ? retval : -EMSGSIZE;
        }
+       if (usb_dev->speed == USB_SPEED_SUPER) {
+               retval = usb_get_bos_descriptor(usb_dev);
+               if (retval < 0) {
+                       mutex_unlock(&usb_bus_list_lock);
+                       dev_dbg(parent_dev, "can't read %s bos descriptor %d\n",
+                                       dev_name(&usb_dev->dev), retval);
+                       return retval;
+               }
+       }
 
        retval = usb_new_device (usb_dev);
        if (retval) {