|
@@ -2794,6 +2794,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|
|
int i, status;
|
|
|
u16 portchange, portstatus;
|
|
|
struct usb_port *port_dev = hub->ports[port1 - 1];
|
|
|
+ int reset_recovery_time;
|
|
|
|
|
|
if (!hub_is_superspeed(hub->hdev)) {
|
|
|
if (warm) {
|
|
@@ -2885,11 +2886,18 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|
|
|
|
|
done:
|
|
|
if (status == 0) {
|
|
|
- /* TRSTRCY = 10 ms; plus some extra */
|
|
|
if (port_dev->quirks & USB_PORT_QUIRK_FAST_ENUM)
|
|
|
usleep_range(10000, 12000);
|
|
|
- else
|
|
|
- msleep(10 + 40);
|
|
|
+ else {
|
|
|
+ /* TRSTRCY = 10 ms; plus some extra */
|
|
|
+ reset_recovery_time = 10 + 40;
|
|
|
+
|
|
|
+ /* Hub needs extra delay after resetting its port. */
|
|
|
+ if (hub->hdev->quirks & USB_QUIRK_HUB_SLOW_RESET)
|
|
|
+ reset_recovery_time += 100;
|
|
|
+
|
|
|
+ msleep(reset_recovery_time);
|
|
|
+ }
|
|
|
|
|
|
if (udev) {
|
|
|
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
|