diff options
Diffstat (limited to 'drivers/usb/core/message.c')
| -rw-r--r-- | drivers/usb/core/message.c | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index cc404bb7e8f7..b5811620f1de 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -1908,6 +1908,45 @@ static void __usb_queue_reset_device(struct work_struct *ws)  	usb_put_intf(iface);	/* Undo _get_ in usb_queue_reset_device() */  } +/* + * Internal function to set the wireless_status sysfs attribute + * See usb_set_wireless_status() for more details + */ +static void __usb_wireless_status_intf(struct work_struct *ws) +{ +	struct usb_interface *iface = +		container_of(ws, struct usb_interface, wireless_status_work); + +	device_lock(iface->dev.parent); +	if (iface->sysfs_files_created) +		usb_update_wireless_status_attr(iface); +	device_unlock(iface->dev.parent); +	usb_put_intf(iface);	/* Undo _get_ in usb_set_wireless_status() */ +} + +/** + * usb_set_wireless_status - sets the wireless_status struct member + * @iface: the interface to modify + * @status: the new wireless status + * + * Set the wireless_status struct member to the new value, and emit + * sysfs changes as necessary. + * + * Returns: 0 on success, -EALREADY if already set. + */ +int usb_set_wireless_status(struct usb_interface *iface, +		enum usb_wireless_status status) +{ +	if (iface->wireless_status == status) +		return -EALREADY; + +	usb_get_intf(iface); +	iface->wireless_status = status; +	schedule_work(&iface->wireless_status_work); + +	return 0; +} +EXPORT_SYMBOL_GPL(usb_set_wireless_status);  /*   * usb_set_configuration - Makes a particular device setting be current @@ -2100,6 +2139,7 @@ free_interfaces:  		intf->dev.type = &usb_if_device_type;  		intf->dev.groups = usb_interface_groups;  		INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); +		INIT_WORK(&intf->wireless_status_work, __usb_wireless_status_intf);  		intf->minor = -1;  		device_initialize(&intf->dev);  		pm_runtime_no_callbacks(&intf->dev);  | 
