diff options
-rw-r--r-- | Documentation/ABI/testing/sysfs-bus-usb | 12 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 7 | ||||
-rw-r--r-- | drivers/usb/core/sysfs.c | 10 | ||||
-rw-r--r-- | include/linux/usb.h | 8 |
4 files changed, 30 insertions, 7 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-usb b/Documentation/ABI/testing/sysfs-bus-usb index 6df4e6f57560..5f75f8f7df34 100644 --- a/Documentation/ABI/testing/sysfs-bus-usb +++ b/Documentation/ABI/testing/sysfs-bus-usb | |||
@@ -208,3 +208,15 @@ Description: | |||
208 | such as ACPI. This file will read either "removable" or | 208 | such as ACPI. This file will read either "removable" or |
209 | "fixed" if the information is available, and "unknown" | 209 | "fixed" if the information is available, and "unknown" |
210 | otherwise. | 210 | otherwise. |
211 | |||
212 | What: /sys/bus/usb/devices/.../ltm_capable | ||
213 | Date: July 2012 | ||
214 | Contact: Sarah Sharp <sarah.a.sharp@linux.intel.com> | ||
215 | Description: | ||
216 | USB 3.0 devices may optionally support Latency Tolerance | ||
217 | Messaging (LTM). They indicate their support by setting a bit | ||
218 | in the bmAttributes field of their SuperSpeed BOS descriptors. | ||
219 | If that bit is set for the device, ltm_capable will read "yes". | ||
220 | If the device doesn't support LTM, the file will read "no". | ||
221 | The file will be present for all speeds of USB devices, and will | ||
222 | always read "no" for USB 1.1 and USB 2.0 devices. | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b5bd6bd8fd12..d739f966b5a8 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -2610,13 +2610,6 @@ static int check_port_resume_type(struct usb_device *udev, | |||
2610 | return status; | 2610 | return status; |
2611 | } | 2611 | } |
2612 | 2612 | ||
2613 | static bool usb_device_supports_ltm(struct usb_device *udev) | ||
2614 | { | ||
2615 | if (udev->speed != USB_SPEED_SUPER || !udev->bos || !udev->bos->ss_cap) | ||
2616 | return false; | ||
2617 | return udev->bos->ss_cap->bmAttributes & USB_LTM_SUPPORT; | ||
2618 | } | ||
2619 | |||
2620 | int usb_disable_ltm(struct usb_device *udev) | 2613 | int usb_disable_ltm(struct usb_device *udev) |
2621 | { | 2614 | { |
2622 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | 2615 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 777f03c37725..682e8256b95d 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -253,6 +253,15 @@ show_removable(struct device *dev, struct device_attribute *attr, char *buf) | |||
253 | } | 253 | } |
254 | static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL); | 254 | static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL); |
255 | 255 | ||
256 | static ssize_t | ||
257 | show_ltm_capable(struct device *dev, struct device_attribute *attr, char *buf) | ||
258 | { | ||
259 | if (usb_device_supports_ltm(to_usb_device(dev))) | ||
260 | return sprintf(buf, "%s\n", "yes"); | ||
261 | return sprintf(buf, "%s\n", "no"); | ||
262 | } | ||
263 | static DEVICE_ATTR(ltm_capable, S_IRUGO, show_ltm_capable, NULL); | ||
264 | |||
256 | #ifdef CONFIG_PM | 265 | #ifdef CONFIG_PM |
257 | 266 | ||
258 | static ssize_t | 267 | static ssize_t |
@@ -649,6 +658,7 @@ static struct attribute *dev_attrs[] = { | |||
649 | &dev_attr_authorized.attr, | 658 | &dev_attr_authorized.attr, |
650 | &dev_attr_remove.attr, | 659 | &dev_attr_remove.attr, |
651 | &dev_attr_removable.attr, | 660 | &dev_attr_removable.attr, |
661 | &dev_attr_ltm_capable.attr, | ||
652 | NULL, | 662 | NULL, |
653 | }; | 663 | }; |
654 | static struct attribute_group dev_attr_grp = { | 664 | static struct attribute_group dev_attr_grp = { |
diff --git a/include/linux/usb.h b/include/linux/usb.h index f29831bad235..f8506ed0f97b 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -636,6 +636,14 @@ extern void usb_unlocked_enable_lpm(struct usb_device *udev); | |||
636 | extern int usb_disable_ltm(struct usb_device *udev); | 636 | extern int usb_disable_ltm(struct usb_device *udev); |
637 | extern void usb_enable_ltm(struct usb_device *udev); | 637 | extern void usb_enable_ltm(struct usb_device *udev); |
638 | 638 | ||
639 | static inline bool usb_device_supports_ltm(struct usb_device *udev) | ||
640 | { | ||
641 | if (udev->speed != USB_SPEED_SUPER || !udev->bos || !udev->bos->ss_cap) | ||
642 | return false; | ||
643 | return udev->bos->ss_cap->bmAttributes & USB_LTM_SUPPORT; | ||
644 | } | ||
645 | |||
646 | |||
639 | /*-------------------------------------------------------------------------*/ | 647 | /*-------------------------------------------------------------------------*/ |
640 | 648 | ||
641 | /* for drivers using iso endpoints */ | 649 | /* for drivers using iso endpoints */ |