Patchwork [RFC,25/30] ACPI / hotplug / PCI: Allow slots without new devices to be rescanned

mail settings
Submitter Rafael J. Wysocki
Date July 12, 2013, 12:03 a.m.
Message ID <4646223.5BGkX74cI8@vostro.rjw.lan>
Download mbox | patch
Permalink /patch/258667/
State Not Applicable
Headers show


Rafael J. Wysocki - July 12, 2013, 12:03 a.m.
From: Kirill A. Shutemov <>

Currently, enable_device() checks the return value of pci_scan_slot()
and returns immediately if that's 0 (meaning that no new functions
have been found in the slot).  However, if one of the functions in
the slot is a bridge, some new devices may appear below it even if
the bridge itself is present continuously, so it generally is
necessary to do the rescan anyway just in case.  [In particular,
that's necessary with the Thunderbolt daisy chaining in which case
new devices may be connected to the existing ones down the chain.]

The correctness of this change relies on the ability of
pcibios_resource_survey_bus() to detect if it has already been called
for the given bus and to skip it if so.  Failure to do that will lead
to resource allocation conflicts.

[rjw: Changelog]
Signed-off-by: Kirill A. Shutemov <>
Signed-off-by: Mika Westerberg <>
Signed-off-by: Rafael J. Wysocki <>
drivers/pci/hotplug/acpiphp_glue.c | 11 ++---------
 drivers/pci/hotplug/acpiphp_glue.c |   11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to
More majordomo info at


Index: linux-pm/drivers/pci/hotplug/acpiphp_glue.c
--- linux-pm.orig/drivers/pci/hotplug/acpiphp_glue.c
+++ linux-pm/drivers/pci/hotplug/acpiphp_glue.c
@@ -554,18 +554,13 @@  static int __ref enable_device(struct ac
 	struct pci_dev *dev;
 	struct pci_bus *bus = slot->bus;
 	struct acpiphp_func *func;
-	int num, max, pass;
+	int max, pass;
 	list_for_each_entry(func, &slot->funcs, sibling)
-	num = pci_scan_slot(bus, PCI_DEVFN(slot->device, 0));
-	if (num == 0) {
-		/* Maybe only part of funcs are added. */
-		dbg("No new device found\n");
-		goto err_exit;
-	}
+	pci_scan_slot(bus, PCI_DEVFN(slot->device, 0));
 	max = acpiphp_max_busnr(bus);
 	for (pass = 0; pass < 2; pass++) {
@@ -611,8 +606,6 @@  static int __ref enable_device(struct ac
- err_exit:
 	return 0;