diff options
| author | Bin Meng <[email protected]> | 2017-07-19 21:49:58 +0800 |
|---|---|---|
| committer | Marek Vasut <[email protected]> | 2017-07-28 23:34:18 +0200 |
| commit | f34211960214290d8b38dab2fbdfb18f07582f45 (patch) | |
| tree | fcb91f8c117a19dab8b140bd7ee314099bc1f56d /common | |
| parent | f7a9e5dd03f83cf31a85eadf8666939abe47b739 (diff) | |
usb: hub: Send correct wValue to get hub descriptor of a USB 3.0 hub
Testing a USB 3.0 hub by connecting it to the xHCI port on Intel
MinnowMax, when issuing 'get hub descriptor' to the hub, xHCI
reports a transfer event TRB with a completion code 6 which means
'Stall Error'.
In fact super speed USB hub descriptor type is 0x2a, not 0x29.
Sending correct SETUP packet to the hub makes it not stall anymore.
Signed-off-by: Bin Meng <[email protected]>
Reviewed-by: Simon Glass <[email protected]>
Reviewed-by: Stefan Roese <[email protected]>
Tested-by: Stefan Roese <[email protected]>
Diffstat (limited to 'common')
| -rw-r--r-- | common/usb_hub.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/common/usb_hub.c b/common/usb_hub.c index 4fe0daa3e34..48831b56814 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -65,11 +65,21 @@ __weak void usb_hub_reset_devices(int port) return; } +static inline bool usb_hub_is_superspeed(struct usb_device *hdev) +{ + return hdev->descriptor.bDeviceProtocol == 3; +} + static int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size) { + unsigned short dtype = USB_DT_HUB; + + if (usb_hub_is_superspeed(dev)) + dtype = USB_DT_SS_HUB; + return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, - USB_DT_HUB << 8, 0, data, size, USB_CNTL_TIMEOUT); + dtype << 8, 0, data, size, USB_CNTL_TIMEOUT); } static int usb_clear_port_feature(struct usb_device *dev, int port, int feature) |
