Will use it to pci_bus_bridge_scan_resize() to make bridge will
have pci_bus directory created correctly.

Signed-off-by: Yinghai Lu <[email protected]>
---
 drivers/pci/bus.c   |   39 +++++++++++++++++++++++++++++++++++++++
 include/linux/pci.h |    1 +
 2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 2882d01..950b786 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -259,6 +259,45 @@ void pci_bus_add_devices(const struct pci_bus *bus)
        }
 }
 
+void pci_bus_add_single_device(struct pci_dev *dev)
+{
+       struct pci_bus *child;
+       int retval;
+
+       /* Skip already-added devices */
+       if (!dev->is_added) {
+               retval = pci_bus_add_device(dev);
+               if (retval)
+                       dev_err(&dev->dev, "Error adding device, continuing\n");
+       }
+
+       BUG_ON(!dev->is_added);
+
+       child = dev->subordinate;
+       /*
+        * If there is an unattached subordinate bus, attach
+        * it and then scan for unattached PCI devices.
+        */
+       if (child) {
+               if (list_empty(&child->node)) {
+                       down_write(&pci_bus_sem);
+                       list_add_tail(&child->node, &dev->bus->children);
+                       up_write(&pci_bus_sem);
+               }
+               pci_bus_add_devices(child);
+
+               /*
+                * register the bus with sysfs as the parent is now
+                * properly registered.
+                */
+               if (!child->is_added) {
+                       retval = pci_bus_add_child(child);
+                       if (retval)
+                               dev_err(&dev->dev, "Error adding bus, 
continuing\n");
+               }
+       }
+}
+
 void pci_enable_bridges(struct pci_bus *bus)
 {
        struct pci_dev *dev;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index f994e93..4446448 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -700,6 +700,7 @@ void pcibios_bus_to_resource(struct pci_dev *dev, struct 
resource *res,
 void pcibios_scan_specific_bus(int busn);
 extern struct pci_bus *pci_find_bus(int domain, int busnr);
 void pci_bus_add_devices(const struct pci_bus *bus);
+void pci_bus_add_single_device(struct pci_dev *dev);
 struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
                                      struct pci_ops *ops, void *sysdata);
 struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
-- 
1.7.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to