• Stefan Roese's avatar
    usb: Change power-on / scanning timeout handling · c998da0d
    Stefan Roese authored
    This patch changes the USB port scanning procedure and timeout
    handling in the following ways:
    
    a)
    The power-on delay in usb_hub_power_on() is now reduced to a value of
    max(100ms, "hub->desc.bPwrOn2PwrGood * 2"). The code does not wait
    using mdelay, instead usb_hub_power_on() will wait before querying
    the device in the scanning loop later. The total timeout for this
    hub, which is 1 second + "hub->desc.bPwrOn2PwrGood * 2" is calculated
    and will be used in the following per-port scanning loop as the timeout
    to detect active USB devices on this hub.
    
    b)
    Don't delay the minimum delay (for power to stabilize) in
    usb_hub_power_on(). Instead skip querying these devices in the scannig
    loop until the delay time is reached.
    
    c)
    The ports are now scanned in a quasi parallel way. The current code did
    wait for each (unconnected) port to reach its timeout and only then
    continue with the next port. This patch now changes this to scan all
    ports of all USB hubs quasi simultaneously. For this, all ports are added
    to a scanning list. This list is scanned until all ports are ready
    by either a) reaching the connection timeout (calculated earlier), or
    by b) detecting a USB device. This results in a faster USB scan time as
    the recursive scanning of USB hubs connected to the hub that's currently
    being scanned will start earlier.
    
    One small functional change to the original code is, that ports with
    overcurrent detection will now get rescanned multiple times
    (PORT_OVERCURRENT_MAX_SCAN_COUNT).
    
    Without this patch:
    starting USB...
    USB0:   USB EHCI 1.00
    scanning bus 0 for devices... 9 USB Device(s) found
    
    time: 20.163 seconds
    
    With this patch:
    starting USB...
    USB0:   USB EHCI 1.00
    scanning bus 0 for devices... 9 USB Device(s) found
    
    time: 1.822 seconds
    
    So ~18.3 seconds of USB scanning time reduction.
    Signed-off-by: default avatarStefan Roese <sr@denx.de>
    Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
    Tested-by: default avatarStephen Warren <swarren@nvidia.com>
    c998da0d
usb_hub.c 21 KB