diff options
Diffstat (limited to 'payloads/libpayload/drivers/usb')
-rw-r--r-- | payloads/libpayload/drivers/usb/ohci.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/payloads/libpayload/drivers/usb/ohci.c b/payloads/libpayload/drivers/usb/ohci.c index 0f4886fc63..2e22ecf9e7 100644 --- a/payloads/libpayload/drivers/usb/ohci.c +++ b/payloads/libpayload/drivers/usb/ohci.c @@ -205,11 +205,10 @@ static int wait_for_ed(usbdev_t *dev, ed_t *head, int pages) { /* wait for results */ - /* TODO: how long to wait? - * give 50ms per page plus another 100ms for now - * this should even work with low-speed + /* TOTEST: how long to wait? + * give 2s per TD (2 pages) plus another 2s for now */ - int timeout = pages*50 + 100; + int timeout = pages*1000 + 2000; while (((head->head_pointer & ~3) != head->tail_pointer) && !(head->head_pointer & 1) && ((((td_t*)phys_to_virt(head->head_pointer & ~3))->config @@ -363,7 +362,10 @@ ohci_control (usbdev_t *dev, direction_t dir, int drlen, void *devreq, int dalen int failure = wait_for_ed(dev, head, (dalen==0)?0:(last_page - first_page + 1)); + /* Wait some frames before and one after disabling list access. */ + mdelay(4); OHCI_INST(dev->controller)->opreg->HcControl &= ~ControlListEnable; + mdelay(1); /* free memory */ ohci_free_ed(head); @@ -464,7 +466,10 @@ ohci_bulk (endpoint_t *ep, int dalen, u8 *data, int finalize) int failure = wait_for_ed(ep->dev, head, (dalen==0)?0:(last_page - first_page + 1)); + /* Wait some frames before and one after disabling list access. */ + mdelay(4); OHCI_INST(ep->dev->controller)->opreg->HcControl &= ~BulkListEnable; + mdelay(1); ep->toggle = head->head_pointer & ED_TOGGLE; |