
Hi Stefan,
On Thu, Jun 29, 2017 at 5:12 PM, Stefan Bruens stefan.bruens@rwth-aachen.de wrote:
On Donnerstag, 29. Juni 2017 08:13:41 CEST Stefan Roese wrote:
Hi Bin,
On 29.06.2017 07:39, Bin Meng wrote:
Hi Stefan,
On Wed, Jun 28, 2017 at 8:47 PM, Stefan Roese sr@denx.de wrote:
[...]
I am more concerned about the "USB device descriptor short read (expected 18, got 8)". This message indicates U-Boot cannot get the device descriptor during set configuration process. So did you manage to get all USB devices that are connected on your board enumerated?
Might be that I'm missing some keyboard / mouse, which I'm not using and not really aware of. One USB port is connected to a KVM switch, enumberating such devices. Here the log from U-Boot and Linux again:
=> usb reset resetting USB... USB0: Register 7000820 NbrPorts 7 Starting the controller USB XHCI 1.00 scanning bus 0 for devices... cannot reset port 1!? USB device descriptor short read (expected 18, got 8) 6 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 (480 Mb/s, 100mA)
+-3 Mass Storage (480 Mb/s, 98mA)
| USBest Technology USB Mass Storage Device 09092207fbf0c4
+-4 Hub (480 Mb/s, 2mA)
| +-6 Mass Storage (480 Mb/s, 200mA) | | JetFlash Mass Storage Device 3281440601
+-5 Vendor specific (5 Gb/s, 64mA)
Realtek USB 10/100/1000 LAN 000002000000
$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 5000M
|__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, |5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M | |__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 12M | |__ Port 1: Dev 6, If 1, Class=Human Interface Device, |Driver=usbhid, 12M |__ Port 1: Dev 6, If 2, Class=Human Interface Device, |Driver=usbhid, 12M |__ Port 1: Dev 6, If 0, Class=Human Interface Device, |Driver=usbhid, 12M | |__ Port 4: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, |480M |__ Port 5: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M | |__ Port 1: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, |480M
Which event polling Kconfig option do I need to enable?
The default one CONFIG_SYS_USB_EVENT_POLL should be OK. By comparing your U-Boot log and Linux one, I found the following devices were
enumerated by Linux but not by U-Boot: |__ Port 1: Dev 6, If 1, Class=Human Interface Device,
Driver=usbhid, 12M
|__ Port 1: Dev 6, If 2, Class=Human Interface Device,
Driver=usbhid, 12M
|__ Port 1: Dev 6, If 0, Class=Human Interface Device,
Driver=usbhid, 12M
These devices are full speed devices. I believe the reason is that U-Boot encounters "USB device descriptor short read (expected 18, got 8)" so it does not continue the enumeration. As to why these full speed devices only return 8 bytes descriptors, this needs to be investigated. Which devices are they?
This is my KVM switch with its USB keyboard and mouse. When I unplug this USB cable, this message does not appear while running "usb reset".
This also happen, when I only plug a USB mouse to this same USB port:
=> usb reset resetting USB... USB0: Register 7000820 NbrPorts 7 Starting the controller USB XHCI 1.00 scanning bus 0 for devices... USB device descriptor short read (expected 18, got 8) 5 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 Mass Storage (480 Mb/s, 98mA)
| USBest Technology USB Mass Storage Device 09092207fbf0c4
+-3 Hub (480 Mb/s, 2mA)
| +-5 Mass Storage (480 Mb/s, 200mA) | | JetFlash Mass Storage Device 3281440601
+-4 Vendor specific (5 Gb/s, 64mA) Realtek USB 10/100/1000 LAN 000002000000
$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 5000M
|__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, |5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
|__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, |12M |__ Port 2: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, |12M |__ Port 4: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M |__ Port 5: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M | |__ Port 1: Dev 5, If 0, Class=Mass Storage, Driver=usb-storage, |480M
U-Boot requests the whole USB Device descriptor, i.e. at least 18 bytes. *If* the devices bMaxPacketSize0 is 8, it will only return 8 bytes per IN transfer. If the driver fails to set the packet size according to the devices capabilities, the HC may only do one instead of multiple IN transfers, i.e. you end up with only 8 bytes.
I you look at common/usb.c, usb_setup_descriptor(...), you can see it actually only requests *at least* 8 bytes. You should verify where you descriptor request is coming from. Either it failed to query the bMaxPacketSize0, or it somehow got reset, i.e. later requests are not split into multiple IN transfers.
Thanks for your information. Actually I suspect the same thing here. I noticed the comment block in usb_setup_descriptor() before. Not like other HCs, xHC does things differently (do_read is false in that function).
Regards, Bin