|
@@ -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;
|