diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/xhci.c | 13 |
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 | ||