Skip to content
Browse files

MFC r256750:

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.

Approved by:	re (glebius)
  • Loading branch information...
1 parent 43cd197 commit 04fdff3ee16d842d845250e78d7bc7bb7347a839 hselasky committed
Showing with 19 additions and 0 deletions.
  1. +19 −0 sys/dev/usb/controller/xhci.c
View
19 sys/dev/usb/controller/xhci.c
@@ -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;

0 comments on commit 04fdff3

Please sign in to comment.
Something went wrong with that request. Please try again.