|
@@ -302,6 +302,15 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci)
|
|
|
ret = xhci_handshake(&xhci->op_regs->cmd_ring,
|
|
|
CMD_RING_RUNNING, 0, 5 * 1000 * 1000);
|
|
|
if (ret < 0) {
|
|
|
+ /* we are about to kill xhci, give it one more chance */
|
|
|
+ xhci_write_64(xhci, temp_64 | CMD_RING_ABORT,
|
|
|
+ &xhci->op_regs->cmd_ring);
|
|
|
+ udelay(1000);
|
|
|
+ ret = xhci_handshake(&xhci->op_regs->cmd_ring,
|
|
|
+ CMD_RING_RUNNING, 0, 3 * 1000 * 1000);
|
|
|
+ if (ret == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
xhci_err(xhci, "Stopped the command ring failed, "
|
|
|
"maybe the host is dead\n");
|
|
|
xhci->xhc_state |= XHCI_STATE_DYING;
|