git: d038463bd269 - main - 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.

Hans Petter Selasky hselasky at FreeBSD.org
Sat Jul 10 19:04:48 UTC 2021


The branch main has been updated by hselasky:

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

commit d038463bd269031fa8f13c0951b223bcae02bbca
Author:     Hans Petter Selasky <hselasky at FreeBSD.org>
AuthorDate: 2021-07-10 16:09:56 +0000
Commit:     Hans Petter Selasky <hselasky at FreeBSD.org>
CommitDate: 2021-07-10 17:57:52 +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.
    
    MFC after:      1 week
    Sponsored by:   NVIDIA Networking
---
 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 10e37c97c254..dd64c2d45141 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];
 };


More information about the dev-commits-src-all mailing list