summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2007-05-02 17:44:11 +0200
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-05-06 16:33:20 +0200
commit473b1e8ed2e4f545de22e58c8c073471b18459e8 (patch)
tree64a1d0b0f243ee3430a198411fda0fb178c16769
parent[SCSI] deprecate the old NCR53C9x driver (diff)
downloadlinux-473b1e8ed2e4f545de22e58c8c073471b18459e8.tar.xz
linux-473b1e8ed2e4f545de22e58c8c073471b18459e8.zip
[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>
-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,
unsigned long ipr_regs_pci;
void __iomem *ipr_regs;
int rc = PCIBIOS_SUCCESSFUL;
- volatile u32 mask, uproc;
+ volatile u32 mask, uproc, interrupts;
ENTER;
@@ -7551,9 +7551,14 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
* the card is in an unknown state and needs a hard reset
*/
mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
+ interrupts = readl(ioa_cfg->regs.sense_interrupt_reg);
uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg);
if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT))
ioa_cfg->needs_hard_reset = 1;
+ if (interrupts & IPR_PCII_ERROR_INTERRUPTS)
+ ioa_cfg->needs_hard_reset = 1;
+ if (interrupts & IPR_PCII_IOA_UNIT_CHECKED)
+ ioa_cfg->ioa_unit_checked = 1;
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg);