Module Name:    src
Committed By:   matt
Date:           Sat May  8 18:08:35 UTC 2010

Modified Files:
        src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_pcie.c

Log Message:
Rework the way interrupts are decided on.  Don't use pa_bus since that's
arbitrary.  Instead grab the device from pa_intrtag since that corresponds
to the PCIe bus we are actually attached to.

While I'm here, compact some switch statements into a few simple assignments.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.13 -r1.1.2.14 src/sys/arch/mips/rmi/rmixl_pcie.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/rmi/rmixl_pcie.c
diff -u src/sys/arch/mips/rmi/rmixl_pcie.c:1.1.2.13 src/sys/arch/mips/rmi/rmixl_pcie.c:1.1.2.14
--- src/sys/arch/mips/rmi/rmixl_pcie.c:1.1.2.13	Thu May  6 20:48:39 2010
+++ src/sys/arch/mips/rmi/rmixl_pcie.c	Sat May  8 18:08:34 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_pcie.c,v 1.1.2.13 2010/05/06 20:48:39 cliff Exp $	*/
+/*	$NetBSD: rmixl_pcie.c,v 1.1.2.14 2010/05/08 18:08:34 matt Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_pcie.c,v 1.1.2.13 2010/05/06 20:48:39 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_pcie.c,v 1.1.2.14 2010/05/08 18:08:34 matt Exp $");
 
 #include "opt_pci.h"
 #include "pci.h"
@@ -1014,9 +1014,18 @@
 int
 rmixl_pcie_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *pih)
 {
+	int device;
 	u_int link;
 	u_int irq;
 
+	/*
+	 * The bus is unimportant since it can change depending on the
+	 * configuration.  We are tied to device # of PCIe bridge we are
+	 * ultimately attached to.
+	 */
+	pci_decompose_tag(pa->pa_pc, pa->pa_intrtag,
+	    NULL, &device, NULL);
+
 #ifdef DEBUG
 	DPRINTF(("%s: ps_bus %d, pa_intrswiz %#x, pa_intrtag %#lx,"
 		" pa_intrpin %d,  pa_intrline %d, pa_rawintrpin %d\n",
@@ -1032,71 +1041,32 @@
 	case MIPS_XLS108:
 	case MIPS_XLS404LITE:
 	case MIPS_XLS408LITE:
-		switch (pa->pa_bus) {
-		case 1:
-			link = 0;
-			irq = 26;
-			break;
-		case 2:
-			link = 1;
-			irq = 27;
-			break;
-		default:
-			panic("%s: bad bus %d\n", __func__, pa->pa_bus);
-		}
+		if (device > 1)
+			panic("%s: bad bus %d", __func__, device);
+		link = device;
+		irq = device + 26;
 		break;
 	case MIPS_XLS204:
-	case MIPS_XLS208:
-		switch (pa->pa_bus) {
-		case 1:
-			link = 0;
-			irq = 26;
-			break;
-		case 2:
-			link = 1;
-			irq = 27;
-			break;
-		case 3:
-			link = 2;
-			irq = 23;
-			break;
-		case 4:
-			link = 3;
-			irq = 24;
-			break;
-		default:
-			panic("%s: bad bus %d\n", __func__, pa->pa_bus);
-		}
+	case MIPS_XLS208: {
+		if (device > 3)
+			panic("%s: bad bus %d", __func__, device);
+		link = device;
+		irq = device + (device & 2 ? 21 : 26);
 		break;
+	}
 	case MIPS_XLS404:
 	case MIPS_XLS408:
 	case MIPS_XLS416:
 	case MIPS_XLS608: 
 	case MIPS_XLS616:
-		switch (pa->pa_bus) {
-		case 1:
-			link = 0;
-			irq = 26;
-			break;
-		case 2:
-			link = 1;
-			irq = 27;
-			break;
-		case 3:
-			link = 2;
-			irq = 28;
-			break;
-		case 4:
-			link = 3;
-			irq = 29;
-			break;
-		default:
-			panic("%s: bad bus %d\n", __func__, pa->pa_bus);
-		}
+		if (device > 3)
+			panic("%s: bad bus %d", __func__, device);
+		link = device;
+		irq = device + 26;
 		break;
 	default:
 		panic("%s: cpu IMPL %#x not supported\n",
-			__func__, MIPS_PRID_IMPL(mips_options.mips_cpu_id));
+		    __func__, MIPS_PRID_IMPL(mips_options.mips_cpu_id));
 	}
 
 	if (pa->pa_intrpin != PCI_INTERRUPT_PIN_NONE)

Reply via email to