• Mika Westerberg's avatar
    ACPI / hotplug / PCI: Check presence of slot itself in get_slot_status() · 13d3047c
    Mika Westerberg authored
    Mike Lothian reported that plugging in a USB-C device does not work
    properly in his Dell Alienware system.  This system has an Intel Alpine
    Ridge Thunderbolt controller providing USB-C functionality.  In these
    systems the USB controller (xHCI) is hotplugged whenever a device is
    connected to the port using ACPI-based hotplug.
    
    The ACPI description of the root port in question is as follows:
    
      Device (RP01)
      {
          Name (_ADR, 0x001C0000)
    
          Device (PXSX)
          {
              Name (_ADR, 0x02)
    
              Method (_RMV, 0, NotSerialized)
              {
                  // ...
              }
          }
    
    Here _ADR 0x02 means device 0, function 2 on the bus under root port (RP01)
    but that seems to be incorrect because device 0 is the upstream port of the
    Alpine Ridge PCIe switch and it has no functions other than 0 (the bridge
    itself).  When we get ACPI Notify() to the root port resulting from
    connecting a USB-C device, Linux tries to read PCI_VENDOR_ID from device 0,
    function 2 which of course always returns 0xffffffff because there is no
    such function and we never find the device.
    
    In Windows this works fine.
    
    Now, since we get ACPI Notify() to the root port and not to the PXSX device
    we should actually start our scan from there as well and not from the
    non-existent PXSX device.  Fix this by checking presence of the slot itself
    (function 0) if we fail to do that otherwise.
    
    While there use pci_bus_read_dev_vendor_id() in get_slot_status(), which is
    the recommended way to read Device and Vendor IDs of devices on PCI buses.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=198557Reported-by: default avatarMike Lothian <mike@fireburn.co.uk>
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: stable@vger.kernel.org
    13d3047c
acpiphp_glue.c 24.6 KB