summaryrefslogtreecommitdiff
path: root/arch/sparc64/kernel/pci_common.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-15 01:19:56 -0800
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 01:13:03 -0800
commit63c2a0e598c2fa769a08a6e9ad124bf270b4436e (patch)
tree3e3a0c8a68221b4a76489ad595d0b886e2683dd9 /arch/sparc64/kernel/pci_common.c
parentab66a50e31deb48b0444c248e67e5aa3217efda5 (diff)
downloadlwn-63c2a0e598c2fa769a08a6e9ad124bf270b4436e.tar.gz
lwn-63c2a0e598c2fa769a08a6e9ad124bf270b4436e.zip
[SPARC64]: Fix pci_intmap_match().
When crawling up the PCI bus chain, stop at the first node that has an interrupt-map property before we hit the root. Also, if we use a bus interrupt-{map,mask} do not forget to update the 'intmask' pointer as we do for the 'intmap' pointer. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/pci_common.c')
-rw-r--r--arch/sparc64/kernel/pci_common.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/pci_common.c b/arch/sparc64/kernel/pci_common.c
index b2d21b11a232..ab6a2e1b76fb 100644
--- a/arch/sparc64/kernel/pci_common.c
+++ b/arch/sparc64/kernel/pci_common.c
@@ -581,18 +581,23 @@ static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt
int plen;
bus_dev = pdev->bus->self;
+ bus_pcp = bus_dev->sysdata;
regs_dev = pdev;
+ regs_pcp = regs_dev->sysdata;
while (bus_dev->bus &&
- bus_dev->bus->number != pbm->pci_first_busno) {
+ bus_dev->bus->number != pbm->pci_first_busno &&
+ prom_getproplen(bus_pcp->prom_node,
+ "interrupt-map") <= 0) {
regs_dev = bus_dev;
+ regs_pcp = regs_dev->sysdata;
+
bus_dev = bus_dev->bus->self;
+ bus_pcp = bus_dev->sysdata;
}
- regs_pcp = regs_dev->sysdata;
pregs = regs_pcp->prom_regs;
- bus_pcp = bus_dev->sysdata;
/* But if the PCI bridge has it's own interrupt map
* and mask properties, use that and the regs of the
@@ -616,6 +621,8 @@ static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt
return 0;
}
+ intmask = &bridge_local_intmask;
+
if (pdev->bus->self != bus_dev)
map_slot = 1;
} else {