diff options
-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, | |||
2710 | if (!(portstatus & USB_PORT_STAT_CONNECTION)) | 2710 | if (!(portstatus & USB_PORT_STAT_CONNECTION)) |
2711 | return -ENOTCONN; | 2711 | return -ENOTCONN; |
2712 | 2712 | ||
2713 | /* bomb out completely if the connection bounced. A USB 3.0 | 2713 | /* Retry if connect change is set but status is still connected. |
2714 | * connection may bounce if multiple warm resets were issued, | 2714 | * A USB 3.0 connection may bounce if multiple warm resets were issued, |
2715 | * but the device may have successfully re-connected. Ignore it. | 2715 | * but the device may have successfully re-connected. Ignore it. |
2716 | */ | 2716 | */ |
2717 | if (!hub_is_superspeed(hub->hdev) && | 2717 | if (!hub_is_superspeed(hub->hdev) && |
2718 | (portchange & USB_PORT_STAT_C_CONNECTION)) | 2718 | (portchange & USB_PORT_STAT_C_CONNECTION)) { |
2719 | return -ENOTCONN; | 2719 | usb_clear_port_feature(hub->hdev, port1, |
2720 | USB_PORT_FEAT_C_CONNECTION); | ||
2721 | return -EAGAIN; | ||
2722 | } | ||
2720 | 2723 | ||
2721 | if (!(portstatus & USB_PORT_STAT_ENABLE)) | 2724 | if (!(portstatus & USB_PORT_STAT_ENABLE)) |
2722 | return -EBUSY; | 2725 | return -EBUSY; |