summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--payloads/libpayload/drivers/usb/uhci.c15
-rw-r--r--payloads/libpayload/drivers/usb/uhci_rh.c18
2 files changed, 24 insertions, 9 deletions
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)->
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