[MIPS] SB1250: Interrupt handler fixes
authorMaciej W. Rozycki <macro@linux-mips.org>
Tue, 3 Oct 2006 11:42:02 +0000 (12:42 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 3 Oct 2006 16:59:17 +0000 (17:59 +0100)
Mask cp0.status against cp0.cause.  Additionally, spurious interrupts are
not recorded.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/sibyte/sb1250/irq.c

index a451b4c7732d9baae2127529c74f974cf2154278..f9bd9f074517575cae863c3b03b2200d22c5677a 100644 (file)
@@ -442,7 +442,7 @@ asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
         * blasting the high 32 bits.
         */
 
-       pending = read_c0_cause();
+       pending = read_c0_cause() & read_c0_status();
 
 #ifdef CONFIG_SIBYTE_SB1250_PROF
        if (pending & CAUSEF_IP7) /* Cpu performance counter interrupt */
@@ -476,5 +476,8 @@ asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
                                              R_IMR_INTERRUPT_STATUS_BASE)));
                if (mask)
                        do_IRQ(fls64(mask) - 1, regs);
-       }
+               else
+                       spurious_interrupt(regs);
+       } else
+               spurious_interrupt(regs);
 }