Date: Thu, 10 Mar 2022 08:35:37 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: 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. Message-ID: <202203100835.22A8ZbKV003393@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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]; };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202203100835.22A8ZbKV003393>