• Sarah Sharp's avatar
    xhci: Add infrastructure for host-specific LPM policies. · 3b3db026
    Sarah Sharp authored
    The choice of U1 and U2 timeouts for USB 3.0 Link Power Management (LPM)
    is highly host controller specific.  Here are a few examples of why it's
    host specific:
    
     1. Setting the U1/U2 timeout too short may cause the link to go into
        U1/U2 in between service intervals, which some hosts may tolerate,
        and some may not.
    
     2. The host controller has to modify its bus schedule in order to take
        into account the Maximum Exit Latency (MEL) to bring all the links
        from the host to the device into U0.  If the MEL is too big, and it
        takes too long to bring the links into an active state, the host
        controller may not be able to service periodic endpoints in time.
    
     3. Host controllers may also have scheduling limitations that force
        them to disable U1 or U2 if a USB device is behind too many tiers of
        hubs.
    
    We could take an educated guess at what U1/U2 timeouts may work for a
    particular host controller.  However, that would result in a binary
    search on every new configuration or alt setting installation, with
    multiple failed Evaluate Context commands.  Worse, the host may blindly
    accept the timeouts and just fail to update its schedule for U1/U2 exit
    latencies, which could result in randomly delayed periodic transfers.
    
    Since we don't want to cause jitter in periodic transfers, or delay
    config/alt setting changes too much, lay down a framework that xHCI
    vendors can extend in order to add their own U1/U2 timeout policies.
    
    To extend the framework, they will need to:
    
     - Modify the PCI init code to add a new xhci->quirk for their host, and
       set the XHCI_LPM_SUPPORT quirk flag.
     - Add their own vendor-specific hooks, like the ones that will be added
       in xhci_call_host_update_timeout_for_endpoint() and
       xhci_check_tier_policy()
     - Make the LPM enable/disable methods call those functions based on the
       xhci->quirk for their host.
    
    An example will be provided for the Intel xHCI host controller in the
    next patch.
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    3b3db026
xhci.c 132 KB