[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>
This commit is contained in:
David S. Miller 2006-02-15 01:19:56 -08:00
parent ab66a50e31
commit 63c2a0e598
1 changed files with 10 additions and 3 deletions

View File

@ -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 {