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:
parent
e036ee6ce2
commit
d038463bd2
@ -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:
|
||||
|
@ -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];
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user