These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / usb / core / sysfs.c
index d269738..65b6e6b 100644 (file)
@@ -531,6 +531,44 @@ static ssize_t usb2_lpm_besl_store(struct device *dev,
 }
 static DEVICE_ATTR_RW(usb2_lpm_besl);
 
+static ssize_t usb3_hardware_lpm_u1_show(struct device *dev,
+                                     struct device_attribute *attr, char *buf)
+{
+       struct usb_device *udev = to_usb_device(dev);
+       const char *p;
+
+       usb_lock_device(udev);
+
+       if (udev->usb3_lpm_u1_enabled)
+               p = "enabled";
+       else
+               p = "disabled";
+
+       usb_unlock_device(udev);
+
+       return sprintf(buf, "%s\n", p);
+}
+static DEVICE_ATTR_RO(usb3_hardware_lpm_u1);
+
+static ssize_t usb3_hardware_lpm_u2_show(struct device *dev,
+                                     struct device_attribute *attr, char *buf)
+{
+       struct usb_device *udev = to_usb_device(dev);
+       const char *p;
+
+       usb_lock_device(udev);
+
+       if (udev->usb3_lpm_u2_enabled)
+               p = "enabled";
+       else
+               p = "disabled";
+
+       usb_unlock_device(udev);
+
+       return sprintf(buf, "%s\n", p);
+}
+static DEVICE_ATTR_RO(usb3_hardware_lpm_u2);
+
 static struct attribute *usb2_hardware_lpm_attr[] = {
        &dev_attr_usb2_hardware_lpm.attr,
        &dev_attr_usb2_lpm_l1_timeout.attr,
@@ -542,6 +580,16 @@ static struct attribute_group usb2_hardware_lpm_attr_group = {
        .attrs  = usb2_hardware_lpm_attr,
 };
 
+static struct attribute *usb3_hardware_lpm_attr[] = {
+       &dev_attr_usb3_hardware_lpm_u1.attr,
+       &dev_attr_usb3_hardware_lpm_u2.attr,
+       NULL,
+};
+static struct attribute_group usb3_hardware_lpm_attr_group = {
+       .name   = power_group_name,
+       .attrs  = usb3_hardware_lpm_attr,
+};
+
 static struct attribute *power_attrs[] = {
        &dev_attr_autosuspend.attr,
        &dev_attr_level.attr,
@@ -564,6 +612,10 @@ static int add_power_attributes(struct device *dev)
                if (udev->usb2_hw_lpm_capable == 1)
                        rc = sysfs_merge_group(&dev->kobj,
                                        &usb2_hardware_lpm_attr_group);
+               if (udev->speed == USB_SPEED_SUPER &&
+                               udev->lpm_capable == 1)
+                       rc = sysfs_merge_group(&dev->kobj,
+                                       &usb3_hardware_lpm_attr_group);
        }
 
        return rc;
@@ -926,6 +978,41 @@ static ssize_t supports_autosuspend_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(supports_autosuspend);
 
+/*
+ * interface_authorized_show - show authorization status of an USB interface
+ * 1 is authorized, 0 is deauthorized
+ */
+static ssize_t interface_authorized_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct usb_interface *intf = to_usb_interface(dev);
+
+       return sprintf(buf, "%u\n", intf->authorized);
+}
+
+/*
+ * interface_authorized_store - authorize or deauthorize an USB interface
+ */
+static ssize_t interface_authorized_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct usb_interface *intf = to_usb_interface(dev);
+       bool val;
+
+       if (strtobool(buf, &val) != 0)
+               return -EINVAL;
+
+       if (val)
+               usb_authorize_interface(intf);
+       else
+               usb_deauthorize_interface(intf);
+
+       return count;
+}
+static struct device_attribute dev_attr_interface_authorized =
+               __ATTR(authorized, S_IRUGO | S_IWUSR,
+               interface_authorized_show, interface_authorized_store);
+
 static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceNumber.attr,
        &dev_attr_bAlternateSetting.attr,
@@ -935,6 +1022,7 @@ static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceProtocol.attr,
        &dev_attr_modalias.attr,
        &dev_attr_supports_autosuspend.attr,
+       &dev_attr_interface_authorized.attr,
        NULL,
 };
 static struct attribute_group intf_attr_grp = {