Commit d78fdd8a authored by David S. Miller's avatar David S. Miller Committed by Greg Kroah-Hartman

sparc64: Fix disappearing PCI devices on e3500.

[ Upstream commit 7ee766d8 ]

Based upon a bug report by Meelis Roos.

The OF device layer builds properties by matching bus types and
applying 'range' properties as appropriate, up to the root.

The match for "PCI" busses is looking at the 'device_type' property,
and this does work %99 of the time.

But on an E3500 system with a PCI QFE card, the DEC 21153 bridge
sitting above the QFE network interface devices has a 'name' of "pci",
but it completely lacks a 'device_type' property.  So we don't match
it as a PCI bus, and subsequently we end up with no resource values at
all for the devices sitting under that DEC bridge.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 28a65ba6
...@@ -170,7 +170,7 @@ static unsigned int of_bus_default_get_flags(const u32 *addr) ...@@ -170,7 +170,7 @@ static unsigned int of_bus_default_get_flags(const u32 *addr)
static int of_bus_pci_match(struct device_node *np) static int of_bus_pci_match(struct device_node *np)
{ {
if (!strcmp(np->type, "pci") || !strcmp(np->type, "pciex")) { if (!strcmp(np->name, "pci")) {
const char *model = of_get_property(np, "model", NULL); const char *model = of_get_property(np, "model", NULL);
if (model && !strcmp(model, "SUNW,simba")) if (model && !strcmp(model, "SUNW,simba"))
...@@ -201,7 +201,7 @@ static int of_bus_simba_match(struct device_node *np) ...@@ -201,7 +201,7 @@ static int of_bus_simba_match(struct device_node *np)
/* Treat PCI busses lacking ranges property just like /* Treat PCI busses lacking ranges property just like
* simba. * simba.
*/ */
if (!strcmp(np->type, "pci") || !strcmp(np->type, "pciex")) { if (!strcmp(np->name, "pci")) {
if (!of_find_property(np, "ranges", NULL)) if (!of_find_property(np, "ranges", NULL))
return 1; return 1;
} }
...@@ -426,7 +426,7 @@ static int __init use_1to1_mapping(struct device_node *pp) ...@@ -426,7 +426,7 @@ static int __init use_1to1_mapping(struct device_node *pp)
* it lacks a ranges property, and this will include * it lacks a ranges property, and this will include
* cases like Simba. * cases like Simba.
*/ */
if (!strcmp(pp->type, "pci") || !strcmp(pp->type, "pciex")) if (!strcmp(pp->name, "pci"))
return 0; return 0;
return 1; return 1;
...@@ -709,8 +709,7 @@ static unsigned int __init build_one_device_irq(struct of_device *op, ...@@ -709,8 +709,7 @@ static unsigned int __init build_one_device_irq(struct of_device *op,
break; break;
} }
} else { } else {
if (!strcmp(pp->type, "pci") || if (!strcmp(pp->name, "pci")) {
!strcmp(pp->type, "pciex")) {
unsigned int this_orig_irq = irq; unsigned int this_orig_irq = irq;
irq = pci_irq_swizzle(dp, pp, irq); irq = pci_irq_swizzle(dp, pp, irq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment