Explorar el Código

[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>
David S. Miller hace 19 años
padre
commit
63c2a0e598
Se han modificado 1 ficheros con 10 adiciones y 3 borrados
  1. 10 3
      arch/sparc64/kernel/pci_common.c

+ 10 - 3
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 {