[part3,08/11] PCI: Make pci_rescan_bus_bridge_resize() use pci_scan_bridge

Submitted by Yinghai Lu on Sept. 2, 2012, 9:52 p.m.

Details

Message ID 1346622741-30799-9-git-send-email-yinghai@kernel.org
State Superseded
Headers show

Commit Message

Yinghai Lu Sept. 2, 2012, 9:52 p.m.
So after remove all children and then using setpci change bus register and
rescan bridge could use new set bus number.

Otherwise need to rescan parent bus, it would have too much overhead.

also need to use pci_bus_add_single_device to make sure new change bus have
directory /sys/../.../pci_bus.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
 drivers/pci/probe.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index d1796fe..59345ac 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1879,14 +1879,16 @@  EXPORT_SYMBOL(pci_scan_bus);
  */
 unsigned int __ref pci_rescan_bus_bridge_resize(struct pci_dev *bridge)
 {
-	unsigned int max;
-	struct pci_bus *bus = bridge->subordinate;
+	unsigned int max = 0;
+	int pass;
+	struct pci_bus *bus = bridge->bus;
 
-	max = pci_scan_child_bus(bus);
+	for (pass = 0; pass < 2; pass++)
+		max = pci_scan_bridge(bus, bridge, max, pass);
 
 	pci_assign_unassigned_bridge_resources(bridge);
 
-	pci_bus_add_devices(bus);
+	pci_bus_add_single_device(bridge);
 
 	return max;
 }