From b83a77c34041aada99f00836bbecb5e6436a7dce Mon Sep 17 00:00:00 2001 From: Sarah Sharp Date: Mon, 20 Feb 2012 08:31:26 -0800 Subject: [PATCH] --- yaml --- r: 303990 b: refs/heads/master c: d9b2099cd66de3164f6e17a5c0e3f14cce24a9a3 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/hub.c | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index ec9227537f58..7e0d2c76b5c6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 448b6eb1e04cddc418d4b780ae19ca8cdb42d110 +refs/heads/master: d9b2099cd66de3164f6e17a5c0e3f14cce24a9a3 diff --git a/trunk/drivers/usb/core/hub.c b/trunk/drivers/usb/core/hub.c index c8e0704c6e5d..100e08f8a027 100644 --- a/trunk/drivers/usb/core/hub.c +++ b/trunk/drivers/usb/core/hub.c @@ -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;