aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2012-05-17 21:51:12 -0400
committerBjorn Helgaas <bhelgaas@google.com>2012-06-13 17:42:23 -0400
commit4d99f524234c2e772eea68ad019ec9c805991f23 (patch)
tree8a77782afe350fd9dac644468d7b6543f10520a1 /drivers/pci
parentf848ffb1043ed0d168064176fb452cc51ec8e0b7 (diff)
PCI: checking busn_res in pci_scan_root_bus()
Some callers do not supply the bus number aperture, usually because they do not know the end. In this case, we assume the aperture extends from the root bus number to bus 255, scan the bus, and shrink the bus number resource so it ends at the largest bus number we found. This is obviously not correct because the actual end of the aperture may well be larger than the largest bus number we found. But I guess it's all we have for now. Also print out one info about that, so we could find out which path does not have busn_res in resources list. [bhelgaas: changelog, _safe iterator unnecessary, use %pR format for bus] Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/probe.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 59011ce9840f..6258f6f24983 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1788,13 +1788,33 @@ void pci_bus_release_busn_res(struct pci_bus *b)
1788struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus, 1788struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
1789 struct pci_ops *ops, void *sysdata, struct list_head *resources) 1789 struct pci_ops *ops, void *sysdata, struct list_head *resources)
1790{ 1790{
1791 struct pci_host_bridge_window *window;
1792 bool found = false;
1791 struct pci_bus *b; 1793 struct pci_bus *b;
1794 int max;
1795
1796 list_for_each_entry(window, resources, list)
1797 if (window->res->flags & IORESOURCE_BUS) {
1798 found = true;
1799 break;
1800 }
1792 1801
1793 b = pci_create_root_bus(parent, bus, ops, sysdata, resources); 1802 b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
1794 if (!b) 1803 if (!b)
1795 return NULL; 1804 return NULL;
1796 1805
1797 b->busn_res.end = pci_scan_child_bus(b); 1806 if (!found) {
1807 dev_info(&b->dev,
1808 "No busn resource found for root bus, will use [bus %02x-ff]\n",
1809 bus);
1810 pci_bus_insert_busn_res(b, bus, 255);
1811 }
1812
1813 max = pci_scan_child_bus(b);
1814
1815 if (!found)
1816 pci_bus_update_busn_res_end(b, max);
1817
1798 pci_bus_add_devices(b); 1818 pci_bus_add_devices(b);
1799 return b; 1819 return b;
1800} 1820}