On Tuesday, December 22, 2015 at 01:21:03 AM, Stefan Brüns wrote:
> Start split and complete split tokens need the hub address and the
> downstream port of the first HS hub (device view).
> 
> The core of the function was duplicated in both host/ehci_hcd and
> musb-new/usb-compat.h.
> 
> Signed-off-by: Stefan Brüns <stefan.bru...@rwth-aachen.de>
> Reviewed-by: Marek Vasut <ma...@denx.de>
> Reviewed-by: Hans de Goede <hdego...@redhat.com>
> Tested-by: Hans de Goede <hdego...@redhat.com>
> ---
> v2: - renamed function to usb_find_usb2_hub_address_port()
>     - put musb port numbering change into separate patch
> v3: - do one assignment per line
> v4: - fix error in musb code (udev => urb->dev)
>     - added Reviewed-by: et al
> 
>  common/usb.c                      | 56
> +++++++++++++++++++++++++++++++++++++++ drivers/usb/host/ehci-hcd.c      
> | 50 ++++------------------------------ drivers/usb/musb-new/musb_host.c 
> | 10 ++++---
>  drivers/usb/musb-new/usb-compat.h | 53
> ------------------------------------ include/usb.h                     |
> 12 +++++++++
>  5 files changed, 80 insertions(+), 101 deletions(-)
> 
> diff --git a/common/usb.c b/common/usb.c
> index b177391..9f67cc1 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -1214,4 +1214,60 @@ bool usb_device_has_child_on_port(struct usb_device
> *parent, int port) #endif
>  }
> 
> +#ifdef CONFIG_DM_USB
> +void usb_find_usb2_hub_address_port(struct usb_device *udev,
> +                            uint8_t *hub_address, uint8_t *hub_port)
> +{
> +     struct udevice *parent;
> +     struct usb_device *uparent, *ttdev;
> +
> +     /*
> +      * When called from usb-uclass.c: usb_scan_device() udev->dev points
> +      * to the parent udevice, not the actual udevice belonging to the
> +      * udev as the device is not instantiated yet. So when searching
> +      * for the first usb-2 parent start with udev->dev not
> +      * udev->dev->parent .
> +      */
> +     ttdev = udev;
> +     parent = udev->dev;
> +     uparent = dev_get_parent_priv(parent);
> +
> +     while (uparent->speed != USB_SPEED_HIGH) {
> +             struct udevice *dev = parent;
> +
> +             if (device_get_uclass_id(dev->parent) != UCLASS_USB_HUB) {
> +                     printf("Error: Cannot find high speed parent of usb-1 
device\n");
> +                     *hub_address = 0;
> +                     *hub_port = 0;
> +                     return;
> +             }
> +
> +             ttdev = dev_get_parent_priv(dev);
> +             parent = dev->parent;
> +             uparent = dev_get_parent_priv(parent);
> +     }
> +     *hub_address = uparent->devnum;
> +     *hub_port = ttdev->portnr;
> +}
> +#else
> +void usb_find_usb2_hub_address_port(struct usb_device *udev,
> +                            uint8_t *hub_address, uint8_t *hub_port)
> +{
> +     /* Find out the nearest parent which is high speed */
> +     while (udev->parent->parent != NULL)
> +             if (udev->parent->speed != USB_SPEED_HIGH) {
> +                     udev = udev->parent;
> +             } else {
> +                     *hub_address = udev->parent->devnum;
> +                     *hub_port = udev->portnr;
> +                     return;
> +             }
> +
> +     printf("Error: Cannot find high speed parent of usb-1 device\n");
> +     *hub_address = 0;
> +     *hub_port = 0;
> +}
> +#endif
> +
> +
>  /* EOF */
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index c85dbce..af025de 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -279,56 +279,16 @@ static inline u8 ehci_encode_speed(enum
> usb_device_speed speed) static void ehci_update_endpt2_dev_n_port(struct
> usb_device *udev, struct QH *qh)
>  {
> -     struct usb_device *ttdev;
> -     int parent_devnum;
> +     uint8_t portnr = 0;
> +     uint8_t hubaddr = 0;
> 
>       if (udev->speed != USB_SPEED_LOW && udev->speed != USB_SPEED_FULL)
>               return;
> 
> -     /*
> -      * For full / low speed devices we need to get the devnum and portnr of
> -      * the tt, so of the first upstream usb-2 hub, there may be usb-1 hubs
> -      * in the tree before that one!
> -      */
> -#ifdef CONFIG_DM_USB
> -     /*
> -      * When called from usb-uclass.c: usb_scan_device() udev->dev points
> -      * to the parent udevice, not the actual udevice belonging to the
> -      * udev as the device is not instantiated yet. So when searching
> -      * for the first usb-2 parent start with udev->dev not
> -      * udev->dev->parent .
> -      */
> -     struct udevice *parent;
> -     struct usb_device *uparent;
> -
> -     ttdev = udev;
> -     parent = udev->dev;
> -     uparent = dev_get_parent_priv(parent);
> -
> -     while (uparent->speed != USB_SPEED_HIGH) {
> -             struct udevice *dev = parent;
> -
> -             if (device_get_uclass_id(dev->parent) != UCLASS_USB_HUB) {
> -                     printf("ehci: Error cannot find high-speed parent of 
usb-1 device\n");
> -                     return;
> -             }
> -
> -             ttdev = dev_get_parent_priv(dev);
> -             parent = dev->parent;
> -             uparent = dev_get_parent_priv(parent);
> -     }
> -     parent_devnum = uparent->devnum;
> -#else
> -     ttdev = udev;
> -     while (ttdev->parent && ttdev->parent->speed != USB_SPEED_HIGH)
> -             ttdev = ttdev->parent;
> -     if (!ttdev->parent)
> -             return;
> -     parent_devnum = ttdev->parent->devnum;
> -#endif
> +     usb_find_usb2_hub_address_port(udev, &hubaddr, &portnr)

Please compile-test your patches, there's a missing ; .
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to