[U-Boot] [PATCH 07/16] usb: hub: Translate USB 3.0 hub port status into old version

Marek Vasut marex at denx.de
Fri Jun 23 17:59:05 UTC 2017


On 06/23/2017 11:54 AM, Bin Meng wrote:
> 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.

This is quite hairy. I'd rather see some protocol version agnostic flag
field rather than patching the wPortStatus and co.

> 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 at gmail.com>
> ---
> 
>  common/usb_hub.c | 33 ++++++++++++++++++++++++++++++++-
>  1 file changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/common/usb_hub.c b/common/usb_hub.c
> index d780251..835fac9 100644
> --- a/common/usb_hub.c
> +++ b/common/usb_hub.c
> @@ -119,9 +119,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)
>  {
> -	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_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;
>  }
>  
>  
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list