|
@@ -2639,7 +2639,14 @@ static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
|
|
|
for_each_pci_bridge(dev, bus) {
|
|
|
cmax = max;
|
|
|
max = pci_scan_bridge_extend(bus, dev, max, 0, 0);
|
|
|
- used_buses += cmax - max;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Reserve one bus for each bridge now to avoid extending
|
|
|
+ * hotplug bridges too much during the second scan below.
|
|
|
+ */
|
|
|
+ used_buses++;
|
|
|
+ if (cmax - max > 1)
|
|
|
+ used_buses += cmax - max - 1;
|
|
|
}
|
|
|
|
|
|
/* Scan bridges that need to be reconfigured */
|
|
@@ -2662,12 +2669,14 @@ static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
|
|
|
* bridges if any.
|
|
|
*/
|
|
|
buses = available_buses / hotplug_bridges;
|
|
|
- buses = min(buses, available_buses - used_buses);
|
|
|
+ buses = min(buses, available_buses - used_buses + 1);
|
|
|
}
|
|
|
|
|
|
cmax = max;
|
|
|
max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1);
|
|
|
- used_buses += max - cmax;
|
|
|
+ /* One bus is already accounted so don't add it again */
|
|
|
+ if (max - cmax > 1)
|
|
|
+ used_buses += max - cmax - 1;
|
|
|
}
|
|
|
|
|
|
/*
|