ehci_pci.c:
ATI EHCI controllers exhibit simmilar stall issues and require this dropped interrupts workaround. Be verbose about it. ehci.c: ehcivar.h: Slight change in comments to note about issues surrounding both VIA and ATI EHCI controllers. Approved by: iedowse
This commit is contained in:
parent
1a8b92ed8b
commit
c11e59dff7
@ -2710,11 +2710,11 @@ ehci_timeout_task(void *addr)
|
||||
}
|
||||
|
||||
/*
|
||||
* Some EHCI chips from VIA seem to trigger interrupts before writing back the
|
||||
* qTD status, or miss signalling occasionally under heavy load. If the host
|
||||
* machine is too fast, we we can miss transaction completion - when we scan
|
||||
* the active list the transaction still seems to be active. This generally
|
||||
* exhibits itself as a umass stall that never recovers.
|
||||
* Some EHCI chips from VIA / ATI seem to trigger interrupts before writing
|
||||
* back the qTD status, or miss signalling occasionally under heavy load.
|
||||
* If the host machine is too fast, we can miss transaction completion - when
|
||||
* we scan the active list the transaction still seems to be active. This
|
||||
* generally exhibits itself as a umass stall that never recovers.
|
||||
*
|
||||
* We work around this behaviour by setting up this callback after any softintr
|
||||
* that completes with transactions still pending, giving us another chance to
|
||||
|
@ -335,6 +335,9 @@ ehci_pci_attach(device_t self)
|
||||
case PCI_EHCI_VENDORID_APPLE:
|
||||
sprintf(sc->sc_vendor, "Apple");
|
||||
break;
|
||||
case PCI_EHCI_VENDORID_ATI:
|
||||
sprintf(sc->sc_vendor, "ATI");
|
||||
break;
|
||||
case PCI_EHCI_VENDORID_CMDTECH:
|
||||
sprintf(sc->sc_vendor, "CMDTECH");
|
||||
break;
|
||||
@ -374,8 +377,17 @@ ehci_pci_attach(device_t self)
|
||||
}
|
||||
|
||||
/* Enable workaround for dropped interrupts as required */
|
||||
if (pci_get_vendor(self) == PCI_EHCI_VENDORID_VIA)
|
||||
switch (pci_get_vendor(self)) {
|
||||
case PCI_EHCI_VENDORID_ATI:
|
||||
case PCI_EHCI_VENDORID_VIA:
|
||||
sc->sc_flags |= EHCI_SCFLG_LOSTINTRBUG;
|
||||
if (bootverbose)
|
||||
device_printf(self,
|
||||
"Dropped interrupts workaround enabled\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find companion controllers. According to the spec they always
|
||||
|
@ -94,7 +94,7 @@ struct ehci_soft_islot {
|
||||
#define EHCI_COMPANION_MAX 8
|
||||
|
||||
#define EHCI_SCFLG_DONEINIT 0x0001 /* ehci_init() has been called. */
|
||||
#define EHCI_SCFLG_LOSTINTRBUG 0x0002 /* workaround for VIA chipsets */
|
||||
#define EHCI_SCFLG_LOSTINTRBUG 0x0002 /* workaround for VIA / ATI chipsets */
|
||||
|
||||
typedef struct ehci_softc {
|
||||
struct usbd_bus sc_bus; /* base device */
|
||||
|
Loading…
Reference in New Issue
Block a user