On 06/23/2017 11:54 AM, Bin Meng wrote:
> xHCI spec says: the values of the 'route string' field shall be
> initialized by the first 'Address Device' command issued to a
> device slot, and shall not be modified by any other command.
> 
> So far U-Boot does not program this field, and it does not prevent
> SS device directly attached to root port, or HS device behind an HS
> hub, from working, due to the fact that 'route string' is used by
> the xHC to target SS packets. But in order to enumerate devices
> behind an SS hub, this field must be programmed.
> 
> With this commit and along with previous commits, now SS & HS devices
> attached to a USB 3.0 hub can be enumerated by U-Boot.
> 
> As usual, this new feature is only available when DM is on.

Great, but I really dislike the ifdef pollution, so this needs to be
sorted out.

> Signed-off-by: Bin Meng <bmeng...@gmail.com>
> 
> ---
> Test logs: two USB 3.0 hubs (one tier2, one tier3)
> => usb tree
> USB device tree:
>   1  Hub (5 Gb/s, 0mA)
>   |  U-Boot XHCI Host Controller
>   |
>   +-2  Hub (5 Gb/s, 0mA)
>   | |  GenesysLogic USB3.0 Hub
>   | |
>   | +-4  Hub (5 Gb/s, 0mA)
>   | | |  VIA Labs, Inc.          USB3.0 Hub
>   | | |
>   | | +-7  Mass Storage (5 Gb/s, 76mA)
>   | |      JetFlash Mass Storage Device 16Q6ZPH20GF3E8UQ
>   | |
>   | +-8  Vendor specific (5 Gb/s, 36mA)
>   |      Realtek USB 10/100/1000 LAN 00E04C680977
>   |
>   +-3  Hub (480 Mb/s, 100mA)
>     |  GenesysLogic USB2.0 Hub
>     |
>     +-5  Mass Storage (480 Mb/s, 200mA)
>     |    Netac OnlyDisk FF00ECB60800FFFF1526
>     |
>     +-6  Hub (480 Mb/s, 0mA)
>          VIA Labs, Inc.          USB2.0 Hub
> 
>  drivers/usb/host/xhci-mem.c | 20 +++++++++++++++++++-
>  1 file changed, 19 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
> index 9aa3092..03874db 100644
> --- a/drivers/usb/host/xhci-mem.c
> +++ b/drivers/usb/host/xhci-mem.c
> @@ -723,6 +723,9 @@ void xhci_setup_addressable_virt_dev(struct xhci_ctrl 
> *ctrl,
>       u64 trb_64 = 0;
>       int slot_id = udev->slot_id;
>       int speed = udev->speed;
> +     int route = 0;
> +     struct usb_device *dev = udev;
> +     struct usb_hub_device *hub;
>  
>       virt_dev = ctrl->devs[slot_id];
>  
> @@ -733,7 +736,22 @@ void xhci_setup_addressable_virt_dev(struct xhci_ctrl 
> *ctrl,
>       slot_ctx = xhci_get_slot_ctx(ctrl, virt_dev->in_ctx);
>  
>       /* Only the control endpoint is valid - one endpoint context */
> -     slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1) | 0);
> +     slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1));
> +
> +#ifdef CONFIG_DM_USB
> +     /* Calculate the route string for this device */
> +     port_num = dev->portnr;
> +     while (!usb_hub_is_root_hub(dev->dev)) {
> +             hub = dev_get_uclass_priv(dev->dev);
> +             route |= port_num << (hub->hub_depth * 4);
> +             dev = dev_get_parent_priv(dev->dev);
> +             port_num = dev->portnr;
> +             dev = dev_get_parent_priv(dev->dev->parent);
> +     }
> +
> +     debug("hub (%p) route string %x\n", udev, route);
> +#endif
> +     slot_ctx->dev_info |= route;
>  
>       switch (speed) {
>       case USB_SPEED_SUPER:
> 


-- 
Best regards,
Marek Vasut
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to