Skip to content
Snippets Groups Projects
Commit 74ffc7cb authored by Bin Meng's avatar Bin Meng Committed by Marek Vasut
Browse files

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: default avatarBin Meng <bmeng.cn@gmail.com>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
parent 46c1d493
No related branches found
No related tags found
No related merge requests found
...@@ -112,9 +112,40 @@ static int usb_get_hub_status(struct usb_device *dev, void *data) ...@@ -112,9 +112,40 @@ static int usb_get_hub_status(struct usb_device *dev, void *data)
int usb_get_port_status(struct usb_device *dev, int port, void *data) 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, USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,
data, sizeof(struct usb_port_status), USB_CNTL_TIMEOUT); data, sizeof(struct usb_port_status), USB_CNTL_TIMEOUT);
#ifdef CONFIG_DM_USB
if (ret < 0)
return ret;
/*
* Translate the USB 3.0 hub port status field into the old version
* that U-Boot understands. Do this only when the hub is not root hub.
* For root hub, the port status field has already been translated
* in the host controller driver (see xhci_submit_root() in xhci.c).
*
* Note: this only supports driver model.
*/
if (!usb_hub_is_root_hub(dev->dev) && usb_hub_is_superspeed(dev)) {
struct usb_port_status *status = (struct usb_port_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_SS_PORT_STAT_SPEED_5GBPS)
tmp |= USB_PORT_STAT_SUPER_SPEED;
status->wPortStatus = tmp;
}
#endif
return ret;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment