The branch releng/13.1 has been updated by hselasky:

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

commit 3e40a842aa80dc62bd9f4afe8d923f4121773ea9
Author:     Hans Petter Selasky <hsela...@freebsd.org>
AuthorDate: 2021-07-10 16:09:56 +0000
Commit:     Hans Petter Selasky <hsela...@freebsd.org>
CommitDate: 2022-03-17 12:25: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.
    
    Sponsored by:   NVIDIA Networking
    Approved by:    re (gjb)
    
    (cherry picked from commit d038463bd269031fa8f13c0951b223bcae02bbca)
    (cherry picked from commit 2db063c4cea9ae46493dab19d70499e06f0e1ed0)
---
 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];
 };

Reply via email to