This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / scsi / ipr.c
index e9c5098..2114bbf 100644 (file)
@@ -2884,6 +2884,7 @@ static int ipr_slave_alloc(struct scsi_device *sdev)
                    (res->cfgte.res_addr.lun == sdev->lun)) {
                        res->sdev = sdev;
                        res->add_to_ml = 0;
+                       res->in_erp = 0;
                        sdev->hostdata = res;
                        res->needs_sync_complete = 1;
                        break;
@@ -3435,8 +3436,10 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
                       SCSI_SENSE_BUFFERSIZE);
        }
 
-       if (res)
+       if (res) {
                res->needs_sync_complete = 1;
+               res->in_erp = 0;
+       }
        ipr_unmap_sglist(ioa_cfg, ipr_cmd);
        list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
        scsi_cmd->scsi_done(scsi_cmd);
@@ -3479,6 +3482,12 @@ static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
 static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
 {
        struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
+       u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
+
+       if (IPR_IOASC_SENSE_KEY(ioasc) > 0) {
+               ipr_erp_done(ipr_cmd);
+               return;
+       }
 
        ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
 
@@ -3756,6 +3765,7 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
                        ipr_erp_cancel_all(ipr_cmd);
                        return;
                }
+               res->needs_sync_complete = 1;
                break;
        case IPR_IOASC_NR_INIT_CMD_REQUIRED:
                break;
@@ -4808,6 +4818,7 @@ static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
        ipr_cmd->timer.data = (unsigned long) ipr_cmd;
        ipr_cmd->timer.expires = jiffies + IPR_OPERATIONAL_TIMEOUT;
        ipr_cmd->timer.function = (void (*)(unsigned long))ipr_timeout;
+       ipr_cmd->done = ipr_reset_ioa_job;
        add_timer(&ipr_cmd->timer);
        list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);