diff -Nru a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c --- a/arch/ppc64/kernel/prom.c Fri Feb 13 10:22:45 2004 +++ b/arch/ppc64/kernel/prom.c Fri Feb 13 10:22:45 2004 @@ -2882,6 +2882,7 @@ int i, j, n, err = 0; unsigned int *irq; struct device_node *ic; + phandle ibm_phandle; node->name = get_property(node, "name", 0); node->type = get_property(node, "device_type", 0); @@ -2929,8 +2930,12 @@ ints = (unsigned int *) get_property(node, "interrupts", &intlen); if (!ints) { - err = -ENODEV; - goto out; + char *name = get_property(node, "name", NULL); + + /* hot-pluggable cards don't have "interrupts" */ + if (name && !strcmp(name, "pci") && !get_property(node, "built-in", NULL)) + goto fixup_pci; + goto out; } intrcells = prom_n_intr_cells(node); @@ -2943,6 +2948,11 @@ goto out; } + /* fix up new node's linux_phandle field */ + /* must be set before map_interrupt */ + if ((ibm_phandle = (unsigned int *)get_property(node, "ibm,phandle", NULL))) + node->linux_phandle = *ibm_phandle; + for (i = 0; i < intlen; ++i) { node->intrs[i].line = 0; node->intrs[i].sense = 1; @@ -2967,6 +2977,7 @@ * IOAs and slots. */ +fixup_pci: node->phb = parent->phb; regs = (u32 *)get_property(node, "reg", 0);