| From 8a78d35a906b75858a0bd9fd6a582af574e485de Mon Sep 17 00:00:00 2001 |
| From: Rick Tseng <rtseng@nvidia.com> |
| Date: Fri, 4 Oct 2019 14:59:30 +0300 |
| Subject: [PATCH] usb: xhci: wait for CNR controller not ready bit in xhci |
| resume |
| |
| commit a70bcbc322837eda1ab5994d12db941dc9733a7d upstream. |
| |
| NVIDIA 3.1 xHCI card would lose power when moving power state into D3Cold. |
| Thus we need to wait for CNR bit to clear in xhci resume, just as in |
| xhci init. |
| |
| [Minor changes to comment and commit message -Mathias] |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Rick Tseng <rtseng@nvidia.com> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Link: https://lore.kernel.org/r/1570190373-30684-6-git-send-email-mathias.nyman@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
| index 5ec5b27ee8a5..bd4ff775a7e7 100644 |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -1108,6 +1108,18 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
| hibernated = true; |
| |
| if (!hibernated) { |
| + /* |
| + * Some controllers might lose power during suspend, so wait |
| + * for controller not ready bit to clear, just as in xHC init. |
| + */ |
| + retval = xhci_handshake(&xhci->op_regs->status, |
| + STS_CNR, 0, 10 * 1000 * 1000); |
| + if (retval) { |
| + xhci_warn(xhci, "Controller not ready at resume %d\n", |
| + retval); |
| + spin_unlock_irq(&xhci->lock); |
| + return retval; |
| + } |
| /* step 1: restore register */ |
| xhci_restore_registers(xhci); |
| /* step 2: initialize command ring buffer */ |
| -- |
| 2.7.4 |
| |