diff options
Diffstat (limited to 'drivers/usb/core/message.c')
| -rw-r--r-- | drivers/usb/core/message.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 82927e1ed27..0c8a7fc4dad 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -6,7 +6,6 @@  #include <linux/usb.h>  #include <linux/module.h>  #include <linux/slab.h> -#include <linux/init.h>  #include <linux/mm.h>  #include <linux/timer.h>  #include <linux/ctype.h> @@ -179,7 +178,7 @@ EXPORT_SYMBOL_GPL(usb_control_msg);   *   * Return:   * If successful, 0. Otherwise a negative error number. The number of actual - * bytes transferred will be stored in the @actual_length paramater. + * bytes transferred will be stored in the @actual_length parameter.   */  int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe,  		      void *data, int len, int *actual_length, int timeout) @@ -218,7 +217,7 @@ EXPORT_SYMBOL_GPL(usb_interrupt_msg);   *   * Return:   * If successful, 0. Otherwise a negative error number. The number of actual - * bytes transferred will be stored in the @actual_length paramater. + * bytes transferred will be stored in the @actual_length parameter.   *   */  int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, @@ -518,7 +517,7 @@ void usb_sg_wait(struct usb_sg_request *io)  		io->urbs[i]->dev = io->dev;  		retval = usb_submit_urb(io->urbs[i], GFP_ATOMIC); -		/* after we submit, let completions or cancelations fire; +		/* after we submit, let completions or cancellations fire;  		 * we handshake using io->status.  		 */  		spin_unlock_irq(&io->lock); @@ -1182,8 +1181,12 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)  			put_device(&dev->actconfig->interface[i]->dev);  			dev->actconfig->interface[i] = NULL;  		} + +		if (dev->usb2_hw_lpm_enabled == 1) +			usb_set_usb2_hardware_lpm(dev, 0);  		usb_unlocked_disable_lpm(dev);  		usb_disable_ltm(dev); +  		dev->actconfig = NULL;  		if (dev->state == USB_STATE_CONFIGURED)  			usb_set_device_state(dev, USB_STATE_ADDRESS); @@ -1290,8 +1293,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)  	struct usb_interface *iface;  	struct usb_host_interface *alt;  	struct usb_hcd *hcd = bus_to_hcd(dev->bus); -	int ret; -	int manual = 0; +	int i, ret, manual = 0;  	unsigned int epaddr;  	unsigned int pipe; @@ -1326,6 +1328,10 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)  		mutex_unlock(hcd->bandwidth_mutex);  		return -ENOMEM;  	} +	/* Changing alt-setting also frees any allocated streams */ +	for (i = 0; i < iface->cur_altsetting->desc.bNumEndpoints; i++) +		iface->cur_altsetting->endpoint[i].streams = 0; +  	ret = usb_hcd_alloc_bandwidth(dev, NULL, iface->cur_altsetting, alt);  	if (ret < 0) {  		dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n", @@ -1917,6 +1923,7 @@ free_interfaces:  	usb_autosuspend_device(dev);  	return 0;  } +EXPORT_SYMBOL_GPL(usb_set_configuration);  static LIST_HEAD(set_config_list);  static DEFINE_SPINLOCK(set_config_lock);  | 
