USB: Refactor code to set LPM support flag.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Mon, 20 Feb 2012 16:31:26 +0000 (08:31 -0800)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Fri, 18 May 2012 22:41:54 +0000 (15:41 -0700)
Refactor the code that sets the usb_device flag to indicate the device
support link power management (lpm_capable).  The current code sets
lpm_capable unconditionally if the USB devices have a USB 2.0 Extended
Capabilities Descriptor.  USB 3.0 devices can also have that descriptor,
but the xHCI driver code that uses lpm_capable will not run the USB 2.0
LPM test for devices under the USB 3.0 roothub.  Therefore, it's fine
only set lpm_capable for high speed devices in this refactoring.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/core/hub.c

index c8e0704c6e5d3e0b6f13864012013f333325d0ab..100e08f8a0273bfc45e59948e4266e2b10fc27b6 100644 (file)
@@ -177,6 +177,21 @@ static struct usb_hub *hdev_to_hub(struct usb_device *hdev)
        return usb_get_intfdata(hdev->actconfig->interface[0]);
 }
 
+static int usb_device_supports_lpm(struct usb_device *udev)
+{
+       /* USB 2.1 (and greater) devices indicate LPM support through
+        * their USB 2.0 Extended Capabilities BOS descriptor.
+        */
+       if (udev->speed == USB_SPEED_HIGH) {
+               if (udev->bos->ext_cap &&
+                       (USB_LPM_SUPPORT &
+                        le32_to_cpu(udev->bos->ext_cap->bmAttributes)))
+                       return 1;
+               return 0;
+       }
+       return 0;
+}
+
 /* USB 2.0 spec Section 11.24.4.5 */
 static int get_hub_descriptor(struct usb_device *hdev, void *data)
 {
@@ -3211,11 +3226,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
 
        if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) {
                retval = usb_get_bos_descriptor(udev);
-               if (!retval) {
-                       if (udev->bos->ext_cap && (USB_LPM_SUPPORT &
-                               le32_to_cpu(udev->bos->ext_cap->bmAttributes)))
-                                       udev->lpm_capable = 1;
-               }
+               if (!retval)
+                       udev->lpm_capable = usb_device_supports_lpm(udev);
        }
 
        retval = 0;