Browse Source

USB: Add a sysfs file to show LTM capabilities.

USB 3.0 devices can optionally support Latency Tolerance Messaging
(LTM).  Add a new sysfs file in the device directory to show whether a
device is LTM capable.  This file will be present for both USB 2.0 and
USB 3.0 devices.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Sarah Sharp 13 years ago
parent
commit
024f117c2f

+ 12 - 0
Documentation/ABI/testing/sysfs-bus-usb

@@ -208,3 +208,15 @@ Description:
 		such as ACPI. This file will read either "removable" or
 		such as ACPI. This file will read either "removable" or
 		"fixed" if the information is available, and "unknown"
 		"fixed" if the information is available, and "unknown"
 		otherwise.
 		otherwise.
+
+What:		/sys/bus/usb/devices/.../ltm_capable
+Date:		July 2012
+Contact:	Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Description:
+		USB 3.0 devices may optionally support Latency Tolerance
+		Messaging (LTM).  They indicate their support by setting a bit
+		in the bmAttributes field of their SuperSpeed BOS descriptors.
+		If that bit is set for the device, ltm_capable will read "yes".
+		If the device doesn't support LTM, the file will read "no".
+		The file will be present for all speeds of USB devices, and will
+		always read "no" for USB 1.1 and USB 2.0 devices.

+ 0 - 7
drivers/usb/core/hub.c

@@ -2610,13 +2610,6 @@ static int check_port_resume_type(struct usb_device *udev,
 	return status;
 	return status;
 }
 }
 
 
-static bool usb_device_supports_ltm(struct usb_device *udev)
-{
-	if (udev->speed != USB_SPEED_SUPER || !udev->bos || !udev->bos->ss_cap)
-		return false;
-	return udev->bos->ss_cap->bmAttributes & USB_LTM_SUPPORT;
-}
-
 int usb_disable_ltm(struct usb_device *udev)
 int usb_disable_ltm(struct usb_device *udev)
 {
 {
 	struct usb_hcd *hcd = bus_to_hcd(udev->bus);
 	struct usb_hcd *hcd = bus_to_hcd(udev->bus);

+ 10 - 0
drivers/usb/core/sysfs.c

@@ -253,6 +253,15 @@ show_removable(struct device *dev, struct device_attribute *attr, char *buf)
 }
 }
 static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL);
 static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL);
 
 
+static ssize_t
+show_ltm_capable(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	if (usb_device_supports_ltm(to_usb_device(dev)))
+		return sprintf(buf, "%s\n", "yes");
+	return sprintf(buf, "%s\n", "no");
+}
+static DEVICE_ATTR(ltm_capable, S_IRUGO, show_ltm_capable, NULL);
+
 #ifdef	CONFIG_PM
 #ifdef	CONFIG_PM
 
 
 static ssize_t
 static ssize_t
@@ -649,6 +658,7 @@ static struct attribute *dev_attrs[] = {
 	&dev_attr_authorized.attr,
 	&dev_attr_authorized.attr,
 	&dev_attr_remove.attr,
 	&dev_attr_remove.attr,
 	&dev_attr_removable.attr,
 	&dev_attr_removable.attr,
+	&dev_attr_ltm_capable.attr,
 	NULL,
 	NULL,
 };
 };
 static struct attribute_group dev_attr_grp = {
 static struct attribute_group dev_attr_grp = {

+ 8 - 0
include/linux/usb.h

@@ -636,6 +636,14 @@ extern void usb_unlocked_enable_lpm(struct usb_device *udev);
 extern int usb_disable_ltm(struct usb_device *udev);
 extern int usb_disable_ltm(struct usb_device *udev);
 extern void usb_enable_ltm(struct usb_device *udev);
 extern void usb_enable_ltm(struct usb_device *udev);
 
 
+static inline bool usb_device_supports_ltm(struct usb_device *udev)
+{
+	if (udev->speed != USB_SPEED_SUPER || !udev->bos || !udev->bos->ss_cap)
+		return false;
+	return udev->bos->ss_cap->bmAttributes & USB_LTM_SUPPORT;
+}
+
+
 /*-------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------*/
 
 
 /* for drivers using iso endpoints */
 /* for drivers using iso endpoints */