Daniel Wagner 4fcf1b
From: Bikash Hazarika <bhazarika@marvell.com>
Daniel Wagner 4fcf1b
Date: Wed, 15 Jun 2022 22:34:59 -0700
Daniel Wagner 4fcf1b
Subject: scsi: qla2xxx: Add a new v2 dport diagnostic feature
Denis Kirjanov 718367
Patch-mainline: v5.20-rc1
Daniel Wagner 4fcf1b
Git-commit: 476da8faa336f104cb5183ff51615335d1ff5d1f
Daniel Wagner 4fcf1b
References: bsc#1201958
Daniel Wagner 4fcf1b
Daniel Wagner 4fcf1b
FW requires minimum 72 bytes buffer size for D_port result. Buffer size
Daniel Wagner 4fcf1b
1024 is mentioned in the FW spec so buffer size is increased to 1024.
Daniel Wagner 4fcf1b
Rewrite the logic to handle START/RESTART command from SDMAPI.
Daniel Wagner 4fcf1b
Daniel Wagner 4fcf1b
Link: https://lore.kernel.org/r/20220616053508.27186-3-njavali@marvell.com
Daniel Wagner 4fcf1b
Signed-off-by: Bikash Hazarika <bhazarika@marvell.com>
Daniel Wagner 4fcf1b
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner 4fcf1b
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner 4fcf1b
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner 4fcf1b
---
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_bsg.c  |   86 ++++++++++++++++++++++++++++++++++++++++
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_bsg.h  |   15 ++++++
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_def.h  |   10 ++++
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_gbl.h  |    4 +
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_init.c |    3 +
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_isr.c  |    3 +
Daniel Wagner 4fcf1b
 drivers/scsi/qla2xxx/qla_mbx.c  |   48 ++++++++++++++++++++++
Daniel Wagner 4fcf1b
 7 files changed, 169 insertions(+)
Daniel Wagner 4fcf1b
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_bsg.c
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
Daniel Wagner 4fcf1b
@@ -2426,6 +2426,89 @@ qla2x00_do_dport_diagnostics(struct bsg_
Daniel Wagner 4fcf1b
 }
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 static int
Daniel Wagner 4fcf1b
+qla2x00_do_dport_diagnostics_v2(struct bsg_job *bsg_job)
Daniel Wagner 4fcf1b
+{
Daniel Wagner 4fcf1b
+	struct fc_bsg_reply *bsg_reply = bsg_job->reply;
Daniel Wagner 4fcf1b
+	struct Scsi_Host *host = fc_bsg_to_shost(bsg_job);
Daniel Wagner 4fcf1b
+	scsi_qla_host_t *vha = shost_priv(host);
Daniel Wagner 4fcf1b
+	int rval;
Daniel Wagner 4fcf1b
+	struct qla_dport_diag_v2 *dd;
Daniel Wagner 4fcf1b
+	mbx_cmd_t mc;
Daniel Wagner 4fcf1b
+	mbx_cmd_t *mcp = &mc;
Daniel Wagner 4fcf1b
+	uint16_t options;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	if (!IS_DPORT_CAPABLE(vha->hw))
Daniel Wagner 4fcf1b
+		return -EPERM;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	dd = kzalloc(sizeof(*dd), GFP_KERNEL);
Daniel Wagner 4fcf1b
+	if (!dd)
Daniel Wagner 4fcf1b
+		return -ENOMEM;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
Daniel Wagner 4fcf1b
+			bsg_job->request_payload.sg_cnt, dd, sizeof(*dd));
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	options  = dd->options;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	/*  Check dport Test in progress */
Daniel Wagner 4fcf1b
+	if (options == QLA_GET_DPORT_RESULT_V2 &&
Daniel Wagner 4fcf1b
+	    vha->dport_status & DPORT_DIAG_IN_PROGRESS) {
Daniel Wagner 4fcf1b
+		bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
Daniel Wagner 4fcf1b
+					EXT_STATUS_DPORT_DIAG_IN_PROCESS;
Daniel Wagner 4fcf1b
+		goto dportcomplete;
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	/*  Check chip reset in progress and start/restart requests arrive */
Daniel Wagner 4fcf1b
+	if (vha->dport_status & DPORT_DIAG_CHIP_RESET_IN_PROGRESS &&
Daniel Wagner 4fcf1b
+	    (options == QLA_START_DPORT_TEST_V2 ||
Daniel Wagner 4fcf1b
+	     options == QLA_RESTART_DPORT_TEST_V2)) {
Daniel Wagner 4fcf1b
+		vha->dport_status &= ~DPORT_DIAG_CHIP_RESET_IN_PROGRESS;
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	/*  Check chip reset in progress and get result request arrive */
Daniel Wagner 4fcf1b
+	if (vha->dport_status & DPORT_DIAG_CHIP_RESET_IN_PROGRESS &&
Daniel Wagner 4fcf1b
+	    options == QLA_GET_DPORT_RESULT_V2) {
Daniel Wagner 4fcf1b
+		bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
Daniel Wagner 4fcf1b
+					EXT_STATUS_DPORT_DIAG_NOT_RUNNING;
Daniel Wagner 4fcf1b
+		goto dportcomplete;
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	rval = qla26xx_dport_diagnostics_v2(vha, dd, mcp);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	if (rval == QLA_SUCCESS) {
Daniel Wagner 4fcf1b
+		bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
Daniel Wagner 4fcf1b
+					EXT_STATUS_OK;
Daniel Wagner 4fcf1b
+		if (options == QLA_START_DPORT_TEST_V2 ||
Daniel Wagner 4fcf1b
+		    options == QLA_RESTART_DPORT_TEST_V2) {
Daniel Wagner 4fcf1b
+			dd->mbx1 = mcp->mb[0];
Daniel Wagner 4fcf1b
+			dd->mbx2 = mcp->mb[1];
Daniel Wagner 4fcf1b
+			vha->dport_status |=  DPORT_DIAG_IN_PROGRESS;
Daniel Wagner 4fcf1b
+		} else if (options == QLA_GET_DPORT_RESULT_V2) {
Daniel Wagner 4fcf1b
+			dd->mbx1 = vha->dport_data[1];
Daniel Wagner 4fcf1b
+			dd->mbx2 = vha->dport_data[2];
Daniel Wagner 4fcf1b
+		}
Daniel Wagner 4fcf1b
+	} else {
Daniel Wagner 4fcf1b
+		dd->mbx1 = mcp->mb[0];
Daniel Wagner 4fcf1b
+		dd->mbx2 = mcp->mb[1];
Daniel Wagner 4fcf1b
+		bsg_reply->reply_data.vendor_reply.vendor_rsp[0] =
Daniel Wagner 4fcf1b
+				EXT_STATUS_DPORT_DIAG_ERR;
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+dportcomplete:
Daniel Wagner 4fcf1b
+	sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
Daniel Wagner 4fcf1b
+			    bsg_job->reply_payload.sg_cnt, dd, sizeof(*dd));
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	bsg_reply->reply_payload_rcv_len = sizeof(*dd);
Daniel Wagner 4fcf1b
+	bsg_job->reply_len = sizeof(*bsg_reply);
Daniel Wagner 4fcf1b
+	bsg_reply->result = DID_OK << 16;
Daniel Wagner 4fcf1b
+	bsg_job_done(bsg_job, bsg_reply->result,
Daniel Wagner 4fcf1b
+		     bsg_reply->reply_payload_rcv_len);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	kfree(dd);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	return 0;
Daniel Wagner 4fcf1b
+}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+static int
Daniel Wagner 4fcf1b
 qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
Daniel Wagner 4fcf1b
 {
Daniel Wagner 4fcf1b
 	scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
Daniel Wagner 4fcf1b
@@ -2861,6 +2944,9 @@ qla2x00_process_vendor_specific(struct s
Daniel Wagner 4fcf1b
 	case QL_VND_DPORT_DIAGNOSTICS:
Daniel Wagner 4fcf1b
 		return qla2x00_do_dport_diagnostics(bsg_job);
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
+	case QL_VND_DPORT_DIAGNOSTICS_V2:
Daniel Wagner 4fcf1b
+		return qla2x00_do_dport_diagnostics_v2(bsg_job);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 	case QL_VND_EDIF_MGMT:
Daniel Wagner 4fcf1b
 		return qla_edif_app_mgmt(bsg_job);
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_bsg.h
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_bsg.h
Daniel Wagner 4fcf1b
@@ -38,6 +38,7 @@
Daniel Wagner 4fcf1b
 #define QL_VND_GET_TGT_STATS		0x25
Daniel Wagner 4fcf1b
 #define QL_VND_MANAGE_HOST_PORT		0x26
Daniel Wagner 4fcf1b
 #define QL_VND_MBX_PASSTHRU		0x2B
Daniel Wagner 4fcf1b
+#define QL_VND_DPORT_DIAGNOSTICS_V2	0x2C
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 /* BSG Vendor specific subcode returns */
Daniel Wagner 4fcf1b
 #define EXT_STATUS_OK			0
Daniel Wagner 4fcf1b
@@ -61,6 +62,9 @@
Daniel Wagner 4fcf1b
 #define EXT_STATUS_TIMEOUT		30
Daniel Wagner 4fcf1b
 #define EXT_STATUS_THREAD_FAILED	31
Daniel Wagner 4fcf1b
 #define EXT_STATUS_DATA_CMP_FAILED	32
Daniel Wagner 4fcf1b
+#define EXT_STATUS_DPORT_DIAG_ERR	40
Daniel Wagner 4fcf1b
+#define EXT_STATUS_DPORT_DIAG_IN_PROCESS	41
Daniel Wagner 4fcf1b
+#define EXT_STATUS_DPORT_DIAG_NOT_RUNNING	42
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 /* BSG definations for interpreting CommandSent field */
Daniel Wagner 4fcf1b
 #define INT_DEF_LB_LOOPBACK_CMD         0
Daniel Wagner 4fcf1b
@@ -289,6 +293,17 @@ struct qla_dport_diag {
Daniel Wagner 4fcf1b
 	uint8_t  unused[62];
Daniel Wagner 4fcf1b
 } __packed;
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
+#define QLA_GET_DPORT_RESULT_V2		0  /* Get Result */
Daniel Wagner 4fcf1b
+#define QLA_RESTART_DPORT_TEST_V2	1  /* Restart test */
Daniel Wagner 4fcf1b
+#define QLA_START_DPORT_TEST_V2		2  /* Start test */
Daniel Wagner 4fcf1b
+struct qla_dport_diag_v2 {
Daniel Wagner 4fcf1b
+	uint16_t options;
Daniel Wagner 4fcf1b
+	uint16_t mbx1;
Daniel Wagner 4fcf1b
+	uint16_t mbx2;
Daniel Wagner 4fcf1b
+	uint8_t  unused[58];
Daniel Wagner 4fcf1b
+	uint8_t buf[1024]; /* Test Result */
Daniel Wagner 4fcf1b
+} __packed;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 /* D_Port options */
Daniel Wagner 4fcf1b
 #define QLA_DPORT_RESULT	0x0
Daniel Wagner 4fcf1b
 #define QLA_DPORT_START		0x2
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_def.h
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_def.h
Daniel Wagner 4fcf1b
@@ -1174,6 +1174,12 @@ static inline bool qla2xxx_is_valid_mbs(
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 /* ISP mailbox loopback echo diagnostic error code */
Daniel Wagner 4fcf1b
 #define MBS_LB_RESET	0x17
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+/* AEN mailbox Port Diagnostics test */
Daniel Wagner 4fcf1b
+#define AEN_START_DIAG_TEST		0x0	/* start the diagnostics */
Daniel Wagner 4fcf1b
+#define AEN_DONE_DIAG_TEST_WITH_NOERR	0x1	/* Done with no errors */
Daniel Wagner 4fcf1b
+#define AEN_DONE_DIAG_TEST_WITH_ERR	0x2	/* Done with error.*/
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 /*
Daniel Wagner 4fcf1b
  * Firmware options 1, 2, 3.
Daniel Wagner 4fcf1b
  */
Daniel Wagner 4fcf1b
@@ -5020,6 +5026,10 @@ typedef struct scsi_qla_host {
Daniel Wagner 4fcf1b
 	u64 short_link_down_cnt;
Daniel Wagner 4fcf1b
 	struct edif_dbell e_dbell;
Daniel Wagner 4fcf1b
 	struct pur_core pur_cinfo;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+#define DPORT_DIAG_IN_PROGRESS                 BIT_0
Daniel Wagner 4fcf1b
+#define DPORT_DIAG_CHIP_RESET_IN_PROGRESS      BIT_1
Daniel Wagner 4fcf1b
+	uint16_t dport_status;
Daniel Wagner 4fcf1b
 } scsi_qla_host_t;
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 struct qla27xx_image_status {
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_gbl.h
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
Daniel Wagner 4fcf1b
@@ -557,6 +557,10 @@ qla2x00_dump_mctp_data(scsi_qla_host_t *
Daniel Wagner 4fcf1b
 extern int
Daniel Wagner 4fcf1b
 qla26xx_dport_diagnostics(scsi_qla_host_t *, void *, uint, uint);
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
+extern int
Daniel Wagner 4fcf1b
+qla26xx_dport_diagnostics_v2(scsi_qla_host_t *,
Daniel Wagner 4fcf1b
+			     struct qla_dport_diag_v2 *,  mbx_cmd_t *);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 int qla24xx_send_mb_cmd(struct scsi_qla_host *, mbx_cmd_t *);
Daniel Wagner 4fcf1b
 int qla24xx_gpdb_wait(struct scsi_qla_host *, fc_port_t *, u8);
Daniel Wagner 4fcf1b
 int qla24xx_gidlist_wait(struct scsi_qla_host *, void *, dma_addr_t,
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 4fcf1b
@@ -7208,6 +7208,9 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
Daniel Wagner 4fcf1b
 	if (vha->flags.online) {
Daniel Wagner 4fcf1b
 		qla2x00_abort_isp_cleanup(vha);
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
+		vha->dport_status |= DPORT_DIAG_CHIP_RESET_IN_PROGRESS;
Daniel Wagner 4fcf1b
+		vha->dport_status &= ~DPORT_DIAG_IN_PROGRESS;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 		if (vha->hw->flags.port_isolated)
Daniel Wagner 4fcf1b
 			return status;
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_isr.c
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_isr.c
Daniel Wagner 4fcf1b
@@ -1762,6 +1762,9 @@ qla2x00_async_event(scsi_qla_host_t *vha
Daniel Wagner 4fcf1b
 		break;
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
 	case MBA_DPORT_DIAGNOSTICS:
Daniel Wagner 4fcf1b
+		if ((mb[1] & 0xF) == AEN_DONE_DIAG_TEST_WITH_NOERR ||
Daniel Wagner 4fcf1b
+		    (mb[1] & 0xF) == AEN_DONE_DIAG_TEST_WITH_ERR)
Daniel Wagner 4fcf1b
+			vha->dport_status &= ~DPORT_DIAG_IN_PROGRESS;
Daniel Wagner 4fcf1b
 		ql_dbg(ql_dbg_async, vha, 0x5052,
Daniel Wagner 4fcf1b
 		    "D-Port Diagnostics: %04x %04x %04x %04x\n",
Daniel Wagner 4fcf1b
 		    mb[0], mb[1], mb[2], mb[3]);
Daniel Wagner 4fcf1b
--- a/drivers/scsi/qla2xxx/qla_mbx.c
Daniel Wagner 4fcf1b
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
Daniel Wagner 4fcf1b
@@ -6472,6 +6472,54 @@ qla26xx_dport_diagnostics(scsi_qla_host_
Daniel Wagner 4fcf1b
 	return rval;
Daniel Wagner 4fcf1b
 }
Daniel Wagner 4fcf1b
 
Daniel Wagner 4fcf1b
+int
Daniel Wagner 4fcf1b
+qla26xx_dport_diagnostics_v2(scsi_qla_host_t *vha,
Daniel Wagner 4fcf1b
+			     struct qla_dport_diag_v2 *dd,  mbx_cmd_t *mcp)
Daniel Wagner 4fcf1b
+{
Daniel Wagner 4fcf1b
+	int rval;
Daniel Wagner 4fcf1b
+	dma_addr_t dd_dma;
Daniel Wagner 4fcf1b
+	uint size = sizeof(dd->buf);
Daniel Wagner 4fcf1b
+	uint16_t options = dd->options;
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x119f,
Daniel Wagner 4fcf1b
+	       "Entered %s.\n", __func__);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	dd_dma = dma_map_single(&vha->hw->pdev->dev,
Daniel Wagner 4fcf1b
+				dd->buf, size, DMA_FROM_DEVICE);
Daniel Wagner 4fcf1b
+	if (dma_mapping_error(&vha->hw->pdev->dev, dd_dma)) {
Daniel Wagner 4fcf1b
+		ql_log(ql_log_warn, vha, 0x1194,
Daniel Wagner 4fcf1b
+		       "Failed to map dma buffer.\n");
Daniel Wagner 4fcf1b
+		return QLA_MEMORY_ALLOC_FAILED;
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	memset(dd->buf, 0, size);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	mcp->mb[0] = MBC_DPORT_DIAGNOSTICS;
Daniel Wagner 4fcf1b
+	mcp->mb[1] = options;
Daniel Wagner 4fcf1b
+	mcp->mb[2] = MSW(LSD(dd_dma));
Daniel Wagner 4fcf1b
+	mcp->mb[3] = LSW(LSD(dd_dma));
Daniel Wagner 4fcf1b
+	mcp->mb[6] = MSW(MSD(dd_dma));
Daniel Wagner 4fcf1b
+	mcp->mb[7] = LSW(MSD(dd_dma));
Daniel Wagner 4fcf1b
+	mcp->mb[8] = size;
Daniel Wagner 4fcf1b
+	mcp->out_mb = MBX_8 | MBX_7 | MBX_6 | MBX_3 | MBX_2 | MBX_1 | MBX_0;
Daniel Wagner 4fcf1b
+	mcp->in_mb = MBX_3 | MBX_2 | MBX_1 | MBX_0;
Daniel Wagner 4fcf1b
+	mcp->buf_size = size;
Daniel Wagner 4fcf1b
+	mcp->flags = MBX_DMA_IN;
Daniel Wagner 4fcf1b
+	mcp->tov = MBX_TOV_SECONDS * 4;
Daniel Wagner 4fcf1b
+	rval = qla2x00_mailbox_command(vha, mcp);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	if (rval != QLA_SUCCESS) {
Daniel Wagner 4fcf1b
+		ql_dbg(ql_dbg_mbx, vha, 0x1195, "Failed=%x.\n", rval);
Daniel Wagner 4fcf1b
+	} else {
Daniel Wagner 4fcf1b
+		ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1196,
Daniel Wagner 4fcf1b
+		       "Done %s.\n", __func__);
Daniel Wagner 4fcf1b
+	}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	dma_unmap_single(&vha->hw->pdev->dev, dd_dma, size, DMA_FROM_DEVICE);
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
+	return rval;
Daniel Wagner 4fcf1b
+}
Daniel Wagner 4fcf1b
+
Daniel Wagner 4fcf1b
 static void qla2x00_async_mb_sp_done(srb_t *sp, int res)
Daniel Wagner 4fcf1b
 {
Daniel Wagner 4fcf1b
 	sp->u.iocb_cmd.u.mbx.rc = res;