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.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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];
};