This change provides some extra time for some slow (or degraded) USB devices
to become fully operational.

This code is the port to newest U-Boot of the fix from - "rayvt" (from [1]).

Links:
[1] - https://forum.doozan.com/read.php?3,35295,35295#msg-35295
[2] - 
https://www.dropbox.com/s/nrkrd1no63viuu8/uboot-bodhi-2016.05-timeoutTD.patch?dl=0

Signed-off-by: Lukasz Majewski <lu...@denx.de>
[Unfortunately, the original patch [2] did not contain S-o-B from the original
author - "rayvt"]
---

 common/usb.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/common/usb.c b/common/usb.c
index 349e838f1d..305482b5bb 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -925,14 +925,20 @@ static int get_descriptor_len(struct usb_device *dev, int 
len, int expect_len)
        __maybe_unused struct usb_device_descriptor *desc;
        ALLOC_CACHE_ALIGN_BUFFER(unsigned char, tmpbuf, USB_BUFSIZ);
        int err;
+       int retry = 5;
 
        desc = (struct usb_device_descriptor *)tmpbuf;
 
+again:
        err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, len);
        if (err < expect_len) {
                if (err < 0) {
-                       printf("unable to get device descriptor (error=%d)\n",
-                               err);
+                       printf("unable to get device descriptor (error=%d) 
retry: %d\n",
+                              err, retry);
+                       mdelay(50);
+                       if (--retry >= 0)
+                               /* Some drives are just slow to wake up. */
+                               goto again;
                        return err;
                } else {
                        printf("USB device descriptor short read (expected %i, 
got %i)\n",
-- 
2.20.1

Reply via email to