linux/drivers/pci/hotplug
Mika Westerberg a2b540651d 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>
History 2018-04-24 09:36:25 +02:00
..
acpi_pcihp.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp_core.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp_glue.c ACPI / hotplug / PCI: Check presence of slot itself in get_slot_status() 2018-04-24 09:36:25 +02:00
acpiphp_ibm.c PCI: acpiphp_ibm: Make ibm_apci_table_attr __ro_after_init 2017-01-11 14:56:02 -06:00
cpci_hotplug.h PCI: hotplug: Make core explicitly non-modular 2016-08-24 17:20:14 -05:00
cpci_hotplug_core.c sched/headers: Prepare to move signal wakeup & sigpending methods from <linux/sched.h> into <linux/sched/signal.h> 2017-03-02 08:42:32 +01:00
cpci_hotplug_pci.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpcihp_generic.c Annotate hardware config module parameters in drivers/pci/hotplug/ 2017-04-20 12:02:32 +01:00
cpcihp_zt5550.c PCI: Constify hotplug pci_device_id structures 2017-08-10 15:21:42 -05:00
cpcihp_zt5550.h PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
cpqphp.h sched/headers: Prepare to move signal wakeup & sigpending methods from <linux/sched.h> into <linux/sched/signal.h> 2017-03-02 08:42:32 +01:00
cpqphp_core.c PCI: Constify hotplug pci_device_id structures 2017-08-10 15:21:42 -05:00
cpqphp_ctrl.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_nvram.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
cpqphp_nvram.h PCI: Remove "extern" from function declarations 2013-04-17 10:21:17 -06:00
cpqphp_pci.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_sysfs.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
ibmphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
ibmphp_core.c PCI: Constify hotplug pci_device_id structures 2017-08-10 15:21:42 -05:00
ibmphp_ebda.c PCI: Constify hotplug pci_device_id structures 2017-08-10 15:21:42 -05:00
ibmphp_hpc.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_pci.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_res.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
Kconfig PCI/hotplug: PowerPC PowerNV PCI hotplug driver 2016-06-21 15:30:58 +10:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci_hotplug_core.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
pciehp.h sched/headers: Prepare to move signal wakeup & sigpending methods from <linux/sched.h> into <linux/sched/signal.h> 2017-03-02 08:42:32 +01:00
pciehp_core.c PCI: pciehp: Remove loading message 2016-12-12 10:05:24 -06:00
pciehp_ctrl.c Revert "PCI: pciehp: Add runtime PM support for PCIe hotplug ports" 2017-02-03 08:53:51 -06:00
pciehp_hpc.c PCI: pciehp: Report power fault only once until we clear it 2017-08-15 13:46:31 -05:00
pciehp_pci.c PCI: Add device disconnected state 2017-03-29 22:54:46 -05:00
pcihp_skeleton.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
pnv_php.c PCI: Convert to using %pOF instead of full_name() 2017-08-24 11:24:59 -05:00
rpadlpar.h PCI: Remove "extern" from function declarations 2013-04-17 10:21:17 -06:00
rpadlpar_core.c PCI: Convert to using %pOF instead of full_name() 2017-08-24 11:24:59 -05:00
rpadlpar_sysfs.c PCI: Constify hotplug attribute_group structures 2017-08-10 15:21:41 -05:00
rpaphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
rpaphp_core.c PCI: Convert to using %pOF instead of full_name() 2017-08-24 11:24:59 -05:00
rpaphp_pci.c PCI: Convert to using %pOF instead of full_name() 2017-08-24 11:24:59 -05:00
rpaphp_slot.c PCI: Convert to using %pOF instead of full_name() 2017-08-24 11:24:59 -05:00
s390_pci_hpc.c s390: hotplug: make pci_hpc explicitly non-modular 2016-10-31 17:55:44 +01:00
sgi_hotplug.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
shpchp.h sched/headers: Prepare to move signal wakeup & sigpending methods from <linux/sched.h> into <linux/sched/signal.h> 2017-03-02 08:42:32 +01:00
shpchp_core.c PCI: Constify hotplug pci_device_id structures 2017-08-10 15:21:42 -05: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-08-02 16:54:50 -05:00
shpchp_pci.c PCI: shpchp: Remove pci_configure_slot() usage 2014-09-12 20:09:49 -06:00
shpchp_sysfs.c PCI: Use to_pci_dev() instead of open-coding it 2016-01-08 12:05:39 -06:00