|
@@ -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_CONNECTION) ? 1 : 0,
|
|
(portstatus & USB_PORT_STAT_ENABLE) ? 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)
|
|
if (portstatus & USB_PORT_STAT_ENABLE)
|
|
break;
|
|
break;
|