|
@@ -71,7 +71,7 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * add a single device
|
|
|
+ * pci_bus_add_device - add a single device
|
|
|
* @dev: device to add
|
|
|
*
|
|
|
* This adds a single pci device to the global
|
|
@@ -105,7 +105,7 @@ int pci_bus_add_device(struct pci_dev *dev)
|
|
|
void pci_bus_add_devices(struct pci_bus *bus)
|
|
|
{
|
|
|
struct pci_dev *dev;
|
|
|
- struct pci_bus *child_bus;
|
|
|
+ struct pci_bus *child;
|
|
|
int retval;
|
|
|
|
|
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
|
@@ -120,39 +120,40 @@ void pci_bus_add_devices(struct pci_bus *bus)
|
|
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
|
|
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 (dev->subordinate) {
|
|
|
- if (list_empty(&dev->subordinate->node)) {
|
|
|
- down_write(&pci_bus_sem);
|
|
|
- list_add_tail(&dev->subordinate->node,
|
|
|
- &dev->bus->children);
|
|
|
- up_write(&pci_bus_sem);
|
|
|
- }
|
|
|
- pci_bus_add_devices(dev->subordinate);
|
|
|
-
|
|
|
- /* register the bus with sysfs as the parent is now
|
|
|
- * properly registered. */
|
|
|
- child_bus = dev->subordinate;
|
|
|
- if (child_bus->is_added)
|
|
|
- continue;
|
|
|
- child_bus->dev.parent = child_bus->bridge;
|
|
|
- retval = device_register(&child_bus->dev);
|
|
|
- if (retval)
|
|
|
- dev_err(&dev->dev, "Error registering pci_bus,"
|
|
|
- " continuing...\n");
|
|
|
- else {
|
|
|
- child_bus->is_added = 1;
|
|
|
- retval = device_create_file(&child_bus->dev,
|
|
|
- &dev_attr_cpuaffinity);
|
|
|
- }
|
|
|
+ if (!child)
|
|
|
+ continue;
|
|
|
+ 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)
|
|
|
+ continue;
|
|
|
+ child->dev.parent = child->bridge;
|
|
|
+ retval = device_register(&child->dev);
|
|
|
+ if (retval)
|
|
|
+ dev_err(&dev->dev, "Error registering pci_bus,"
|
|
|
+ " continuing...\n");
|
|
|
+ else {
|
|
|
+ child->is_added = 1;
|
|
|
+ retval = device_create_file(&child->dev,
|
|
|
+ &dev_attr_cpuaffinity);
|
|
|
if (retval)
|
|
|
dev_err(&dev->dev, "Error creating cpuaffinity"
|
|
|
" file, continuing...\n");
|
|
|
|
|
|
- retval = device_create_file(&child_bus->dev,
|
|
|
+ retval = device_create_file(&child->dev,
|
|
|
&dev_attr_cpulistaffinity);
|
|
|
if (retval)
|
|
|
dev_err(&dev->dev,
|