From owner-svn-src-all@freebsd.org  Mon Jun 10 13:16:51 2019
Return-Path: <owner-svn-src-all@freebsd.org>
Delivered-To: svn-src-all@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id E1B7515BEE0A;
 Mon, 10 Jun 2019 13:16:50 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org
 [IPv6:2610:1c1:1:606c::19:3])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 server-signature RSA-PSS (4096 bits)
 client-signature RSA-PSS (4096 bits) client-digest SHA256)
 (Client CN "mxrelay.nyi.freebsd.org",
 Issuer "Let's Encrypt Authority X3" (verified OK))
 by mx1.freebsd.org (Postfix) with ESMTPS id 860AF72614;
 Mon, 10 Jun 2019 13:16:50 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 46C5E1ABC4;
 Mon, 10 Jun 2019 13:16:50 +0000 (UTC)
 (envelope-from hselasky@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x5ADGole018542;
 Mon, 10 Jun 2019 13:16:50 GMT (envelope-from hselasky@FreeBSD.org)
Received: (from hselasky@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id x5ADGoG6018541;
 Mon, 10 Jun 2019 13:16:50 GMT (envelope-from hselasky@FreeBSD.org)
Message-Id: <201906101316.x5ADGoG6018541@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: hselasky set sender to
 hselasky@FreeBSD.org using -f
From: Hans Petter Selasky <hselasky@FreeBSD.org>
Date: Mon, 10 Jun 2019 13:16:50 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
 svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject: svn commit: r348852 - stable/12/sys/dev/usb/controller
X-SVN-Group: stable-12
X-SVN-Commit-Author: hselasky
X-SVN-Commit-Paths: stable/12/sys/dev/usb/controller
X-SVN-Commit-Revision: 348852
X-SVN-Commit-Repository: base
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Rspamd-Queue-Id: 860AF72614
X-Spamd-Bar: --
Authentication-Results: mx1.freebsd.org
X-Spamd-Result: default: False [-2.91 / 15.00];
 local_wl_from(0.00)[FreeBSD.org];
 NEURAL_HAM_MEDIUM(-1.00)[-0.999,0];
 NEURAL_HAM_SHORT(-0.91)[-0.909,0];
 ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US];
 NEURAL_HAM_LONG(-1.00)[-1.000,0]
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 Jun 2019 13:16:51 -0000

Author: hselasky
Date: Mon Jun 10 13:16:49 2019
New Revision: 348852
URL: https://svnweb.freebsd.org/changeset/base/348852

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.
  
  Sponsored by:	Mellanox Technologies

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

Modified: stable/12/sys/dev/usb/controller/xhci.c
==============================================================================
--- stable/12/sys/dev/usb/controller/xhci.c	Mon Jun 10 13:15:49 2019	(r348851)
+++ stable/12/sys/dev/usb/controller/xhci.c	Mon Jun 10 13:16:49 2019	(r348852)
@@ -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)