git: 2db063c4cea9 - stable/13 - Make sure the XHCI driver obeys the isochronous scheduling threshold value as given by the XHCI hardware parameters to avoid scheduling isochronous transfers too early.

From: Hans Petter Selasky <hselasky_at_FreeBSD.org>
Date: Thu, 10 Mar 2022 08:35:37 UTC
The branch stable/13 has been updated by hselasky:

URL: https://cgit.FreeBSD.org/src/commit/?id=2db063c4cea9ae46493dab19d70499e06f0e1ed0

commit 2db063c4cea9ae46493dab19d70499e06f0e1ed0
Author:     Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2021-07-10 16:09:56 +0000
Commit:     Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-03-10 08:27:41 +0000

    Make sure the XHCI driver obeys the isochronous scheduling threshold value
    as given by the XHCI hardware parameters to avoid scheduling isochronous
    transfers too early.
    
    Sponsored by:   NVIDIA Networking
    
    (cherry picked from commit d038463bd269031fa8f13c0951b223bcae02bbca)
---
 sys/dev/usb/controller/xhci.c | 11 ++++++++++-
 sys/dev/usb/controller/xhci.h |  3 +++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index db2aad057bc0..f42428614bbb 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -644,6 +644,9 @@ xhci_init(struct xhci_softc *sc, device_t self, uint8_t dma32)
 
 	DPRINTF("HCS2=0x%08x\n", temp);
 
+	/* get isochronous scheduling threshold */
+	sc->sc_ist = XHCI_HCS2_IST(temp);
+
 	/* get number of scratchpads */
 	sc->sc_noscratch = XHCI_HCS2_SPB_MAX(temp);
 
@@ -2075,7 +2078,13 @@ xhci_setup_generic_chain(struct usb_xfer *xfer)
 
 		x = XREAD4(temp.sc, runt, XHCI_MFINDEX);
 
-		DPRINTF("MFINDEX=0x%08x\n", x);
+		DPRINTF("MFINDEX=0x%08x IST=0x%x\n", x, sc->sc_ist);
+
+		/* add isochronous scheduling threshold */
+		if (temp.sc->sc_ist & 8)
+			x += (temp.sc->sc_ist & 7) << 3;
+		else
+			x += (temp.sc->sc_ist & 7);
 
 		switch (usbd_get_speed(xfer->xroot->udev)) {
 		case USB_SPEED_FULL:
diff --git a/sys/dev/usb/controller/xhci.h b/sys/dev/usb/controller/xhci.h
index e8841a05b134..802207208569 100644
--- a/sys/dev/usb/controller/xhci.h
+++ b/sys/dev/usb/controller/xhci.h
@@ -529,6 +529,9 @@ struct xhci_softc {
 	/* size of context */
 	uint8_t			sc_ctx_is_64_byte;
 
+	/* Isochronous Scheduling Threshold */
+	uint8_t			sc_ist;
+
 	/* vendor string for root HUB */
 	char			sc_vendor[16];
 };