diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 14 | 
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b9ce5e8bda51..42566d774d18 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2534,6 +2534,10 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,  		if (ret < 0)  			return ret; +		/* The port state is unknown until the reset completes. */ +		if ((portstatus & USB_PORT_STAT_RESET)) +			goto delay; +  		/*  		 * Some buggy devices require a warm reset to be issued even  		 * when the port appears not to be connected. @@ -2579,11 +2583,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,  			if ((portchange & USB_PORT_STAT_C_CONNECTION))  				return -ENOTCONN; -			/* if we`ve finished resetting, then break out of -			 * the loop -			 */ -			if (!(portstatus & USB_PORT_STAT_RESET) && -			    (portstatus & USB_PORT_STAT_ENABLE)) { +			if ((portstatus & USB_PORT_STAT_ENABLE)) {  				if (hub_is_wusb(hub))  					udev->speed = USB_SPEED_WIRELESS;  				else if (hub_is_superspeed(hub->hdev)) @@ -2597,10 +2597,10 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,  				return 0;  			}  		} else { -			if (portchange & USB_PORT_STAT_C_BH_RESET) -				return 0; +			return 0;  		} +delay:  		/* switch to the long delay after two short delay failures */  		if (delay_time >= 2 * HUB_SHORT_RESET_TIME)  			delay = HUB_LONG_RESET_TIME;  | 
