void __init eeh_addr_cache_build(void);
 void eeh_add_device_tree_early(struct device_node *);
 void eeh_add_device_tree_late(struct pci_bus *);
+void eeh_add_sysfs_files(struct pci_bus *);
 void eeh_remove_bus_device(struct pci_dev *, int);
 
 /**
 
 static inline void eeh_add_device_tree_late(struct pci_bus *bus) { }
 
+static inline void eeh_add_sysfs_files(struct pci_bus *bus) { }
+
 static inline void eeh_remove_bus_device(struct pci_dev *dev, int purge_pe) { }
 
 static inline void eeh_lock(void) { }
 
        /* Add probed PCI devices to the device model */
        pci_bus_add_devices(phb->bus);
 
+       /* sysfs files should only be added after devices are added */
+       eeh_add_sysfs_files(phb->bus);
+
        return 0;
 }
 
 
        pcibios_allocate_bus_resources(bus);
        pcibios_claim_one_bus(bus);
 
+       /* Fixup EEH */
+       eeh_add_device_tree_late(bus);
+
        /* Add new devices to global lists.  Register in proc, sysfs. */
        pci_bus_add_devices(bus);
 
-       /* Fixup EEH */
-       eeh_add_device_tree_late(bus);
+       /* sysfs files should only be added after devices are added */
+       eeh_add_sysfs_files(bus);
 }
 EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus);
 
 
        dev->dev.archdata.edev = edev;
 
        eeh_addr_cache_insert_dev(dev);
-       eeh_sysfs_add_device(dev);
 }
 
 /**
 }
 EXPORT_SYMBOL_GPL(eeh_add_device_tree_late);
 
+/**
+ * eeh_add_sysfs_files - Add EEH sysfs files for the indicated PCI bus
+ * @bus: PCI bus
+ *
+ * This routine must be used to add EEH sysfs files for PCI
+ * devices which are attached to the indicated PCI bus. The PCI bus
+ * is added after system boot through hotplug or dlpar.
+ */
+void eeh_add_sysfs_files(struct pci_bus *bus)
+{
+       struct pci_dev *dev;
+
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               eeh_sysfs_add_device(dev);
+               if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
+                       struct pci_bus *subbus = dev->subordinate;
+                       if (subbus)
+                               eeh_add_sysfs_files(subbus);
+               }
+       }
+}
+EXPORT_SYMBOL_GPL(eeh_add_sysfs_files);
+
 /**
  * eeh_remove_device - Undo EEH setup for the indicated pci device
  * @dev: pci device to be removed