Acked-by: Brian King <brking@xxxxxxxxxxxxxxxxxx> On 07/14/2010 12:49 PM, Wayne Boyer wrote: > The method of transitioning to operational for new adapters includes using > initialization stages. The current stage is indicated via a register read. > The final good stage in the sequence is "operational" but does not necessarily > indicate that the driver can proceed. There is another bit that gets set in the > adapter->host interrupt register when the adapter has completed enough of its > bringup such that it can accept commands. The driver was not checking that > bit before proceeding which led to intermittent errors and adapter resets. > > The fix is to check the "transition to operational" bit in the interrupt > register after detecting that the initialization stage is "operational" and > only proceed if both are set. > > Signed-off-by: Wayne Boyer <wayneb@xxxxxxxxxxxxxxxxxx> > --- > drivers/scsi/ipr.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > Index: b/drivers/scsi/ipr.c > =================================================================== > --- a/drivers/scsi/ipr.c 2010-07-08 17:16:09.000000000 -0700 > +++ b/drivers/scsi/ipr.c 2010-07-08 17:17:15.000000000 -0700 > @@ -7166,12 +7166,15 @@ static int ipr_reset_next_stage(struct i > stage_time = ioa_cfg->transop_timeout; > ipr_cmd->job_step = ipr_ioafp_identify_hrrq; > } else if (stage == IPR_IPL_INIT_STAGE_TRANSOP) { > - ipr_cmd->job_step = ipr_ioafp_identify_hrrq; > - maskval = IPR_PCII_IPL_STAGE_CHANGE; > - maskval = (maskval << 32) | IPR_PCII_IOA_TRANS_TO_OPER; > - writeq(maskval, ioa_cfg->regs.set_interrupt_mask_reg); > - int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); > - return IPR_RC_JOB_CONTINUE; > + int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); > + if (int_reg & IPR_PCII_IOA_TRANS_TO_OPER) { > + ipr_cmd->job_step = ipr_ioafp_identify_hrrq; > + maskval = IPR_PCII_IPL_STAGE_CHANGE; > + maskval = (maskval << 32) | IPR_PCII_IOA_TRANS_TO_OPER; > + writeq(maskval, ioa_cfg->regs.set_interrupt_mask_reg); > + int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); > + return IPR_RC_JOB_CONTINUE; > + } > } > > ipr_cmd->timer.data = (unsigned long) ipr_cmd; > > -- > To unsubscribe from this list: send the line "unsubscribe linux-scsi" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Brian King Linux on Power Virtualization IBM Linux Technology Center -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html