From patchwork Thu Dec 6 06:30:40 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [U-Boot,resend] usbh/ehci: Increase timeout for enumeration Date: Wed, 05 Dec 2012 20:30:40 -0000 From: Vipin Kumar X-Patchwork-Id: 204143 Message-Id: <6d67e42f17927a93540ee2c37364b9c85c2a2b06.1354775426.git.vipin.kumar@st.com> To: , Cc: spear-devel@list.st.com Few pen drives take longer than usual for enumeration. The u-boot unlike linux does not depend on interrupts and works in polling and timeout mode. This patch increases this timeout to increase the set of usb sticks that can be enumerated by u-boot Signed-off-by: Vipin Kumar --- common/usb_hub.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/common/usb_hub.c b/common/usb_hub.c index e4a1201..24de9b7 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -393,17 +393,34 @@ static int usb_hub_configure(struct usb_device *dev) "" : "no "); usb_hub_power_on(hub); + mdelay(1500); + for (i = 0; i < dev->maxchild; i++) { ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1); unsigned short portstatus, portchange; + int ret; + ulong start = get_timer(0); + + do { + ret = usb_get_port_status(dev, i + 1, portsts); + if (ret < 0) { + USB_HUB_PRINTF("get_port_status failed\n"); + break; + } + + portstatus = le16_to_cpu(portsts->wPortStatus); + portchange = le16_to_cpu(portsts->wPortChange); + + if ((portchange & USB_PORT_STAT_C_CONNECTION) && + (portstatus & USB_PORT_STAT_CONNECTION)) + break; - if (usb_get_port_status(dev, i + 1, portsts) < 0) { - USB_HUB_PRINTF("get_port_status failed\n"); + mdelay(100); + } while (get_timer(start) < CONFIG_SYS_HZ * 10); + + if (ret < 0) continue; - } - portstatus = le16_to_cpu(portsts->wPortStatus); - portchange = le16_to_cpu(portsts->wPortChange); USB_HUB_PRINTF("Port %d Status %X Change %X\n", i + 1, portstatus, portchange);