diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 11 | 
1 files changed, 7 insertions, 4 deletions
| diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b5c733613823..e9ce6bb0b22d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2710,13 +2710,16 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,  	if (!(portstatus & USB_PORT_STAT_CONNECTION))  		return -ENOTCONN; -	/* bomb out completely if the connection bounced.  A USB 3.0 -	 * connection may bounce if multiple warm resets were issued, +	/* Retry if connect change is set but status is still connected. +	 * A USB 3.0 connection may bounce if multiple warm resets were issued,  	 * but the device may have successfully re-connected. Ignore it.  	 */  	if (!hub_is_superspeed(hub->hdev) && -			(portchange & USB_PORT_STAT_C_CONNECTION)) -		return -ENOTCONN; +	    (portchange & USB_PORT_STAT_C_CONNECTION)) { +		usb_clear_port_feature(hub->hdev, port1, +				       USB_PORT_FEAT_C_CONNECTION); +		return -EAGAIN; +	}  	if (!(portstatus & USB_PORT_STAT_ENABLE))  		return -EBUSY; | 
