linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes
@ 2021-10-21  7:31 Nilesh Javali
  2021-10-21  7:31 ` [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance Nilesh Javali
                   ` (12 more replies)
  0 siblings, 13 replies; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:31 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

Martin,

Please apply the miscellaneous qla2xxx driver and EDIF bug fixes to the
scsi tree at your earliest convenience.

v2:
Add Fixes tag for relevant commits

Thanks,
Nilesh

Nilesh Javali (1):
  qla2xxx: Update version to 10.02.07.200-k

Quinn Tran (12):
  qla2xxx: relogin during fabric disturbance
  qla2xxx: fix gnl list corruption
  qla2xxx: turn off target reset during issue_lip
  qla2xxx: edif: fix app start fail
  qla2xxx: edif: fix app start delay
  qla2xxx: edif: flush stale events and msgs on session down
  qla2xxx: edif: replace list_for_each_safe with
    list_for_each_entry_safe
  qla2xxx: edif: tweak trace message
  qla2xxx: edif: reduce connection thrash
  qla2xxx: edif: increase ELS payload
  qla2xxx: edif: fix inconsistent check of db_flags
  qla2xxx: edif: fix edif bsg

 drivers/scsi/qla2xxx/qla_attr.c     |   7 +-
 drivers/scsi/qla2xxx/qla_def.h      |   4 +-
 drivers/scsi/qla2xxx/qla_edif.c     | 333 +++++++++++++++-------------
 drivers/scsi/qla2xxx/qla_edif.h     |  13 +-
 drivers/scsi/qla2xxx/qla_edif_bsg.h |   2 +-
 drivers/scsi/qla2xxx/qla_gbl.h      |   4 +-
 drivers/scsi/qla2xxx/qla_init.c     | 108 +++++++--
 drivers/scsi/qla2xxx/qla_iocb.c     |   3 +-
 drivers/scsi/qla2xxx/qla_isr.c      |   4 +
 drivers/scsi/qla2xxx/qla_mr.c       |  23 --
 drivers/scsi/qla2xxx/qla_os.c       |  37 +---
 drivers/scsi/qla2xxx/qla_target.c   |   3 +-
 drivers/scsi/qla2xxx/qla_version.h  |   4 +-
 13 files changed, 298 insertions(+), 247 deletions(-)


base-commit: efe1dc571a5b808baa26682eef16561be2e356fd
prerequisite-patch-id: 505841911eadc4a52bd4b72393ab50f095664f55
-- 
2.19.0.rc0


^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
@ 2021-10-21  7:31 ` Nilesh Javali
  2021-10-21 13:58   ` Himanshu Madhani
  2021-10-21  7:31 ` [PATCH v2 02/13] qla2xxx: fix gnl list corruption Nilesh Javali
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:31 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

For RSCN of type "Area, Domain, or Fabric", which indicate
a portion or entire fabric was disturbed. Current driver
does not set the scan_need flag to indicate a session was
affected by the disturbance. This in turn, can lead to
IO timeout and delay of relogin. Hence initiate relogin
in the event of fabric disturbance.

Fixes: 1560bafdff9e ("scsi: qla2xxx: Use complete switch scan for RSCN events")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_init.c | 54 +++++++++++++++++++++++++++------
 1 file changed, 45 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index a9a4243cb15a..339aa3b2737a 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1786,16 +1786,52 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
 	fc_port_t *fcport;
 	unsigned long flags;
 
-	fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
-	if (fcport) {
-		if (fcport->flags & FCF_FCP2_DEVICE) {
-			ql_dbg(ql_dbg_disc, vha, 0x2115,
-			       "Delaying session delete for FCP2 portid=%06x %8phC ",
-			       fcport->d_id.b24, fcport->port_name);
-			return;
+	switch (ea->id.b.rsvd_1) {
+	case RSCN_PORT_ADDR:
+		fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
+		if (fcport) {
+			if (fcport->flags & FCF_FCP2_DEVICE) {
+				ql_dbg(ql_dbg_disc, vha, 0x2115,
+				       "Delaying session delete for FCP2 portid=%06x %8phC ",
+					fcport->d_id.b24, fcport->port_name);
+				return;
+			}
+			fcport->scan_needed = 1;
+			fcport->rscn_gen++;
+		}
+		break;
+	case RSCN_AREA_ADDR:
+		list_for_each_entry(fcport, &vha->vp_fcports, list) {
+			if (fcport->flags & FCF_FCP2_DEVICE)
+				continue;
+
+			if ((ea->id.b24 & 0xffff00) == (fcport->d_id.b24 & 0xffff00)) {
+				fcport->scan_needed = 1;
+				fcport->rscn_gen++;
+			}
 		}
-		fcport->scan_needed = 1;
-		fcport->rscn_gen++;
+		break;
+	case RSCN_DOM_ADDR:
+		list_for_each_entry(fcport, &vha->vp_fcports, list) {
+			if (fcport->flags & FCF_FCP2_DEVICE)
+				continue;
+
+			if ((ea->id.b24 & 0xff0000) == (fcport->d_id.b24 & 0xff0000)) {
+				fcport->scan_needed = 1;
+				fcport->rscn_gen++;
+			}
+		}
+		break;
+	case RSCN_FAB_ADDR:
+	default:
+		list_for_each_entry(fcport, &vha->vp_fcports, list) {
+			if (fcport->flags & FCF_FCP2_DEVICE)
+				continue;
+
+			fcport->scan_needed = 1;
+			fcport->rscn_gen++;
+		}
+		break;
 	}
 
 	spin_lock_irqsave(&vha->work_lock, flags);
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 02/13] qla2xxx: fix gnl list corruption
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
  2021-10-21  7:31 ` [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance Nilesh Javali
@ 2021-10-21  7:31 ` Nilesh Javali
  2021-10-21 13:58   ` Himanshu Madhani
  2021-10-21  7:31 ` [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip Nilesh Javali
                   ` (10 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:31 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

Current code does list element deletion and addition
in and out of lock protection. This patch move lock
deletion behind lock.

list_add double add: new=ffff9130b5eb89f8, prev=ffff9130b5eb89f8,
    next=ffff9130c6a715f0.
 ------------[ cut here ]------------
 kernel BUG at lib/list_debug.c:31!
 invalid opcode: 0000 [#1] SMP PTI
 CPU: 1 PID: 182395 Comm: kworker/1:37 Kdump: loaded Tainted: G W  OE
 --------- -  - 4.18.0-193.el8.x86_64 #1
 Hardware name: HP ProLiant DL160 Gen8, BIOS J03 02/10/2014
 Workqueue: qla2xxx_wq qla2x00_iocb_work_fn [qla2xxx]
 RIP: 0010:__list_add_valid+0x41/0x50
 Code: 85 94 00 00 00 48 39 c7 74 0b 48 39 d7 74 06 b8 01 00 00 00 c3 48 89 f2
 4c 89 c1 48 89 fe 48 c7 c7 60 83 ad 97 e8 4d bd ce ff <0f> 0b 0f 1f 00 66 2e
 0f 1f 84 00 00 00 00 00 48 8b 07 48 8b 57 08
 RSP: 0018:ffffaba306f47d68 EFLAGS: 00010046
 RAX: 0000000000000058 RBX: ffff9130b5eb8800 RCX: 0000000000000006
 RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff9130b7456a00
 RBP: ffff9130c6a70a58 R08: 000000000008d7be R09: 0000000000000001
 R10: 0000000000000000 R11: 0000000000000001 R12: ffff9130c6a715f0
 R13: ffff9130b5eb8824 R14: ffff9130b5eb89f8 R15: ffff9130b5eb89f8
 FS:  0000000000000000(0000) GS:ffff9130b7440000(0000) knlGS:0000000000000000
 CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
 CR2: 00007efcaaef11a0 CR3: 000000005200a002 CR4: 00000000000606e0
 Call Trace:
  qla24xx_async_gnl+0x113/0x3c0 [qla2xxx]
  ? qla2x00_iocb_work_fn+0x53/0x80 [qla2xxx]
  ? process_one_work+0x1a7/0x3b0
  ? worker_thread+0x30/0x390
  ? create_worker+0x1a0/0x1a0
  ? kthread+0x112/0x130

Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_init.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 339aa3b2737a..2ccdc76cf0d9 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -987,8 +987,6 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
 	    sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1],
 	    sp->u.iocb_cmd.u.mbx.in_mb[2]);
 
-	if (res == QLA_FUNCTION_TIMEOUT)
-		return;
 
 	sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE);
 	memset(&ea, 0, sizeof(ea));
@@ -1026,8 +1024,8 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
 	spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 
 	list_for_each_entry_safe(fcport, tf, &h, gnl_entry) {
-		list_del_init(&fcport->gnl_entry);
 		spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
+		list_del_init(&fcport->gnl_entry);
 		fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 		spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 		ea.fcport = fcport;
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
  2021-10-21  7:31 ` [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance Nilesh Javali
  2021-10-21  7:31 ` [PATCH v2 02/13] qla2xxx: fix gnl list corruption Nilesh Javali
@ 2021-10-21  7:31 ` Nilesh Javali
  2021-10-21 13:59   ` Himanshu Madhani
  2021-10-21  7:31 ` [PATCH v2 04/13] qla2xxx: edif: fix app start fail Nilesh Javali
                   ` (9 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:31 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

When user use issue_lip to do link bounce, driver sends
additional target reset to remote device before resetting
the link. The target reset would affect other paths with
active IOs. This patch will remove the unnecessary
target reset.

Fixes: 5854771e314e ("[SCSI] qla2xxx: Add ISPFX00 specific bus reset routine")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_gbl.h |  2 --
 drivers/scsi/qla2xxx/qla_mr.c  | 23 -----------------------
 drivers/scsi/qla2xxx/qla_os.c  | 27 ++-------------------------
 3 files changed, 2 insertions(+), 50 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 8aadcdeca6cb..8faaa0ec595d 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -171,7 +171,6 @@ extern int ql2xasynctmfenable;
 extern int ql2xgffidenable;
 extern int ql2xenabledif;
 extern int ql2xenablehba_err_chk;
-extern int ql2xtargetreset;
 extern int ql2xdontresethba;
 extern uint64_t ql2xmaxlun;
 extern int ql2xmdcapmask;
@@ -820,7 +819,6 @@ extern void qlafx00_abort_iocb(srb_t *, struct abort_iocb_entry_fx00 *);
 extern void qlafx00_fxdisc_iocb(srb_t *, struct fxdisc_entry_fx00 *);
 extern void qlafx00_timer_routine(scsi_qla_host_t *);
 extern int qlafx00_rescan_isp(scsi_qla_host_t *);
-extern int qlafx00_loop_reset(scsi_qla_host_t *vha);
 
 /* qla82xx related functions */
 
diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c
index 6e920da64863..350b0c4346fb 100644
--- a/drivers/scsi/qla2xxx/qla_mr.c
+++ b/drivers/scsi/qla2xxx/qla_mr.c
@@ -738,29 +738,6 @@ qlafx00_lun_reset(fc_port_t *fcport, uint64_t l, int tag)
 	return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag);
 }
 
-int
-qlafx00_loop_reset(scsi_qla_host_t *vha)
-{
-	int ret;
-	struct fc_port *fcport;
-	struct qla_hw_data *ha = vha->hw;
-
-	if (ql2xtargetreset) {
-		list_for_each_entry(fcport, &vha->vp_fcports, list) {
-			if (fcport->port_type != FCT_TARGET)
-				continue;
-
-			ret = ha->isp_ops->target_reset(fcport, 0, 0);
-			if (ret != QLA_SUCCESS) {
-				ql_dbg(ql_dbg_taskm, vha, 0x803d,
-				    "Bus Reset failed: Reset=%d "
-				    "d_id=%x.\n", ret, fcport->d_id.b24);
-			}
-		}
-	}
-	return QLA_SUCCESS;
-}
-
 int
 qlafx00_iospace_config(struct qla_hw_data *ha)
 {
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 03ff2596715b..3fca6b8bb23f 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -202,12 +202,6 @@ MODULE_PARM_DESC(ql2xdbwr,
 		" 0 -- Regular doorbell.\n"
 		" 1 -- CAMRAM doorbell (faster).\n");
 
-int ql2xtargetreset = 1;
-module_param(ql2xtargetreset, int, S_IRUGO);
-MODULE_PARM_DESC(ql2xtargetreset,
-		 "Enable target reset."
-		 "Default is 1 - use hw defaults.");
-
 int ql2xgffidenable;
 module_param(ql2xgffidenable, int, S_IRUGO);
 MODULE_PARM_DESC(ql2xgffidenable,
@@ -1695,27 +1689,10 @@ int
 qla2x00_loop_reset(scsi_qla_host_t *vha)
 {
 	int ret;
-	struct fc_port *fcport;
 	struct qla_hw_data *ha = vha->hw;
 
-	if (IS_QLAFX00(ha)) {
-		return qlafx00_loop_reset(vha);
-	}
-
-	if (ql2xtargetreset == 1 && ha->flags.enable_target_reset) {
-		list_for_each_entry(fcport, &vha->vp_fcports, list) {
-			if (fcport->port_type != FCT_TARGET)
-				continue;
-
-			ret = ha->isp_ops->target_reset(fcport, 0, 0);
-			if (ret != QLA_SUCCESS) {
-				ql_dbg(ql_dbg_taskm, vha, 0x802c,
-				    "Bus Reset failed: Reset=%d "
-				    "d_id=%x.\n", ret, fcport->d_id.b24);
-			}
-		}
-	}
-
+	if (IS_QLAFX00(ha))
+		return QLA_SUCCESS;
 
 	if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) {
 		atomic_set(&vha->loop_state, LOOP_DOWN);
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 04/13] qla2xxx: edif: fix app start fail
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (2 preceding siblings ...)
  2021-10-21  7:31 ` [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip Nilesh Javali
@ 2021-10-21  7:31 ` Nilesh Javali
  2021-10-21 14:06   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 05/13] qla2xxx: edif: fix app start delay Nilesh Javali
                   ` (8 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:31 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

On app start, all sessions need to be reset to see
if secure connection can be made. Fix the
broken check which prevents that process.

Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c | 54 +++++++++++++++++----------------
 1 file changed, 28 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index ad746c62f0d4..cb54d3ee11aa 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -529,7 +529,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 	struct app_start_reply	appreply;
 	struct fc_port  *fcport, *tf;
 
-	ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app start\n", __func__);
+	ql_log(ql_log_info, vha, 0x1313,
+	       "EDIF application registration with driver, FC device connections will be re-established.\n");
 
 	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
 	    bsg_job->request_payload.sg_cnt, &appstart,
@@ -554,37 +555,38 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 		qla2xxx_wake_dpc(vha);
 	} else {
 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
+			ql_dbg(ql_dbg_edif, vha, 0x2058,
+			       "FCSP - nn %8phN pn %8phN portid=%02x%02x%02x.\n",
+			       fcport->node_name, fcport->port_name,
+			       fcport->d_id.b.domain, fcport->d_id.b.area,
+			       fcport->d_id.b.al_pa);
 			ql_dbg(ql_dbg_edif, vha, 0xf084,
-			       "%s: sess %p %8phC lid %#04x s_id %06x logout %d\n",
-			       __func__, fcport, fcport->port_name,
-			       fcport->loop_id, fcport->d_id.b24,
-			       fcport->logout_on_delete);
-
-			ql_dbg(ql_dbg_edif, vha, 0xf084,
-			       "keep %d els_logo %d disc state %d auth state %d stop state %d\n",
-			       fcport->keep_nport_handle,
-			       fcport->send_els_logo, fcport->disc_state,
-			       fcport->edif.auth_state, fcport->edif.app_stop);
+			       "%s: se_sess %p / sess %p from port %8phC "
+			       "loop_id %#04x s_id %02x:%02x:%02x logout %d "
+			       "keep %d els_logo %d disc state %d auth state %d"
+			       "stop state %d\n",
+			       __func__, fcport->se_sess, fcport,
+			       fcport->port_name, fcport->loop_id,
+			       fcport->d_id.b.domain, fcport->d_id.b.area,
+			       fcport->d_id.b.al_pa, fcport->logout_on_delete,
+			       fcport->keep_nport_handle, fcport->send_els_logo,
+			       fcport->disc_state, fcport->edif.auth_state,
+			       fcport->edif.app_stop);
 
 			if (atomic_read(&vha->loop_state) == LOOP_DOWN)
 				break;
-			if (!(fcport->flags & FCF_FCSP_DEVICE))
-				continue;
 
 			fcport->edif.app_started = 1;
-			if (fcport->edif.app_stop ||
-			    (fcport->disc_state != DSC_LOGIN_COMPLETE &&
-			     fcport->disc_state != DSC_LOGIN_PEND &&
-			     fcport->disc_state != DSC_DELETED)) {
-				/* no activity */
-				fcport->edif.app_stop = 0;
-
-				ql_dbg(ql_dbg_edif, vha, 0x911e,
-				       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
-				       __func__, fcport->port_name);
-				fcport->edif.app_sess_online = 1;
-				qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
-			}
+			fcport->login_retry = vha->hw->login_retry_count;
+
+			/* no activity */
+			fcport->edif.app_stop = 0;
+
+			ql_dbg(ql_dbg_edif, vha, 0x911e,
+			       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
+			       __func__, fcport->port_name);
+			fcport->edif.app_sess_online = 1;
+			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
 			qla_edif_sa_ctl_init(vha, fcport);
 		}
 	}
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 05/13] qla2xxx: edif: fix app start delay
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (3 preceding siblings ...)
  2021-10-21  7:31 ` [PATCH v2 04/13] qla2xxx: edif: fix app start fail Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:09   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down Nilesh Javali
                   ` (7 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

Current driver does unnecessary pause for each session to
get to certain state before allowing the app start call to
return. In larger environment, this introduce long delay.
Previously, the delay is meant to synchronize app and driver.
In today's driver, the 2 side uses various events to synchronize
the state.

The same is applied to authentication failure call.

Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c | 64 ++-------------------------------
 1 file changed, 3 insertions(+), 61 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index cb54d3ee11aa..33cdcdf9f511 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -290,63 +290,6 @@ qla_edif_app_check(scsi_qla_host_t *vha, struct app_id appid)
 	return false;
 }
 
-static void qla_edif_reset_auth_wait(struct fc_port *fcport, int state,
-		int waitonly)
-{
-	int cnt, max_cnt = 200;
-	bool traced = false;
-
-	fcport->keep_nport_handle = 1;
-
-	if (!waitonly) {
-		qla2x00_set_fcport_disc_state(fcport, state);
-		qlt_schedule_sess_for_deletion(fcport);
-	} else {
-		qla2x00_set_fcport_disc_state(fcport, state);
-	}
-
-	ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
-		"%s: waiting for session, max_cnt=%u\n",
-		__func__, max_cnt);
-
-	cnt = 0;
-
-	if (waitonly) {
-		/* Marker wait min 10 msecs. */
-		msleep(50);
-		cnt += 50;
-	}
-	while (1) {
-		if (!traced) {
-			ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
-			    "%s: session sleep.\n",
-			    __func__);
-			traced = true;
-		}
-		msleep(20);
-		cnt++;
-		if (waitonly && (fcport->disc_state == state ||
-			fcport->disc_state == DSC_LOGIN_COMPLETE))
-			break;
-		if (fcport->disc_state == DSC_LOGIN_AUTH_PEND)
-			break;
-		if (cnt > max_cnt)
-			break;
-	}
-
-	if (!waitonly) {
-		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
-		    "%s: waited for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
-		    __func__, fcport->port_name, fcport->loop_id,
-		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
-	} else {
-		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
-		    "%s: waited ONLY for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
-		    __func__, fcport->port_name, fcport->loop_id,
-		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
-	}
-}
-
 static void
 qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl,
 	int index)
@@ -585,8 +528,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 			ql_dbg(ql_dbg_edif, vha, 0x911e,
 			       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
 			       __func__, fcport->port_name);
-			fcport->edif.app_sess_online = 1;
-			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
+			fcport->edif.app_sess_online = 0;
+			qlt_schedule_sess_for_deletion(fcport);
 			qla_edif_sa_ctl_init(vha, fcport);
 		}
 	}
@@ -802,7 +745,6 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 		ql_dbg(ql_dbg_edif, vha, 0x911e,
 		    "%s AUTH complete - RESUME with prli for wwpn %8phC\n",
 		    __func__, fcport->port_name);
-		qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 1);
 		qla24xx_post_prli_work(vha, fcport);
 	}
 
@@ -875,7 +817,7 @@ qla_edif_app_authfail(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 
 		if (qla_ini_mode_enabled(fcport->vha)) {
 			fcport->send_els_logo = 1;
-			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
+			qlt_schedule_sess_for_deletion(fcport);
 		}
 	}
 
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (4 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 05/13] qla2xxx: edif: fix app start delay Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:21   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe Nilesh Javali
                   ` (6 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

On session down, driver will flush all stale messages and
doorbell events. This prevents authentication application
from having to process stale data.

Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
Signed-off-by: Karunakara Merugu <kmerugu@marvell.com>
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c   | 99 ++++++++++++++++++++++++++++++-
 drivers/scsi/qla2xxx/qla_gbl.h    |  2 +
 drivers/scsi/qla2xxx/qla_target.c |  1 +
 3 files changed, 101 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index 33cdcdf9f511..b4eca966067a 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -1595,6 +1595,41 @@ qla_enode_stop(scsi_qla_host_t *vha)
 	spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags);
 }
 
+static void qla_enode_clear(scsi_qla_host_t *vha, port_id_t portid)
+{
+	unsigned    long flags;
+	struct enode    *e, *tmp;
+	struct purexevent   *purex;
+	LIST_HEAD(enode_list);
+
+	if (vha->pur_cinfo.enode_flags != ENODE_ACTIVE) {
+		ql_dbg(ql_dbg_edif, vha, 0x09102,
+		       "%s enode not active\n", __func__);
+		return;
+	}
+	spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags);
+	list_for_each_entry_safe(e, tmp, &vha->pur_cinfo.head, list) {
+		purex = &e->u.purexinfo;
+		if (purex->pur_info.pur_sid.b24 == portid.b24) {
+			ql_dbg(ql_dbg_edif, vha, 0x911d,
+			    "%s free ELS sid=%x. xchg %x, nb=%xh\n",
+			    __func__, portid.b24,
+			    purex->pur_info.pur_rx_xchg_address,
+			    purex->pur_info.pur_bytes_rcvd);
+
+			list_del_init(&e->list);
+			list_add_tail(&e->list, &enode_list);
+		}
+	}
+
+	spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags);
+
+	list_for_each_entry_safe(e, tmp, &enode_list, list) {
+		list_del_init(&e->list);
+		qla_enode_free(vha, e);
+	}
+}
+
 /*
  *  allocate enode struct and populate buffer
  *  returns: enode pointer with buffers
@@ -1794,6 +1829,59 @@ qla_edb_node_free(scsi_qla_host_t *vha, struct edb_node *node)
 	node->ntype = N_UNDEF;
 }
 
+static void qla_edb_clear(scsi_qla_host_t *vha, port_id_t portid)
+{
+	unsigned long flags;
+	struct edb_node *e, *tmp;
+	port_id_t sid;
+	LIST_HEAD(edb_list);
+
+	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+		/* doorbell list not enabled */
+		ql_dbg(ql_dbg_edif, vha, 0x09102,
+		       "%s doorbell not enabled\n", __func__);
+		return;
+	}
+
+	/* grab lock so list doesn't move */
+	spin_lock_irqsave(&vha->e_dbell.db_lock, flags);
+
+	list_for_each_entry_safe(e, tmp, &vha->e_dbell.head, list) {
+		switch (e->ntype) {
+		case VND_CMD_AUTH_STATE_NEEDED:
+		case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN:
+			sid = e->u.plogi_did;
+			break;
+		case VND_CMD_AUTH_STATE_ELS_RCVD:
+			sid = e->u.els_sid;
+			break;
+		case VND_CMD_AUTH_STATE_SAUPDATE_COMPL:
+			/* app wants to see this  */
+			continue;
+		default:
+			ql_log(ql_log_warn, vha, 0x09102,
+			       "%s unknown type: %x\n", __func__, e->ntype);
+			sid.b24 = 0;
+			break;
+		}
+		if (sid.b24 == portid.b24) {
+			ql_dbg(ql_dbg_edif, vha, 0x910f,
+			       "%s Doorbell free : type=%x %p\n",
+			       __func__, e->ntype, e);
+			list_del_init(&e->list);
+			list_add_tail(&e->list, &edb_list);
+		}
+	}
+
+	spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags);
+
+	list_for_each_entry_safe(e, tmp, &edb_list, list) {
+		qla_edb_node_free(vha, e);
+		list_del_init(&e->list);
+		kfree(e);
+	}
+}
+
 /* function called when app is stopping */
 
 void
@@ -2380,7 +2468,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 	ql_dbg(ql_dbg_edif, host, 0x0910c,
 	    "%s COMPLETE purex->pur_info.pur_bytes_rcvd =%xh s:%06x -> d:%06x xchg=%xh\n",
 	    __func__, purex->pur_info.pur_bytes_rcvd, purex->pur_info.pur_sid.b24,
-	    purex->pur_info.pur_did.b24, p->rx_xchg_addr);
+	    purex->pur_info.pur_did.b24, purex->pur_info.pur_rx_xchg_address);
 
 	qla_edb_eventcreate(host, VND_CMD_AUTH_STATE_ELS_RCVD, sid, 0, NULL);
 }
@@ -3403,3 +3491,12 @@ void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess)
 		qla2x00_post_aen_work(vha, FCH_EVT_PORT_OFFLINE, sess->d_id.b24);
 	}
 }
+
+void qla_edif_clear_appdata(struct scsi_qla_host *vha, struct fc_port *fcport)
+{
+	if (!(fcport->flags & FCF_FCSP_DEVICE))
+		return;
+
+	qla_edb_clear(vha, fcport->d_id);
+	qla_enode_clear(vha, fcport->d_id);
+}
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 8faaa0ec595d..76b89bd297dc 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -142,6 +142,8 @@ void qlt_chk_edif_rx_sa_delete_pending(scsi_qla_host_t *vha, fc_port_t *fcport,
 void qla2x00_release_all_sadb(struct scsi_qla_host *vha, struct fc_port *fcport);
 int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsgjob);
 void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess);
+void qla_edif_clear_appdata(struct scsi_qla_host *vha,
+			    struct fc_port *fcport);
 const char *sc_to_str(uint16_t cmd);
 
 /*
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index b3478ed9b12e..edc34e69d75b 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1003,6 +1003,7 @@ void qlt_free_session_done(struct work_struct *work)
 					"%s bypassing release_all_sadb\n",
 					__func__);
 			}
+			qla_edif_clear_appdata(vha, sess);
 			qla_edif_sess_down(vha, sess);
 		}
 		qla2x00_mark_device_lost(vha, sess, 0);
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (5 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:22   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 08/13] qla2xxx: edif: tweak trace message Nilesh Javali
                   ` (5 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

This patch is per review comment by Hannes Reinecke from
previous submission to replace list_for_each_safe with
list_for_each_entry_safe.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c | 39 ++++++++-------------------------
 drivers/scsi/qla2xxx/qla_edif.h |  1 -
 drivers/scsi/qla2xxx/qla_os.c   |  8 +++----
 3 files changed, 13 insertions(+), 35 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index b4eca966067a..ca3b947770b9 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -1674,41 +1674,25 @@ static struct enode *
 qla_enode_find(scsi_qla_host_t *vha, uint32_t ntype, uint32_t p1, uint32_t p2)
 {
 	struct enode		*node_rtn = NULL;
-	struct enode		*list_node = NULL;
+	struct enode		*list_node, *q;
 	unsigned long		flags;
-	struct list_head	*pos, *q;
 	uint32_t		sid;
-	uint32_t		rw_flag;
 	struct purexevent	*purex;
 
 	/* secure the list from moving under us */
 	spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags);
 
-	list_for_each_safe(pos, q, &vha->pur_cinfo.head) {
-		list_node = list_entry(pos, struct enode, list);
+	list_for_each_entry_safe(list_node, q, &vha->pur_cinfo.head, list) {
 
 		/* node type determines what p1 and p2 are */
 		purex = &list_node->u.purexinfo;
 		sid = p1;
-		rw_flag = p2;
 
 		if (purex->pur_info.pur_sid.b24 == sid) {
-			if (purex->pur_info.pur_pend == 1 &&
-			    rw_flag == PUR_GET) {
-				/*
-				 * if the receive is in progress
-				 * and its a read/get then can't
-				 * transfer yet
-				 */
-				ql_dbg(ql_dbg_edif, vha, 0x9106,
-				    "%s purex xfer in progress for sid=%x\n",
-				    __func__, sid);
-			} else {
-				/* found it and its complete */
-				node_rtn = list_node;
-				list_del(pos);
-				break;
-			}
+			/* found it and its complete */
+			node_rtn = list_node;
+			list_del(&list_node->list);
+			break;
 		}
 	}
 
@@ -2419,7 +2403,6 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 
 	purex = &ptr->u.purexinfo;
 	purex->pur_info.pur_sid = a.did;
-	purex->pur_info.pur_pend = 0;
 	purex->pur_info.pur_bytes_rcvd = totlen;
 	purex->pur_info.pur_rx_xchg_address = le32_to_cpu(p->rx_xchg_addr);
 	purex->pur_info.pur_nphdl = le16_to_cpu(p->nport_handle);
@@ -3171,18 +3154,14 @@ static uint16_t qla_edif_sadb_get_sa_index(fc_port_t *fcport,
 /* release any sadb entries -- only done at teardown */
 void qla_edif_sadb_release(struct qla_hw_data *ha)
 {
-	struct list_head *pos;
-	struct list_head *tmp;
-	struct edif_sa_index_entry *entry;
+	struct edif_sa_index_entry *entry, *tmp;
 
-	list_for_each_safe(pos, tmp, &ha->sadb_rx_index_list) {
-		entry = list_entry(pos, struct edif_sa_index_entry, next);
+	list_for_each_entry_safe(entry, tmp, &ha->sadb_rx_index_list, next) {
 		list_del(&entry->next);
 		kfree(entry);
 	}
 
-	list_for_each_safe(pos, tmp, &ha->sadb_tx_index_list) {
-		entry = list_entry(pos, struct edif_sa_index_entry, next);
+	list_for_each_entry_safe(entry, tmp, &ha->sadb_tx_index_list, next) {
 		list_del(&entry->next);
 		kfree(entry);
 	}
diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
index 9e8f28d0caa1..cd54c1dfe3cb 100644
--- a/drivers/scsi/qla2xxx/qla_edif.h
+++ b/drivers/scsi/qla2xxx/qla_edif.h
@@ -102,7 +102,6 @@ struct dinfo {
 };
 
 struct pur_ninfo {
-	unsigned int	pur_pend:1;
 	port_id_t       pur_sid;
 	port_id_t	pur_did;
 	uint8_t		vp_idx;
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 3fca6b8bb23f..df0e46ef3e96 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -3885,13 +3885,13 @@ qla2x00_remove_one(struct pci_dev *pdev)
 static inline void
 qla24xx_free_purex_list(struct purex_list *list)
 {
-	struct list_head *item, *next;
+	struct purex_item *item, *next;
 	ulong flags;
 
 	spin_lock_irqsave(&list->lock, flags);
-	list_for_each_safe(item, next, &list->head) {
-		list_del(item);
-		kfree(list_entry(item, struct purex_item, list));
+	list_for_each_entry_safe(item, next, &list->head, list) {
+		list_del(&item->list);
+		kfree(item);
 	}
 	spin_unlock_irqrestore(&list->lock, flags);
 }
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 08/13] qla2xxx: edif: tweak trace message
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (6 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:35   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash Nilesh Javali
                   ` (4 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

Modify trace messages for additional debugability.

Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_def.h  |  4 ++--
 drivers/scsi/qla2xxx/qla_edif.c |  6 +++++-
 drivers/scsi/qla2xxx/qla_init.c | 15 +++++++++------
 drivers/scsi/qla2xxx/qla_isr.c  |  4 ++++
 4 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 8924eeb9367d..9ebf4a234d9a 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -639,9 +639,9 @@ struct qla_els_pt_arg {
 	u8 els_opcode;
 	u8 vp_idx;
 	__le16 nport_handle;
-	u16 control_flags;
+	u16 control_flags, ox_id;
 	__le32 rx_xchg_address;
-	port_id_t did;
+	port_id_t did, sid;
 	u32 tx_len, tx_byte_count, rx_len, rx_byte_count;
 	dma_addr_t tx_addr, rx_addr;
 
diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index ca3b947770b9..bb3a1afb86a8 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -1765,7 +1765,8 @@ qla_els_reject_iocb(scsi_qla_host_t *vha, struct qla_qpair *qp,
 	qla_els_pt_iocb(vha, els_iocb, a);
 
 	ql_dbg(ql_dbg_edif, vha, 0x0183,
-	    "Sending ELS reject...\n");
+	    "Sending ELS reject ox_id %04x s:%06x -> d:%06x\n",
+	    a->ox_id, a->sid.b24, a->did.b24);
 	ql_dump_buffer(ql_dbg_edif + ql_dbg_verbose, vha, 0x0185,
 	    vha->hw->elsrej.c, sizeof(*vha->hw->elsrej.c));
 	/* flush iocb to mem before notifying hw doorbell */
@@ -2362,6 +2363,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 	a.tx_addr = vha->hw->elsrej.cdma;
 	a.vp_idx = vha->vp_idx;
 	a.control_flags = EPD_ELS_RJT;
+	a.ox_id = le16_to_cpu(p->ox_id);
 
 	sid = p->s_id[0] | (p->s_id[1] << 8) | (p->s_id[2] << 16);
 
@@ -2411,6 +2413,8 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 	purex->pur_info.pur_did.b.al_pa =  p->d_id[0];
 	purex->pur_info.vp_idx = p->vp_idx;
 
+	a.sid = purex->pur_info.pur_did;
+
 	rc = __qla_copy_purex_to_buffer(vha, pkt, rsp, purex->msgp,
 		purex->msgp_len);
 	if (rc) {
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2ccdc76cf0d9..dbffc59e1677 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -333,9 +333,6 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
 		    vha->e_dbell.db_flags & EDB_ACTIVE) {
 			lio->u.logio.flags |=
 				(SRB_LOGIN_FCSP | SRB_LOGIN_SKIP_PRLI);
-			ql_dbg(ql_dbg_disc, vha, 0x2072,
-			    "Async-login: w/ FCSP %8phC hdl=%x, loopid=%x portid=%06x\n",
-			    fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24);
 		} else {
 			lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
 		}
@@ -344,12 +341,14 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
 	if (NVME_TARGET(vha->hw, fcport))
 		lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI;
 
+	rval = qla2x00_start_sp(sp);
+
 	ql_dbg(ql_dbg_disc, vha, 0x2072,
-	       "Async-login - %8phC hdl=%x, loopid=%x portid=%06x retries=%d.\n",
+	       "Async-login - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
 	       fcport->port_name, sp->handle, fcport->loop_id,
-	       fcport->d_id.b24, fcport->login_retry);
+	       fcport->d_id.b24, fcport->login_retry,
+	       lio->u.logio.flags & SRB_LOGIN_FCSP ? "FCSP" : "");
 
-	rval = qla2x00_start_sp(sp);
 	if (rval != QLA_SUCCESS) {
 		fcport->flags |= FCF_LOGIN_NEEDED;
 		set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
@@ -5867,6 +5866,10 @@ void qla_register_fcport_fn(struct work_struct *work)
 
 	qla2x00_update_fcport(fcport->vha, fcport);
 
+	ql_dbg(ql_dbg_disc, fcport->vha, 0x911e,
+	       "%s rscn gen %d/%d next DS %d\n", __func__,
+	       rscn_gen, fcport->rscn_gen, fcport->next_disc_state);
+
 	if (rscn_gen != fcport->rscn_gen) {
 		/* RSCN(s) came in while registration */
 		switch (fcport->next_disc_state) {
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index b26f2699adb2..4e1dffa329f1 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -2233,6 +2233,10 @@ qla24xx_els_ct_entry(scsi_qla_host_t *v, struct req_que *req,
 				}
 
 			} else if (comp_status == CS_PORT_LOGGED_OUT) {
+				ql_dbg(ql_dbg_disc, vha, 0x911e,
+				       "%s %d sche delete\n",
+				       __func__, __LINE__);
+
 				els->u.els_plogi.len = 0;
 				res = DID_IMM_RETRY << 16;
 				qlt_schedule_sess_for_deletion(sp->fcport);
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (7 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 08/13] qla2xxx: edif: tweak trace message Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:39   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 10/13] qla2xxx: edif: increase ELS payload Nilesh Javali
                   ` (3 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

On ipsec start by remote port, Target port may use RSCN to
trigger initiator to relogin. If driver is already in the process
of a relogin, then ignore the RSCN and allow the current relogin
to continue. This reduces thrashing of the connection.

Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_attr.c |  7 ++++++-
 drivers/scsi/qla2xxx/qla_edif.h |  4 ++++
 drivers/scsi/qla2xxx/qla_init.c | 24 ++++++++++++++++++++++--
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index cb5f2ecb652d..41a9fb04b663 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2757,7 +2757,12 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
 			if (fcport->loop_id != FC_NO_LOOP_ID)
 				fcport->logout_on_delete = 1;
 
-			qlt_schedule_sess_for_deletion(fcport);
+			if (!EDIF_NEGOTIATION_PENDING(fcport)) {
+				ql_dbg(ql_dbg_disc, fcport->vha, 0x911e,
+				       "%s %d sched delete\n", __func__,
+				       __LINE__);
+				qlt_schedule_sess_for_deletion(fcport);
+			}
 		} else {
 			qla2x00_port_logout(fcport->vha, fcport);
 		}
diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
index cd54c1dfe3cb..920b1eace40f 100644
--- a/drivers/scsi/qla2xxx/qla_edif.h
+++ b/drivers/scsi/qla2xxx/qla_edif.h
@@ -132,4 +132,8 @@ struct enode {
 	 _s->disc_state == DSC_DELETED || \
 	 !_s->edif.app_sess_online))
 
+#define EDIF_NEGOTIATION_PENDING(_fcport) \
+	((_fcport->vha.e_dbell.db_flags & EDB_ACTIVE) && \
+	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND))
+
 #endif	/* __QLA_EDIF_H */
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index dbffc59e1677..999e0423891c 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1793,8 +1793,28 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
 					fcport->d_id.b24, fcport->port_name);
 				return;
 			}
-			fcport->scan_needed = 1;
-			fcport->rscn_gen++;
+
+			if (vha->hw->flags.edif_enabled && vha->e_dbell.db_flags & EDB_ACTIVE) {
+				/*
+				 * On ipsec start by remote port, Target port
+				 * may use RSCN to trigger initiator to
+				 * relogin. If driver is already in the
+				 * process of a relogin, then ignore the RSCN
+				 * and allow the current relogin to continue.
+				 * This reduces thrashing of the connection.
+				 */
+				if (atomic_read(&fcport->state) == FCS_ONLINE) {
+					/*
+					 * If state = online, then set scan_needed=1 to do relogin.
+					 * Otherwise we're already in the middle of a relogin
+					 */
+					fcport->scan_needed = 1;
+					fcport->rscn_gen++;
+				}
+			} else {
+				fcport->scan_needed = 1;
+				fcport->rscn_gen++;
+			}
 		}
 		break;
 	case RSCN_AREA_ADDR:
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 10/13] qla2xxx: edif: increase ELS payload
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (8 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:41   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags Nilesh Javali
                   ` (2 subsequent siblings)
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

Currently, FW limits ELS payload to FC frame size/2112.
This patch adjust memory buffer size to be able to handle
max ELS payload.

Fixes: 84318a9f01ce ("scsi: qla2xxx: edif: Add send, receive, and accept for
		     auth_els")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c     | 2 +-
 drivers/scsi/qla2xxx/qla_edif.h     | 3 ++-
 drivers/scsi/qla2xxx/qla_edif_bsg.h | 2 +-
 drivers/scsi/qla2xxx/qla_init.c     | 4 ++++
 drivers/scsi/qla2xxx/qla_os.c       | 2 +-
 5 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index bb3a1afb86a8..1ea130c61d70 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -2375,7 +2375,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 		return;
 	}
 
-	if (totlen > MAX_PAYLOAD) {
+	if (totlen > ELS_MAX_PAYLOAD) {
 		ql_dbg(ql_dbg_edif, vha, 0x0910d,
 		    "%s WARNING: verbose ELS frame received (totlen=%x)\n",
 		    __func__, totlen);
diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
index 920b1eace40f..2517005fb08c 100644
--- a/drivers/scsi/qla2xxx/qla_edif.h
+++ b/drivers/scsi/qla2xxx/qla_edif.h
@@ -93,7 +93,6 @@ struct sa_update_28xx {
 };
 
 #define        NUM_ENTRIES     256
-#define        MAX_PAYLOAD     1024
 #define        PUR_GET         1
 
 struct dinfo {
@@ -127,6 +126,8 @@ struct enode {
 	} u;
 };
 
+#define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES))
+
 #define EDIF_SESSION_DOWN(_s) \
 	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \
 	 _s->disc_state == DSC_DELETED || \
diff --git a/drivers/scsi/qla2xxx/qla_edif_bsg.h b/drivers/scsi/qla2xxx/qla_edif_bsg.h
index 58b718d35d19..53026d82ebff 100644
--- a/drivers/scsi/qla2xxx/qla_edif_bsg.h
+++ b/drivers/scsi/qla2xxx/qla_edif_bsg.h
@@ -8,7 +8,7 @@
 #define __QLA_EDIF_BSG_H
 
 /* BSG Vendor specific commands */
-#define	ELS_MAX_PAYLOAD		1024
+#define	ELS_MAX_PAYLOAD		2112
 #ifndef	WWN_SIZE
 #define WWN_SIZE		8
 #endif
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 999e0423891c..2bc5593645ec 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -4486,6 +4486,10 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
 		    (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
 	}
 
+	/* ELS pass through payload is limit by frame size. */
+	if (ha->flags.edif_enabled)
+		mid_init_cb->init_cb.frame_payload_size = cpu_to_le16(ELS_MAX_PAYLOAD);
+
 	rval = qla2x00_init_firmware(vha, ha->init_cb_size);
 next_check:
 	if (rval) {
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index df0e46ef3e96..814d082491af 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -4352,7 +4352,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
 
 	/* allocate the purex dma pool */
 	ha->purex_dma_pool = dma_pool_create(name, &ha->pdev->dev,
-	    MAX_PAYLOAD, 8, 0);
+	    ELS_MAX_PAYLOAD, 8, 0);
 
 	if (!ha->purex_dma_pool) {
 		ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b,
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (9 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 10/13] qla2xxx: edif: increase ELS payload Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:44   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 12/13] qla2xxx: edif: fix edif bsg Nilesh Javali
  2021-10-21  7:32 ` [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k Nilesh Javali
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

db_flags field is a bit field. Replace value check with bit flag check.

Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c   | 26 +++++++++++++-------------
 drivers/scsi/qla2xxx/qla_edif.h   |  7 +++++--
 drivers/scsi/qla2xxx/qla_init.c   | 13 ++++++-------
 drivers/scsi/qla2xxx/qla_iocb.c   |  3 +--
 drivers/scsi/qla2xxx/qla_target.c |  2 +-
 5 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index 1ea130c61d70..440a3caa28f9 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -218,7 +218,7 @@ fc_port_t *fcport)
 		    "%s edif not enabled\n", __func__);
 		goto done;
 	}
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		ql_dbg(ql_dbg_edif, vha, 0x09102,
 		    "%s doorbell not enabled\n", __func__);
 		goto done;
@@ -482,9 +482,9 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 	ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app_vid=%x app_start_flags %x\n",
 	     __func__, appstart.app_info.app_vid, appstart.app_start_flags);
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		/* mark doorbell as active since an app is now present */
-		vha->e_dbell.db_flags = EDB_ACTIVE;
+		vha->e_dbell.db_flags |= EDB_ACTIVE;
 	} else {
 		ql_dbg(ql_dbg_edif, vha, 0x911e, "%s doorbell already active\n",
 		     __func__);
@@ -1274,7 +1274,7 @@ qla24xx_sadb_update(struct bsg_job *bsg_job)
 		goto done;
 	}
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		ql_log(ql_log_warn, vha, 0x70a1, "App not started\n");
 		rval = -EIO;
 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
@@ -1778,7 +1778,7 @@ qla_els_reject_iocb(scsi_qla_host_t *vha, struct qla_qpair *qp,
 void
 qla_edb_init(scsi_qla_host_t *vha)
 {
-	if (vha->e_dbell.db_flags == EDB_ACTIVE) {
+	if (DBELL_ACTIVE(vha)) {
 		/* list already init'd - error */
 		ql_dbg(ql_dbg_edif, vha, 0x09102,
 		    "edif db already initialized, cannot reinit\n");
@@ -1821,7 +1821,7 @@ static void qla_edb_clear(scsi_qla_host_t *vha, port_id_t portid)
 	port_id_t sid;
 	LIST_HEAD(edb_list);
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		/* doorbell list not enabled */
 		ql_dbg(ql_dbg_edif, vha, 0x09102,
 		       "%s doorbell not enabled\n", __func__);
@@ -1875,7 +1875,7 @@ qla_edb_stop(scsi_qla_host_t *vha)
 	unsigned long flags;
 	struct edb_node *node, *q;
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		/* doorbell list not enabled */
 		ql_dbg(ql_dbg_edif, vha, 0x09102,
 		    "%s doorbell not enabled\n", __func__);
@@ -1926,7 +1926,7 @@ qla_edb_node_add(scsi_qla_host_t *vha, struct edb_node *ptr)
 {
 	unsigned long		flags;
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		/* doorbell list not enabled */
 		ql_dbg(ql_dbg_edif, vha, 0x09102,
 		    "%s doorbell not enabled\n", __func__);
@@ -1957,7 +1957,7 @@ qla_edb_eventcreate(scsi_qla_host_t *vha, uint32_t dbtype,
 		return;
 	}
 
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		if (fcport)
 			fcport->edif.auth_state = dbtype;
 		/* doorbell list not enabled */
@@ -2052,7 +2052,7 @@ qla_edif_timer(scsi_qla_host_t *vha)
 	struct qla_hw_data *ha = vha->hw;
 
 	if (!vha->vp_idx && N2N_TOPO(ha) && ha->flags.n2n_fw_acc_sec) {
-		if (vha->e_dbell.db_flags != EDB_ACTIVE &&
+		if (DBELL_INACTIVE(vha) &&
 		    ha->edif_post_stop_cnt_down) {
 			ha->edif_post_stop_cnt_down--;
 
@@ -2090,7 +2090,7 @@ edif_doorbell_show(struct device *dev, struct device_attribute *attr,
 	sz = 256;
 
 	/* stop new threads from waiting if we're not init'd */
-	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
+	if (DBELL_INACTIVE(vha)) {
 		ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x09122,
 		    "%s error - edif db not enabled\n", __func__);
 		return 0;
@@ -2438,7 +2438,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 
 	fcport = qla2x00_find_fcport_by_pid(host, &purex->pur_info.pur_sid);
 
-	if (host->e_dbell.db_flags != EDB_ACTIVE ||
+	if (DBELL_INACTIVE(vha) ||
 	    (fcport && EDIF_SESSION_DOWN(fcport))) {
 		ql_dbg(ql_dbg_edif, host, 0x0910c, "%s e_dbell.db_flags =%x %06x\n",
 		    __func__, host->e_dbell.db_flags,
@@ -3464,7 +3464,7 @@ int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 
 void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess)
 {
-	if (sess->edif.app_sess_online && vha->e_dbell.db_flags & EDB_ACTIVE) {
+	if (sess->edif.app_sess_online && DBELL_ACTIVE(vha)) {
 		ql_dbg(ql_dbg_disc, vha, 0xf09c,
 			"%s: sess %8phN send port_offline event\n",
 			__func__, sess->port_name);
diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
index 2517005fb08c..a965ca8e47ce 100644
--- a/drivers/scsi/qla2xxx/qla_edif.h
+++ b/drivers/scsi/qla2xxx/qla_edif.h
@@ -41,9 +41,12 @@ struct pur_core {
 };
 
 enum db_flags_t {
-	EDB_ACTIVE = 0x1,
+	EDB_ACTIVE = BIT_0,
 };
 
+#define DBELL_ACTIVE(_v) (_v->e_dbell.db_flags & EDB_ACTIVE)
+#define DBELL_INACTIVE(_v) (!(_v->e_dbell.db_flags & EDB_ACTIVE))
+
 struct edif_dbell {
 	enum db_flags_t		db_flags;
 	spinlock_t		db_lock;
@@ -134,7 +137,7 @@ struct enode {
 	 !_s->edif.app_sess_online))
 
 #define EDIF_NEGOTIATION_PENDING(_fcport) \
-	((_fcport->vha.e_dbell.db_flags & EDB_ACTIVE) && \
+	(DBELL_ACTIVE(_fcport->vha) && \
 	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND))
 
 #endif	/* __QLA_EDIF_H */
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2bc5593645ec..c0b813fc1ec4 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -330,7 +330,7 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
 		lio->u.logio.flags |= SRB_LOGIN_PRLI_ONLY;
 	} else {
 		if (vha->hw->flags.edif_enabled &&
-		    vha->e_dbell.db_flags & EDB_ACTIVE) {
+		    DBELL_ACTIVE(vha)) {
 			lio->u.logio.flags |=
 				(SRB_LOGIN_FCSP | SRB_LOGIN_SKIP_PRLI);
 		} else {
@@ -861,7 +861,7 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
 				break;
 			case DSC_LS_PLOGI_COMP:
 				if (vha->hw->flags.edif_enabled &&
-				    vha->e_dbell.db_flags & EDB_ACTIVE) {
+				    DBELL_ACTIVE(vha)) {
 					/* check to see if App support secure or not */
 					qla24xx_post_gpdb_work(vha, fcport, 0);
 					break;
@@ -1451,7 +1451,7 @@ static int	qla_chk_secure_login(scsi_qla_host_t	*vha, fc_port_t *fcport,
 			qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE,
 			    fcport->d_id.b24);
 
-			if (vha->e_dbell.db_flags ==  EDB_ACTIVE) {
+			if (DBELL_ACTIVE(vha)) {
 				ql_dbg(ql_dbg_disc, vha, 0x20ef,
 				    "%s %d %8phC EDIF: post DB_AUTH: AUTH needed\n",
 				    __func__, __LINE__, fcport->port_name);
@@ -1794,7 +1794,7 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
 				return;
 			}
 
-			if (vha->hw->flags.edif_enabled && vha->e_dbell.db_flags & EDB_ACTIVE) {
+			if (vha->hw->flags.edif_enabled && DBELL_ACTIVE(vha)) {
 				/*
 				 * On ipsec start by remote port, Target port
 				 * may use RSCN to trigger initiator to
@@ -4240,7 +4240,7 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha)
 		 * fw shal not send PRLI after PLOGI Acc
 		 */
 		if (ha->flags.edif_enabled &&
-		    vha->e_dbell.db_flags & EDB_ACTIVE) {
+		    DBELL_ACTIVE(vha)) {
 			ha->fw_options[3] |= BIT_15;
 			ha->flags.n2n_fw_acc_sec = 1;
 		} else {
@@ -5396,8 +5396,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
 			 * use link up to wake up app to get ready for
 			 * authentication.
 			 */
-			if (ha->flags.edif_enabled &&
-			    !(vha->e_dbell.db_flags & EDB_ACTIVE))
+			if (ha->flags.edif_enabled && DBELL_INACTIVE(vha))
 				qla2x00_post_aen_work(vha, FCH_EVT_LINKUP,
 						      ha->link_data_rate);
 
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 9d4ad1d2b00a..ed604f2185bf 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -3034,8 +3034,7 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
 	elsio->u.els_plogi.els_cmd = els_opcode;
 	elsio->u.els_plogi.els_plogi_pyld->opcode = els_opcode;
 
-	if (els_opcode == ELS_DCMD_PLOGI && vha->hw->flags.edif_enabled &&
-	    vha->e_dbell.db_flags & EDB_ACTIVE) {
+	if (els_opcode == ELS_DCMD_PLOGI && DBELL_ACTIVE(vha)) {
 		struct fc_els_flogi *p = ptr;
 
 		p->fl_csp.sp_features |= cpu_to_be16(FC_SP_FT_SEC);
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index edc34e69d75b..031233729ff4 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -4817,7 +4817,7 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
 	}
 
 	if (vha->hw->flags.edif_enabled) {
-		if (!(vha->e_dbell.db_flags & EDB_ACTIVE)) {
+		if (DBELL_INACTIVE(vha)) {
 			ql_dbg(ql_dbg_disc, vha, 0xffff,
 			       "%s %d Term INOT due to app not started lid=%d, NportID %06X ",
 			       __func__, __LINE__, loop_id, port_id.b24);
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 12/13] qla2xxx: edif: fix edif bsg
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (10 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:46   ` Himanshu Madhani
  2021-10-21  7:32 ` [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k Nilesh Javali
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

From: Quinn Tran <qutran@marvell.com>

Various EDIF bsg's did not properly fill out the reply_payload_rcv_len
field. This cause app to parse empty data in the return payload.

Fixes: 7ebb336e45ef ("scsi: qla2xxx: edif: Add start + stop bsgs")
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_edif.c | 49 ++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index 440a3caa28f9..68ae7ab43d0c 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c
@@ -546,14 +546,14 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 	appreply.edif_enode_active = vha->pur_cinfo.enode_flags;
 	appreply.edif_edb_active = vha->e_dbell.db_flags;
 
-	bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
-	    sizeof(struct app_start_reply);
+	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
 
 	SET_DID_STATUS(bsg_reply->result, DID_OK);
 
-	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
-	    bsg_job->reply_payload.sg_cnt, &appreply,
-	    sizeof(struct app_start_reply));
+	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
+							       bsg_job->reply_payload.sg_cnt,
+							       &appreply,
+							       sizeof(struct app_start_reply));
 
 	ql_dbg(ql_dbg_edif, vha, 0x911d,
 	    "%s app start completed with 0x%x\n",
@@ -750,9 +750,10 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 
 errstate_exit:
 	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
-	    bsg_job->reply_payload.sg_cnt, &appplogireply,
-	    sizeof(struct app_plogi_reply));
+	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
+							       bsg_job->reply_payload.sg_cnt,
+							       &appplogireply,
+							       sizeof(struct app_plogi_reply));
 
 	return rval;
 }
@@ -835,7 +836,7 @@ static int
 qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 {
 	int32_t			rval = 0;
-	int32_t			num_cnt;
+	int32_t			pcnt = 0;
 	struct fc_bsg_reply	*bsg_reply = bsg_job->reply;
 	struct app_pinfo_req	app_req;
 	struct app_pinfo_reply	*app_reply;
@@ -847,16 +848,14 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 	    bsg_job->request_payload.sg_cnt, &app_req,
 	    sizeof(struct app_pinfo_req));
 
-	num_cnt = app_req.num_ports;	/* num of ports alloc'd by app */
-
 	app_reply = kzalloc((sizeof(struct app_pinfo_reply) +
-	    sizeof(struct app_pinfo) * num_cnt), GFP_KERNEL);
+	    sizeof(struct app_pinfo) * app_req.num_ports), GFP_KERNEL);
+
 	if (!app_reply) {
 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
 		rval = -1;
 	} else {
 		struct fc_port	*fcport = NULL, *tf;
-		uint32_t	pcnt = 0;
 
 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
 			if (!(fcport->flags & FCF_FCSP_DEVICE))
@@ -925,9 +924,11 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 		SET_DID_STATUS(bsg_reply->result, DID_OK);
 	}
 
-	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
-	    bsg_job->reply_payload.sg_cnt, app_reply,
-	    sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * num_cnt);
+	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
+	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
+							       bsg_job->reply_payload.sg_cnt,
+							       app_reply,
+							       sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * pcnt);
 
 	kfree(app_reply);
 
@@ -944,10 +945,11 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 {
 	int32_t			rval = 0;
 	struct fc_bsg_reply	*bsg_reply = bsg_job->reply;
-	uint32_t ret_size, size;
+	uint32_t size;
 
 	struct app_sinfo_req	app_req;
 	struct app_stats_reply	*app_reply;
+	uint32_t pcnt = 0;
 
 	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
 	    bsg_job->request_payload.sg_cnt, &app_req,
@@ -963,18 +965,12 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 	size = sizeof(struct app_stats_reply) +
 	    (sizeof(struct app_sinfo) * app_req.num_ports);
 
-	if (size > bsg_job->reply_payload.payload_len)
-		ret_size = bsg_job->reply_payload.payload_len;
-	else
-		ret_size = size;
-
 	app_reply = kzalloc(size, GFP_KERNEL);
 	if (!app_reply) {
 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
 		rval = -1;
 	} else {
 		struct fc_port	*fcport = NULL, *tf;
-		uint32_t	pcnt = 0;
 
 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
 			if (fcport->edif.enable) {
@@ -998,9 +994,11 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
 		SET_DID_STATUS(bsg_reply->result, DID_OK);
 	}
 
+	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
 	bsg_reply->reply_payload_rcv_len =
 	    sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
-	       bsg_job->reply_payload.sg_cnt, app_reply, ret_size);
+	       bsg_job->reply_payload.sg_cnt, app_reply,
+	       sizeof(struct app_stats_reply) + (sizeof(struct app_sinfo) * pcnt));
 
 	kfree(app_reply);
 
@@ -1074,8 +1072,7 @@ qla_edif_app_mgmt(struct bsg_job *bsg_job)
 		    __func__,
 		    bsg_request->rqst_data.h_vendor.vendor_cmd[1]);
 		rval = EXT_STATUS_INVALID_PARAM;
-		bsg_job->reply_len = sizeof(struct fc_bsg_reply);
-		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
+		done = false;
 		break;
 	}
 
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k
  2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
                   ` (11 preceding siblings ...)
  2021-10-21  7:32 ` [PATCH v2 12/13] qla2xxx: edif: fix edif bsg Nilesh Javali
@ 2021-10-21  7:32 ` Nilesh Javali
  2021-10-21 14:47   ` Himanshu Madhani
  12 siblings, 1 reply; 27+ messages in thread
From: Nilesh Javali @ 2021-10-21  7:32 UTC (permalink / raw)
  To: martin.petersen; +Cc: linux-scsi, GR-QLogic-Storage-Upstream

Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_version.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h
index 4b117165bf8b..27e440f8a702 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -6,9 +6,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION      "10.02.07.100-k"
+#define QLA2XXX_VERSION      "10.02.07.200-k"
 
 #define QLA_DRIVER_MAJOR_VER	10
 #define QLA_DRIVER_MINOR_VER	2
 #define QLA_DRIVER_PATCH_VER	7
-#define QLA_DRIVER_BETA_VER	100
+#define QLA_DRIVER_BETA_VER	200
-- 
2.19.0.rc0


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance
  2021-10-21  7:31 ` [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance Nilesh Javali
@ 2021-10-21 13:58   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 13:58 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:31 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> For RSCN of type "Area, Domain, or Fabric", which indicate
> a portion or entire fabric was disturbed. Current driver
> does not set the scan_need flag to indicate a session was
> affected by the disturbance. This in turn, can lead to
> IO timeout and delay of relogin. Hence initiate relogin
> in the event of fabric disturbance.
> 
> Fixes: 1560bafdff9e ("scsi: qla2xxx: Use complete switch scan for RSCN events")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_init.c | 54 +++++++++++++++++++++++++++------
> 1 file changed, 45 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index a9a4243cb15a..339aa3b2737a 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -1786,16 +1786,52 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
> 	fc_port_t *fcport;
> 	unsigned long flags;
> 
> -	fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
> -	if (fcport) {
> -		if (fcport->flags & FCF_FCP2_DEVICE) {
> -			ql_dbg(ql_dbg_disc, vha, 0x2115,
> -			       "Delaying session delete for FCP2 portid=%06x %8phC ",
> -			       fcport->d_id.b24, fcport->port_name);
> -			return;
> +	switch (ea->id.b.rsvd_1) {
> +	case RSCN_PORT_ADDR:
> +		fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
> +		if (fcport) {
> +			if (fcport->flags & FCF_FCP2_DEVICE) {
> +				ql_dbg(ql_dbg_disc, vha, 0x2115,
> +				       "Delaying session delete for FCP2 portid=%06x %8phC ",
> +					fcport->d_id.b24, fcport->port_name);
> +				return;
> +			}
> +			fcport->scan_needed = 1;
> +			fcport->rscn_gen++;
> +		}
> +		break;
> +	case RSCN_AREA_ADDR:
> +		list_for_each_entry(fcport, &vha->vp_fcports, list) {
> +			if (fcport->flags & FCF_FCP2_DEVICE)
> +				continue;
> +
> +			if ((ea->id.b24 & 0xffff00) == (fcport->d_id.b24 & 0xffff00)) {
> +				fcport->scan_needed = 1;
> +				fcport->rscn_gen++;
> +			}
> 		}
> -		fcport->scan_needed = 1;
> -		fcport->rscn_gen++;
> +		break;
> +	case RSCN_DOM_ADDR:
> +		list_for_each_entry(fcport, &vha->vp_fcports, list) {
> +			if (fcport->flags & FCF_FCP2_DEVICE)
> +				continue;
> +
> +			if ((ea->id.b24 & 0xff0000) == (fcport->d_id.b24 & 0xff0000)) {
> +				fcport->scan_needed = 1;
> +				fcport->rscn_gen++;
> +			}
> +		}
> +		break;
> +	case RSCN_FAB_ADDR:
> +	default:
> +		list_for_each_entry(fcport, &vha->vp_fcports, list) {
> +			if (fcport->flags & FCF_FCP2_DEVICE)
> +				continue;
> +
> +			fcport->scan_needed = 1;
> +			fcport->rscn_gen++;
> +		}
> +		break;
> 	}
> 
> 	spin_lock_irqsave(&vha->work_lock, flags);
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 02/13] qla2xxx: fix gnl list corruption
  2021-10-21  7:31 ` [PATCH v2 02/13] qla2xxx: fix gnl list corruption Nilesh Javali
@ 2021-10-21 13:58   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 13:58 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:31 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> Current code does list element deletion and addition
> in and out of lock protection. This patch move lock
> deletion behind lock.
> 
> list_add double add: new=ffff9130b5eb89f8, prev=ffff9130b5eb89f8,
>    next=ffff9130c6a715f0.
> ------------[ cut here ]------------
> kernel BUG at lib/list_debug.c:31!
> invalid opcode: 0000 [#1] SMP PTI
> CPU: 1 PID: 182395 Comm: kworker/1:37 Kdump: loaded Tainted: G W  OE
> --------- -  - 4.18.0-193.el8.x86_64 #1
> Hardware name: HP ProLiant DL160 Gen8, BIOS J03 02/10/2014
> Workqueue: qla2xxx_wq qla2x00_iocb_work_fn [qla2xxx]
> RIP: 0010:__list_add_valid+0x41/0x50
> Code: 85 94 00 00 00 48 39 c7 74 0b 48 39 d7 74 06 b8 01 00 00 00 c3 48 89 f2
> 4c 89 c1 48 89 fe 48 c7 c7 60 83 ad 97 e8 4d bd ce ff <0f> 0b 0f 1f 00 66 2e
> 0f 1f 84 00 00 00 00 00 48 8b 07 48 8b 57 08
> RSP: 0018:ffffaba306f47d68 EFLAGS: 00010046
> RAX: 0000000000000058 RBX: ffff9130b5eb8800 RCX: 0000000000000006
> RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff9130b7456a00
> RBP: ffff9130c6a70a58 R08: 000000000008d7be R09: 0000000000000001
> R10: 0000000000000000 R11: 0000000000000001 R12: ffff9130c6a715f0
> R13: ffff9130b5eb8824 R14: ffff9130b5eb89f8 R15: ffff9130b5eb89f8
> FS:  0000000000000000(0000) GS:ffff9130b7440000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 00007efcaaef11a0 CR3: 000000005200a002 CR4: 00000000000606e0
> Call Trace:
>  qla24xx_async_gnl+0x113/0x3c0 [qla2xxx]
>  ? qla2x00_iocb_work_fn+0x53/0x80 [qla2xxx]
>  ? process_one_work+0x1a7/0x3b0
>  ? worker_thread+0x30/0x390
>  ? create_worker+0x1a0/0x1a0
>  ? kthread+0x112/0x130
> 
> Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_init.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index 339aa3b2737a..2ccdc76cf0d9 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -987,8 +987,6 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
> 	    sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1],
> 	    sp->u.iocb_cmd.u.mbx.in_mb[2]);
> 
> -	if (res == QLA_FUNCTION_TIMEOUT)
> -		return;
> 
> 	sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE);
> 	memset(&ea, 0, sizeof(ea));
> @@ -1026,8 +1024,8 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
> 	spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
> 
> 	list_for_each_entry_safe(fcport, tf, &h, gnl_entry) {
> -		list_del_init(&fcport->gnl_entry);
> 		spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
> +		list_del_init(&fcport->gnl_entry);
> 		fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
> 		spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
> 		ea.fcport = fcport;
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip
  2021-10-21  7:31 ` [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip Nilesh Javali
@ 2021-10-21 13:59   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 13:59 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:31 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> When user use issue_lip to do link bounce, driver sends
> additional target reset to remote device before resetting
> the link. The target reset would affect other paths with
> active IOs. This patch will remove the unnecessary
> target reset.
> 
> Fixes: 5854771e314e ("[SCSI] qla2xxx: Add ISPFX00 specific bus reset routine")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_gbl.h |  2 --
> drivers/scsi/qla2xxx/qla_mr.c  | 23 -----------------------
> drivers/scsi/qla2xxx/qla_os.c  | 27 ++-------------------------
> 3 files changed, 2 insertions(+), 50 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
> index 8aadcdeca6cb..8faaa0ec595d 100644
> --- a/drivers/scsi/qla2xxx/qla_gbl.h
> +++ b/drivers/scsi/qla2xxx/qla_gbl.h
> @@ -171,7 +171,6 @@ extern int ql2xasynctmfenable;
> extern int ql2xgffidenable;
> extern int ql2xenabledif;
> extern int ql2xenablehba_err_chk;
> -extern int ql2xtargetreset;
> extern int ql2xdontresethba;
> extern uint64_t ql2xmaxlun;
> extern int ql2xmdcapmask;
> @@ -820,7 +819,6 @@ extern void qlafx00_abort_iocb(srb_t *, struct abort_iocb_entry_fx00 *);
> extern void qlafx00_fxdisc_iocb(srb_t *, struct fxdisc_entry_fx00 *);
> extern void qlafx00_timer_routine(scsi_qla_host_t *);
> extern int qlafx00_rescan_isp(scsi_qla_host_t *);
> -extern int qlafx00_loop_reset(scsi_qla_host_t *vha);
> 
> /* qla82xx related functions */
> 
> diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c
> index 6e920da64863..350b0c4346fb 100644
> --- a/drivers/scsi/qla2xxx/qla_mr.c
> +++ b/drivers/scsi/qla2xxx/qla_mr.c
> @@ -738,29 +738,6 @@ qlafx00_lun_reset(fc_port_t *fcport, uint64_t l, int tag)
> 	return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag);
> }
> 
> -int
> -qlafx00_loop_reset(scsi_qla_host_t *vha)
> -{
> -	int ret;
> -	struct fc_port *fcport;
> -	struct qla_hw_data *ha = vha->hw;
> -
> -	if (ql2xtargetreset) {
> -		list_for_each_entry(fcport, &vha->vp_fcports, list) {
> -			if (fcport->port_type != FCT_TARGET)
> -				continue;
> -
> -			ret = ha->isp_ops->target_reset(fcport, 0, 0);
> -			if (ret != QLA_SUCCESS) {
> -				ql_dbg(ql_dbg_taskm, vha, 0x803d,
> -				    "Bus Reset failed: Reset=%d "
> -				    "d_id=%x.\n", ret, fcport->d_id.b24);
> -			}
> -		}
> -	}
> -	return QLA_SUCCESS;
> -}
> -
> int
> qlafx00_iospace_config(struct qla_hw_data *ha)
> {
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 03ff2596715b..3fca6b8bb23f 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -202,12 +202,6 @@ MODULE_PARM_DESC(ql2xdbwr,
> 		" 0 -- Regular doorbell.\n"
> 		" 1 -- CAMRAM doorbell (faster).\n");
> 
> -int ql2xtargetreset = 1;
> -module_param(ql2xtargetreset, int, S_IRUGO);
> -MODULE_PARM_DESC(ql2xtargetreset,
> -		 "Enable target reset."
> -		 "Default is 1 - use hw defaults.");
> -
> int ql2xgffidenable;
> module_param(ql2xgffidenable, int, S_IRUGO);
> MODULE_PARM_DESC(ql2xgffidenable,
> @@ -1695,27 +1689,10 @@ int
> qla2x00_loop_reset(scsi_qla_host_t *vha)
> {
> 	int ret;
> -	struct fc_port *fcport;
> 	struct qla_hw_data *ha = vha->hw;
> 
> -	if (IS_QLAFX00(ha)) {
> -		return qlafx00_loop_reset(vha);
> -	}
> -
> -	if (ql2xtargetreset == 1 && ha->flags.enable_target_reset) {
> -		list_for_each_entry(fcport, &vha->vp_fcports, list) {
> -			if (fcport->port_type != FCT_TARGET)
> -				continue;
> -
> -			ret = ha->isp_ops->target_reset(fcport, 0, 0);
> -			if (ret != QLA_SUCCESS) {
> -				ql_dbg(ql_dbg_taskm, vha, 0x802c,
> -				    "Bus Reset failed: Reset=%d "
> -				    "d_id=%x.\n", ret, fcport->d_id.b24);
> -			}
> -		}
> -	}
> -
> +	if (IS_QLAFX00(ha))
> +		return QLA_SUCCESS;
> 
> 	if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) {
> 		atomic_set(&vha->loop_state, LOOP_DOWN);
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 04/13] qla2xxx: edif: fix app start fail
  2021-10-21  7:31 ` [PATCH v2 04/13] qla2xxx: edif: fix app start fail Nilesh Javali
@ 2021-10-21 14:06   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:06 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:31 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> On app start, all sessions need to be reset to see
> if secure connection can be made. Fix the
> broken check which prevents that process.
> 
> Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c | 54 +++++++++++++++++----------------
> 1 file changed, 28 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index ad746c62f0d4..cb54d3ee11aa 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -529,7 +529,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 	struct app_start_reply	appreply;
> 	struct fc_port  *fcport, *tf;
> 
> -	ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app start\n", __func__);
> +	ql_log(ql_log_info, vha, 0x1313,
> +	       "EDIF application registration with driver, FC device connections will be re-established.\n");
> 
> 	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
> 	    bsg_job->request_payload.sg_cnt, &appstart,
> @@ -554,37 +555,38 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 		qla2xxx_wake_dpc(vha);
> 	} else {
> 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
> +			ql_dbg(ql_dbg_edif, vha, 0x2058,
> +			       "FCSP - nn %8phN pn %8phN portid=%02x%02x%02x.\n”,
								  ^^^^^^^^^^^^

Small nit.. why do you remove %06x for port_id for new message. Any particular reason?

> +			       fcport->node_name, fcport->port_name,
> +			       fcport->d_id.b.domain, fcport->d_id.b.area,
> +			       fcport->d_id.b.al_pa);
> 			ql_dbg(ql_dbg_edif, vha, 0xf084,
> -			       "%s: sess %p %8phC lid %#04x s_id %06x logout %d\n",
> -			       __func__, fcport, fcport->port_name,
> -			       fcport->loop_id, fcport->d_id.b24,
> -			       fcport->logout_on_delete);
> -
> -			ql_dbg(ql_dbg_edif, vha, 0xf084,
> -			       "keep %d els_logo %d disc state %d auth state %d stop state %d\n",
> -			       fcport->keep_nport_handle,
> -			       fcport->send_els_logo, fcport->disc_state,
> -			       fcport->edif.auth_state, fcport->edif.app_stop);
> +			       "%s: se_sess %p / sess %p from port %8phC "
> +			       "loop_id %#04x s_id %02x:%02x:%02x logout %d “
						     ^^^^^^^^^^^^^
Same comment as above. This could be replace with %06x for s_id

> +			       "keep %d els_logo %d disc state %d auth state %d"
> +			       "stop state %d\n",
> +			       __func__, fcport->se_sess, fcport,
> +			       fcport->port_name, fcport->loop_id,
> +			       fcport->d_id.b.domain, fcport->d_id.b.area,
> +			       fcport->d_id.b.al_pa, fcport->logout_on_delete,
> +			       fcport->keep_nport_handle, fcport->send_els_logo,
> +			       fcport->disc_state, fcport->edif.auth_state,
> +			       fcport->edif.app_stop);
> 
> 			if (atomic_read(&vha->loop_state) == LOOP_DOWN)
> 				break;
> -			if (!(fcport->flags & FCF_FCSP_DEVICE))
> -				continue;
> 
> 			fcport->edif.app_started = 1;
> -			if (fcport->edif.app_stop ||
> -			    (fcport->disc_state != DSC_LOGIN_COMPLETE &&
> -			     fcport->disc_state != DSC_LOGIN_PEND &&
> -			     fcport->disc_state != DSC_DELETED)) {
> -				/* no activity */
> -				fcport->edif.app_stop = 0;
> -
> -				ql_dbg(ql_dbg_edif, vha, 0x911e,
> -				       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
> -				       __func__, fcport->port_name);
> -				fcport->edif.app_sess_online = 1;
> -				qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
> -			}
> +			fcport->login_retry = vha->hw->login_retry_count;
> +
> +			/* no activity */
> +			fcport->edif.app_stop = 0;
> +
> +			ql_dbg(ql_dbg_edif, vha, 0x911e,
> +			       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
> +			       __func__, fcport->port_name);
> +			fcport->edif.app_sess_online = 1;
> +			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
> 			qla_edif_sa_ctl_init(vha, fcport);
> 		}
> 	}
> -- 
> 2.19.0.rc0
> 
Once you fix above nits.. feel free to add

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 05/13] qla2xxx: edif: fix app start delay
  2021-10-21  7:32 ` [PATCH v2 05/13] qla2xxx: edif: fix app start delay Nilesh Javali
@ 2021-10-21 14:09   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:09 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> Current driver does unnecessary pause for each session to
> get to certain state before allowing the app start call to
> return. In larger environment, this introduce long delay.
> Previously, the delay is meant to synchronize app and driver.
> In today's driver, the 2 side uses various events to synchronize
> the state.
> 
> The same is applied to authentication failure call.
> 
> Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c | 64 ++-------------------------------
> 1 file changed, 3 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index cb54d3ee11aa..33cdcdf9f511 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -290,63 +290,6 @@ qla_edif_app_check(scsi_qla_host_t *vha, struct app_id appid)
> 	return false;
> }
> 
> -static void qla_edif_reset_auth_wait(struct fc_port *fcport, int state,
> -		int waitonly)
> -{
> -	int cnt, max_cnt = 200;
> -	bool traced = false;
> -
> -	fcport->keep_nport_handle = 1;
> -
> -	if (!waitonly) {
> -		qla2x00_set_fcport_disc_state(fcport, state);
> -		qlt_schedule_sess_for_deletion(fcport);
> -	} else {
> -		qla2x00_set_fcport_disc_state(fcport, state);
> -	}
> -
> -	ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
> -		"%s: waiting for session, max_cnt=%u\n",
> -		__func__, max_cnt);
> -
> -	cnt = 0;
> -
> -	if (waitonly) {
> -		/* Marker wait min 10 msecs. */
> -		msleep(50);
> -		cnt += 50;
> -	}
> -	while (1) {
> -		if (!traced) {
> -			ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
> -			    "%s: session sleep.\n",
> -			    __func__);
> -			traced = true;
> -		}
> -		msleep(20);
> -		cnt++;
> -		if (waitonly && (fcport->disc_state == state ||
> -			fcport->disc_state == DSC_LOGIN_COMPLETE))
> -			break;
> -		if (fcport->disc_state == DSC_LOGIN_AUTH_PEND)
> -			break;
> -		if (cnt > max_cnt)
> -			break;
> -	}
> -
> -	if (!waitonly) {
> -		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
> -		    "%s: waited for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
> -		    __func__, fcport->port_name, fcport->loop_id,
> -		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
> -	} else {
> -		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
> -		    "%s: waited ONLY for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
> -		    __func__, fcport->port_name, fcport->loop_id,
> -		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
> -	}
> -}
> -
> static void
> qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl,
> 	int index)
> @@ -585,8 +528,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 			ql_dbg(ql_dbg_edif, vha, 0x911e,
> 			       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
> 			       __func__, fcport->port_name);
> -			fcport->edif.app_sess_online = 1;
> -			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
> +			fcport->edif.app_sess_online = 0;
> +			qlt_schedule_sess_for_deletion(fcport);
> 			qla_edif_sa_ctl_init(vha, fcport);
> 		}
> 	}
> @@ -802,7 +745,6 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 		ql_dbg(ql_dbg_edif, vha, 0x911e,
> 		    "%s AUTH complete - RESUME with prli for wwpn %8phC\n",
> 		    __func__, fcport->port_name);
> -		qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 1);
> 		qla24xx_post_prli_work(vha, fcport);
> 	}
> 
> @@ -875,7 +817,7 @@ qla_edif_app_authfail(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 
> 		if (qla_ini_mode_enabled(fcport->vha)) {
> 			fcport->send_els_logo = 1;
> -			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
> +			qlt_schedule_sess_for_deletion(fcport);
> 		}
> 	}
> 
> -- 
> 2.19.0.rc0
> 

Makes sense. 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down
  2021-10-21  7:32 ` [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down Nilesh Javali
@ 2021-10-21 14:21   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:21 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> On session down, driver will flush all stale messages and
> doorbell events. This prevents authentication application
> from having to process stale data.
> 
> Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
> Signed-off-by: Karunakara Merugu <kmerugu@marvell.com>
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c   | 99 ++++++++++++++++++++++++++++++-
> drivers/scsi/qla2xxx/qla_gbl.h    |  2 +
> drivers/scsi/qla2xxx/qla_target.c |  1 +
> 3 files changed, 101 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index 33cdcdf9f511..b4eca966067a 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -1595,6 +1595,41 @@ qla_enode_stop(scsi_qla_host_t *vha)
> 	spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags);
> }
> 
> +static void qla_enode_clear(scsi_qla_host_t *vha, port_id_t portid)
> +{
> +	unsigned    long flags;
> +	struct enode    *e, *tmp;
> +	struct purexevent   *purex;
> +	LIST_HEAD(enode_list);
> +
> +	if (vha->pur_cinfo.enode_flags != ENODE_ACTIVE) {
> +		ql_dbg(ql_dbg_edif, vha, 0x09102,
> +		       "%s enode not active\n", __func__);
> +		return;
> +	}
> +	spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags);
> +	list_for_each_entry_safe(e, tmp, &vha->pur_cinfo.head, list) {
> +		purex = &e->u.purexinfo;
> +		if (purex->pur_info.pur_sid.b24 == portid.b24) {
> +			ql_dbg(ql_dbg_edif, vha, 0x911d,
> +			    "%s free ELS sid=%x. xchg %x, nb=%xh\n”,
					      ^^  
Shouldn’t this be %06x?
	
> +			    __func__, portid.b24,
> +			    purex->pur_info.pur_rx_xchg_address,
> +			    purex->pur_info.pur_bytes_rcvd);
> +
> +			list_del_init(&e->list);
> +			list_add_tail(&e->list, &enode_list);
> +		}
> +	}
> +

No need for newline above.

> +	spin_unlock_irqrestore(&vha->pur_cinfo.pur_lock, flags);
> +
> +	list_for_each_entry_safe(e, tmp, &enode_list, list) {
> +		list_del_init(&e->list);
> +		qla_enode_free(vha, e);
> +	}
> +}
> +
> /*
>  *  allocate enode struct and populate buffer
>  *  returns: enode pointer with buffers
> @@ -1794,6 +1829,59 @@ qla_edb_node_free(scsi_qla_host_t *vha, struct edb_node *node)
> 	node->ntype = N_UNDEF;
> }
> 
> +static void qla_edb_clear(scsi_qla_host_t *vha, port_id_t portid)
> +{
> +	unsigned long flags;
> +	struct edb_node *e, *tmp;
> +	port_id_t sid;
> +	LIST_HEAD(edb_list);
> +
> +	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +		/* doorbell list not enabled */
> +		ql_dbg(ql_dbg_edif, vha, 0x09102,
> +		       "%s doorbell not enabled\n", __func__);
> +		return;
> +	}
> +
> +	/* grab lock so list doesn't move */
> +	spin_lock_irqsave(&vha->e_dbell.db_lock, flags);
> +

No need for newline above.

> +	list_for_each_entry_safe(e, tmp, &vha->e_dbell.head, list) {
> +		switch (e->ntype) {
> +		case VND_CMD_AUTH_STATE_NEEDED:
> +		case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN:
> +			sid = e->u.plogi_did;
> +			break;
> +		case VND_CMD_AUTH_STATE_ELS_RCVD:
> +			sid = e->u.els_sid;
> +			break;
> +		case VND_CMD_AUTH_STATE_SAUPDATE_COMPL:
> +			/* app wants to see this  */
> +			continue;
> +		default:
> +			ql_log(ql_log_warn, vha, 0x09102,
> +			       "%s unknown type: %x\n", __func__, e->ntype);
					   ^^^^
Please add “node type" for ease of reading messages during debugging 
					
> +			sid.b24 = 0;
> +			break;
> +		}
> +		if (sid.b24 == portid.b24) {
> +			ql_dbg(ql_dbg_edif, vha, 0x910f,
> +			       "%s Doorbell free : type=%x %p\n”,
					^^^^
Please have meaningful prints for ease of debugging 

> +			       __func__, e->ntype, e);
> +			list_del_init(&e->list);
> +			list_add_tail(&e->list, &edb_list);
> +		}
> +	}
> +

No need for newline above. 

> +	spin_unlock_irqrestore(&vha->e_dbell.db_lock, flags);
> +
> +	list_for_each_entry_safe(e, tmp, &edb_list, list) {
> +		qla_edb_node_free(vha, e);
> +		list_del_init(&e->list);
> +		kfree(e);
> +	}
> +}
> +
> /* function called when app is stopping */
> 
> void
> @@ -2380,7 +2468,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 	ql_dbg(ql_dbg_edif, host, 0x0910c,
> 	    "%s COMPLETE purex->pur_info.pur_bytes_rcvd =%xh s:%06x -> d:%06x xchg=%xh\n",
> 	    __func__, purex->pur_info.pur_bytes_rcvd, purex->pur_info.pur_sid.b24,
> -	    purex->pur_info.pur_did.b24, p->rx_xchg_addr);
> +	    purex->pur_info.pur_did.b24, purex->pur_info.pur_rx_xchg_address);
> 
> 	qla_edb_eventcreate(host, VND_CMD_AUTH_STATE_ELS_RCVD, sid, 0, NULL);
> }
> @@ -3403,3 +3491,12 @@ void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess)
> 		qla2x00_post_aen_work(vha, FCH_EVT_PORT_OFFLINE, sess->d_id.b24);
> 	}
> }
> +
> +void qla_edif_clear_appdata(struct scsi_qla_host *vha, struct fc_port *fcport)
> +{
> +	if (!(fcport->flags & FCF_FCSP_DEVICE))
> +		return;
> +
> +	qla_edb_clear(vha, fcport->d_id);
> +	qla_enode_clear(vha, fcport->d_id);
> +}
> diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
> index 8faaa0ec595d..76b89bd297dc 100644
> --- a/drivers/scsi/qla2xxx/qla_gbl.h
> +++ b/drivers/scsi/qla2xxx/qla_gbl.h
> @@ -142,6 +142,8 @@ void qlt_chk_edif_rx_sa_delete_pending(scsi_qla_host_t *vha, fc_port_t *fcport,
> void qla2x00_release_all_sadb(struct scsi_qla_host *vha, struct fc_port *fcport);
> int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsgjob);
> void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess);
> +void qla_edif_clear_appdata(struct scsi_qla_host *vha,
> +			    struct fc_port *fcport);
> const char *sc_to_str(uint16_t cmd);
> 
> /*
> diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
> index b3478ed9b12e..edc34e69d75b 100644
> --- a/drivers/scsi/qla2xxx/qla_target.c
> +++ b/drivers/scsi/qla2xxx/qla_target.c
> @@ -1003,6 +1003,7 @@ void qlt_free_session_done(struct work_struct *work)
> 					"%s bypassing release_all_sadb\n",
> 					__func__);
> 			}
> +			qla_edif_clear_appdata(vha, sess);
> 			qla_edif_sess_down(vha, sess);
> 		}
> 		qla2x00_mark_device_lost(vha, sess, 0);
> -- 
> 2.19.0.rc0
> 

Once you fix small nits, feel free to add

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe
  2021-10-21  7:32 ` [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe Nilesh Javali
@ 2021-10-21 14:22   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:22 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> This patch is per review comment by Hannes Reinecke from
> previous submission to replace list_for_each_safe with
> list_for_each_entry_safe.
> 
> Reviewed-by: Hannes Reinecke <hare@suse.de>
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c | 39 ++++++++-------------------------
> drivers/scsi/qla2xxx/qla_edif.h |  1 -
> drivers/scsi/qla2xxx/qla_os.c   |  8 +++----
> 3 files changed, 13 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index b4eca966067a..ca3b947770b9 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -1674,41 +1674,25 @@ static struct enode *
> qla_enode_find(scsi_qla_host_t *vha, uint32_t ntype, uint32_t p1, uint32_t p2)
> {
> 	struct enode		*node_rtn = NULL;
> -	struct enode		*list_node = NULL;
> +	struct enode		*list_node, *q;
> 	unsigned long		flags;
> -	struct list_head	*pos, *q;
> 	uint32_t		sid;
> -	uint32_t		rw_flag;
> 	struct purexevent	*purex;
> 
> 	/* secure the list from moving under us */
> 	spin_lock_irqsave(&vha->pur_cinfo.pur_lock, flags);
> 
> -	list_for_each_safe(pos, q, &vha->pur_cinfo.head) {
> -		list_node = list_entry(pos, struct enode, list);
> +	list_for_each_entry_safe(list_node, q, &vha->pur_cinfo.head, list) {
> 
> 		/* node type determines what p1 and p2 are */
> 		purex = &list_node->u.purexinfo;
> 		sid = p1;
> -		rw_flag = p2;
> 
> 		if (purex->pur_info.pur_sid.b24 == sid) {
> -			if (purex->pur_info.pur_pend == 1 &&
> -			    rw_flag == PUR_GET) {
> -				/*
> -				 * if the receive is in progress
> -				 * and its a read/get then can't
> -				 * transfer yet
> -				 */
> -				ql_dbg(ql_dbg_edif, vha, 0x9106,
> -				    "%s purex xfer in progress for sid=%x\n",
> -				    __func__, sid);
> -			} else {
> -				/* found it and its complete */
> -				node_rtn = list_node;
> -				list_del(pos);
> -				break;
> -			}
> +			/* found it and its complete */
> +			node_rtn = list_node;
> +			list_del(&list_node->list);
> +			break;
> 		}
> 	}
> 
> @@ -2419,7 +2403,6 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 
> 	purex = &ptr->u.purexinfo;
> 	purex->pur_info.pur_sid = a.did;
> -	purex->pur_info.pur_pend = 0;
> 	purex->pur_info.pur_bytes_rcvd = totlen;
> 	purex->pur_info.pur_rx_xchg_address = le32_to_cpu(p->rx_xchg_addr);
> 	purex->pur_info.pur_nphdl = le16_to_cpu(p->nport_handle);
> @@ -3171,18 +3154,14 @@ static uint16_t qla_edif_sadb_get_sa_index(fc_port_t *fcport,
> /* release any sadb entries -- only done at teardown */
> void qla_edif_sadb_release(struct qla_hw_data *ha)
> {
> -	struct list_head *pos;
> -	struct list_head *tmp;
> -	struct edif_sa_index_entry *entry;
> +	struct edif_sa_index_entry *entry, *tmp;
> 
> -	list_for_each_safe(pos, tmp, &ha->sadb_rx_index_list) {
> -		entry = list_entry(pos, struct edif_sa_index_entry, next);
> +	list_for_each_entry_safe(entry, tmp, &ha->sadb_rx_index_list, next) {
> 		list_del(&entry->next);
> 		kfree(entry);
> 	}
> 
> -	list_for_each_safe(pos, tmp, &ha->sadb_tx_index_list) {
> -		entry = list_entry(pos, struct edif_sa_index_entry, next);
> +	list_for_each_entry_safe(entry, tmp, &ha->sadb_tx_index_list, next) {
> 		list_del(&entry->next);
> 		kfree(entry);
> 	}
> diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
> index 9e8f28d0caa1..cd54c1dfe3cb 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.h
> +++ b/drivers/scsi/qla2xxx/qla_edif.h
> @@ -102,7 +102,6 @@ struct dinfo {
> };
> 
> struct pur_ninfo {
> -	unsigned int	pur_pend:1;
> 	port_id_t       pur_sid;
> 	port_id_t	pur_did;
> 	uint8_t		vp_idx;
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 3fca6b8bb23f..df0e46ef3e96 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -3885,13 +3885,13 @@ qla2x00_remove_one(struct pci_dev *pdev)
> static inline void
> qla24xx_free_purex_list(struct purex_list *list)
> {
> -	struct list_head *item, *next;
> +	struct purex_item *item, *next;
> 	ulong flags;
> 
> 	spin_lock_irqsave(&list->lock, flags);
> -	list_for_each_safe(item, next, &list->head) {
> -		list_del(item);
> -		kfree(list_entry(item, struct purex_item, list));
> +	list_for_each_entry_safe(item, next, &list->head, list) {
> +		list_del(&item->list);
> +		kfree(item);
> 	}
> 	spin_unlock_irqrestore(&list->lock, flags);
> }
> -- 
> 2.19.0.rc0
> 

Looks Good. 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 08/13] qla2xxx: edif: tweak trace message
  2021-10-21  7:32 ` [PATCH v2 08/13] qla2xxx: edif: tweak trace message Nilesh Javali
@ 2021-10-21 14:35   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:35 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> Modify trace messages for additional debugability.
> 
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_def.h  |  4 ++--
> drivers/scsi/qla2xxx/qla_edif.c |  6 +++++-
> drivers/scsi/qla2xxx/qla_init.c | 15 +++++++++------
> drivers/scsi/qla2xxx/qla_isr.c  |  4 ++++
> 4 files changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> index 8924eeb9367d..9ebf4a234d9a 100644
> --- a/drivers/scsi/qla2xxx/qla_def.h
> +++ b/drivers/scsi/qla2xxx/qla_def.h
> @@ -639,9 +639,9 @@ struct qla_els_pt_arg {
> 	u8 els_opcode;
> 	u8 vp_idx;
> 	__le16 nport_handle;
> -	u16 control_flags;
> +	u16 control_flags, ox_id;
> 	__le32 rx_xchg_address;
> -	port_id_t did;
> +	port_id_t did, sid;
> 	u32 tx_len, tx_byte_count, rx_len, rx_byte_count;
> 	dma_addr_t tx_addr, rx_addr;
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index ca3b947770b9..bb3a1afb86a8 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -1765,7 +1765,8 @@ qla_els_reject_iocb(scsi_qla_host_t *vha, struct qla_qpair *qp,
> 	qla_els_pt_iocb(vha, els_iocb, a);
> 
> 	ql_dbg(ql_dbg_edif, vha, 0x0183,
> -	    "Sending ELS reject...\n");
> +	    "Sending ELS reject ox_id %04x s:%06x -> d:%06x\n",
> +	    a->ox_id, a->sid.b24, a->did.b24);
> 	ql_dump_buffer(ql_dbg_edif + ql_dbg_verbose, vha, 0x0185,
> 	    vha->hw->elsrej.c, sizeof(*vha->hw->elsrej.c));
> 	/* flush iocb to mem before notifying hw doorbell */
> @@ -2362,6 +2363,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 	a.tx_addr = vha->hw->elsrej.cdma;
> 	a.vp_idx = vha->vp_idx;
> 	a.control_flags = EPD_ELS_RJT;
> +	a.ox_id = le16_to_cpu(p->ox_id);
> 
> 	sid = p->s_id[0] | (p->s_id[1] << 8) | (p->s_id[2] << 16);
> 
> @@ -2411,6 +2413,8 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 	purex->pur_info.pur_did.b.al_pa =  p->d_id[0];
> 	purex->pur_info.vp_idx = p->vp_idx;
> 
> +	a.sid = purex->pur_info.pur_did;
> +
> 	rc = __qla_copy_purex_to_buffer(vha, pkt, rsp, purex->msgp,
> 		purex->msgp_len);
> 	if (rc) {
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index 2ccdc76cf0d9..dbffc59e1677 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -333,9 +333,6 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
> 		    vha->e_dbell.db_flags & EDB_ACTIVE) {
> 			lio->u.logio.flags |=
> 				(SRB_LOGIN_FCSP | SRB_LOGIN_SKIP_PRLI);
> -			ql_dbg(ql_dbg_disc, vha, 0x2072,
> -			    "Async-login: w/ FCSP %8phC hdl=%x, loopid=%x portid=%06x\n",
> -			    fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24);
> 		} else {
> 			lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
> 		}
> @@ -344,12 +341,14 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
> 	if (NVME_TARGET(vha->hw, fcport))
> 		lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI;
> 
> +	rval = qla2x00_start_sp(sp);
> +
> 	ql_dbg(ql_dbg_disc, vha, 0x2072,
> -	       "Async-login - %8phC hdl=%x, loopid=%x portid=%06x retries=%d.\n",
> +	       "Async-login - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
> 	       fcport->port_name, sp->handle, fcport->loop_id,
> -	       fcport->d_id.b24, fcport->login_retry);
> +	       fcport->d_id.b24, fcport->login_retry,
> +	       lio->u.logio.flags & SRB_LOGIN_FCSP ? "FCSP" : "");
> 
> -	rval = qla2x00_start_sp(sp);
> 	if (rval != QLA_SUCCESS) {
> 		fcport->flags |= FCF_LOGIN_NEEDED;
> 		set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
> @@ -5867,6 +5866,10 @@ void qla_register_fcport_fn(struct work_struct *work)
> 
> 	qla2x00_update_fcport(fcport->vha, fcport);
> 
> +	ql_dbg(ql_dbg_disc, fcport->vha, 0x911e,
> +	       "%s rscn gen %d/%d next DS %d\n", __func__,
> +	       rscn_gen, fcport->rscn_gen, fcport->next_disc_state);
> +
> 	if (rscn_gen != fcport->rscn_gen) {
> 		/* RSCN(s) came in while registration */
> 		switch (fcport->next_disc_state) {
> diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
> index b26f2699adb2..4e1dffa329f1 100644
> --- a/drivers/scsi/qla2xxx/qla_isr.c
> +++ b/drivers/scsi/qla2xxx/qla_isr.c
> @@ -2233,6 +2233,10 @@ qla24xx_els_ct_entry(scsi_qla_host_t *v, struct req_que *req,
> 				}
> 
> 			} else if (comp_status == CS_PORT_LOGGED_OUT) {
> +				ql_dbg(ql_dbg_disc, vha, 0x911e,
> +				       "%s %d sche delete\n”,
						^^^^^ 
Please use “scheduled” here. Or better yet more meaningful message so its easy to read during debugging. 

> +				       __func__, __LINE__);
> +
> 				els->u.els_plogi.len = 0;
> 				res = DID_IMM_RETRY << 16;
> 				qlt_schedule_sess_for_deletion(sp->fcport);
> -- 
> 2.19.0.rc0
> 

Once small nit above is fixed, feel free to add

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash
  2021-10-21  7:32 ` [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash Nilesh Javali
@ 2021-10-21 14:39   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:39 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> On ipsec start by remote port, Target port may use RSCN to
> trigger initiator to relogin. If driver is already in the process
> of a relogin, then ignore the RSCN and allow the current relogin
> to continue. This reduces thrashing of the connection.
> 
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_attr.c |  7 ++++++-
> drivers/scsi/qla2xxx/qla_edif.h |  4 ++++
> drivers/scsi/qla2xxx/qla_init.c | 24 ++++++++++++++++++++++--
> 3 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
> index cb5f2ecb652d..41a9fb04b663 100644
> --- a/drivers/scsi/qla2xxx/qla_attr.c
> +++ b/drivers/scsi/qla2xxx/qla_attr.c
> @@ -2757,7 +2757,12 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
> 			if (fcport->loop_id != FC_NO_LOOP_ID)
> 				fcport->logout_on_delete = 1;
> 
> -			qlt_schedule_sess_for_deletion(fcport);
> +			if (!EDIF_NEGOTIATION_PENDING(fcport)) {
> +				ql_dbg(ql_dbg_disc, fcport->vha, 0x911e,
> +				       "%s %d sched delete\n", __func__,
						^^^^^^
Same comment as previous patch. Please use more meaningful debug print. 

 
> +				       __LINE__);
> +				qlt_schedule_sess_for_deletion(fcport);
> +			}
> 		} else {
> 			qla2x00_port_logout(fcport->vha, fcport);
> 		}
> diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
> index cd54c1dfe3cb..920b1eace40f 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.h
> +++ b/drivers/scsi/qla2xxx/qla_edif.h
> @@ -132,4 +132,8 @@ struct enode {
> 	 _s->disc_state == DSC_DELETED || \
> 	 !_s->edif.app_sess_online))
> 
> +#define EDIF_NEGOTIATION_PENDING(_fcport) \
> +	((_fcport->vha.e_dbell.db_flags & EDB_ACTIVE) && \
> +	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND))
> +
> #endif	/* __QLA_EDIF_H */
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index dbffc59e1677..999e0423891c 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -1793,8 +1793,28 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
> 					fcport->d_id.b24, fcport->port_name);
> 				return;
> 			}
> -			fcport->scan_needed = 1;
> -			fcport->rscn_gen++;
> +
> +			if (vha->hw->flags.edif_enabled && vha->e_dbell.db_flags & EDB_ACTIVE) {
> +				/*
> +				 * On ipsec start by remote port, Target port
> +				 * may use RSCN to trigger initiator to
> +				 * relogin. If driver is already in the
> +				 * process of a relogin, then ignore the RSCN
> +				 * and allow the current relogin to continue.
> +				 * This reduces thrashing of the connection.
> +				 */
> +				if (atomic_read(&fcport->state) == FCS_ONLINE) {
> +					/*
> +					 * If state = online, then set scan_needed=1 to do relogin.
> +					 * Otherwise we're already in the middle of a relogin
> +					 */
> +					fcport->scan_needed = 1;
> +					fcport->rscn_gen++;
> +				}
> +			} else {
> +				fcport->scan_needed = 1;
> +				fcport->rscn_gen++;
> +			}
> 		}
> 		break;
> 	case RSCN_AREA_ADDR:
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 10/13] qla2xxx: edif: increase ELS payload
  2021-10-21  7:32 ` [PATCH v2 10/13] qla2xxx: edif: increase ELS payload Nilesh Javali
@ 2021-10-21 14:41   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:41 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> Currently, FW limits ELS payload to FC frame size/2112.
> This patch adjust memory buffer size to be able to handle
> max ELS payload.
> 
> Fixes: 84318a9f01ce ("scsi: qla2xxx: edif: Add send, receive, and accept for
> 		     auth_els")

^^^ Fixes line should be one line..  Please fix that 

> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c     | 2 +-
> drivers/scsi/qla2xxx/qla_edif.h     | 3 ++-
> drivers/scsi/qla2xxx/qla_edif_bsg.h | 2 +-
> drivers/scsi/qla2xxx/qla_init.c     | 4 ++++
> drivers/scsi/qla2xxx/qla_os.c       | 2 +-
> 5 files changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index bb3a1afb86a8..1ea130c61d70 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -2375,7 +2375,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 		return;
> 	}
> 
> -	if (totlen > MAX_PAYLOAD) {
> +	if (totlen > ELS_MAX_PAYLOAD) {
> 		ql_dbg(ql_dbg_edif, vha, 0x0910d,
> 		    "%s WARNING: verbose ELS frame received (totlen=%x)\n",
> 		    __func__, totlen);
> diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
> index 920b1eace40f..2517005fb08c 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.h
> +++ b/drivers/scsi/qla2xxx/qla_edif.h
> @@ -93,7 +93,6 @@ struct sa_update_28xx {
> };
> 
> #define        NUM_ENTRIES     256
> -#define        MAX_PAYLOAD     1024
> #define        PUR_GET         1
> 
> struct dinfo {
> @@ -127,6 +126,8 @@ struct enode {
> 	} u;
> };
> 
> +#define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES))
> +
> #define EDIF_SESSION_DOWN(_s) \
> 	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \
> 	 _s->disc_state == DSC_DELETED || \
> diff --git a/drivers/scsi/qla2xxx/qla_edif_bsg.h b/drivers/scsi/qla2xxx/qla_edif_bsg.h
> index 58b718d35d19..53026d82ebff 100644
> --- a/drivers/scsi/qla2xxx/qla_edif_bsg.h
> +++ b/drivers/scsi/qla2xxx/qla_edif_bsg.h
> @@ -8,7 +8,7 @@
> #define __QLA_EDIF_BSG_H
> 
> /* BSG Vendor specific commands */
> -#define	ELS_MAX_PAYLOAD		1024
> +#define	ELS_MAX_PAYLOAD		2112
> #ifndef	WWN_SIZE
> #define WWN_SIZE		8
> #endif
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index 999e0423891c..2bc5593645ec 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -4486,6 +4486,10 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
> 		    (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
> 	}
> 
> +	/* ELS pass through payload is limit by frame size. */
> +	if (ha->flags.edif_enabled)
> +		mid_init_cb->init_cb.frame_payload_size = cpu_to_le16(ELS_MAX_PAYLOAD);
> +
> 	rval = qla2x00_init_firmware(vha, ha->init_cb_size);
> next_check:
> 	if (rval) {
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index df0e46ef3e96..814d082491af 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -4352,7 +4352,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
> 
> 	/* allocate the purex dma pool */
> 	ha->purex_dma_pool = dma_pool_create(name, &ha->pdev->dev,
> -	    MAX_PAYLOAD, 8, 0);
> +	    ELS_MAX_PAYLOAD, 8, 0);
> 
> 	if (!ha->purex_dma_pool) {
> 		ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b,
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags
  2021-10-21  7:32 ` [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags Nilesh Javali
@ 2021-10-21 14:44   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:44 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> db_flags field is a bit field. Replace value check with bit flag check.
> 
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c   | 26 +++++++++++++-------------
> drivers/scsi/qla2xxx/qla_edif.h   |  7 +++++--
> drivers/scsi/qla2xxx/qla_init.c   | 13 ++++++-------
> drivers/scsi/qla2xxx/qla_iocb.c   |  3 +--
> drivers/scsi/qla2xxx/qla_target.c |  2 +-
> 5 files changed, 26 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index 1ea130c61d70..440a3caa28f9 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -218,7 +218,7 @@ fc_port_t *fcport)
> 		    "%s edif not enabled\n", __func__);
> 		goto done;
> 	}
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		ql_dbg(ql_dbg_edif, vha, 0x09102,
> 		    "%s doorbell not enabled\n", __func__);
> 		goto done;
> @@ -482,9 +482,9 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 	ql_dbg(ql_dbg_edif, vha, 0x911d, "%s app_vid=%x app_start_flags %x\n",
> 	     __func__, appstart.app_info.app_vid, appstart.app_start_flags);
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		/* mark doorbell as active since an app is now present */
> -		vha->e_dbell.db_flags = EDB_ACTIVE;
> +		vha->e_dbell.db_flags |= EDB_ACTIVE;
> 	} else {
> 		ql_dbg(ql_dbg_edif, vha, 0x911e, "%s doorbell already active\n",
> 		     __func__);
> @@ -1274,7 +1274,7 @@ qla24xx_sadb_update(struct bsg_job *bsg_job)
> 		goto done;
> 	}
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		ql_log(ql_log_warn, vha, 0x70a1, "App not started\n");
> 		rval = -EIO;
> 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
> @@ -1778,7 +1778,7 @@ qla_els_reject_iocb(scsi_qla_host_t *vha, struct qla_qpair *qp,
> void
> qla_edb_init(scsi_qla_host_t *vha)
> {
> -	if (vha->e_dbell.db_flags == EDB_ACTIVE) {
> +	if (DBELL_ACTIVE(vha)) {
> 		/* list already init'd - error */
> 		ql_dbg(ql_dbg_edif, vha, 0x09102,
> 		    "edif db already initialized, cannot reinit\n");
> @@ -1821,7 +1821,7 @@ static void qla_edb_clear(scsi_qla_host_t *vha, port_id_t portid)
> 	port_id_t sid;
> 	LIST_HEAD(edb_list);
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		/* doorbell list not enabled */
> 		ql_dbg(ql_dbg_edif, vha, 0x09102,
> 		       "%s doorbell not enabled\n", __func__);
> @@ -1875,7 +1875,7 @@ qla_edb_stop(scsi_qla_host_t *vha)
> 	unsigned long flags;
> 	struct edb_node *node, *q;
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		/* doorbell list not enabled */
> 		ql_dbg(ql_dbg_edif, vha, 0x09102,
> 		    "%s doorbell not enabled\n", __func__);
> @@ -1926,7 +1926,7 @@ qla_edb_node_add(scsi_qla_host_t *vha, struct edb_node *ptr)
> {
> 	unsigned long		flags;
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		/* doorbell list not enabled */
> 		ql_dbg(ql_dbg_edif, vha, 0x09102,
> 		    "%s doorbell not enabled\n", __func__);
> @@ -1957,7 +1957,7 @@ qla_edb_eventcreate(scsi_qla_host_t *vha, uint32_t dbtype,
> 		return;
> 	}
> 
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		if (fcport)
> 			fcport->edif.auth_state = dbtype;
> 		/* doorbell list not enabled */
> @@ -2052,7 +2052,7 @@ qla_edif_timer(scsi_qla_host_t *vha)
> 	struct qla_hw_data *ha = vha->hw;
> 
> 	if (!vha->vp_idx && N2N_TOPO(ha) && ha->flags.n2n_fw_acc_sec) {
> -		if (vha->e_dbell.db_flags != EDB_ACTIVE &&
> +		if (DBELL_INACTIVE(vha) &&
> 		    ha->edif_post_stop_cnt_down) {
> 			ha->edif_post_stop_cnt_down--;
> 
> @@ -2090,7 +2090,7 @@ edif_doorbell_show(struct device *dev, struct device_attribute *attr,
> 	sz = 256;
> 
> 	/* stop new threads from waiting if we're not init'd */
> -	if (vha->e_dbell.db_flags != EDB_ACTIVE) {
> +	if (DBELL_INACTIVE(vha)) {
> 		ql_dbg(ql_dbg_edif + ql_dbg_verbose, vha, 0x09122,
> 		    "%s error - edif db not enabled\n", __func__);
> 		return 0;
> @@ -2438,7 +2438,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
> 
> 	fcport = qla2x00_find_fcport_by_pid(host, &purex->pur_info.pur_sid);
> 
> -	if (host->e_dbell.db_flags != EDB_ACTIVE ||
> +	if (DBELL_INACTIVE(vha) ||
> 	    (fcport && EDIF_SESSION_DOWN(fcport))) {
> 		ql_dbg(ql_dbg_edif, host, 0x0910c, "%s e_dbell.db_flags =%x %06x\n",
> 		    __func__, host->e_dbell.db_flags,
> @@ -3464,7 +3464,7 @@ int qla_edif_process_els(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 
> void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess)
> {
> -	if (sess->edif.app_sess_online && vha->e_dbell.db_flags & EDB_ACTIVE) {
> +	if (sess->edif.app_sess_online && DBELL_ACTIVE(vha)) {
> 		ql_dbg(ql_dbg_disc, vha, 0xf09c,
> 			"%s: sess %8phN send port_offline event\n",
> 			__func__, sess->port_name);
> diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
> index 2517005fb08c..a965ca8e47ce 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.h
> +++ b/drivers/scsi/qla2xxx/qla_edif.h
> @@ -41,9 +41,12 @@ struct pur_core {
> };
> 
> enum db_flags_t {
> -	EDB_ACTIVE = 0x1,
> +	EDB_ACTIVE = BIT_0,
> };
> 
> +#define DBELL_ACTIVE(_v) (_v->e_dbell.db_flags & EDB_ACTIVE)
> +#define DBELL_INACTIVE(_v) (!(_v->e_dbell.db_flags & EDB_ACTIVE))
> +
> struct edif_dbell {
> 	enum db_flags_t		db_flags;
> 	spinlock_t		db_lock;
> @@ -134,7 +137,7 @@ struct enode {
> 	 !_s->edif.app_sess_online))
> 
> #define EDIF_NEGOTIATION_PENDING(_fcport) \
> -	((_fcport->vha.e_dbell.db_flags & EDB_ACTIVE) && \
> +	(DBELL_ACTIVE(_fcport->vha) && \
> 	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND))
> 
> #endif	/* __QLA_EDIF_H */
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index 2bc5593645ec..c0b813fc1ec4 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -330,7 +330,7 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
> 		lio->u.logio.flags |= SRB_LOGIN_PRLI_ONLY;
> 	} else {
> 		if (vha->hw->flags.edif_enabled &&
> -		    vha->e_dbell.db_flags & EDB_ACTIVE) {
> +		    DBELL_ACTIVE(vha)) {
> 			lio->u.logio.flags |=
> 				(SRB_LOGIN_FCSP | SRB_LOGIN_SKIP_PRLI);
> 		} else {
> @@ -861,7 +861,7 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
> 				break;
> 			case DSC_LS_PLOGI_COMP:
> 				if (vha->hw->flags.edif_enabled &&
> -				    vha->e_dbell.db_flags & EDB_ACTIVE) {
> +				    DBELL_ACTIVE(vha)) {
> 					/* check to see if App support secure or not */
> 					qla24xx_post_gpdb_work(vha, fcport, 0);
> 					break;
> @@ -1451,7 +1451,7 @@ static int	qla_chk_secure_login(scsi_qla_host_t	*vha, fc_port_t *fcport,
> 			qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE,
> 			    fcport->d_id.b24);
> 
> -			if (vha->e_dbell.db_flags ==  EDB_ACTIVE) {
> +			if (DBELL_ACTIVE(vha)) {
> 				ql_dbg(ql_dbg_disc, vha, 0x20ef,
> 				    "%s %d %8phC EDIF: post DB_AUTH: AUTH needed\n",
> 				    __func__, __LINE__, fcport->port_name);
> @@ -1794,7 +1794,7 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)
> 				return;
> 			}
> 
> -			if (vha->hw->flags.edif_enabled && vha->e_dbell.db_flags & EDB_ACTIVE) {
> +			if (vha->hw->flags.edif_enabled && DBELL_ACTIVE(vha)) {
> 				/*
> 				 * On ipsec start by remote port, Target port
> 				 * may use RSCN to trigger initiator to
> @@ -4240,7 +4240,7 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha)
> 		 * fw shal not send PRLI after PLOGI Acc
> 		 */
> 		if (ha->flags.edif_enabled &&
> -		    vha->e_dbell.db_flags & EDB_ACTIVE) {
> +		    DBELL_ACTIVE(vha)) {
> 			ha->fw_options[3] |= BIT_15;
> 			ha->flags.n2n_fw_acc_sec = 1;
> 		} else {
> @@ -5396,8 +5396,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
> 			 * use link up to wake up app to get ready for
> 			 * authentication.
> 			 */
> -			if (ha->flags.edif_enabled &&
> -			    !(vha->e_dbell.db_flags & EDB_ACTIVE))
> +			if (ha->flags.edif_enabled && DBELL_INACTIVE(vha))
> 				qla2x00_post_aen_work(vha, FCH_EVT_LINKUP,
> 						      ha->link_data_rate);
> 
> diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
> index 9d4ad1d2b00a..ed604f2185bf 100644
> --- a/drivers/scsi/qla2xxx/qla_iocb.c
> +++ b/drivers/scsi/qla2xxx/qla_iocb.c
> @@ -3034,8 +3034,7 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
> 	elsio->u.els_plogi.els_cmd = els_opcode;
> 	elsio->u.els_plogi.els_plogi_pyld->opcode = els_opcode;
> 
> -	if (els_opcode == ELS_DCMD_PLOGI && vha->hw->flags.edif_enabled &&
> -	    vha->e_dbell.db_flags & EDB_ACTIVE) {
> +	if (els_opcode == ELS_DCMD_PLOGI && DBELL_ACTIVE(vha)) {
> 		struct fc_els_flogi *p = ptr;
> 
> 		p->fl_csp.sp_features |= cpu_to_be16(FC_SP_FT_SEC);
> diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
> index edc34e69d75b..031233729ff4 100644
> --- a/drivers/scsi/qla2xxx/qla_target.c
> +++ b/drivers/scsi/qla2xxx/qla_target.c
> @@ -4817,7 +4817,7 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
> 	}
> 
> 	if (vha->hw->flags.edif_enabled) {
> -		if (!(vha->e_dbell.db_flags & EDB_ACTIVE)) {
> +		if (DBELL_INACTIVE(vha)) {
> 			ql_dbg(ql_dbg_disc, vha, 0xffff,
> 			       "%s %d Term INOT due to app not started lid=%d, NportID %06X ",
> 			       __func__, __LINE__, loop_id, port_id.b24);
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 12/13] qla2xxx: edif: fix edif bsg
  2021-10-21  7:32 ` [PATCH v2 12/13] qla2xxx: edif: fix edif bsg Nilesh Javali
@ 2021-10-21 14:46   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:46 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Quinn Tran <qutran@marvell.com>
> 
> Various EDIF bsg's did not properly fill out the reply_payload_rcv_len
> field. This cause app to parse empty data in the return payload.
> 
> Fixes: 7ebb336e45ef ("scsi: qla2xxx: edif: Add start + stop bsgs")
> Signed-off-by: Quinn Tran <qutran@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_edif.c | 49 ++++++++++++++++-----------------
> 1 file changed, 23 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
> index 440a3caa28f9..68ae7ab43d0c 100644
> --- a/drivers/scsi/qla2xxx/qla_edif.c
> +++ b/drivers/scsi/qla2xxx/qla_edif.c
> @@ -546,14 +546,14 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 	appreply.edif_enode_active = vha->pur_cinfo.enode_flags;
> 	appreply.edif_edb_active = vha->e_dbell.db_flags;
> 
> -	bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
> -	    sizeof(struct app_start_reply);
> +	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
> 
> 	SET_DID_STATUS(bsg_reply->result, DID_OK);
> 
> -	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> -	    bsg_job->reply_payload.sg_cnt, &appreply,
> -	    sizeof(struct app_start_reply));
> +	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> +							       bsg_job->reply_payload.sg_cnt,
> +							       &appreply,
> +							       sizeof(struct app_start_reply));
> 
> 	ql_dbg(ql_dbg_edif, vha, 0x911d,
> 	    "%s app start completed with 0x%x\n",
> @@ -750,9 +750,10 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 
> errstate_exit:
> 	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
> -	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> -	    bsg_job->reply_payload.sg_cnt, &appplogireply,
> -	    sizeof(struct app_plogi_reply));
> +	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> +							       bsg_job->reply_payload.sg_cnt,
> +							       &appplogireply,
> +							       sizeof(struct app_plogi_reply));
> 
> 	return rval;
> }
> @@ -835,7 +836,7 @@ static int
> qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> {
> 	int32_t			rval = 0;
> -	int32_t			num_cnt;
> +	int32_t			pcnt = 0;
> 	struct fc_bsg_reply	*bsg_reply = bsg_job->reply;
> 	struct app_pinfo_req	app_req;
> 	struct app_pinfo_reply	*app_reply;
> @@ -847,16 +848,14 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 	    bsg_job->request_payload.sg_cnt, &app_req,
> 	    sizeof(struct app_pinfo_req));
> 
> -	num_cnt = app_req.num_ports;	/* num of ports alloc'd by app */
> -
> 	app_reply = kzalloc((sizeof(struct app_pinfo_reply) +
> -	    sizeof(struct app_pinfo) * num_cnt), GFP_KERNEL);
> +	    sizeof(struct app_pinfo) * app_req.num_ports), GFP_KERNEL);
> +
> 	if (!app_reply) {
> 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
> 		rval = -1;
> 	} else {
> 		struct fc_port	*fcport = NULL, *tf;
> -		uint32_t	pcnt = 0;
> 
> 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
> 			if (!(fcport->flags & FCF_FCSP_DEVICE))
> @@ -925,9 +924,11 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 		SET_DID_STATUS(bsg_reply->result, DID_OK);
> 	}
> 
> -	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> -	    bsg_job->reply_payload.sg_cnt, app_reply,
> -	    sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * num_cnt);
> +	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
> +	bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> +							       bsg_job->reply_payload.sg_cnt,
> +							       app_reply,
> +							       sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * pcnt);
> 
> 	kfree(app_reply);
> 
> @@ -944,10 +945,11 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> {
> 	int32_t			rval = 0;
> 	struct fc_bsg_reply	*bsg_reply = bsg_job->reply;
> -	uint32_t ret_size, size;
> +	uint32_t size;
> 
> 	struct app_sinfo_req	app_req;
> 	struct app_stats_reply	*app_reply;
> +	uint32_t pcnt = 0;
> 
> 	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
> 	    bsg_job->request_payload.sg_cnt, &app_req,
> @@ -963,18 +965,12 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 	size = sizeof(struct app_stats_reply) +
> 	    (sizeof(struct app_sinfo) * app_req.num_ports);
> 
> -	if (size > bsg_job->reply_payload.payload_len)
> -		ret_size = bsg_job->reply_payload.payload_len;
> -	else
> -		ret_size = size;
> -
> 	app_reply = kzalloc(size, GFP_KERNEL);
> 	if (!app_reply) {
> 		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
> 		rval = -1;
> 	} else {
> 		struct fc_port	*fcport = NULL, *tf;
> -		uint32_t	pcnt = 0;
> 
> 		list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
> 			if (fcport->edif.enable) {
> @@ -998,9 +994,11 @@ qla_edif_app_getstats(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
> 		SET_DID_STATUS(bsg_reply->result, DID_OK);
> 	}
> 
> +	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
> 	bsg_reply->reply_payload_rcv_len =
> 	    sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
> -	       bsg_job->reply_payload.sg_cnt, app_reply, ret_size);
> +	       bsg_job->reply_payload.sg_cnt, app_reply,
> +	       sizeof(struct app_stats_reply) + (sizeof(struct app_sinfo) * pcnt));
> 
> 	kfree(app_reply);
> 
> @@ -1074,8 +1072,7 @@ qla_edif_app_mgmt(struct bsg_job *bsg_job)
> 		    __func__,
> 		    bsg_request->rqst_data.h_vendor.vendor_cmd[1]);
> 		rval = EXT_STATUS_INVALID_PARAM;
> -		bsg_job->reply_len = sizeof(struct fc_bsg_reply);
> -		SET_DID_STATUS(bsg_reply->result, DID_ERROR);
> +		done = false;
> 		break;
> 	}
> 
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k
  2021-10-21  7:32 ` [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k Nilesh Javali
@ 2021-10-21 14:47   ` Himanshu Madhani
  0 siblings, 0 replies; 27+ messages in thread
From: Himanshu Madhani @ 2021-10-21 14:47 UTC (permalink / raw)
  To: Nilesh Javali; +Cc: Martin Petersen, linux-scsi, GR-QLogic-Storage-Upstream



> On Oct 21, 2021, at 2:32 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_version.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h
> index 4b117165bf8b..27e440f8a702 100644
> --- a/drivers/scsi/qla2xxx/qla_version.h
> +++ b/drivers/scsi/qla2xxx/qla_version.h
> @@ -6,9 +6,9 @@
> /*
>  * Driver version
>  */
> -#define QLA2XXX_VERSION      "10.02.07.100-k"
> +#define QLA2XXX_VERSION      "10.02.07.200-k"
> 
> #define QLA_DRIVER_MAJOR_VER	10
> #define QLA_DRIVER_MINOR_VER	2
> #define QLA_DRIVER_PATCH_VER	7
> -#define QLA_DRIVER_BETA_VER	100
> +#define QLA_DRIVER_BETA_VER	200
> -- 
> 2.19.0.rc0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering


^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2021-10-21 14:47 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-21  7:31 [PATCH v2 00/13] qla2xxx - misc driver and EDIF bug fixes Nilesh Javali
2021-10-21  7:31 ` [PATCH v2 01/13] qla2xxx: relogin during fabric disturbance Nilesh Javali
2021-10-21 13:58   ` Himanshu Madhani
2021-10-21  7:31 ` [PATCH v2 02/13] qla2xxx: fix gnl list corruption Nilesh Javali
2021-10-21 13:58   ` Himanshu Madhani
2021-10-21  7:31 ` [PATCH v2 03/13] qla2xxx: turn off target reset during issue_lip Nilesh Javali
2021-10-21 13:59   ` Himanshu Madhani
2021-10-21  7:31 ` [PATCH v2 04/13] qla2xxx: edif: fix app start fail Nilesh Javali
2021-10-21 14:06   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 05/13] qla2xxx: edif: fix app start delay Nilesh Javali
2021-10-21 14:09   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 06/13] qla2xxx: edif: flush stale events and msgs on session down Nilesh Javali
2021-10-21 14:21   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 07/13] qla2xxx: edif: replace list_for_each_safe with list_for_each_entry_safe Nilesh Javali
2021-10-21 14:22   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 08/13] qla2xxx: edif: tweak trace message Nilesh Javali
2021-10-21 14:35   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 09/13] qla2xxx: edif: reduce connection thrash Nilesh Javali
2021-10-21 14:39   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 10/13] qla2xxx: edif: increase ELS payload Nilesh Javali
2021-10-21 14:41   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 11/13] qla2xxx: edif: fix inconsistent check of db_flags Nilesh Javali
2021-10-21 14:44   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 12/13] qla2xxx: edif: fix edif bsg Nilesh Javali
2021-10-21 14:46   ` Himanshu Madhani
2021-10-21  7:32 ` [PATCH v2 13/13] qla2xxx: Update version to 10.02.07.200-k Nilesh Javali
2021-10-21 14:47   ` Himanshu Madhani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).