aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/drivers/usb/uhci_rh.c
diff options
context:
space:
mode:
authorNico Huber <nico.huber@secunet.com>2012-05-21 14:23:03 +0200
committerPatrick Georgi <patrick@georgi-clan.de>2012-06-09 13:13:08 +0200
commitbb1c42b92037dc3dbbb639a1140dd284e978c595 (patch)
treeee8d0f1e942d69ae5c4f57b08385579d012b5626 /payloads/libpayload/drivers/usb/uhci_rh.c
parentc43e736c0ccd26fbfea11c19d5140ea1cc30d90d (diff)
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>
Diffstat (limited to 'payloads/libpayload/drivers/usb/uhci_rh.c')
-rw-r--r--payloads/libpayload/drivers/usb/uhci_rh.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/payloads/libpayload/drivers/usb/uhci_rh.c b/payloads/libpayload/drivers/usb/uhci_rh.c
index 5074099255..4674608148 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