Daniel Wagner 342910
From: Quinn Tran <qutran@marvell.com>
Daniel Wagner 342910
Date: Tue, 26 Oct 2021 04:54:09 -0700
Daniel Wagner 342910
Subject: scsi: qla2xxx: edif: Increase ELS payload
Daniel Wagner 342910
Patch-mainline: v5.16-rc1
Daniel Wagner 342910
Git-commit: 0f6d600a26e89d31d8381b324fc970f72579a126
Daniel Wagner 342910
References: git-fixes
Daniel Wagner 342910
Daniel Wagner 342910
Currently, firmware limits ELS payload to FC frame size/2112.  This patch
Daniel Wagner 342910
adjusts memory buffer size to be able to handle max ELS payload.
Daniel Wagner 342910
Daniel Wagner 342910
Link: https://lore.kernel.org/r/20211026115412.27691-11-njavali@marvell.com
Daniel Wagner 342910
Fixes: 84318a9f01ce ("scsi: qla2xxx: edif: Add send, receive, and accept for auth_els")
Daniel Wagner 342910
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Daniel Wagner 342910
Signed-off-by: Quinn Tran <qutran@marvell.com>
Daniel Wagner 342910
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner 342910
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner 342910
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner 342910
---
Daniel Wagner 342910
 drivers/scsi/qla2xxx/qla_edif.c     |    2 +-
Daniel Wagner 342910
 drivers/scsi/qla2xxx/qla_edif.h     |    3 ++-
Daniel Wagner 342910
 drivers/scsi/qla2xxx/qla_edif_bsg.h |    2 +-
Daniel Wagner 342910
 drivers/scsi/qla2xxx/qla_init.c     |    4 ++++
Daniel Wagner 342910
 drivers/scsi/qla2xxx/qla_os.c       |    2 +-
Daniel Wagner 342910
 5 files changed, 9 insertions(+), 4 deletions(-)
Daniel Wagner 342910
Daniel Wagner 342910
--- a/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 342910
+++ b/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 342910
@@ -2384,7 +2384,7 @@ void qla24xx_auth_els(scsi_qla_host_t *v
Daniel Wagner 342910
 		return;
Daniel Wagner 342910
 	}
Daniel Wagner 342910
 
Daniel Wagner 342910
-	if (totlen > MAX_PAYLOAD) {
Daniel Wagner 342910
+	if (totlen > ELS_MAX_PAYLOAD) {
Daniel Wagner 342910
 		ql_dbg(ql_dbg_edif, vha, 0x0910d,
Daniel Wagner 342910
 		    "%s WARNING: verbose ELS frame received (totlen=%x)\n",
Daniel Wagner 342910
 		    __func__, totlen);
Daniel Wagner 342910
--- a/drivers/scsi/qla2xxx/qla_edif.h
Daniel Wagner 342910
+++ b/drivers/scsi/qla2xxx/qla_edif.h
Daniel Wagner 342910
@@ -93,7 +93,6 @@ struct sa_update_28xx {
Daniel Wagner 342910
 };
Daniel Wagner 342910
 
Daniel Wagner 342910
 #define        NUM_ENTRIES     256
Daniel Wagner 342910
-#define        MAX_PAYLOAD     1024
Daniel Wagner 342910
 #define        PUR_GET         1
Daniel Wagner 342910
 
Daniel Wagner 342910
 struct dinfo {
Daniel Wagner 342910
@@ -128,6 +127,8 @@ struct enode {
Daniel Wagner 342910
 	} u;
Daniel Wagner 342910
 };
Daniel Wagner 342910
 
Daniel Wagner 342910
+#define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES))
Daniel Wagner 342910
+
Daniel Wagner 342910
 #define EDIF_SESSION_DOWN(_s) \
Daniel Wagner 342910
 	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \
Daniel Wagner 342910
 	 _s->disc_state == DSC_DELETED || \
Daniel Wagner 342910
--- a/drivers/scsi/qla2xxx/qla_edif_bsg.h
Daniel Wagner 342910
+++ b/drivers/scsi/qla2xxx/qla_edif_bsg.h
Daniel Wagner 342910
@@ -8,7 +8,7 @@
Daniel Wagner 342910
 #define __QLA_EDIF_BSG_H
Daniel Wagner 342910
 
Daniel Wagner 342910
 /* BSG Vendor specific commands */
Daniel Wagner 342910
-#define	ELS_MAX_PAYLOAD		1024
Daniel Wagner 342910
+#define	ELS_MAX_PAYLOAD		2112
Daniel Wagner 342910
 #ifndef	WWN_SIZE
Daniel Wagner 342910
 #define WWN_SIZE		8
Daniel Wagner 342910
 #endif
Daniel Wagner 342910
--- a/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 342910
+++ b/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 342910
@@ -4468,6 +4468,10 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
Daniel Wagner 342910
 		    (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
Daniel Wagner 342910
 	}
Daniel Wagner 342910
 
Daniel Wagner 342910
+	/* ELS pass through payload is limit by frame size. */
Daniel Wagner 342910
+	if (ha->flags.edif_enabled)
Daniel Wagner 342910
+		mid_init_cb->init_cb.frame_payload_size = cpu_to_le16(ELS_MAX_PAYLOAD);
Daniel Wagner 342910
+
Daniel Wagner 342910
 	rval = qla2x00_init_firmware(vha, ha->init_cb_size);
Daniel Wagner 342910
 next_check:
Daniel Wagner 342910
 	if (rval) {
Daniel Wagner 342910
--- a/drivers/scsi/qla2xxx/qla_os.c
Daniel Wagner 342910
+++ b/drivers/scsi/qla2xxx/qla_os.c
Daniel Wagner 342910
@@ -4389,7 +4389,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha
Daniel Wagner 342910
 
Daniel Wagner 342910
 	/* allocate the purex dma pool */
Daniel Wagner 342910
 	ha->purex_dma_pool = dma_pool_create(name, &ha->pdev->dev,
Daniel Wagner 342910
-	    MAX_PAYLOAD, 8, 0);
Daniel Wagner 342910
+	    ELS_MAX_PAYLOAD, 8, 0);
Daniel Wagner 342910
 
Daniel Wagner 342910
 	if (!ha->purex_dma_pool) {
Daniel Wagner 342910
 		ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b,