Improve XHCI stability. When a command timeout happens, the command

should be aborted else the command queue can stop. Refer to section
"4.6.1.2" of the XHCI specification.

MFC after:	1 week
This commit is contained in:
Hans Petter Selasky 2013-10-18 17:38:57 +00:00
parent 64238eb48e
commit 2c452d7400
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=256750

View File

@ -1144,6 +1144,25 @@ xhci_do_command(struct xhci_softc *sc, struct xhci_trb *trb,
}
if (err != 0) {
DPRINTFN(0, "Command timeout!\n");
/*
* Try to abort the last command as per section
* 4.6.1.2 "Aborting a Command" of the XHCI
* specification:
*/
temp = XREAD4(sc, oper, XHCI_CRCR_LO);
XWRITE4(sc, oper, XHCI_CRCR_LO, temp | XHCI_CRCR_LO_CA);
/* wait for abort event, if any */
err = cv_timedwait(&sc->sc_cmd_cv, &sc->sc_bus.bus_mtx, hz / 16);
if (err != 0 && xhci_interrupt_poll(sc) != 0) {
DPRINTF("Command was completed when polling\n");
err = 0;
}
if (err != 0) {
DPRINTF("Command abort timeout!\n");
}
err = USB_ERR_TIMEOUT;
trb->dwTrb2 = 0;
trb->dwTrb3 = 0;