Commit 9df89d85 authored by Xenia Ragiadakou's avatar Xenia Ragiadakou Committed by Greg Kroah-Hartman

usbcore: set lpm_capable field for LPM capable root hubs

This patch sets the lpm_capable field for root hubs with LPM capabilities.
Signed-off-by: default avatarXenia Ragiadakou <burzalodowa@gmail.com>
Reported-by: default avatarMartin MOKREJS <mmokrejs@gmail.com>
Suggested-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6c74dada
...@@ -1033,6 +1033,7 @@ static int register_root_hub(struct usb_hcd *hcd) ...@@ -1033,6 +1033,7 @@ static int register_root_hub(struct usb_hcd *hcd)
dev_name(&usb_dev->dev), retval); dev_name(&usb_dev->dev), retval);
return retval; return retval;
} }
usb_dev->lpm_capable = usb_device_supports_lpm(usb_dev);
} }
retval = usb_new_device (usb_dev); retval = usb_new_device (usb_dev);
......
...@@ -135,7 +135,7 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev) ...@@ -135,7 +135,7 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)
return usb_get_intfdata(hdev->actconfig->interface[0]); return usb_get_intfdata(hdev->actconfig->interface[0]);
} }
static int usb_device_supports_lpm(struct usb_device *udev) int usb_device_supports_lpm(struct usb_device *udev)
{ {
/* USB 2.1 (and greater) devices indicate LPM support through /* USB 2.1 (and greater) devices indicate LPM support through
* their USB 2.0 Extended Capabilities BOS descriptor. * their USB 2.0 Extended Capabilities BOS descriptor.
...@@ -156,6 +156,11 @@ static int usb_device_supports_lpm(struct usb_device *udev) ...@@ -156,6 +156,11 @@ static int usb_device_supports_lpm(struct usb_device *udev)
"Power management will be impacted.\n"); "Power management will be impacted.\n");
return 0; return 0;
} }
/* udev is root hub */
if (!udev->parent)
return 1;
if (udev->parent->lpm_capable) if (udev->parent->lpm_capable)
return 1; return 1;
......
...@@ -35,6 +35,7 @@ extern int usb_get_device_descriptor(struct usb_device *dev, ...@@ -35,6 +35,7 @@ extern int usb_get_device_descriptor(struct usb_device *dev,
unsigned int size); unsigned int size);
extern int usb_get_bos_descriptor(struct usb_device *dev); extern int usb_get_bos_descriptor(struct usb_device *dev);
extern void usb_release_bos_descriptor(struct usb_device *dev); extern void usb_release_bos_descriptor(struct usb_device *dev);
extern int usb_device_supports_lpm(struct usb_device *udev);
extern char *usb_cache_string(struct usb_device *udev, int index); extern char *usb_cache_string(struct usb_device *udev, int index);
extern int usb_set_configuration(struct usb_device *dev, int configuration); extern int usb_set_configuration(struct usb_device *dev, int configuration);
extern int usb_choose_configuration(struct usb_device *udev); extern int usb_choose_configuration(struct usb_device *udev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment