From: "Jan Beulich" The way mpt_interrupt() was coded, it was impossible for the unhandled interrupt detection logic to ever trigger. All interrupt handlers should return IRQ_NONE when they have nothing to do. Signed-off-by: Jan Beulich Cc: "Moore, Eric Dean" Signed-off-by: Andrew Morton --- drivers/message/fusion/mptbase.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) diff -puN drivers/message/fusion/mptbase.c~mpt_interrupt-should-return-irq_none-when drivers/message/fusion/mptbase.c --- devel/drivers/message/fusion/mptbase.c~mpt_interrupt-should-return-irq_none-when 2006-05-08 10:29:21.000000000 -0700 +++ devel-akpm/drivers/message/fusion/mptbase.c 2006-05-08 10:29:21.000000000 -0700 @@ -372,20 +372,21 @@ static irqreturn_t mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) { MPT_ADAPTER *ioc = bus_id; - u32 pa; + u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); + + if (pa == 0xFFFFFFFF) + return IRQ_NONE; /* * Drain the reply FIFO! */ - while (1) { - pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); - if (pa == 0xFFFFFFFF) - return IRQ_HANDLED; - else if (pa & MPI_ADDRESS_REPLY_A_BIT) + do { + if (pa & MPI_ADDRESS_REPLY_A_BIT) mpt_reply(ioc, pa); else mpt_turbo_reply(ioc, pa); - } + pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); + } while (pa != 0xFFFFFFFF); return IRQ_HANDLED; } _