In xhci(4) there is no stream ID in the completion TRB.

Instead iterate all the stream IDs in stream mode to find
the matching USB transfer.

MFC after:	3 days
Sponsored by:	Mellanox Technologies
This commit is contained in:
hselasky 2019-06-04 09:01:02 +00:00
parent 469bf20db0
commit 40124d2a05

View File

@ -891,7 +891,7 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci_trb *trb)
uint64_t td_event;
uint32_t temp;
uint32_t remainder;
uint16_t stream_id;
uint16_t stream_id = 0;
uint16_t i;
uint8_t status;
uint8_t halted;
@ -904,7 +904,6 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci_trb *trb)
remainder = XHCI_TRB_2_REM_GET(temp);
status = XHCI_TRB_2_ERROR_GET(temp);
stream_id = XHCI_TRB_2_STREAM_GET(temp);
temp = le32toh(trb->dwTrb3);
epno = XHCI_TRB_3_EP_GET(temp);
@ -914,8 +913,8 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci_trb *trb)
halted = (status != XHCI_TRB_ERROR_SHORT_PKT &&
status != XHCI_TRB_ERROR_SUCCESS);
DPRINTF("slot=%u epno=%u stream=%u remainder=%u status=%u\n",
index, epno, stream_id, remainder, status);
DPRINTF("slot=%u epno=%u remainder=%u status=%u\n",
index, epno, remainder, status);
if (index > sc->sc_noslot) {
DPRINTF("Invalid slot.\n");
@ -929,19 +928,20 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci_trb *trb)
pepext = &sc->sc_hw.devs[index].endp[epno];
if (pepext->trb_ep_mode != USB_EP_MODE_STREAMS) {
stream_id = 0;
DPRINTF("stream_id=0\n");
} else if (stream_id >= XHCI_MAX_STREAMS) {
DPRINTF("Invalid stream ID.\n");
return;
}
/* try to find the USB transfer that generated the event */
for (i = 0; i != (XHCI_MAX_TRANSFERS - 1); i++) {
for (i = 0;; i++) {
struct usb_xfer *xfer;
struct xhci_td *td;
if (i == (XHCI_MAX_TRANSFERS - 1)) {
if (pepext->trb_ep_mode != USB_EP_MODE_STREAMS ||
stream_id == (XHCI_MAX_STREAMS - 1))
break;
stream_id++;
i = 0;
DPRINTFN(5, "stream_id=%u\n", stream_id);
}
xfer = pepext->xfer[i + (XHCI_MAX_TRANSFERS * stream_id)];
if (xfer == NULL)
continue;