[U-Boot] [PATCH 3/6] usb: Remove 1 second per port timeout in usb_hub_configure()

Hans de Goede
2016-03-10T18:59:51Z

Hi,

On 10-03-16 16:50, Stefan Roese wrote:
> On complex USB infrastructures, with many hubs and therefore many
> (perhaps unconnected) ports, current U-Boot has a very long USB scanning
> time. On my current custom x86 board, this time is over 20 seconds!!!
> One of the biggest problems here is a 1 second delay (timeout) in
> usb_hub_configure() to check, if a USB device is connected to a
> port. As this is done for each port, this timeout sums up over
> all unconnected ports.
>
> This patch removes this 1 seconds per port timeout from
> usb_hub_configure().

If you look at the commit which added the delay, you will see the
need for this delay clearly documented. The USB spec gives devices
up to one second to connect after they get power, and some devices
actually use almost that entire second.

Sure what you're doing will work most of the time, but works most
of the time is not really helpful, and will just cause hard to
debug problems.

Instead what we need to do is implement parallel usb scanning,
I've done some suggestions on how to do this here:

http://lists.denx.de/pipermail/u-boot/2016-February/245243.html

Regards,

Hans

> All my USB devices are still detected correctly
> on my platform. And I'm using 4 different USB keys right now.
> Including a problematic "Intenso Alu Line" key.
>
> Here the numbers for my current board:
>
> Without this patch:
> starting USB...
> USB0: USB EHCI 1.00
> scanning bus 0 for devices... 9 USB Device(s) found
>
> time: 24.811 seconds
>
> With this patch:
> starting USB...
> USB0: USB EHCI 1.00
> scanning bus 0 for devices... 9 USB Device(s) found
>
> time: 10.822 seconds
>
> So ~14 seconds of USB scanning time reduction.
>
> Again, this timeout is only removed if CONFIG_USB_FAST_SCAN is
> defined. Once more tests are done on multiple other platforms we
> can decide to remove this timeout completely.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Stephen Warren <swarren@nvidia.com>
> Cc: Marek Vasut <marex@denx.de>
> ---
>
> common/usb_hub.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/common/usb_hub.c b/common/usb_hub.c
> index 660f4f4..780291f 100644
> --- a/common/usb_hub.c
> +++ b/common/usb_hub.c
> @@ -478,7 +478,11 @@ static int usb_hub_configure(struct usb_device *dev)
> unsigned short portstatus, portchange;
> int ret;
> ulong start = get_timer(0);
> +#if defined(CONFIG_USB_FAST_SCAN)
> + uint delay = 0;
> +#else
> uint delay = CONFIG_SYS_HZ;
> +#endif
>
> #ifdef CONFIG_SANDBOX
> if (state_get_skip_delays())
>