diff options
Diffstat (limited to 'sys/dev/usb/controller/uhci.c')
-rw-r--r-- | sys/dev/usb/controller/uhci.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/dev/usb/controller/uhci.c b/sys/dev/usb/controller/uhci.c index fe3cf93..49ce4e1 100644 --- a/sys/dev/usb/controller/uhci.c +++ b/sys/dev/usb/controller/uhci.c @@ -2138,6 +2138,7 @@ uhci_device_isoc_enter(struct usb_xfer *xfer) uint32_t nframes; uint32_t temp; uint32_t *plen; + uint8_t first = 1; #ifdef USB_DEBUG uint8_t once = 1; @@ -2253,6 +2254,18 @@ uhci_device_isoc_enter(struct usb_xfer *xfer) UHCI_TD_ACTIVE | UHCI_TD_IOS | UHCI_TD_IOC)); + } else if (first != 0) { + /* + * Workaround for lost or too early completion + * interrupt: + */ + first = 0; + td->td_status = htole32 + (UHCI_TD_ZERO_ACTLEN + (UHCI_TD_SET_ERRCNT(0) | + UHCI_TD_ACTIVE | + UHCI_TD_IOS | + UHCI_TD_IOC)); } else { td->td_status = htole32 (UHCI_TD_ZERO_ACTLEN |