diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-03-03 09:27:40 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-03-26 07:21:15 +0100 |
commit | bb2cbfb2bfcc85aa480664dd9c0df9ced3775922 (patch) | |
tree | c251cd67189cd5b9c299b0436976ae9c7f1bce73 /drivers/usb | |
parent | 6d1d95a386ed0fefe100ee7e8f000216002aa356 (diff) | |
download | barebox-bb2cbfb2bfcc85aa480664dd9c0df9ced3775922.tar.gz barebox-bb2cbfb2bfcc85aa480664dd9c0df9ced3775922.tar.xz |
usb: hub: Translate USB 3.0 hub port status into old version
Adoption of U-Boot commit:
| 1commit 74ffc7cbb1d2d1f218b1bd67d1bd3cc1cba8aa79
| Author: Bin Meng <bmeng.cn@gmail.com>
| Date: Wed Jul 19 21:51:12 2017 +0800
|
| usb: hub: Translate USB 3.0 hub port status into old version
|
| USB 3.0 hub port status field has different bit positions from 2.0
| hubs. Since U-Boot only understands the old version, translate the
| new one into the old one.
|
| Since we are going to add USB 3.0 hub support, this feature is only
| available with driver model USB.
|
| Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
| Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/core/hub.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 2e702e5954..805b6b9027 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -100,9 +100,28 @@ static int usb_get_hub_status(struct usb_device *dev, void *data) static int usb_get_port_status(struct usb_device *dev, int port, void *data) { - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), + int ret; + + ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port, data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT); + if (ret < 0) + return ret; + + if (!usb_hub_is_root_hub(dev) && usb_hub_is_superspeed(dev)) { + struct usb_port_status *status = data; + u16 tmp = status->wPortStatus & USB_SS_PORT_STAT_MASK; + + if (status->wPortStatus & USB_SS_PORT_STAT_POWER) + tmp |= USB_PORT_STAT_POWER; + if ((status->wPortStatus & USB_SS_PORT_STAT_SPEED) == + USB_PORT_STAT_SPEED_5GBPS) + tmp |= USB_PORT_STAT_SUPER_SPEED; + + status->wPortStatus = tmp; + } + + return ret; } |