blob: 443286bc2bb6b484d5042e96928a340c5f3d0022 [file] [log] [blame]
From 984ed87aa4eb894c46ffd6af4174fdf432763bcd 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 4/9] 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.
Sined-off-by: Joel Stanley <joel@jms.id.au>
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 adc169d2fd76..ec92a843325b 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -682,6 +682,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);
@@ -693,11 +708,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.9.3