[coreboot] New patch to review for coreboot: 8f0e148 libpayload: Adjust timeouts and delays in OHCI driver

Nico Huber (nico.huber@secunet.com) gerrit at coreboot.org
Wed Jun 20 17:36:48 CEST 2012


Nico Huber (nico.huber at secunet.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1127

-gerrit

commit 8f0e148abe2490e677ed5f3ac588aea860c29c44
Author: Nico Huber <nico.huber at secunet.com>
Date:   Tue Jun 19 10:27:00 2012 +0200

    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 at secunet.com>
---
 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 6d98cc1..105f601 100644
--- a/payloads/libpayload/drivers/usb/ohci.c
+++ b/payloads/libpayload/drivers/usb/ohci.c
@@ -203,11 +203,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
@@ -361,7 +360,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);
@@ -462,7 +464,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;
 




More information about the coreboot mailing list