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@secunet.com>
Reviewed-on: http://review.coreboot.org/1073
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c
index 8f2321e..78f7aba 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -102,13 +102,18 @@
 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)->