summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/controller/uhci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/controller/uhci.c')
-rw-r--r--sys/dev/usb/controller/uhci.c13
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
OpenPOWER on IntegriCloud