summaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2015-04-29 21:59:46 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-05-01 08:37:19 +0200
commit2a8bc957a7e211731b35fc9c96cc9e46558424ba (patch)
treebd852cfff0c654061444aa6600e0b9efe5c4ccfe /drivers/pci
parent92207cde490261c52cc804588561d8f3117cdf87 (diff)
downloadbarebox-2a8bc957a7e211731b35fc9c96cc9e46558424ba.tar.gz
barebox-2a8bc957a7e211731b35fc9c96cc9e46558424ba.tar.xz
PCI: register and active bridge device before proceeding to scan
The bridge device needs to be registered and activated before the scanning can proceed, as the bridge is the parent for other devices. This fixes a NULL ptr derefernce when scanning PCI hierarchies with bridges behind bridges. Signed-off-by: Lucas Stach <dev@lynxeye.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/pci.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 40e0fe7f87..470ea664e9 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -371,11 +371,15 @@ unsigned int pci_scan_bus(struct pci_bus *bus)
list_add_tail(&child_bus->node, &bus->children);
dev->subordinate = child_bus;
+ /* activate bridge device */
+ pci_register_device(dev);
+
+ /* scan pci hierarchy behind bridge */
prescan_setup_bridge(dev);
pci_scan_bus(child_bus);
postscan_setup_bridge(dev);
- /* first activate bridge then all devices on it's bus */
- pci_register_device(dev);
+
+ /* finally active all devices behind the bridge */
list_for_each_entry(dev, &child_bus->devices, bus_list)
if (!dev->subordinate)
pci_register_device(dev);