* [PATCH 1/1] ipr: fix possible false positive detection of stuck interrupt
[not found] <20110517161648.403401807@linux.vnet.ibm.com>
@ 2011-05-17 16:18 ` Wayne Boyer
2011-05-17 17:59 ` Brian King
0 siblings, 1 reply; 2+ messages in thread
From: Wayne Boyer @ 2011-05-17 16:18 UTC (permalink / raw)
To: James Bottomley; +Cc: linux-scsi, Brian King, Kleber Sacilotto de Souza
If the driver is getting flooded with interrupts, there's a possibility
that the interrupt service routine could falsely detect a stuck interrupt
condition and reset the adapter.
This patch changes the logic such that the routine will loop back into
the command processing code one more time after detecting the stuck
interrupt signature. If there are no commands to process after that pass,
and the interrupt is still not cleared, then the driver will print the
"Error clearing HRRQ" message and reset the adapter.
Signed-off-by: Wayne Boyer <wayneb@linux.vnet.ibm.com>
---
drivers/scsi/ipr.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
Index: b/drivers/scsi/ipr.c
===================================================================
--- a/drivers/scsi/ipr.c 2011-05-03 09:09:53.389771489 -0700
+++ b/drivers/scsi/ipr.c 2011-05-04 11:50:18.855071813 -0700
@@ -5149,21 +5149,21 @@ static irqreturn_t ipr_isr(int irq, void
if (ipr_cmd != NULL) {
/* Clear the PCI interrupt */
+ num_hrrq = 0;
do {
writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32);
int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32);
} while (int_reg & IPR_PCII_HRRQ_UPDATED &&
num_hrrq++ < IPR_MAX_HRRQ_RETRIES);
- if (int_reg & IPR_PCII_HRRQ_UPDATED) {
- ipr_isr_eh(ioa_cfg, "Error clearing HRRQ");
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
- return IRQ_HANDLED;
- }
-
} else if (rc == IRQ_NONE && irq_none == 0) {
int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32);
irq_none++;
+ } else if (num_hrrq == IPR_MAX_HRRQ_RETRIES &&
+ int_reg & IPR_PCII_HRRQ_UPDATED) {
+ ipr_isr_eh(ioa_cfg, "Error clearing HRRQ");
+ spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ return IRQ_HANDLED;
} else
break;
}
^ permalink raw reply [flat|nested] 2+ messages in thread