powerpc/pci: Fix crash in PCI code on ppc64 when matching device nodes
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 20 Mar 2011 23:57:57 +0000 (10:57 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 20 Mar 2011 23:57:57 +0000 (10:57 +1100)
Commit b5d937de0367d26f65b9af1aef5f2c34c1939be0 has a bug which causes
basically a NULL dereference in the PCI code during boot on ppc64
machines.

fetch_dev_dn() is called when dev->dev.of_node is NULL, so using that
as the starting point for the search makes no sense. It should instead
start from the device node of the PHB.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/pci_dn.c

index 29852688ceaaae7f6f9c09cbc7e3f6350ee8170f..d225d99fe39d8f076ee637377a43692024c39232 100644 (file)
@@ -176,11 +176,14 @@ static void *is_devfn_node(struct device_node *dn, void *data)
  */
 struct device_node *fetch_dev_dn(struct pci_dev *dev)
 {
-       struct device_node *orig_dn = dev->dev.of_node;
+       struct pci_controller *phb = dev->sysdata;
        struct device_node *dn;
        unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
 
-       dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval);
+       if (WARN_ON(!phb))
+               return NULL;
+
+       dn = traverse_pci_devices(phb->dn, is_devfn_node, (void *)searchval);
        if (dn)
                dev->dev.of_node = dn;
        return dn;