powerpc/pci: Fix crash in PCI code on ppc64 when matching device nodes
Commit b5d937de03
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>
This commit is contained in:
Родитель
a952baa034
Коммит
90407c9976
|
@ -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 *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;
|
struct device_node *dn;
|
||||||
unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
|
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)
|
if (dn)
|
||||||
dev->dev.of_node = dn;
|
dev->dev.of_node = dn;
|
||||||
return dn;
|
return dn;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче