[coreboot] New patch to review for coreboot: 2541489 libpayload: Add timeouts in the UHCI USB driver

Nico Huber (nico.huber@secunet.com) gerrit at coreboot.org
Thu May 31 15:41:30 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/1073

-gerrit

commit 2541489b34e3a5d1fa4a96fdd4dfd7bcbaa92ac5
Author: Nico Huber <nico.huber at secunet.com>
Date:   Mon May 21 14:23:03 2012 +0200

    libpayload: Add timeouts in the UHCI USB driver
    
    We should always have some timeout when we wait for the hardware. This adds
    missing timeouts to the UHCI driver.
    
    Change-Id: Ic37b95ce12ff3ff5efe3e7ca346090946f6ee7de
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 payloads/libpayload/drivers/usb/uhci.c    |   15 ++++++++++-----
 payloads/libpayload/drivers/usb/uhci_rh.c |   18 ++++++++++++++----
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c
index d9a1a10..8e6c9ed 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -102,13 +102,18 @@ static void
 uhci_reset (hci_t *controller)
 {
 	/* reset */
-	uhci_reg_write16 (controller, USBCMD, 4);
-	mdelay (50);
+	uhci_reg_write16 (controller, USBCMD, 4); /* Global Reset */
+	mdelay (50); /* uhci spec 2.1.1: at least 10ms */
 	uhci_reg_write16 (controller, USBCMD, 0);
 	mdelay (10);
-	uhci_reg_write16 (controller, USBCMD, 2);
-	while ((uhci_reg_read16 (controller, USBCMD) & 2) != 0)
-		mdelay (1);
+	uhci_reg_write16 (controller, USBCMD, 2); /* Host Controller Reset */
+	/* wait for controller to finish reset */
+	/* TOTEST: how long to wait? 100ms for now */
+	int timeout = 200; /* time out after 200 * 500us == 100ms */
+	while (((uhci_reg_read16 (controller, USBCMD) & 2) != 0) && timeout--)
+		udelay (500);
+	if (timeout < 0)
+		debug ("Warning: uhci: host controller reset timed out.\n");
 
 	uhci_reg_write32 (controller, FLBASEADD,
 			  (u32) virt_to_phys (UHCI_INST (controller)->
diff --git a/payloads/libpayload/drivers/usb/uhci_rh.c b/payloads/libpayload/drivers/usb/uhci_rh.c
index 5074099..4674608 100644
--- a/payloads/libpayload/drivers/usb/uhci_rh.c
+++ b/payloads/libpayload/drivers/usb/uhci_rh.c
@@ -65,10 +65,15 @@ uhci_rh_enable_port (usbdev_t *dev, int port)
 
 	uhci_reg_write16(controller, port,
 			 uhci_reg_read16(controller, port) | 1 << 2);	/* enable */
+	/* wait for controller to enable port */
+	/* TOTEST: how long to wait? 100ms for now */
+	int timeout = 200; /* time out after 200 * 500us == 100ms */
 	do {
 		value = uhci_reg_read16 (controller, port);
-		mdelay (1);
-	} while (((value & (1 << 2)) == 0) && (value & 0x01));
+		udelay(500); timeout--;
+	} while (((value & (1 << 2)) == 0) && (value & 0x01) && timeout);
+	if (!timeout)
+		debug("Warning: uhci_rh: port enabling timed out.\n");
 }
 
 /* disable root hub */
@@ -82,10 +87,15 @@ uhci_rh_disable_port (usbdev_t *dev, int port)
 	uhci_reg_write16(controller, port,
 			 uhci_reg_read16(controller, port) & ~4);
 	int value;
+	/* wait for controller to disable port */
+	/* TOTEST: how long to wait? 100ms for now */
+	int timeout = 200; /* time out after 200 * 500us == 100ms */
 	do {
 		value = uhci_reg_read16 (controller, port);
-		mdelay (1);
-	} while ((value & (1 << 2)) != 0);
+		udelay(500); timeout--;
+	} while (((value & (1 << 2)) != 0) && timeout);
+	if (!timeout)
+		debug("Warning: uhci_rh: port disabling timed out.\n");
 }
 
 static void




More information about the coreboot mailing list