diff options
Diffstat (limited to 'drivers/usb/core/sysfs.c')
| -rw-r--r-- | drivers/usb/core/sysfs.c | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index b63f78e48c74..323dc02becbe 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -1227,9 +1227,59 @@ static const struct attribute_group intf_assoc_attr_grp = {  	.is_visible =	intf_assoc_attrs_are_visible,  }; +static ssize_t wireless_status_show(struct device *dev, +				    struct device_attribute *attr, char *buf) +{ +	struct usb_interface *intf; + +	intf = to_usb_interface(dev); +	if (intf->wireless_status == USB_WIRELESS_STATUS_DISCONNECTED) +		return sysfs_emit(buf, "%s\n", "disconnected"); +	return sysfs_emit(buf, "%s\n", "connected"); +} +static DEVICE_ATTR_RO(wireless_status); + +static struct attribute *intf_wireless_status_attrs[] = { +	&dev_attr_wireless_status.attr, +	NULL +}; + +static umode_t intf_wireless_status_attr_is_visible(struct kobject *kobj, +		struct attribute *a, int n) +{ +	struct device *dev = kobj_to_dev(kobj); +	struct usb_interface *intf = to_usb_interface(dev); + +	if (a != &dev_attr_wireless_status.attr || +	    intf->wireless_status != USB_WIRELESS_STATUS_NA) +		return a->mode; +	return 0; +} + +static const struct attribute_group intf_wireless_status_attr_grp = { +	.attrs =	intf_wireless_status_attrs, +	.is_visible =	intf_wireless_status_attr_is_visible, +}; + +int usb_update_wireless_status_attr(struct usb_interface *intf) +{ +	struct device *dev = &intf->dev; +	int ret; + +	ret = sysfs_update_group(&dev->kobj, &intf_wireless_status_attr_grp); +	if (ret < 0) +		return ret; + +	sysfs_notify(&dev->kobj, NULL, "wireless_status"); +	kobject_uevent(&dev->kobj, KOBJ_CHANGE); + +	return 0; +} +  const struct attribute_group *usb_interface_groups[] = {  	&intf_attr_grp,  	&intf_assoc_attr_grp, +	&intf_wireless_status_attr_grp,  	NULL  };  |