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
This commit is contained in:
Hans Petter Selasky 2021-07-10 18:09:56 +02:00
parent e036ee6ce2
commit d038463bd2
2 changed files with 13 additions and 1 deletions

View 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:

View 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];
};