Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux-2.6-microblaze.git] / drivers / scsi / fnic / fnic_scsi.c
index d048f3b..6c0646d 100644 (file)
@@ -466,15 +466,27 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
        }
 
        rp = rport->dd_data;
-       if (!rp || rp->rp_state != RPORT_ST_READY) {
+       if (!rp || rp->rp_state == RPORT_ST_DELETE) {
                FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
-                               "returning DID_NO_CONNECT for IO as rport is removed\n");
+                       "rport 0x%x removed, returning DID_NO_CONNECT\n",
+                       rport->port_id);
+
                atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
                sc->result = DID_NO_CONNECT<<16;
                done(sc);
                return 0;
        }
 
+       if (rp->rp_state != RPORT_ST_READY) {
+               FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
+                       "rport 0x%x in state 0x%x, returning DID_IMM_RETRY\n",
+                       rport->port_id, rp->rp_state);
+
+               sc->result = DID_IMM_RETRY << 16;
+               done(sc);
+               return 0;
+       }
+
        if (lp->state != LPORT_ST_READY || !(lp->link_up))
                return SCSI_MLQUEUE_HOST_BUSY;
 
@@ -633,6 +645,7 @@ static int fnic_fcpio_fw_reset_cmpl_handler(struct fnic *fnic,
 
        atomic64_set(&fnic->fnic_stats.fw_stats.active_fw_reqs, 0);
        atomic64_set(&fnic->fnic_stats.io_stats.active_ios, 0);
+       atomic64_set(&fnic->io_cmpl_skip, 0);
 
        spin_lock_irqsave(&fnic->fnic_lock, flags);