]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
Make sure the XHCI driver obeys the isochronous scheduling threshold value
authorHans Petter Selasky <hselasky@FreeBSD.org>
Sat, 10 Jul 2021 16:09:56 +0000 (18:09 +0200)
committerHans Petter Selasky <hselasky@FreeBSD.org>
Thu, 17 Mar 2022 12:25:52 +0000 (13:25 +0100)
as given by the XHCI hardware parameters to avoid scheduling isochronous
transfers too early.

Sponsored by: NVIDIA Networking
Approved by: re (gjb)

(cherry picked from commit d038463bd269031fa8f13c0951b223bcae02bbca)
(cherry picked from commit 2db063c4cea9ae46493dab19d70499e06f0e1ed0)

sys/dev/usb/controller/xhci.c
sys/dev/usb/controller/xhci.h

index db2aad057bc0b5c2f37830254809627d8712fb7b..f42428614bbb758ac56cd1cd727637af15bde17c 100644 (file)
@@ -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:
index e8841a05b1341c2c0a38e14085e265d33a38e84b..802207208569396999e0ab096b1c2b668cb85dbf 100644 (file)
@@ -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];
 };