diff options
author | thompsa <thompsa@FreeBSD.org> | 2009-11-08 20:51:15 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2009-11-08 20:51:15 +0000 |
commit | 138b1174a623634b265299a95c263adcbc9c76de (patch) | |
tree | 58453478da79b83d50f1f9b6a76b6554e1ff82e8 /sys/dev/usb/controller/ehci.h | |
parent | 410f2a9fd7c27f9feea4855407b8a73cc612993d (diff) | |
download | FreeBSD-src-138b1174a623634b265299a95c263adcbc9c76de.zip FreeBSD-src-138b1174a623634b265299a95c263adcbc9c76de.tar.gz |
Integrate lost interrupts patch from the old USB stack.
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
check for completion after the writeback has taken place
Submitted by: Alexander Nedotsuko
MFC after: 3 days
Diffstat (limited to 'sys/dev/usb/controller/ehci.h')
-rw-r--r-- | sys/dev/usb/controller/ehci.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/dev/usb/controller/ehci.h b/sys/dev/usb/controller/ehci.h index 32c0835..a3d8406 100644 --- a/sys/dev/usb/controller/ehci.h +++ b/sys/dev/usb/controller/ehci.h @@ -321,6 +321,7 @@ typedef struct ehci_softc { struct ehci_hw_softc sc_hw; struct usb_bus sc_bus; /* base device */ struct usb_callout sc_tmo_pcd; + struct usb_callout sc_tmo_poll; union ehci_hub_desc sc_hub_desc; struct usb_device *sc_devices[EHCI_MAX_DEVICES]; @@ -348,6 +349,7 @@ typedef struct ehci_softc { #define EHCI_SCFLG_BIGEDESC 0x0008 /* big-endian byte order descriptors */ #define EHCI_SCFLG_BIGEMMIO 0x0010 /* big-endian byte order MMIO */ #define EHCI_SCFLG_TT 0x0020 /* transaction translator present */ +#define EHCI_SCFLG_LOSTINTRBUG 0x0040 /* workaround for VIA / ATI chipsets */ uint8_t sc_offs; /* offset to operational registers */ uint8_t sc_doorbell_disable; /* set on doorbell failure */ |