diff options
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index f69256c63b2b..60a8e5fec6c5 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -1212,6 +1212,38 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, | |||
1212 | EXPORT_SYMBOL(pci_scan_bus_parented); | 1212 | EXPORT_SYMBOL(pci_scan_bus_parented); |
1213 | 1213 | ||
1214 | #ifdef CONFIG_HOTPLUG | 1214 | #ifdef CONFIG_HOTPLUG |
1215 | /** | ||
1216 | * pci_rescan_bus - scan a PCI bus for devices. | ||
1217 | * @bus: PCI bus to scan | ||
1218 | * | ||
1219 | * Scan a PCI bus and child buses for new devices, adds them, | ||
1220 | * and enables them. | ||
1221 | * | ||
1222 | * Returns the max number of subordinate bus discovered. | ||
1223 | */ | ||
1224 | unsigned int __devinit pci_rescan_bus(struct pci_bus *bus) | ||
1225 | { | ||
1226 | unsigned int max; | ||
1227 | struct pci_dev *dev; | ||
1228 | |||
1229 | max = pci_scan_child_bus(bus); | ||
1230 | |||
1231 | up_read(&pci_bus_sem); | ||
1232 | list_for_each_entry(dev, &bus->devices, bus_list) | ||
1233 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || | ||
1234 | dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) | ||
1235 | if (dev->subordinate) | ||
1236 | pci_bus_size_bridges(dev->subordinate); | ||
1237 | down_read(&pci_bus_sem); | ||
1238 | |||
1239 | pci_bus_assign_resources(bus); | ||
1240 | pci_enable_bridges(bus); | ||
1241 | pci_bus_add_devices(bus); | ||
1242 | |||
1243 | return max; | ||
1244 | } | ||
1245 | EXPORT_SYMBOL_GPL(pci_rescan_bus); | ||
1246 | |||
1215 | EXPORT_SYMBOL(pci_add_new_bus); | 1247 | EXPORT_SYMBOL(pci_add_new_bus); |
1216 | EXPORT_SYMBOL(pci_scan_slot); | 1248 | EXPORT_SYMBOL(pci_scan_slot); |
1217 | EXPORT_SYMBOL(pci_scan_bridge); | 1249 | EXPORT_SYMBOL(pci_scan_bridge); |