diff options
Diffstat (limited to 'drivers/usb/core/devio.c')
| -rw-r--r-- | drivers/usb/core/devio.c | 14 | 
1 files changed, 9 insertions, 5 deletions
| diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 6abb7294e919..b5b85bf80329 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1209,12 +1209,16 @@ static int do_proc_control(struct usb_dev_state *ps,  		usb_unlock_device(dev);  		i = usbfs_start_wait_urb(urb, tmo, &actlen); + +		/* Linger a bit, prior to the next control message. */ +		if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG) +			msleep(200);  		usb_lock_device(dev);  		snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, tbuf, actlen);  		if (!i && actlen) {  			if (copy_to_user(ctrl->data, tbuf, actlen)) {  				ret = -EFAULT; -				goto recv_fault; +				goto done;  			}  		}  	} else { @@ -1231,6 +1235,10 @@ static int do_proc_control(struct usb_dev_state *ps,  		usb_unlock_device(dev);  		i = usbfs_start_wait_urb(urb, tmo, &actlen); + +		/* Linger a bit, prior to the next control message. */ +		if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG) +			msleep(200);  		usb_lock_device(dev);  		snoop_urb(dev, NULL, pipe, actlen, i, COMPLETE, NULL, 0);  	} @@ -1242,10 +1250,6 @@ static int do_proc_control(struct usb_dev_state *ps,  	}  	ret = (i < 0 ? i : actlen); - recv_fault: -	/* Linger a bit, prior to the next control message. */ -	if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG) -		msleep(200);   done:  	kfree(dr);  	usb_free_urb(urb); |