*/
 #define USB_SHORT_SET_ADDRESS_REQ_TIMEOUT      500  /* ms */
 
+/*
+ * Give SS hubs 200ms time after wake to train downstream links before
+ * assuming no port activity and allowing hub to runtime suspend back.
+ */
+#define USB_SS_PORT_U0_WAKE_TIME       200  /* ms */
+
 /* Protect struct usb_device->state and ->children members
  * Note: Both are also protected by ->dev.sem, except that ->state can
  * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */
 
 enum hub_activation_type {
        HUB_INIT, HUB_INIT2, HUB_INIT3,         /* INITs must come first */
-       HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME,
+       HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME, HUB_POST_RESUME,
 };
 
 static void hub_init_func2(struct work_struct *ws);
 static void hub_init_func3(struct work_struct *ws);
+static void hub_post_resume(struct work_struct *ws);
 
 static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
 {
                        goto init2;
                goto init3;
        }
+
+       if (type == HUB_POST_RESUME) {
+               usb_autopm_put_interface_async(to_usb_interface(hub->intfdev));
+               hub_put(hub);
+               return;
+       }
+
        hub_get(hub);
 
        /* The superspeed hub except for root hub has to use Hub Depth
                device_unlock(&hdev->dev);
        }
 
+       if (type == HUB_RESUME && hub_is_superspeed(hub->hdev)) {
+               /* give usb3 downstream links training time after hub resume */
+               INIT_DELAYED_WORK(&hub->init_work, hub_post_resume);
+               queue_delayed_work(system_power_efficient_wq, &hub->init_work,
+                                  msecs_to_jiffies(USB_SS_PORT_U0_WAKE_TIME));
+               usb_autopm_get_interface_no_resume(
+                       to_usb_interface(hub->intfdev));
+               return;
+       }
+
        hub_put(hub);
 }
 
        hub_activate(hub, HUB_INIT3);
 }
 
+static void hub_post_resume(struct work_struct *ws)
+{
+       struct usb_hub *hub = container_of(ws, struct usb_hub, init_work.work);
+
+       hub_activate(hub, HUB_POST_RESUME);
+}
+
 enum hub_quiescing_type {
        HUB_DISCONNECT, HUB_PRE_RESET, HUB_SUSPEND
 };