svn commit: r348604 - head/sys/dev/usb/controller
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Jun 4 09:01:03 UTC 2019
Author: hselasky
Date: Tue Jun 4 09:01:02 2019
New Revision: 348604
URL: https://svnweb.freebsd.org/changeset/base/348604
Log:
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
Modified:
head/sys/dev/usb/controller/xhci.c
Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c Tue Jun 4 08:06:51 2019 (r348603)
+++ head/sys/dev/usb/controller/xhci.c Tue Jun 4 09:01:02 2019 (r348604)
@@ -891,7 +891,7 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
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
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
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,18 +928,19 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
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)
More information about the svn-src-all
mailing list