• D
    usb: block suspension of superspeed port while hispeed peer is active · 7ad3c470
    Dan Williams 提交于
    ClearPortFeature(PORT_POWER) on a usb3 port places the port in either a
    DSPORT.Powered-off-detect / DSPORT.Powered-off-reset loop, or the
    DSPORT.Powered-off state.  There is no way to ensure that RX
    terminations will persist in this state, so it is possible a device will
    degrade to its usb2 connection.  Prevent this by blocking power-off of a
    usb3 port while its usb2 peer is active, and powering on a usb3 port
    before its usb2 peer.
    
    By default the latency between peer power-on events is 0.  In order for
    the device to not see usb2 active while usb3 is still powering up inject
    the hub recommended power_on_good delay.  In support of satisfying the
    power_on_good delay outside of hub_power_on() refactor the places where
    the delay is consumed to call a new hub_power_on_good_delay() helper.
    
    Finally, because this introduces several new checks for whether a port
    is_superspeed, cache that disctinction at port creation so that we don't
    need to keep looking up the parent hub device.
    Acked-by: NAlan Stern <stern@rowland.harvard.edu>
    [alan]: add a 'superspeed' flag to the port
    Signed-off-by: NDan Williams <dan.j.williams@intel.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    7ad3c470
port.c 11.2 KB