[U-Boot] [xHCI] Controller failure with USB 3.0 hub

Marek Vasut marek.vasut at gmail.com
Sat May 19 01:03:02 UTC 2018


Hello Bin,

I noticed a potential bug in the U-Boot xHCI implementation. I observe
this one Renesas RCar Gen3 platform.

If I plug a USB 3.0 hub into the root port, I see the following error:
  ERROR: Configure Endpoint command returned completion code 5.
If I plug a USB 3.0 stick into the root port, I do not get the error and
the stick is correctly detected.

Example with the USB 3.0 hub:

=> usb reset
resetting USB...
USB0:   Register 2000120 NbrPorts 2
Starting the controller
USB XHCI 1.00
USB1:   USB EHCI 1.10
USB2:   USB EHCI 1.10
USB3:   USB EHCI 1.10
******** HERE ********
scanning bus 0 for devices... ERROR: Configure Endpoint command returned
completion code 5.
******** HERE ********
1 USB Device(s) found
scanning bus 1 for devices... 1 USB Device(s) found
scanning bus 2 for devices... 1 USB Device(s) found
scanning bus 3 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
=> usb tree
USB device tree:
  1  Hub (5 Gb/s, 0mA)
     U-Boot XHCI Host Controller

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

If I revert d228ca362b though, the setup starts working fine. In fact,
if I just commend out xhci_update_hub_device() in xhci_usb_ops , it
works fine as well.

Moreover, if I use the following patch, it works fine too:

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 3adb0028f2..bd393d92bb 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1453,7 +1453,7 @@ static int xhci_update_hub_device(struct udevice
*dev, struct usb_device *udev)
        if (udev->speed == USB_SPEED_HIGH)
                slot_ctx->tt_info |= cpu_to_le32(TT_THINK_TIME(think_time));

-       return xhci_configure_endpoints(udev, false);
+       return xhci_configure_endpoints(udev, true);
 }

 static int xhci_get_max_xfer_size(struct udevice *dev, size_t *size)

That is:

=> usb reset
resetting USB...
USB0:   Register 2000120 NbrPorts 2
Starting the controller
USB XHCI 1.00
USB1:   USB EHCI 1.10
USB2:   USB EHCI 1.10
USB3:   USB EHCI 1.10
scanning bus 0 for devices... 5 USB Device(s) found
scanning bus 1 for devices... 1 USB Device(s) found
scanning bus 2 for devices... 1 USB Device(s) found
scanning bus 3 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 2 Storage Device(s) found
=> usb tree
USB device tree:
  1  Hub (5 Gb/s, 0mA)
  |  U-Boot XHCI Host Controller
  |
  +-2  Hub (5 Gb/s, 2mA)
  | |  VIA Labs, Inc. 4-Port USB 3.0 Hub
  | |
  | +-4  Mass Storage (5 Gb/s, 224mA)
  |      SanDisk Ultra 4C530001110620109113
  |
  +-3  Hub (480 Mb/s, 100mA)
    |   USB2.0 Hub
    |
    +-5  Mass Storage (480 Mb/s, 200mA)
                  USB FLASH DRIVE  195A06010623

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

  1  Hub (480 Mb/s, 0mA)
     u-boot EHCI Host Controller

Do you have an explanation for me ?
-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list