diff options
| -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 | ||
