• Dan Williams's avatar
    usb: find internal hub tier mismatch via acpi · 3bfd659b
    Dan Williams authored
    ACPI identifies peer ports by setting their 'group_token' and
    'group_position' _PLD data to the same value.  If a platform has tier
    mismatch [1] , ACPI can override the default (USB3 defined) peer port
    association for internal hubs.  External hubs follow the default peer
    association scheme.
    
    Location data is cached as an opaque cookie in usb_port_location data.
    
    Note that we only consider the group_token and group_position attributes
    from the _PLD data as ACPI specifies that group_token is a unique
    identifier.
    
    When we find port location data for a port then we assume that the
    firmware will also describe its peer port.  This allows the
    implementation to only ever set the peer once.  This leads to a question
    about what happens when a pm runtime event occurs while the peer
    associations are still resolving.  Since we only ever set the peer
    information once, a USB3 port needs to be prevented from suspending
    while its ->peer pointer is NULL (implemented in a subsequent patch).
    
    There is always the possibility that firmware mis-identifies the ports,
    but there is not much the kernel can do in that case.
    
    [1]: xhci 1.1 appendix D figure 131
    [2]: acpi 5 section 6.1.8
    
    [alan]: don't do default peering when acpi data present
    Suggested-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3bfd659b
usb-acpi.c 5.87 KB