[SPARC64]: Fix pci_intmap_match().
authorDavid S. Miller <davem@sunset.davemloft.net>
Wed, 15 Feb 2006 09:19:56 +0000 (01:19 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 20 Mar 2006 09:13:03 +0000 (01:13 -0800)
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>
arch/sparc64/kernel/pci_common.c

index b2d21b11a2328be1edddb2ee82e394867a951040..ab6a2e1b76fbfd229e09c1faa351b5ee97230271 100644 (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 {