aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/xhci.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 40e0a0c221b8..79ccfe5f8ad0 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -116,6 +116,7 @@ int xhci_reset(struct xhci_hcd *xhci)
116{ 116{
117 u32 command; 117 u32 command;
118 u32 state; 118 u32 state;
119 int ret;
119 120
120 state = xhci_readl(xhci, &xhci->op_regs->status); 121 state = xhci_readl(xhci, &xhci->op_regs->status);
121 if ((state & STS_HALT) == 0) { 122 if ((state & STS_HALT) == 0) {
@@ -130,7 +131,17 @@ int xhci_reset(struct xhci_hcd *xhci)
130 /* XXX: Why does EHCI set this here? Shouldn't other code do this? */ 131 /* XXX: Why does EHCI set this here? Shouldn't other code do this? */
131 xhci_to_hcd(xhci)->state = HC_STATE_HALT; 132 xhci_to_hcd(xhci)->state = HC_STATE_HALT;
132 133
133 return handshake(xhci, &xhci->op_regs->command, CMD_RESET, 0, 250 * 1000); 134 ret = handshake(xhci, &xhci->op_regs->command,
135 CMD_RESET, 0, 250 * 1000);
136 if (ret)
137 return ret;
138
139 xhci_dbg(xhci, "Wait for controller to be ready for doorbell rings\n");
140 /*
141 * xHCI cannot write to any doorbells or operational registers other
142 * than status until the "Controller Not Ready" flag is cleared.
143 */
144 return handshake(xhci, &xhci->op_regs->status, STS_CNR, 0, 250 * 1000);
134} 145}
135 146
136 147