Merge git://git.denx.de/u-boot-usb
authorTom Rini <trini@ti.com>
Fri, 29 Aug 2014 15:15:18 +0000 (11:15 -0400)
committerTom Rini <trini@ti.com>
Fri, 29 Aug 2014 15:15:18 +0000 (11:15 -0400)
common/usb.c
common/usb_hub.c

index 60daa100522406c0b42f2012960805e1ce8157be..bd0f8d5d180fb1a72590dd341562cea4056c4253 100644 (file)
@@ -34,7 +34,7 @@
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 #include <compiler.h>
-
+#include <errno.h>
 #include <usb.h>
 #ifdef CONFIG_4xx
 #include <asm/4xx_pci.h>
@@ -60,6 +60,7 @@ int usb_init(void)
        void *ctrl;
        struct usb_device *dev;
        int i, start_index = 0;
+       int ret;
 
        dev_index = 0;
        asynch_allowed = 1;
@@ -75,7 +76,13 @@ int usb_init(void)
        for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
                /* init low_level USB */
                printf("USB%d:   ", i);
-               if (usb_lowlevel_init(i, USB_INIT_HOST, &ctrl)) {
+               ret = usb_lowlevel_init(i, USB_INIT_HOST, &ctrl);
+               if (ret == -ENODEV) {   /* No such device. */
+                       puts("Port not available.\n");
+                       continue;
+               }
+
+               if (ret) {              /* Other error. */
                        puts("lowlevel init failed\n");
                        continue;
                }
index 2add4b97920fefedbad4d2cd04b888d294992841..c416e5e0b31790e2bc7570fd113f7b52bb2a4502 100644 (file)
@@ -209,9 +209,22 @@ int hub_port_reset(struct usb_device *dev, int port,
                      (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0,
                      (portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0);
 
-               if ((portchange & USB_PORT_STAT_C_CONNECTION) ||
-                   !(portstatus & USB_PORT_STAT_CONNECTION))
-                       return -1;
+               /*
+                * Perhaps we should check for the following here:
+                * - C_CONNECTION hasn't been set.
+                * - CONNECTION is still set.
+                *
+                * Doing so would ensure that the device is still connected
+                * to the bus, and hasn't been unplugged or replaced while the
+                * USB bus reset was going on.
+                *
+                * However, if we do that, then (at least) a San Disk Ultra
+                * USB 3.0 16GB device fails to reset on (at least) an NVIDIA
+                * Tegra Jetson TK1 board. For some reason, the device appears
+                * to briefly drop off the bus when this second bus reset is
+                * executed, yet if we retry this loop, it'll eventually come
+                * back after another reset or two.
+                */
 
                if (portstatus & USB_PORT_STAT_ENABLE)
                        break;