Index: drivers/parisc/asp.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/asp.c,v
retrieving revision 1.7
diff -u -p -r1.7 asp.c
--- drivers/parisc/asp.c	1 Jan 2005 20:22:11 -0000	1.7
+++ drivers/parisc/asp.c	2 Jan 2005 06:08:20 -0000
@@ -35,18 +35,18 @@ static int asp_choose_irq(struct parisc_
 	int irq = -1;
 
 	switch (dev->id.sversion) {
-	case 0x71:	irq = 22; break; /* SCSI */
-	case 0x72:	irq = 23; break; /* LAN */
-	case 0x73:	irq = 30; break; /* HIL */
-	case 0x74:	irq = 24; break; /* Centronics */
-	case 0x75:	irq = (dev->hw_path == 4) ? 26 : 25; break; /* RS232 */
-	case 0x76:	irq = 21; break; /* EISA BA */
-	case 0x77:	irq = 20; break; /* Graphics1 */
-	case 0x7a:	irq = 18; break; /* Audio (Bushmaster) */
-	case 0x7b:	irq = 18; break; /* Audio (Scorpio) */
-	case 0x7c:	irq = 28; break; /* FW SCSI */
-	case 0x7d:	irq = 27; break; /* FDDI */
-	case 0x7f:	irq = 18; break; /* Audio (Outfield) */
+	case 0x71:	irq =  9; break; /* SCSI */
+	case 0x72:	irq =  8; break; /* LAN */
+	case 0x73:	irq =  1; break; /* HIL */
+	case 0x74:	irq =  7; break; /* Centronics */
+	case 0x75:	irq = (dev->hw_path == 4) ? 5 : 6; break; /* RS232 */
+	case 0x76:	irq = 10; break; /* EISA BA */
+	case 0x77:	irq = 11; break; /* Graphics1 */
+	case 0x7a:	irq = 13; break; /* Audio (Bushmaster) */
+	case 0x7b:	irq = 13; break; /* Audio (Scorpio) */
+	case 0x7c:	irq =  3; break; /* FW SCSI */
+	case 0x7d:	irq =  4; break; /* FDDI */
+	case 0x7f:	irq = 13; break; /* Audio (Outfield) */
 	}
 	return irq;
 }
Index: drivers/parisc/gsc.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/gsc.c,v
retrieving revision 1.9
diff -u -p -r1.9 gsc.c
--- drivers/parisc/gsc.c	1 Jan 2005 20:22:11 -0000	1.9
+++ drivers/parisc/gsc.c	2 Jan 2005 06:08:20 -0000
@@ -74,37 +74,12 @@ int gsc_claim_irq(struct gsc_irq *i, int
 EXPORT_SYMBOL(gsc_alloc_irq);
 EXPORT_SYMBOL(gsc_claim_irq);
 
-/* IRQ bits must be numbered from Most Significant Bit */
-#define GSC_FIX_IRQ(x)	(31-(x))
-#define GSC_MASK_IRQ(x)	(1<<(GSC_FIX_IRQ(x)))
-
-static void do_irq_mask(unsigned long mask, struct irq_region *region, struct pt_regs *regs)
-{
-	unsigned long bit;
-	unsigned int irq;
-
-#ifdef DEBUG_IRQ
-	if (mask != (1L<<MAX_CPU_IRQ))
-	    printk(KERN_DEBUG "do_irq_mask %08lx %p %p\n", mask, region, regs);
-#endif
-
-	for (bit = (1L<<MAX_CPU_IRQ), irq = 0; mask && bit; bit>>=1, irq++) {
-		unsigned int irq_num;
-		if (!(bit&mask))
-			continue;
-
-		mask &= ~bit;	/* clear bit in mask - can exit loop sooner */
-		irq_num = region->data.irqbase + irq;
-
-		do_irq(&region->action[irq], irq_num, regs);
-	}
-}
-
 /* Common interrupt demultiplexer used by Asp, Lasi & Wax.  */
 irqreturn_t gsc_asic_intr(int gsc_asic_irq, void *dev, struct pt_regs *regs)
 {
-	unsigned long irq;
+	unsigned long irr;
 	struct gsc_asic *gsc_asic = dev;
+	struct irq_region *region;
 
 	/* 
 	    Don't need to protect OFFSET_IRR with spinlock since this is
@@ -113,16 +88,21 @@ irqreturn_t gsc_asic_intr(int gsc_asic_i
 	    modifying the region, and then re-enabling the region.
 	*/
 
-	irq = gsc_readl(gsc_asic->hpa+OFFSET_IRR);
-	if (irq == 0) {
-		printk(KERN_ERR "%s: barking without apparent reason.\n", gsc_asic->name);
-	} else {
-		DEBPRINTK ("%s (0x%x) barked, mask=0x%x, irq=%d\n", 
-		    gsc_asic->name, gsc_asic->irq_region->data.irqbase, 
-		    irq, GSC_FIX_IRQ(ffs(irq))+1 );
+	irr = gsc_readl(gsc_asic->hpa+OFFSET_IRR);
+	if (irr == 0)
+		return IRQ_NONE;
+
+	DEBPRINTK("%s (0x%x) intr, mask=0x%x, irq=%d\n", gsc_asic->name,
+			gsc_asic->irq_region->data.irqbase, irq, ffs(irq));
+
+	region = gsc_asic->irq_region;
+	do {
+		int local_irq = __ffs(irr);
+		unsigned int irq = region->data.irqbase + local_irq;
+		do_irq(&region->action[local_irq], irq, regs);
+		irr &= ~(1 << local_irq);
+	} while (irr);
 
-		do_irq_mask(irq, gsc_asic->irq_region, regs);
-	}
 	return IRQ_HANDLED;
 }
 
@@ -133,7 +113,7 @@ static void gsc_asic_disable_irq(unsigne
 	int irq = IRQ_OFFSET(irq_handle);
 	/* Disable the IRQ line by clearing the bit in the IMR */
 	u32 imr = gsc_readl(irq_dev->hpa + OFFSET_IMR);
-	imr &= ~GSC_MASK_IRQ(irq);
+	imr &= ~(1 << irq);
 
 	DEBPRINTK( KERN_WARNING "%s(%p, %d) %s: IMR 0x%x\n", 
 		    __FUNCTION__, irq_dev, irq, BUSDEV_DEV(irq_dev)->name, imr);
@@ -149,7 +129,7 @@ static void gsc_asic_enable_irq(unsigned
 	/* Enable the IRQ line by setting the bit in the IMR */
 	unsigned long addr = irq_dev->hpa + OFFSET_IMR;
 	u32 imr = gsc_readl(addr);
-	imr |= GSC_MASK_IRQ(irq);
+	imr |= 1 << irq;
 
 	DEBPRINTK (KERN_WARNING "%s(%p, %d) %s: IMR 0x%x\n", 
 		    __FUNCTION__, irq_dev, irq, irq_dev->name, imr);
@@ -186,9 +166,6 @@ void fixup_child_irqs(struct parisc_devi
 
 		irq = choose_irq(padev);
 		if (irq > 0) {
-#ifdef __LP64__
-			irq += 32;
-#endif
 			padev->irq = base + irq;
 		}
 	}
Index: drivers/parisc/lasi.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/lasi.c,v
retrieving revision 1.7
diff -u -p -r1.7 lasi.c
--- drivers/parisc/lasi.c	1 Jan 2005 20:22:11 -0000	1.7
+++ drivers/parisc/lasi.c	2 Jan 2005 06:08:20 -0000
@@ -43,16 +43,16 @@ static int lasi_choose_irq(struct parisc
 	** "irq" bits below are numbered relative to most significant bit.
 	*/
 	switch (dev->id.sversion) {
-		case 0x74:	irq = 24; break; /* Centronics */
-		case 0x7B:	irq = 18; break; /* Audio */
-		case 0x81:	irq = 17; break; /* Lasi itself */
-		case 0x82:	irq = 22; break; /* SCSI */
-		case 0x83:	irq = 11; break; /* Floppy */
-		case 0x84:	irq =  5; break; /* PS/2 Keyboard */
-		case 0x87:	irq = 13; break; /* ISDN */
-		case 0x8A:	irq = 23; break; /* LAN */
-		case 0x8C:	irq = 26; break; /* RS232 */
-		case 0x8D:	irq = (dev->hw_path == 13) ? 15 : 14;
+		case 0x74:	irq =  7; break; /* Centronics */
+		case 0x7B:	irq = 13; break; /* Audio */
+		case 0x81:	irq = 14; break; /* Lasi itself */
+		case 0x82:	irq =  9; break; /* SCSI */
+		case 0x83:	irq = 20; break; /* Floppy */
+		case 0x84:	irq = 26; break; /* PS/2 Keyboard */
+		case 0x87:	irq = 18; break; /* ISDN */
+		case 0x8A:	irq =  8; break; /* LAN */
+		case 0x8C:	irq =  5; break; /* RS232 */
+		case 0x8D:	irq = (dev->hw_path == 13) ? 16 : 17;
 						break; /* Telephone */
 		default: 	irq = -1; break; /* unknown */
 	}
Index: drivers/parisc/wax.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/wax.c,v
retrieving revision 1.7
diff -u -p -r1.7 wax.c
--- drivers/parisc/wax.c	1 Jan 2005 20:22:11 -0000	1.7
+++ drivers/parisc/wax.c	2 Jan 2005 06:08:20 -0000
@@ -33,9 +33,9 @@ static int wax_choose_irq(struct parisc_
 	int irq = -1;
 
 	switch (dev->id.sversion) {
-		case 0x73:	irq = 30; break; /* HIL */
-		case 0x8c:	irq = 25; break; /* RS232 */
-		case 0x90:	irq = 21; break; /* WAX EISA BA */
+		case 0x73:	irq =  1; break; /* HIL */
+		case 0x8c:	irq =  6; break; /* RS232 */
+		case 0x90:	irq = 10; break; /* WAX EISA BA */
 	}
 
 	return irq;

