On 03/15/2016 01:59 PM, Stefan Roese wrote: > My current x86 platform (Bay Trail, not in mainline yet) has a quite > complex USB infrastructure with many USB hubs. Here the USB scan takes > an incredible huge amount of time: > > starting USB... > USB0: USB EHCI 1.00 > scanning bus 0 for devices... 9 USB Device(s) found > > time: 28.415 seconds > > This is of course not acceptable on platforms, where USB needs to get > scanned at every bootup. As this increases the bootup time of this > device by nearly 30 seconds! > > This patch series greatly reduces the USB scanning time. This is done > by multiple means: > > - Remove or reduce delays and timeouts > - Remove a 2nd reset of the USB hubs > - Change USB port timeout handling and introduce quasi parallel USB > port scanning > > As a result, the USB scanning time is greatly reduced: > > starting USB... > USB0: USB EHCI 1.00 > scanning bus 0 for devices... 9 USB Device(s) found > > time: 1.822 seconds > > As you can see, the time is reduced from 28.4 to 1.8 seconds! > > Please find more details to the changes in the patch description. > > Testing and comments welcome! > > Thanks, > Stefan > > Changes in v5: > - Removed superfluous debug output from usb_scan_port() > - Replaced usb_hub_power_on() with usb_set_port_feature() in case > of overcurrent detection. This is whats really needed here. > - Added a per-port overcurrent counter and stop re-scanning of > a device that exceeds the PORT_OVERCURRENT_MAX_SCAN_COUNT > - Moved list_del() to end of loop in usb_scan_port() > - Moved timeout / delay variables from USB dev to hub struct > as they are hub specific > - Moved state_get_skip_delays() to usb_hub_power_on() so that > the timeouts are not set there > > Changes in v4: > - Minor rewording / fixes of the commit text > - Add Acked-by / Tested-by from Hans and Stephen > - Minor rewording / fixes of the commit text > - Add Acked-by from Hans > - Moved check for query_delay into usb_scan_port() as suggested by Hans > - Correct list handling (drop INIT_LIST_HEAD) > - Added some missing free() calls > - Changed connect_timeout calculation as suggested by Stephen > - Moved usb_scan_list to other globals to be cleaned up in a later patch > - Added timeout check for non-functional ports (usb_get_port_status > return error > - Reverted if logic in loop to remove an indentation level > - Moved debug() output > - Removed unnecessary if when already connected > - Added Hans's Acked-by > - Added Stephen's Tested-by > - Minor rewording / fixes of the commit text > > Changes in v3: > - Changed small timeout from 10ms to 20ms as this results in a > much faster USB scanning time (10ms too small and 20ms enough > in many cases) > - Introduced scanning list containing all USB devices of one USB > controller that need to get scanned > - Don't delay in usb_hub_power_on(). Instead skip querying these devices > until the delay time is reached. > > Changes in v2: > - Add Acked-by / Tested-by from Hans and Stephen > - Make this change unconditional > - Add Acked-by / Tested-by from Hans and Stephen > - Make this change unconditional > - Add Tested-by from Stephen > - Remove static USB port configuration patch (for now) > > Stefan Roese (4): > usb: legacy_hub_port_reset(): Speedup hub reset handling > usb: Remove 200 ms delay in usb_hub_port_connect_change() > usb: Don't reset the USB hub a 2nd time > usb: Change power-on / scanning timeout handling > > common/usb.c | 13 +-- > common/usb_hub.c | 329 > ++++++++++++++++++++++++++++++++++++++----------------- > include/usb.h | 4 + > 3 files changed, 235 insertions(+), 111 deletions(-) > Applied to u-boot-usb/master , thanks!
-- Best regards, Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot