|
@@ -1287,29 +1287,34 @@ void xhci_handle_command_timeout(unsigned long data)
|
|
|
hw_ring_state = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
|
|
|
if ((xhci->cmd_ring_state & CMD_RING_STATE_RUNNING) &&
|
|
|
(hw_ring_state & CMD_RING_RUNNING)) {
|
|
|
- spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
xhci_dbg(xhci, "Command timeout\n");
|
|
|
ret = xhci_abort_cmd_ring(xhci);
|
|
|
if (unlikely(ret == -ESHUTDOWN)) {
|
|
|
xhci_err(xhci, "Abort command ring failed\n");
|
|
|
xhci_cleanup_command_queue(xhci);
|
|
|
+ spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
usb_hc_died(xhci_to_hcd(xhci)->primary_hcd);
|
|
|
xhci_dbg(xhci, "xHCI host controller is dead.\n");
|
|
|
+
|
|
|
+ return;
|
|
|
}
|
|
|
- return;
|
|
|
+
|
|
|
+ goto time_out_completed;
|
|
|
}
|
|
|
|
|
|
/* command ring failed to restart, or host removed. Bail out */
|
|
|
if (second_timeout || xhci->xhc_state & XHCI_STATE_REMOVING) {
|
|
|
- spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
xhci_dbg(xhci, "command timed out twice, ring start fail?\n");
|
|
|
xhci_cleanup_command_queue(xhci);
|
|
|
- return;
|
|
|
+
|
|
|
+ goto time_out_completed;
|
|
|
}
|
|
|
|
|
|
/* command timeout on stopped ring, ring can't be aborted */
|
|
|
xhci_dbg(xhci, "Command timeout on stopped ring\n");
|
|
|
xhci_handle_stopped_cmd_ring(xhci, xhci->current_cmd);
|
|
|
+
|
|
|
+time_out_completed:
|
|
|
spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
return;
|
|
|
}
|