From bb1c42b92037dc3dbbb639a1140dd284e978c595 Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Mon, 21 May 2012 14:23:03 +0200 Subject: 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 Reviewed-on: http://review.coreboot.org/1073 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- payloads/libpayload/drivers/usb/uhci.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'payloads/libpayload/drivers/usb/uhci.c') diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c index 8f2321eedf..78f7aba2dc 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)-> -- cgit v1.2.3