[U-Boot] [PATCH 03/14] usb: xhci: Don't assume LS/FS devices are always behind a HS hub
Stefan Roese
sr at denx.de
Fri Sep 22 04:58:40 UTC 2017
On 18.09.2017 15:40, Bin Meng wrote:
> At present xHCI driver assumes LS/FS devices are attached directly
> to a HS hub. If they are connected to a LS/FS hub, the driver will
> fail to perform the USB enumeration process on such devices.
>
> This is fixed by looking from the device itself all the way up to
> the HS hub where the TT that serves the device is located.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
> drivers/usb/host/xhci-mem.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
> index d5eab3a..84982a9 100644
> --- a/drivers/usb/host/xhci-mem.c
> +++ b/drivers/usb/host/xhci-mem.c
> @@ -786,12 +786,22 @@ void xhci_setup_addressable_virt_dev(struct xhci_ctrl *ctrl,
> #ifdef CONFIG_DM_USB
> /* Set up TT fields to support FS/LS devices */
> if (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL) {
> - dev = dev_get_parent_priv(udev->dev);
> - if (dev->speed == USB_SPEED_HIGH) {
> - hub = dev_get_uclass_priv(udev->dev);
> + struct udevice *parent = udev->dev;
> +
> + dev = udev;
> + do {
> + port_num = dev->portnr;
> + dev = dev_get_parent_priv(parent);
> + if (usb_hub_is_root_hub(dev->dev))
> + break;
> + parent = dev->dev->parent;
> + } while (dev->speed != USB_SPEED_HIGH);
> +
> + if (!usb_hub_is_root_hub(dev->dev)) {
> + hub = dev_get_uclass_priv(dev->dev);
> if (hub->tt.multi)
> slot_ctx->dev_info |= cpu_to_le32(DEV_MTT);
> - slot_ctx->tt_info |= cpu_to_le32(TT_PORT(udev->portnr));
> + slot_ctx->tt_info |= cpu_to_le32(TT_PORT(port_num));
> slot_ctx->tt_info |= cpu_to_le32(TT_SLOT(dev->slot_id));
> }
> }
>
Reviewed-by: Stefan Roese <sr at denx.de>
Tested-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
More information about the U-Boot
mailing list