[U-Boot] [PATCH v5 0/4] usb: Reduce USB scanning time

Marek Vasut marex at denx.de
Tue Mar 15 20:53:31 CET 2016


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


More information about the U-Boot mailing list