scsi: qedf: Use same logic for SCSI host reset and FC lip_reset.
authorChad Dupuis <chad.dupuis@cavium.com>
Wed, 31 May 2017 13:33:55 +0000 (06:33 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 00:48:06 +0000 (20:48 -0400)
We should be using the same logic to do a soft reset of the FCoE function
whether it is initiated via sg_reset or the fc_host issue_lip attribute.
Refactor the host reset and fcoe reset handlers to use the preferred logic
which is currently contained in qedf_eh_host_reset().

Signed-off-by: Chad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedf/qedf_main.c

index 7753fc5..6813b9b 100644 (file)
@@ -640,27 +640,17 @@ void qedf_wait_for_upload(struct qedf_ctx *qedf)
        }
 }
 
-/* Reset the host by gracefully logging out and then logging back in */
-static int qedf_eh_host_reset(struct scsi_cmnd *sc_cmd)
+/* Performs soft reset of qedf_ctx by simulating a link down/up */
+static void qedf_ctx_soft_reset(struct fc_lport *lport)
 {
-       struct fc_lport *lport;
        struct qedf_ctx *qedf;
 
-       lport = shost_priv(sc_cmd->device->host);
-
        if (lport->vport) {
                QEDF_ERR(NULL, "Cannot issue host reset on NPIV port.\n");
-               return SUCCESS;
+               return;
        }
 
-       qedf = (struct qedf_ctx *)lport_priv(lport);
-
-       if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN ||
-           test_bit(QEDF_UNLOADING, &qedf->flags) ||
-           test_bit(QEDF_DBG_STOP_IO, &qedf->flags))
-               return FAILED;
-
-       QEDF_ERR(&(qedf->dbg_ctx), "HOST RESET Issued...");
+       qedf = lport_priv(lport);
 
        /* For host reset, essentially do a soft link up/down */
        atomic_set(&qedf->link_state, QEDF_LINK_DOWN);
@@ -672,6 +662,24 @@ static int qedf_eh_host_reset(struct scsi_cmnd *sc_cmd)
        qedf->vlan_id  = 0;
        queue_delayed_work(qedf->link_update_wq, &qedf->link_update,
            0);
+}
+
+/* Reset the host by gracefully logging out and then logging back in */
+static int qedf_eh_host_reset(struct scsi_cmnd *sc_cmd)
+{
+       struct fc_lport *lport;
+       struct qedf_ctx *qedf;
+
+       lport = shost_priv(sc_cmd->device->host);
+       qedf = lport_priv(lport);
+
+       if (atomic_read(&qedf->link_state) == QEDF_LINK_DOWN ||
+           test_bit(QEDF_UNLOADING, &qedf->flags))
+               return FAILED;
+
+       QEDF_ERR(&(qedf->dbg_ctx), "HOST RESET Issued...");
+
+       qedf_ctx_soft_reset(lport);
 
        return SUCCESS;
 }
@@ -1669,8 +1677,7 @@ static int qedf_fcoe_reset(struct Scsi_Host *shost)
 {
        struct fc_lport *lport = shost_priv(shost);
 
-       fc_fabric_logoff(lport);
-       fc_fabric_login(lport);
+       qedf_ctx_soft_reset(lport);
        return 0;
 }