|
@@ -655,15 +655,6 @@ int xhci_run(struct usb_hcd *hcd)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(xhci_run);
|
|
|
|
|
|
-static void xhci_only_stop_hcd(struct usb_hcd *hcd)
|
|
|
-{
|
|
|
- struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
|
-
|
|
|
- spin_lock_irq(&xhci->lock);
|
|
|
- xhci_halt(xhci);
|
|
|
- spin_unlock_irq(&xhci->lock);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Stop xHCI driver.
|
|
|
*
|
|
@@ -678,15 +669,14 @@ void xhci_stop(struct usb_hcd *hcd)
|
|
|
u32 temp;
|
|
|
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
|
|
|
|
- mutex_lock(&xhci->mutex);
|
|
|
-
|
|
|
- if (!usb_hcd_is_primary_hcd(hcd)) {
|
|
|
- xhci_only_stop_hcd(xhci->shared_hcd);
|
|
|
- mutex_unlock(&xhci->mutex);
|
|
|
+ if (xhci->xhc_state & XHCI_STATE_HALTED)
|
|
|
return;
|
|
|
- }
|
|
|
|
|
|
+ mutex_lock(&xhci->mutex);
|
|
|
spin_lock_irq(&xhci->lock);
|
|
|
+ xhci->xhc_state |= XHCI_STATE_HALTED;
|
|
|
+ xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
|
|
|
+
|
|
|
/* Make sure the xHC is halted for a USB3 roothub
|
|
|
* (xhci_stop() could be called as part of failed init).
|
|
|
*/
|