linux/drivers/pci/hotplug
Mika Westerberg 63aa8d8968 ACPI / hotplug / PCI: Check presence of slot itself in get_slot_status()
commit 13d3047c81 upstream.

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=198557
Reported-by: Mike Lothian <mike@fireburn.co.uk>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-04-24 09:32:06 +02:00
..
acpi_pcihp.c Merge branches 'pci/enumeration', 'pci/virtualization' and 'pci/cleanup' into next 2014-09-25 13:52:02 -06:00
acpiphp_core.c PCI: Move EXPORT_SYMBOL so it immediately follows function/variable 2014-06-10 13:36:10 -06:00
acpiphp_glue.c ACPI / hotplug / PCI: Check presence of slot itself in get_slot_status() 2018-04-24 09:32:06 +02:00
acpiphp_ibm.c PCI: Add space before open parenthesis 2014-09-24 07:43:03 -06:00
acpiphp.h ACPI / hotplug / PCI: Add hotplug contexts to PCI host bridges 2014-06-11 21:08:49 +02:00
cpci_hotplug_core.c PCI: Delete unnecessary NULL pointer checks 2014-12-26 16:28:08 -07:00
cpci_hotplug_pci.c PCI: cpcihp: Add missing curly braces in cpci_configure_slot() 2015-03-12 11:22:10 -05:00
cpci_hotplug.h PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
cpcihp_generic.c PCI: Add space before open parenthesis 2014-09-24 07:43:03 -06:00
cpcihp_zt5550.c PCI: Remove assignment from "if" conditions 2014-09-24 07:50:53 -06:00
cpcihp_zt5550.h PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
cpqphp_core.c PCI: Remove unnecessary curly braces 2014-09-24 07:49:20 -06:00
cpqphp_ctrl.c PCI: Remove unnecessary curly braces 2014-09-24 07:49:20 -06:00
cpqphp_nvram.c PCI: Remove unnecessary curly braces 2014-09-24 07:49:20 -06:00
cpqphp_nvram.h PCI: Remove "extern" from function declarations 2013-04-17 10:21:17 -06:00
cpqphp_pci.c PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
cpqphp_sysfs.c PCI: cpqphp: Remove unnecessary null test before debugfs_remove() 2014-07-07 14:53:44 -06:00
cpqphp.h PCI: Add space before open parenthesis 2014-09-24 07:43:03 -06:00
ibmphp_core.c PCI: Assign resources before drivers claim devices (pci_scan_bus()) 2015-03-12 15:04:01 -05:00
ibmphp_ebda.c PCI: Remove unnecessary curly braces 2014-09-24 07:49:20 -06:00
ibmphp_hpc.c PCI: Remove unnecessary curly braces 2014-09-24 07:49:20 -06:00
ibmphp_pci.c PCI: Remove assignment from "if" conditions 2014-09-24 07:50:53 -06:00
ibmphp_res.c PCI: Simplify if-return sequences 2014-11-10 21:08:07 -07:00
ibmphp.h PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
Kconfig PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
Makefile PCI: pciehp: Drop pointless ACPI-based "slot detection" check 2015-05-21 11:01:12 -05:00
pci_hotplug_core.c PCI: Use "slot" and "pci_slot" for struct hotplug_slot and struct pci_slot 2015-07-15 22:03:31 -05:00
pciehp_core.c PCI: pciehp: Clean up debug logging 2015-06-17 17:35:28 -05:00
pciehp_ctrl.c PCI: pciehp: Queue power work requests in dedicated function 2015-10-21 13:55:37 -05:00
pciehp_hpc.c PCI: pciehp: Remove ignored MRL sensor interrupt events 2015-08-10 14:24:09 -05:00
pciehp_pci.c PCI: pciehp: Remove pci_configure_slot() usage 2014-09-12 20:09:47 -06:00
pciehp.h PCI: pciehp: Remove ignored MRL sensor interrupt events 2015-08-10 14:24:09 -05:00
pcihp_skeleton.c PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
rpadlpar_core.c powerpc/pci/rpadlpar: Fix device reference leaks 2017-01-12 11:22:50 +01:00
rpadlpar_sysfs.c
rpadlpar.h PCI: Remove "extern" from function declarations 2013-04-17 10:21:17 -06:00
rpaphp_core.c of: Migrate of_find_node_by_name() users to for_each_node_by_name() 2014-06-26 17:12:24 +01:00
rpaphp_pci.c PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
rpaphp_slot.c PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
rpaphp.h PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
s390_pci_hpc.c s390/pci: fix kmsg component 2014-07-22 09:26:21 +02:00
sgi_hotplug.c ACPI: Introduce acpi_unload_parent_table() usages in Linux kernel 2015-01-26 16:08:49 +01:00
shpchp_core.c PCI: Merge multi-line quoted strings 2014-06-10 20:20:42 -06:00
shpchp_ctrl.c PCI: Remove assignment from "if" conditions 2014-09-24 07:50:53 -06:00
shpchp_hpc.c PCI: shpchp: Enable bridge bus mastering if MSI is enabled 2017-09-27 11:00:16 +02:00
shpchp_pci.c PCI: shpchp: Remove pci_configure_slot() usage 2014-09-12 20:09:49 -06:00
shpchp_sysfs.c PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00
shpchp.h PCI: Whitespace cleanup 2014-06-10 20:20:19 -06:00