|
@@ -799,7 +799,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
|
u32 command, temp = 0;
|
|
|
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
|
|
struct usb_hcd *secondary_hcd;
|
|
|
- int retval;
|
|
|
+ int retval = 0;
|
|
|
|
|
|
/* Wait a bit if either of the roothubs need to settle from the
|
|
|
* transition into bus suspend.
|
|
@@ -809,6 +809,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
|
xhci->bus_state[1].next_statechange))
|
|
|
msleep(100);
|
|
|
|
|
|
+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
|
|
+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
|
|
|
+
|
|
|
spin_lock_irq(&xhci->lock);
|
|
|
if (xhci->quirks & XHCI_RESET_ON_RESUME)
|
|
|
hibernated = true;
|
|
@@ -878,20 +881,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
|
return retval;
|
|
|
xhci_dbg(xhci, "Start the primary HCD\n");
|
|
|
retval = xhci_run(hcd->primary_hcd);
|
|
|
- if (retval)
|
|
|
- goto failed_restart;
|
|
|
-
|
|
|
- xhci_dbg(xhci, "Start the secondary HCD\n");
|
|
|
- retval = xhci_run(secondary_hcd);
|
|
|
if (!retval) {
|
|
|
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
|
|
- set_bit(HCD_FLAG_HW_ACCESSIBLE,
|
|
|
- &xhci->shared_hcd->flags);
|
|
|
+ xhci_dbg(xhci, "Start the secondary HCD\n");
|
|
|
+ retval = xhci_run(secondary_hcd);
|
|
|
}
|
|
|
-failed_restart:
|
|
|
hcd->state = HC_STATE_SUSPENDED;
|
|
|
xhci->shared_hcd->state = HC_STATE_SUSPENDED;
|
|
|
- return retval;
|
|
|
+ goto done;
|
|
|
}
|
|
|
|
|
|
/* step 4: set Run/Stop bit */
|
|
@@ -910,11 +906,14 @@ failed_restart:
|
|
|
* Running endpoints by ringing their doorbells
|
|
|
*/
|
|
|
|
|
|
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
|
|
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
|
|
|
-
|
|
|
spin_unlock_irq(&xhci->lock);
|
|
|
- return 0;
|
|
|
+
|
|
|
+ done:
|
|
|
+ if (retval == 0) {
|
|
|
+ usb_hcd_resume_root_hub(hcd);
|
|
|
+ usb_hcd_resume_root_hub(xhci->shared_hcd);
|
|
|
+ }
|
|
|
+ return retval;
|
|
|
}
|
|
|
#endif /* CONFIG_PM */
|
|
|
|