ipr: reverse the isr optimization changes
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 ipr: reverse the isr optimization changes
The isr optimization patch that was submitted a few months ago exposed problems with receiving and handling spurious HRRQ interrutps.
That patch is reverted with this one. A new patch will be submitted once the issue is better understood and properly handled in the driver.
Signed-off-by Wayne Boyer <[email protected]>
---
drivers/scsi/ipr.c | 63 +++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 30 deletions(-)
drivers/scsi/ipr.c +33 -30
@@ -4936,39 +4936,15 @@ static int ipr_eh_abort(struct scsi_cmnd/** * ipr_handle_other_interrupt - Handle "other" interrupts * @ioa_cfg: ioa config struct +* @int_reg: interrupt register * * Return value: * IRQ_NONE / IRQ_HANDLED **/ -static irqreturn_t ipr_handle_other_interrupt (struct ipr_ioa_cfg *ioa_cfg) +static irqreturn_t ipr_handle_other_interrupt (struct ipr_ioa_cfg *ioa_cfg, +volatile u32 int_reg) {irqreturn_t rc =IRQ_HANDLED ; -volatile u32 int_reg, int_mask_reg; - - int_mask_reg =readl (ioa_cfg->regs.sense_interrupt_mask_reg32); - int_reg =readl (ioa_cfg->regs.sense_interrupt_reg32) & ~int_mask_reg; - -/* If an interrupt on the adapter did not occur, ignore it. -* Or in the case of SIS 64, check for a stage change interrupt. -*/ -if ((int_reg &IPR_PCII_OPER_INTERRUPTS ) ==0 ) { -if (ioa_cfg->sis64) { - int_mask_reg =readl (ioa_cfg->regs.sense_interrupt_mask_reg); - int_reg =readl (ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; -if (int_reg &IPR_PCII_IPL_STAGE_CHANGE ) { - -/* clear stage change */ -writel (IPR_PCII_IPL_STAGE_CHANGE , ioa_cfg->regs.clr_interrupt_reg); - int_reg =readl (ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; -list_del (&ioa_cfg->reset_cmd->queue); -del_timer (&ioa_cfg->reset_cmd->timer); -ipr_reset_ioa_job (ioa_cfg->reset_cmd); -return IRQ_HANDLED ; - } - } - -return IRQ_NONE ; - }if (int_reg &IPR_PCII_IOA_TRANS_TO_OPER ) {/* Mask the interrupt */
@@ -5029,7 +5005,7 @@ static irqreturn_t ipr_isr(int irq, void {struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)devp;unsigned long lock_flags =0 ; -volatile u32 int_reg; +volatile u32 int_reg, int_mask_reg;u32 ioasc;u16 cmd_index;int num_hrrq =0 ;
@@ -5044,6 +5020,33 @@ static irqreturn_t ipr_isr(int irq, voidreturn IRQ_NONE ; } + int_mask_reg =readl (ioa_cfg->regs.sense_interrupt_mask_reg32); + int_reg =readl (ioa_cfg->regs.sense_interrupt_reg32) & ~int_mask_reg; + +/* If an interrupt on the adapter did not occur, ignore it. +* Or in the case of SIS 64, check for a stage change interrupt. +*/ +if (unlikely ((int_reg &IPR_PCII_OPER_INTERRUPTS ) ==0 )) { +if (ioa_cfg->sis64) { + int_mask_reg =readl (ioa_cfg->regs.sense_interrupt_mask_reg); + int_reg =readl (ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; +if (int_reg &IPR_PCII_IPL_STAGE_CHANGE ) { + +/* clear stage change */ +writel (IPR_PCII_IPL_STAGE_CHANGE , ioa_cfg->regs.clr_interrupt_reg); + int_reg =readl (ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; +list_del (&ioa_cfg->reset_cmd->queue); +del_timer (&ioa_cfg->reset_cmd->timer); +ipr_reset_ioa_job (ioa_cfg->reset_cmd); +spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags); +return IRQ_HANDLED ; + } + } + +spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags); +return IRQ_NONE ; + } +while (1 ) { ipr_cmd =NULL ;
@@ -5083,7 +5086,7 @@ static irqreturn_t ipr_isr(int irq, void/* Clear the PCI interrupt */ do {writel (IPR_PCII_HRRQ_UPDATED , ioa_cfg->regs.clr_interrupt_reg32); - int_reg =readl (ioa_cfg->regs.sense_interrupt_reg32); + int_reg =readl (ioa_cfg->regs.sense_interrupt_reg32) & ~int_mask_reg; }while (int_reg &IPR_PCII_HRRQ_UPDATED && num_hrrq++ <IPR_MAX_HRRQ_RETRIES );
@@ -5098,7 +5101,7 @@ static irqreturn_t ipr_isr(int irq, void }if (unlikely (rc ==IRQ_NONE )) - rc =ipr_handle_other_interrupt (ioa_cfg); + rc =ipr_handle_other_interrupt (ioa_cfg, int_reg);spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags);return rc;
Quoted 7 lines · Wayne Boyer
The isr optimization patch that was submitted a few months ago exposed problems with receiving and handling spurious HRRQ interrutps.
That patch is reverted with this one. A new patch will be submitted once the issue is better understood and properly handled in the driver.
Acked-by Brian King <[email protected]>
Signature · 3 lines
Brian King Linux on Power Virtualization IBM Linux Technology Center