• Lukas Wunner's avatar
    PCI: pciehp: Tolerate Presence Detect hardwired to zero · 80696f99
    Lukas Wunner authored
    The WiGig Bus Extension (WBE) specification allows tunneling PCIe over
    IEEE 802.11.  A product implementing this spec is the wil6210 from
    Wilocity (now part of Qualcomm Atheros).  It integrates a PCIe switch
    with a wireless network adapter:
    
      00.0-+              [1ae9:0101]  Upstream Port
           +-00.0-+       [1ae9:0200]  Downstream Port
           |      +-00.0  [168c:0034]  Atheros AR9462 Wireless Network Adapter
           +-02.0         [1ae9:0201]  Downstream Port
           +-03.0         [1ae9:0201]  Downstream Port
    
    Wirelessly attached devices presumably appear below the hotplug ports
    with device ID [1ae9:0201].  Oddly, the Downstream Port [1ae9:0200]
    leading to the wireless network adapter is likewise Hotplug Capable,
    but has its Presence Detect State bit hardwired to zero.  Even if the
    Link Active bit is set, Presence Detect is zero, so this cannot be
    caused by in-band presence detection but only by broken hardware.
    
    pciehp assumes an empty slot if Presence Detect State is zero,
    regardless of Link Active being one.  Consequently, up until v4.18 it
    removes the wireless network adapter in pciehp_resume().  From v4.19 it
    already does so in pciehp_probe().
    
    Be lenient towards broken hardware and assume the slot is occupied if
    Link Active is set:  Introduce pciehp_card_present_or_link_active()
    and use it in lieu of pciehp_get_adapter_status() everywhere, except
    in pciehp_handle_presence_or_link_change() whose log messages depend
    on which of Presence Detect State or Link Active is set.
    
    Remove the Presence Detect State check from __pciehp_enable_slot()
    because it is only called if either of Presence Detect State or Link
    Active is set.
    
    Caution: There is a possibility that broken hardware exists which has
    working Presence Detect but hardwires Link Active to one.  On such
    hardware the slot will now incorrectly be considered always occupied.
    If such hardware is discovered, this commit can be rolled back and a
    quirk can be added which sets is_hotplug_bridge = 0 for [1ae9:0200].
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=200839Reported-and-tested-by: default avatarDavid Yang <mmyangfl@gmail.com>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Cc: Rajat Jain <rajatja@google.com>
    Cc: Ashok Raj <ashok.raj@intel.com>
    80696f99
pciehp_hpc.c 25.5 KB