Hannes Reinecke 43d46a
From: Quinn Tran <quinn.tran@cavium.com>
Hannes Reinecke 43d46a
Date: Tue, 1 May 2018 09:01:48 -0700
Hannes Reinecke 43d46a
Subject: [PATCH] scsi: qla2xxx: Move GPSC and GFPNID out of session management
Hannes Reinecke 43d46a
References: bsc#1086327,FATE#324903
Hannes Reinecke 43d46a
Git-commit: cc28e0ace97c5615cc2333d98827751cd0d794d1
Hannes Reinecke 43d46a
Patch-mainline: v4.18-rc1
Hannes Reinecke 43d46a
Hannes Reinecke 43d46a
Move GPSC & GFPNID commands out of session management to reduce time lag
Hannes Reinecke 43d46a
in reporting the session state to remote port. These commands are not
Hannes Reinecke 43d46a
essential when it comes to maintaining the rport state. Delay sending
Hannes Reinecke 43d46a
these commands after rport state is set to Online.
Hannes Reinecke 43d46a
Hannes Reinecke 43d46a
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Hannes Reinecke 43d46a
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Hannes Reinecke 43d46a
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Hannes Reinecke 43d46a
Signed-off-by: Hannes Reinecke <hare@suse.de>
Hannes Reinecke 43d46a
---
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_def.h    |  3 +-
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_gbl.h    |  3 +-
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_gs.c     | 10 +----
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_init.c   | 78 +++++++++++++++++++++++----------------
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_os.c     |  4 ++
Hannes Reinecke 43d46a
 drivers/scsi/qla2xxx/qla_target.c |  1 -
Hannes Reinecke 43d46a
 6 files changed, 55 insertions(+), 44 deletions(-)
Hannes Reinecke 43d46a
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
Hannes Reinecke 43d46a
index 5c433b3d728f..bb7e7cf3689c 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_def.h
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_def.h
Hannes Reinecke 43d46a
@@ -2283,8 +2283,6 @@ enum discovery_state {
Hannes Reinecke 43d46a
 	DSC_LOGIN_PEND,
Hannes Reinecke 43d46a
 	DSC_LOGIN_FAILED,
Hannes Reinecke 43d46a
 	DSC_GPDB,
Hannes Reinecke 43d46a
-	DSC_GFPN_ID,
Hannes Reinecke 43d46a
-	DSC_GPSC,
Hannes Reinecke 43d46a
 	DSC_UPD_FCPORT,
Hannes Reinecke 43d46a
 	DSC_LOGIN_COMPLETE,
Hannes Reinecke 43d46a
 	DSC_ADISC,
Hannes Reinecke 43d46a
@@ -3230,6 +3228,7 @@ enum qla_work_type {
Hannes Reinecke 43d46a
 	QLA_EVT_GNNID,
Hannes Reinecke 43d46a
 	QLA_EVT_GFPNID,
Hannes Reinecke 43d46a
 	QLA_EVT_SP_RETRY,
Hannes Reinecke 43d46a
+	QLA_EVT_IIDMA,
Hannes Reinecke 43d46a
 };
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
Hannes Reinecke 43d46a
index 7373e63d13ad..04776fbb4a6f 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_gbl.h
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
Hannes Reinecke 43d46a
@@ -116,7 +116,8 @@ extern int qla2x00_post_async_prlo_work(struct scsi_qla_host *, fc_port_t *,
Hannes Reinecke 43d46a
     uint16_t *);
Hannes Reinecke 43d46a
 extern int qla2x00_post_async_prlo_done_work(struct scsi_qla_host *,
Hannes Reinecke 43d46a
     fc_port_t *, uint16_t *);
Hannes Reinecke 43d46a
-
Hannes Reinecke 43d46a
+int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
Hannes Reinecke 43d46a
+void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
Hannes Reinecke 43d46a
 /*
Hannes Reinecke 43d46a
  * Global Data in qla_os.c source file.
Hannes Reinecke 43d46a
  */
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
Hannes Reinecke 43d46a
index fdc9b8f475c0..f77fff7bad29 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_gs.c
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_gs.c
Hannes Reinecke 43d46a
@@ -3185,7 +3185,6 @@ int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 done_free_sp:
Hannes Reinecke 43d46a
 	sp->free(sp);
Hannes Reinecke 43d46a
-	fcport->flags &= ~FCF_ASYNC_SENT;
Hannes Reinecke 43d46a
 done:
Hannes Reinecke 43d46a
 	fcport->flags &= ~FCF_ASYNC_ACTIVE;
Hannes Reinecke 43d46a
 	return rval;
Hannes Reinecke 43d46a
@@ -3249,7 +3248,7 @@ void qla24xx_handle_gpsc_event(scsi_qla_host_t *vha, struct event_arg *ea)
Hannes Reinecke 43d46a
 		return;
Hannes Reinecke 43d46a
 	}
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	qla24xx_post_upd_fcport_work(vha, ea->fcport);
Hannes Reinecke 43d46a
+	qla_post_iidma_work(vha, fcport);
Hannes Reinecke 43d46a
 }
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 static void qla24xx_async_gpsc_sp_done(void *s, int res)
Hannes Reinecke 43d46a
@@ -3267,8 +3266,6 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
Hannes Reinecke 43d46a
 	    "Async done-%s res %x, WWPN %8phC \n",
Hannes Reinecke 43d46a
 	    sp->name, res, fcport->port_name);
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
Hannes Reinecke 43d46a
-
Hannes Reinecke 43d46a
 	if (res == (DID_ERROR << 16)) {
Hannes Reinecke 43d46a
 		/* entry status error */
Hannes Reinecke 43d46a
 		goto done;
Hannes Reinecke 43d46a
@@ -3337,7 +3334,6 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 	if (!sp)
Hannes Reinecke 43d46a
 		goto done;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	fcport->flags |= FCF_ASYNC_SENT;
Hannes Reinecke 43d46a
 	sp->type = SRB_CT_PTHRU_CMD;
Hannes Reinecke 43d46a
 	sp->name = "gpsc";
Hannes Reinecke 43d46a
 	sp->gen1 = fcport->rscn_gen;
Hannes Reinecke 43d46a
@@ -4554,7 +4550,6 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 done_free_sp:
Hannes Reinecke 43d46a
 	sp->free(sp);
Hannes Reinecke 43d46a
-	fcport->flags &= ~FCF_ASYNC_SENT;
Hannes Reinecke 43d46a
 done:
Hannes Reinecke 43d46a
 	return rval;
Hannes Reinecke 43d46a
 }
Hannes Reinecke 43d46a
@@ -4616,7 +4611,6 @@ static void qla2x00_async_gfpnid_sp_done(void *s, int res)
Hannes Reinecke 43d46a
 	struct event_arg ea;
Hannes Reinecke 43d46a
 	u64 wwn;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	fcport->flags &= ~FCF_ASYNC_SENT;
Hannes Reinecke 43d46a
 	wwn = wwn_to_u64(fpn);
Hannes Reinecke 43d46a
 	if (wwn)
Hannes Reinecke 43d46a
 		memcpy(fcport->fabric_port_name, fpn, WWN_SIZE);
Hannes Reinecke 43d46a
@@ -4645,12 +4639,10 @@ int qla24xx_async_gfpnid(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 	if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
Hannes Reinecke 43d46a
 		return rval;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	fcport->disc_state = DSC_GFPN_ID;
Hannes Reinecke 43d46a
 	sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC);
Hannes Reinecke 43d46a
 	if (!sp)
Hannes Reinecke 43d46a
 		goto done;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-	fcport->flags |= FCF_ASYNC_SENT;
Hannes Reinecke 43d46a
 	sp->type = SRB_CT_PTHRU_CMD;
Hannes Reinecke 43d46a
 	sp->name = "gfpnid";
Hannes Reinecke 43d46a
 	sp->gen1 = fcport->rscn_gen;
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
Hannes Reinecke 43d46a
index 83ab15bf5e23..f9e7a96b6ef3 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_init.c
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_init.c
Hannes Reinecke 43d46a
@@ -1023,30 +1023,11 @@ void __qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
Hannes Reinecke 43d46a
 		vha->fcport_count++;
Hannes Reinecke 43d46a
 		ea->fcport->login_succ = 1;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-		if (!IS_IIDMA_CAPABLE(vha->hw) ||
Hannes Reinecke 43d46a
-		    !vha->hw->flags.gpsc_supported) {
Hannes Reinecke 43d46a
-			ql_dbg(ql_dbg_disc, vha, 0x20d6,
Hannes Reinecke 43d46a
-			    "%s %d %8phC post upd_fcport fcp_cnt %d\n",
Hannes Reinecke 43d46a
-			    __func__, __LINE__,  ea->fcport->port_name,
Hannes Reinecke 43d46a
-			    vha->fcport_count);
Hannes Reinecke 43d46a
-
Hannes Reinecke 43d46a
-			qla24xx_post_upd_fcport_work(vha, ea->fcport);
Hannes Reinecke 43d46a
-		} else {
Hannes Reinecke 43d46a
-			if (ea->fcport->id_changed) {
Hannes Reinecke 43d46a
-				ea->fcport->id_changed = 0;
Hannes Reinecke 43d46a
-				ql_dbg(ql_dbg_disc, vha, 0x20d7,
Hannes Reinecke 43d46a
-				    "%s %d %8phC post gfpnid fcp_cnt %d\n",
Hannes Reinecke 43d46a
-				    __func__, __LINE__, ea->fcport->port_name,
Hannes Reinecke 43d46a
-				    vha->fcport_count);
Hannes Reinecke 43d46a
-				qla24xx_post_gfpnid_work(vha, ea->fcport);
Hannes Reinecke 43d46a
-			} else {
Hannes Reinecke 43d46a
-				ql_dbg(ql_dbg_disc, vha, 0x20d7,
Hannes Reinecke 43d46a
-				    "%s %d %8phC post gpsc fcp_cnt %d\n",
Hannes Reinecke 43d46a
-				    __func__, __LINE__, ea->fcport->port_name,
Hannes Reinecke 43d46a
-				    vha->fcport_count);
Hannes Reinecke 43d46a
-				qla24xx_post_gpsc_work(vha, ea->fcport);
Hannes Reinecke 43d46a
-			}
Hannes Reinecke 43d46a
-		}
Hannes Reinecke 43d46a
+		ql_dbg(ql_dbg_disc, vha, 0x20d6,
Hannes Reinecke 43d46a
+		    "%s %d %8phC post upd_fcport fcp_cnt %d\n",
Hannes Reinecke 43d46a
+		    __func__, __LINE__,  ea->fcport->port_name,
Hannes Reinecke 43d46a
+		    vha->fcport_count);
Hannes Reinecke 43d46a
+		qla24xx_post_upd_fcport_work(vha, ea->fcport);
Hannes Reinecke 43d46a
 	} else if (ea->fcport->login_succ) {
Hannes Reinecke 43d46a
 		/*
Hannes Reinecke 43d46a
 		 * We have an existing session. A late RSCN delivery
Hannes Reinecke 43d46a
@@ -5052,6 +5033,24 @@ qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 	}
Hannes Reinecke 43d46a
 }
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
+void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
+{
Hannes Reinecke 43d46a
+	qla2x00_iidma_fcport(vha, fcport);
Hannes Reinecke 43d46a
+	qla24xx_update_fcport_fcp_prio(vha, fcport);
Hannes Reinecke 43d46a
+}
Hannes Reinecke 43d46a
+
Hannes Reinecke 43d46a
+int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
+{
Hannes Reinecke 43d46a
+	struct qla_work_evt *e;
Hannes Reinecke 43d46a
+
Hannes Reinecke 43d46a
+	e = qla2x00_alloc_work(vha, QLA_EVT_IIDMA);
Hannes Reinecke 43d46a
+	if (!e)
Hannes Reinecke 43d46a
+		return QLA_FUNCTION_FAILED;
Hannes Reinecke 43d46a
+
Hannes Reinecke 43d46a
+	e->u.fcport.fcport = fcport;
Hannes Reinecke 43d46a
+	return qla2x00_post_work(vha, e);
Hannes Reinecke 43d46a
+}
Hannes Reinecke 43d46a
+
Hannes Reinecke 43d46a
 /* qla2x00_reg_remote_port is reserved for Initiator Mode only.*/
Hannes Reinecke 43d46a
 static void
Hannes Reinecke 43d46a
 qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
@@ -5120,13 +5119,14 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 	if (IS_QLAFX00(vha->hw)) {
Hannes Reinecke 43d46a
 		qla2x00_set_fcport_state(fcport, FCS_ONLINE);
Hannes Reinecke 43d46a
-		goto reg_port;
Hannes Reinecke 43d46a
+	} else {
Hannes Reinecke 43d46a
+		fcport->login_retry = 0;
Hannes Reinecke 43d46a
+		fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
Hannes Reinecke 43d46a
+		fcport->disc_state = DSC_LOGIN_COMPLETE;
Hannes Reinecke 43d46a
+		fcport->deleted = 0;
Hannes Reinecke 43d46a
+		fcport->logout_on_delete = 1;
Hannes Reinecke 43d46a
+		qla2x00_set_fcport_state(fcport, FCS_ONLINE);
Hannes Reinecke 43d46a
 	}
Hannes Reinecke 43d46a
-	fcport->login_retry = 0;
Hannes Reinecke 43d46a
-	fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
Hannes Reinecke 43d46a
-	fcport->disc_state = DSC_LOGIN_COMPLETE;
Hannes Reinecke 43d46a
-	fcport->deleted = 0;
Hannes Reinecke 43d46a
-	fcport->logout_on_delete = 1;
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 	qla2x00_set_fcport_state(fcport, FCS_ONLINE);
Hannes Reinecke 43d46a
 	qla2x00_iidma_fcport(vha, fcport);
Hannes Reinecke 43d46a
@@ -5138,7 +5138,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 	qla24xx_update_fcport_fcp_prio(vha, fcport);
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
-reg_port:
Hannes Reinecke 43d46a
 	switch (vha->host->active_mode) {
Hannes Reinecke 43d46a
 	case MODE_INITIATOR:
Hannes Reinecke 43d46a
 		qla2x00_reg_remote_port(vha, fcport);
Hannes Reinecke 43d46a
@@ -5157,6 +5156,23 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
Hannes Reinecke 43d46a
 	default:
Hannes Reinecke 43d46a
 		break;
Hannes Reinecke 43d46a
 	}
Hannes Reinecke 43d46a
+
Hannes Reinecke 43d46a
+	if (IS_IIDMA_CAPABLE(vha->hw) && vha->hw->flags.gpsc_supported) {
Hannes Reinecke 43d46a
+		if (fcport->id_changed) {
Hannes Reinecke 43d46a
+			fcport->id_changed = 0;
Hannes Reinecke 43d46a
+			ql_dbg(ql_dbg_disc, vha, 0x20d7,
Hannes Reinecke 43d46a
+			    "%s %d %8phC post gfpnid fcp_cnt %d\n",
Hannes Reinecke 43d46a
+			    __func__, __LINE__, fcport->port_name,
Hannes Reinecke 43d46a
+			    vha->fcport_count);
Hannes Reinecke 43d46a
+			qla24xx_post_gfpnid_work(vha, fcport);
Hannes Reinecke 43d46a
+		} else {
Hannes Reinecke 43d46a
+			ql_dbg(ql_dbg_disc, vha, 0x20d7,
Hannes Reinecke 43d46a
+			    "%s %d %8phC post gpsc fcp_cnt %d\n",
Hannes Reinecke 43d46a
+			    __func__, __LINE__, fcport->port_name,
Hannes Reinecke 43d46a
+			    vha->fcport_count);
Hannes Reinecke 43d46a
+			qla24xx_post_gpsc_work(vha, fcport);
Hannes Reinecke 43d46a
+		}
Hannes Reinecke 43d46a
+	}
Hannes Reinecke 43d46a
 }
Hannes Reinecke 43d46a
 
Hannes Reinecke 43d46a
 /*
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
Hannes Reinecke 43d46a
index 85ee085f03af..4ff9c074cf76 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_os.c
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_os.c
Hannes Reinecke 43d46a
@@ -5036,6 +5036,10 @@ qla2x00_do_work(struct scsi_qla_host *vha)
Hannes Reinecke 43d46a
 			break;
Hannes Reinecke 43d46a
 		case QLA_EVT_SP_RETRY:
Hannes Reinecke 43d46a
 			qla_sp_retry(vha, e);
Hannes Reinecke 43d46a
+			break;
Hannes Reinecke 43d46a
+		case QLA_EVT_IIDMA:
Hannes Reinecke 43d46a
+			qla_do_iidma_work(vha, e->u.fcport.fcport);
Hannes Reinecke 43d46a
+			break;
Hannes Reinecke 43d46a
 		}
Hannes Reinecke 43d46a
 		if (e->flags & QLA_EVT_FLAG_FREE)
Hannes Reinecke 43d46a
 			kfree(e);
Hannes Reinecke 43d46a
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
Hannes Reinecke 43d46a
index b65480efb516..531ed219ba6c 100644
Hannes Reinecke 43d46a
--- a/drivers/scsi/qla2xxx/qla_target.c
Hannes Reinecke 43d46a
+++ b/drivers/scsi/qla2xxx/qla_target.c
Hannes Reinecke 43d46a
@@ -4840,7 +4840,6 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
Hannes Reinecke 43d46a
 			switch (sess->disc_state) {
Hannes Reinecke 43d46a
 			case DSC_LOGIN_PEND:
Hannes Reinecke 43d46a
 			case DSC_GPDB:
Hannes Reinecke 43d46a
-			case DSC_GPSC:
Hannes Reinecke 43d46a
 			case DSC_UPD_FCPORT:
Hannes Reinecke 43d46a
 			case DSC_LOGIN_COMPLETE:
Hannes Reinecke 43d46a
 			case DSC_ADISC:
Hannes Reinecke 43d46a
-- 
Hannes Reinecke 43d46a
2.12.3
Hannes Reinecke 43d46a