summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-03-03 09:27:40 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-03-26 07:21:15 +0100
commitbb2cbfb2bfcc85aa480664dd9c0df9ced3775922 (patch)
treec251cd67189cd5b9c299b0436976ae9c7f1bce73 /drivers/usb
parent6d1d95a386ed0fefe100ee7e8f000216002aa356 (diff)
downloadbarebox-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.c21
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;
}