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 <s...@denx.de>
Cc: Simon Glass <s...@chromium.org>
Cc: Hans de Goede <hdego...@redhat.com>
Cc: Stephen Warren <swar...@nvidia.com>
Cc: Marek Vasut <ma...@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())
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot