libpayload: Adjust timeouts and delays in OHCI driver
This sets the timeout for control and bulk transfers to 2s per transfer descriptor (like we set it in the EHCI driver). It also adds delays around the disabling of control and bulk list access to overcome some race conditions. Change-Id: Ia2d1db890fca51c7d9477de163d55030e0c5a04a Signed-off-by: Nico Huber <nico.huber@secunet.com> Reviewed-on: http://review.coreboot.org/1127 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
@ -205,11 +205,10 @@ static int
|
|||||||
wait_for_ed(usbdev_t *dev, ed_t *head, int pages)
|
wait_for_ed(usbdev_t *dev, ed_t *head, int pages)
|
||||||
{
|
{
|
||||||
/* wait for results */
|
/* wait for results */
|
||||||
/* TODO: how long to wait?
|
/* TOTEST: how long to wait?
|
||||||
* give 50ms per page plus another 100ms for now
|
* give 2s per TD (2 pages) plus another 2s for now
|
||||||
* this should even work with low-speed
|
|
||||||
*/
|
*/
|
||||||
int timeout = pages*50 + 100;
|
int timeout = pages*1000 + 2000;
|
||||||
while (((head->head_pointer & ~3) != head->tail_pointer) &&
|
while (((head->head_pointer & ~3) != head->tail_pointer) &&
|
||||||
!(head->head_pointer & 1) &&
|
!(head->head_pointer & 1) &&
|
||||||
((((td_t*)phys_to_virt(head->head_pointer & ~3))->config
|
((((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,
|
int failure = wait_for_ed(dev, head,
|
||||||
(dalen==0)?0:(last_page - first_page + 1));
|
(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;
|
OHCI_INST(dev->controller)->opreg->HcControl &= ~ControlListEnable;
|
||||||
|
mdelay(1);
|
||||||
|
|
||||||
/* free memory */
|
/* free memory */
|
||||||
ohci_free_ed(head);
|
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,
|
int failure = wait_for_ed(ep->dev, head,
|
||||||
(dalen==0)?0:(last_page - first_page + 1));
|
(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;
|
OHCI_INST(ep->dev->controller)->opreg->HcControl &= ~BulkListEnable;
|
||||||
|
mdelay(1);
|
||||||
|
|
||||||
ep->toggle = head->head_pointer & ED_TOGGLE;
|
ep->toggle = head->head_pointer & ED_TOGGLE;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user