PCI_EXP_RTCTL_CRSSVE);
 }
 
+static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
+                                             unsigned int available_buses);
+
 /*
+ * pci_scan_bridge_extend() - Scan buses behind a bridge
+ * @bus: Parent bus the bridge is on
+ * @dev: Bridge itself
+ * @max: Starting subordinate number of buses behind this bridge
+ * @available_buses: Total number of buses available for this bridge and
+ *                  the devices below. After the minimal bus space has
+ *                  been allocated the remaining buses will be
+ *                  distributed equally between hotplug-capable bridges.
+ * @pass: Either %0 (scan already configured bridges) or %1 (scan bridges
+ *        that need to be reconfigured.
+ *
  * If it's a bridge, configure it and scan the bus behind it.
  * For CardBus bridges, we don't scan behind as the devices will
  * be handled by the bridge driver itself.
  * them, we proceed to assigning numbers to the remaining buses in
  * order to avoid overlaps between old and new bus numbers.
  */
-int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
+static int pci_scan_bridge_extend(struct pci_bus *bus, struct pci_dev *dev,
+                                 int max, unsigned int available_buses,
+                                 int pass)
 {
        struct pci_bus *child;
        int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
                                                bus->busn_res.end);
                }
                max++;
+               if (available_buses)
+                       available_buses--;
+
                buses = (buses & 0xff000000)
                      | ((unsigned int)(child->primary)     <<  0)
                      | ((unsigned int)(child->busn_res.start)   <<  8)
 
                if (!is_cardbus) {
                        child->bridge_ctl = bctl;
-                       max = pci_scan_child_bus(child);
+                       max = pci_scan_child_bus_extend(child, available_buses);
                } else {
                        /*
                         * For CardBus bridges, we leave 4 bus numbers
 
        return max;
 }
+
+/*
+ * pci_scan_bridge() - Scan buses behind a bridge
+ * @bus: Parent bus the bridge is on
+ * @dev: Bridge itself
+ * @max: Starting subordinate number of buses behind this bridge
+ * @pass: Either %0 (scan already configured bridges) or %1 (scan bridges
+ *        that need to be reconfigured.
+ *
+ * If it's a bridge, configure it and scan the bus behind it.
+ * For CardBus bridges, we don't scan behind as the devices will
+ * be handled by the bridge driver itself.
+ *
+ * We need to process bridges in two passes -- first we scan those
+ * already configured by the BIOS and after we are done with all of
+ * them, we proceed to assigning numbers to the remaining buses in
+ * order to avoid overlaps between old and new bus numbers.
+ */
+int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
+{
+       return pci_scan_bridge_extend(bus, dev, max, 0, pass);
+}
 EXPORT_SYMBOL(pci_scan_bridge);
 
 /*
        /* nothing to do, expected to be removed in the future */
 }
 
-unsigned int pci_scan_child_bus(struct pci_bus *bus)
+/**
+ * pci_scan_child_bus_extend() - Scan devices below a bus
+ * @bus: Bus to scan for devices
+ * @available_buses: Total number of buses available (%0 does not try to
+ *                  extend beyond the minimal)
+ *
+ * Scans devices below @bus including subordinate buses. Returns new
+ * subordinate number including all the found devices. Passing
+ * @available_buses causes the remaining bus space to be distributed
+ * equally between hotplug-capable bridges to allow future extension of the
+ * hierarchy.
+ */
+static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
+                                             unsigned int available_buses)
 {
-       unsigned int devfn, max = bus->busn_res.start;
+       unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0;
+       unsigned int start = bus->busn_res.start;
+       unsigned int devfn, cmax, max = start;
        struct pci_dev *dev;
 
        dev_dbg(&bus->dev, "scanning bus\n");
                pci_scan_slot(bus, devfn);
 
        /* Reserve buses for SR-IOV capability. */
-       max += pci_iov_bus_range(bus);
+       used_buses = pci_iov_bus_range(bus);
+       max += used_buses;
 
        /*
         * After performing arch-dependent fixup of the bus, look behind
                bus->is_added = 1;
        }
 
+       /*
+        * Calculate how many hotplug bridges and normal bridges there
+        * are on this bus. We will distribute the additional available
+        * buses between hotplug bridges.
+        */
+       for_each_pci_bridge(dev, bus) {
+               if (dev->is_hotplug_bridge)
+                       hotplug_bridges++;
+               else
+                       normal_bridges++;
+       }
+
        /*
         * Scan bridges that are already configured. We don't touch them
         * unless they are misconfigured (which will be done in the second
         * scan below).
         */
-       for_each_pci_bridge(dev, bus)
-               max = pci_scan_bridge(bus, dev, max, 0);
+       for_each_pci_bridge(dev, bus) {
+               cmax = max;
+               max = pci_scan_bridge_extend(bus, dev, max, 0, 0);
+               used_buses += cmax - max;
+       }
 
        /* Scan bridges that need to be reconfigured */
-       for_each_pci_bridge(dev, bus)
-               max = pci_scan_bridge(bus, dev, max, 1);
+       for_each_pci_bridge(dev, bus) {
+               unsigned int buses = 0;
+
+               if (!hotplug_bridges && normal_bridges == 1) {
+                       /*
+                        * There is only one bridge on the bus (upstream
+                        * port) so it gets all available buses which it
+                        * can then distribute to the possible hotplug
+                        * bridges below.
+                        */
+                       buses = available_buses;
+               } else if (dev->is_hotplug_bridge) {
+                       /*
+                        * Distribute the extra buses between hotplug
+                        * bridges if any.
+                        */
+                       buses = available_buses / hotplug_bridges;
+                       buses = min(buses, available_buses - used_buses);
+               }
+
+               cmax = max;
+               max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1);
+               used_buses += max - cmax;
+       }
 
        /*
         * Make sure a hotplug bridge has at least the minimum requested
-        * number of buses.
+        * number of buses but allow it to grow up to the maximum available
+        * bus number of there is room.
         */
-       if (bus->self && bus->self->is_hotplug_bridge && pci_hotplug_bus_size) {
-               if (max - bus->busn_res.start < pci_hotplug_bus_size - 1)
-                       max = bus->busn_res.start + pci_hotplug_bus_size - 1;
-
-               /* Do not allocate more buses than we have room left */
-               if (max > bus->busn_res.end)
-                       max = bus->busn_res.end;
+       if (bus->self && bus->self->is_hotplug_bridge) {
+               used_buses = max_t(unsigned int, available_buses,
+                                  pci_hotplug_bus_size - 1);
+               if (max - start < used_buses) {
+                       max = start + used_buses;
+
+                       /* Do not allocate more buses than we have room left */
+                       if (max > bus->busn_res.end)
+                               max = bus->busn_res.end;
+
+                       dev_dbg(&bus->dev, "%pR extended by %#02x\n",
+                               &bus->busn_res, max - start);
+               }
        }
 
        /*
        dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
        return max;
 }
+
+/**
+ * pci_scan_child_bus() - Scan devices below a bus
+ * @bus: Bus to scan for devices
+ *
+ * Scans devices below @bus including subordinate buses. Returns new
+ * subordinate number including all the found devices.
+ */
+unsigned int pci_scan_child_bus(struct pci_bus *bus)
+{
+       return pci_scan_child_bus_extend(bus, 0);
+}
 EXPORT_SYMBOL_GPL(pci_scan_child_bus);
 
 /**
 {
        struct pci_bus *parent = dev->bus;
        int busnr, start = parent->busn_res.start;
+       unsigned int available_buses = 0;
        int end = parent->busn_res.end;
 
        for (busnr = start; busnr <= end; busnr++) {
        /* Scan bridges that are already configured */
        busnr = pci_scan_bridge(parent, dev, busnr, 0);
 
+       /*
+        * Distribute the available bus numbers between hotplug-capable
+        * bridges to make extending the chain later possible.
+        */
+       available_buses = end - busnr;
+
        /* Scan bridges that need to be reconfigured */
-       pci_scan_bridge(parent, dev, busnr, 1);
+       pci_scan_bridge_extend(parent, dev, busnr, available_buses, 1);
 
        if (!dev->subordinate)
                return -1;