blob: 92c5a955f302e216533bd44783df989e326720fd [file] [log] [blame]
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Joel Stanley <joel@jms.id.au>
Date: Tue, 19 Jul 2016 22:43:26 +0930
Subject: [PATCH 02/12] xhci: do not halt the secondary HCD
We can't halt the secondary HCD, because it's also the primary HCD,
which will cause problems if we have devices attached to the primary
HCD, like a keyboard.
Signed-off-by: Joel Stanley <joel@jms.id.au>
---
drivers/usb/host/xhci.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 9a0ec116654a..315020dac049 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -689,6 +689,21 @@ void xhci_stop(struct usb_hcd *hcd)
mutex_lock(&xhci->mutex);
+ /*
+ * We can't halt the secondary HCD, because it's also the primary
+ * HCD, which will cause problems if we have devices attached to the
+ * primary HCD, like a keyboard.
+ */
+ if (!usb_hcd_is_primary_hcd(hcd)) {
+ /* The shared_hcd is going to be deallocated shortly (the USB
+ * core only calls this function when allocation fails in
+ * usb_add_hcd(), or usb_remove_hcd() is called). So we need
+ * to unset xHCI's pointer. */
+ xhci->shared_hcd = NULL;
+ mutex_unlock(&xhci->mutex);
+ return;
+ }
+
if (!(xhci->xhc_state & XHCI_STATE_HALTED)) {
spin_lock_irq(&xhci->lock);
@@ -699,11 +714,6 @@ void xhci_stop(struct usb_hcd *hcd)
spin_unlock_irq(&xhci->lock);
}
- if (!usb_hcd_is_primary_hcd(hcd)) {
- mutex_unlock(&xhci->mutex);
- return;
- }
-
xhci_cleanup_msix(xhci);
/* Deleting Compliance Mode Recovery Timer */
--
2.11.0