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>
This commit is contained in:
parent
f74631e342
commit
024f117c2f
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue