aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ipr.c
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2007-05-02 11:44:11 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-05-06 10:33:20 -0400
commit473b1e8ed2e4f545de22e58c8c073471b18459e8 (patch)
tree64a1d0b0f243ee3430a198411fda0fb178c16769 /drivers/scsi/ipr.c
parenta6bcbc2f5ddd6de8a0e08ea3871585abcc82ecd6 (diff)
[SCSI] ipr: Better handle adapter boot time errors
If an ipr adapter encounters an adapter error requiring an adapter reset to recover from prior to driver load time, the error will be ignored and recovery will not happen until the initial timeout occurs waiting for the firmware to come ready, which means a five minute timeout. Fix is to read the interrupt register before clearing any of the interrupts at probe time. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/ipr.c')
-rw-r--r--drivers/scsi/ipr.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index b15dfcbde4a0..101e519844df 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -7444,7 +7444,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7444 unsigned long ipr_regs_pci; 7444 unsigned long ipr_regs_pci;
7445 void __iomem *ipr_regs; 7445 void __iomem *ipr_regs;
7446 int rc = PCIBIOS_SUCCESSFUL; 7446 int rc = PCIBIOS_SUCCESSFUL;
7447 volatile u32 mask, uproc; 7447 volatile u32 mask, uproc, interrupts;
7448 7448
7449 ENTER; 7449 ENTER;
7450 7450
@@ -7551,9 +7551,14 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7551 * the card is in an unknown state and needs a hard reset 7551 * the card is in an unknown state and needs a hard reset
7552 */ 7552 */
7553 mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg); 7553 mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
7554 interrupts = readl(ioa_cfg->regs.sense_interrupt_reg);
7554 uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg); 7555 uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg);
7555 if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT)) 7556 if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT))
7556 ioa_cfg->needs_hard_reset = 1; 7557 ioa_cfg->needs_hard_reset = 1;
7558 if (interrupts & IPR_PCII_ERROR_INTERRUPTS)
7559 ioa_cfg->needs_hard_reset = 1;
7560 if (interrupts & IPR_PCII_IOA_UNIT_CHECKED)
7561 ioa_cfg->ioa_unit_checked = 1;
7557 7562
7558 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); 7563 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
7559 rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg); 7564 rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg);