Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Jun 2019 13:15:49 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r348851 - stable/11/sys/dev/usb/controller
Message-ID:  <201906101315.x5ADFnYm018440@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon Jun 10 13:15:49 2019
New Revision: 348851
URL: https://svnweb.freebsd.org/changeset/base/348851

Log:
  MFC r348604:
  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.
  
  Approved by:	re(kib)
  Sponsored by:	Mellanox Technologies

Modified:
  stable/11/sys/dev/usb/controller/xhci.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/usb/controller/xhci.c
==============================================================================
--- stable/11/sys/dev/usb/controller/xhci.c	Mon Jun 10 12:40:38 2019	(r348850)
+++ stable/11/sys/dev/usb/controller/xhci.c	Mon Jun 10 13:15:49 2019	(r348851)
@@ -889,7 +889,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;
@@ -902,7 +902,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);
@@ -912,8 +911,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");
@@ -927,18 +926,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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906101315.x5ADFnYm018440>