14105717bc98ba01663ff28f8a16d8716ba9d07feSam Ravnborg/* Core PCI functionality used only by PCI hotplug */
24105717bc98ba01663ff28f8a16d8716ba9d07feSam Ravnborg
34105717bc98ba01663ff28f8a16d8716ba9d07feSam Ravnborg#include <linux/pci.h>
4363c75db1d7bbda0aa90e680565f2673bab92ee4Paul Gortmaker#include <linux/export.h>
54105717bc98ba01663ff28f8a16d8716ba9d07feSam Ravnborg#include "pci.h"
64105717bc98ba01663ff28f8a16d8716ba9d07feSam Ravnborg
710874f5a00266343a06e95da680e8a5a383d9a80Bjorn Helgaasint pci_hp_add_bridge(struct pci_dev *dev)
8a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu{
9a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	struct pci_bus *parent = dev->bus;
10a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	int pass, busnr, start = parent->busn_res.start;
11a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	int end = parent->busn_res.end;
12a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu
13a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	for (busnr = start; busnr <= end; busnr++) {
14a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu		if (!pci_find_bus(pci_domain_nr(parent), busnr))
15a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu			break;
16a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	}
17a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	if (busnr-- > end) {
18a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu		printk(KERN_ERR "No bus number available for hot-added bridge %s\n",
19a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu				pci_name(dev));
20a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu		return -1;
21a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	}
22a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	for (pass = 0; pass < 2; pass++)
23a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu		busnr = pci_scan_bridge(parent, dev, busnr, pass);
24a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	if (!dev->subordinate)
25a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu		return -1;
26a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu
27a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu	return 0;
28a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai Lu}
29a8e4b9c101ae58cc64cda0201229d3318701a7f0Yinghai LuEXPORT_SYMBOL_GPL(pci_hp_add_bridge);
30