usb: xhci: clean up command queue on HC halt failure as well
'Commit c9cabb7ee02bcb0c ("usb: xhci: clean up command queue when halting"); fixes deadlock condition when some commands are pending at the time of usb_remove_hcd() or when controller is halted. That change cleans up command queue if halting of controller is successful. But, this deadlock may still be seen in case if due to some reason halting of controller fails. To handle that scenario as well cleanup command queue irrespective of controller halt succeeds or fails. Change-Id: I2c88fca3614af7fe58bc858898449d47546da247 Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
This commit is contained in:
parent
46692be6dd
commit
d69c50aa2a
1 changed files with 12 additions and 9 deletions
|
@ -116,17 +116,20 @@ int xhci_halt(struct xhci_hcd *xhci)
|
|||
STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC);
|
||||
if (!ret) {
|
||||
xhci->xhc_state |= XHCI_STATE_HALTED;
|
||||
xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
|
||||
|
||||
if (timer_pending(&xhci->cmd_timer)) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Cleanup command queue");
|
||||
del_timer(&xhci->cmd_timer);
|
||||
xhci_cleanup_command_queue(xhci);
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
xhci_warn(xhci, "Host not halted after %u microseconds.\n",
|
||||
XHCI_MAX_HALT_USEC);
|
||||
}
|
||||
|
||||
xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
|
||||
|
||||
if (timer_pending(&xhci->cmd_timer)) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Cleanup command queue");
|
||||
del_timer(&xhci->cmd_timer);
|
||||
xhci_cleanup_command_queue(xhci);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue