[PATCH] Revert "scsi: qla2xxx: Fix NVMe Target discovery"

2018-12-06 Thread Himanshu Madhani
This reverts commit db186382af21e926e90df19499475f2552192b77.

This commit introduced regression with FCP discovery so revert
it back to fix discovery for FCP luns

Cc: 
Signed-off-by: Himanshu Madhani 
---
Hi Martin, 

This patch has introduced regression for LUN discovery with FC. 

Please apply this revert to 4.20/scsi-fixes branch at your earliest convenience.

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_os.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index b658b9a5eb1e..d0ecc729a90a 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -4886,10 +4886,10 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, 
struct qla_work_evt *e)
fcport->d_id = e->u.new_sess.id;
fcport->flags |= FCF_FABRIC_DEVICE;
fcport->fw_login_state = DSC_LS_PLOGI_PEND;
-   if (e->u.new_sess.fc4_type & FS_FC4TYPE_FCP)
+   if (e->u.new_sess.fc4_type == FS_FC4TYPE_FCP)
fcport->fc4_type = FC4_TYPE_FCP_SCSI;
 
-   if (e->u.new_sess.fc4_type & FS_FC4TYPE_NVME) {
+   if (e->u.new_sess.fc4_type == FS_FC4TYPE_NVME) {
fcport->fc4_type = FC4_TYPE_OTHER;
fcport->fc4f_nvme = FC4_TYPE_NVME;
}
-- 
2.12.0



[PATCH] qla2xxx: Add SysFS hook for FC-NVMe autoconnect

2018-11-12 Thread Himanshu Madhani
This patch adds a SysFS hook for systemd service to kick
off autoconnect command at the boot time.

Output of the SysFS hook will provide host-traddr/traddr which will
be used by NVMe CLI to kick off discovery at boot time.

Signed-off-by: Himanshu Madhani 
---
Hi Martin, 

This patch provides mechanism for qla2xxx driver's boot time scripts for 
autodiscovery and autoconnection of NVMe LUNs. 

Please apply this to 4.21/scsi-queue at your earliest convenience. 

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_attr.c | 122 +++-
 1 file changed, 121 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 678aff5ca947..323a4aa35f16 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1665,6 +1665,125 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
ha->max_speed_sup ? "32Gps" : "16Gps");
 }
 
+static ssize_t
+qla27xx_nvme_connect_str_show(struct device *dev, struct device_attribute 
*attr,
+char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct nvme_fc_remote_port *rport;
+   struct nvme_fc_local_port *lport;
+   struct qla_hw_data *ha = vha->hw;
+   struct qla_nvme_rport *qla_rport, *trport;
+   fc_port_t *fcport;
+   char temp[150] = {0};
+   char *rportstate = "";
+
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   if (!vha->flags.nvme_enabled)
+   return scnprintf(buf, PAGE_SIZE, "%s\n",
+   "FC-NVMe is not enabled");
+
+   list_for_each_entry(fcport, >vp_fcports, list) {
+   if (!fcport) {
+   scnprintf(buf, PAGE_SIZE, "No FC host\n");
+   return strlen(buf);
+   }
+
+   if (!vha->nvme_local_port) {
+   scnprintf(buf, PAGE_SIZE,
+   "FC-NVMe Initiator on 0x%16llx not registered.\n",
+   wwn_to_u64(fcport->port_name));
+   return strlen(buf);
+   }
+
+   list_for_each_entry_safe(qla_rport, trport,
+   >nvme_rport_list, list) {
+   if (qla_rport->fcport == fcport) {
+   rport = fcport->nvme_remote_port;
+
+   lport = vha->nvme_local_port;
+
+   scnprintf(temp, sizeof(temp),
+   "FC-NVMe LPORT: host%ld 
nn-0x%16llx:pn-0x%16llx port_id %06x %s\n",
+   vha->host_no, lport->node_name,
+   lport->port_name, lport->port_id, "ONLINE");
+
+   if (strlcat(buf, temp, PAGE_SIZE) >= PAGE_SIZE)
+   goto done;
+
+   scnprintf(temp, sizeof(temp),
+   "FC-NVMe RPORT: host%ld nn-0x%llx:pn-0x%llx 
port_id %06x ",
+   vha->host_no, rport->node_name,
+   rport->port_name, rport->port_id);
+
+   /* Find out Rport State */
+   if (rport->port_state & FC_OBJSTATE_ONLINE)
+   rportstate = "ONLINE";
+
+   if (rport->port_state & FC_OBJSTATE_UNKNOWN)
+   rportstate = "UNKNOWN";
+
+   if (rport->port_state & ~(FC_OBJSTATE_ONLINE |
+   FC_OBJSTATE_UNKNOWN))
+   rportstate = "UNSUPPORTED";
+
+   if (strlcat(buf, temp, PAGE_SIZE) >=
+   PAGE_SIZE)
+   goto done;
+
+   if (rport->port_role &
+   (FC_PORT_ROLE_NVME_INITIATOR |
+ FC_PORT_ROLE_NVME_TARGET |
+ FC_PORT_ROLE_NVME_DISCOVERY)) {
+   if (rport->port_role &
+   FC_PORT_ROLE_NVME_INITIATOR)
+   if (strlcat(buf, "INITIATOR ",
+   PAGE_SIZE) >= PAGE_SIZE)
+   goto done;
+
+   if (rport->port_role &
+   FC_PORT_ROLE_NVME_TARGET)
+  

[PATCH 1/1] qla2xxx: Initialize port speed to avoid setting lower speed

2018-11-06 Thread Himanshu Madhani
From: Quinn Tran 

This patch initializes port speed so that firmware does not
set lower operating speed. Setting lower speed in firmware
impacts WRITE perfomance.

Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
Cc: 
Singed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
Tested-by: Laurence Oberman 
---
Hi Martin, 

This patch fixes initialization issue for the driver which results into setting 
lower
speed for WRITE transfer. In our latest experiments we have seen improvments of 
47%
for WRITE data 

Please apply this patch to 4.20/scsi-fixes for 4.20-rcX inclusion at your 
earliest convenience.

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_init.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 36d67230c3b1..92d2c6866e35 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -4791,6 +4791,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
fcport->loop_id = FC_NO_LOOP_ID;
qla2x00_set_fcport_state(fcport, FCS_UNCONFIGURED);
fcport->supported_classes = FC_COS_UNSPECIFIED;
+   fcport->fp_speed = PORT_SPEED_UNKNOWN;
 
fcport->ct_desc.ct_sns = dma_alloc_coherent(>hw->pdev->dev,
sizeof(struct ct_sns_pkt), >ct_desc.ct_sns_dma,
-- 
2.12.0



[PATCH v4 4/5] qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

2018-10-31 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node for NVMe Target configuration

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 33 +
 drivers/scsi/qla2xxx/qla_gs.c   |  2 +-
 drivers/scsi/qla2xxx/qla_init.c |  3 ++-
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 0bb9ac6ece92..678aff5ca947 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -13,6 +13,7 @@
 #include 
 
 static int qla24xx_vport_disable(struct fc_vport *, bool);
+extern void qlt_set_mode(struct scsi_qla_host *vha);
 
 /* SYSFS attributes - 
*/
 
@@ -631,6 +632,37 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_write_nvmet(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr,
+   char *buf, loff_t off, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+   struct device, kobj)));
+   struct qla_hw_data *ha = vha->hw;
+   scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+   ql_log(ql_log_info, vha, 0x706e,
+   "Bringing up target mode!! vha:%p\n", vha);
+   qlt_op_target_mode = 1;
+   qlt_set_mode(base_vha);
+   set_bit(ISP_ABORT_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   qla2x00_wait_for_hba_online(vha);
+
+   return count;
+}
+
+static struct bin_attribute sysfs_nvmet_attr = {
+   .attr = {
+   .name = "nvmet",
+   .mode = 0200,
+   },
+   .size = 0,
+   .write = qla2x00_sysfs_write_nvmet,
+};
+
+
+static ssize_t
 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -943,6 +975,7 @@ static struct sysfs_entry {
{ "issue_logo", _issue_logo_attr, },
{ "xgmac_stats", _xgmac_stats_attr, 3 },
{ "dcbx_tlv", _dcbx_tlv_attr, 3 },
+   { "nvmet", _nvmet_attr, },
{ NULL },
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index ea55ed972eed..cfc6818952a0 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -698,7 +698,7 @@ qla2x00_rff_id(scsi_qla_host_t *vha, u8 type)
return (QLA_SUCCESS);
 
return qla_async_rffid(vha, >d_id, qlt_rff_id(vha),
-   FC4_TYPE_FCP_SCSI);
+   type);
 }
 
 static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 665964d4f0c4..36d67230c3b1 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5526,7 +5526,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
 * will be newer than discovery_gen. */
qlt_do_generation_tick(vha, _gen);
 
-   if (USE_ASYNC_SCAN(ha)) {
+   if (USE_ASYNC_SCAN(ha) && !(vha->flags.nvmet_enabled)) {
+   /* If NVME target mode is enabled, go through regular scan */
rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
NULL);
if (rval)
-- 
2.12.0



[PATCH v4 5/5] qla2xxx: Update driver version to 11.00.00.00-k

2018-10-31 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 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 12bafff71a1a..0d58aa629c08 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.11-k"
+#define QLA2XXX_VERSION  "11.00.00.00-k"
 
-#define QLA_DRIVER_MAJOR_VER   10
+#define QLA_DRIVER_MAJOR_VER   11
 #define QLA_DRIVER_MINOR_VER   0
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v4 2/5] qla2xxx_nvmet: Add files for FC-NVMe Target support

2018-10-31 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds files to enable NVMe Target Support

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvmet.c | 795 +++
 drivers/scsi/qla2xxx/qla_nvmet.h | 129 +++
 2 files changed, 924 insertions(+)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
new file mode 100644
index ..caf72d5d627b
--- /dev/null
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -0,0 +1,795 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2017 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "qla_nvme.h"
+#include "qla_nvmet.h"
+
+static void qla_nvmet_send_resp_ctio(struct qla_qpair *qpair,
+   struct qla_nvmet_cmd *cmd, struct nvmefc_tgt_fcp_req *rsp);
+static void qla_nvmet_send_abts_ctio(struct scsi_qla_host *vha,
+   struct abts_recv_from_24xx *abts, bool flag);
+
+/*
+ * qla_nvmet_targetport_delete -
+ * Invoked by the nvmet to indicate that the target port has
+ * been deleted
+ */
+static void
+qla_nvmet_targetport_delete(struct nvmet_fc_target_port *targetport)
+{
+   struct qla_nvmet_tgtport *tport = targetport->private;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   complete(>tport_del);
+}
+
+/*
+ * qlt_nvmet_ls_done -
+ * Invoked by the firmware interface to indicate the completion
+ * of an LS cmd
+ * Free all associated resources of the LS cmd
+ */
+static void qlt_nvmet_ls_done(void *ptr, int res)
+{
+   struct srb *sp = ptr;
+   struct srb_iocb   *nvme = >u.iocb_cmd;
+   struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc;
+   struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   ql_dbg(ql_dbg_nvme, sp->vha, 0x11001,
+   "%s: sp %p vha %p, rsp %p, cmd %p\n", __func__,
+   sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd);
+
+   rsp->done(rsp);
+
+   /* Free tgt_cmd */
+   kfree(tgt_cmd->buf);
+   kfree(tgt_cmd);
+   qla2x00_rel_sp(sp);
+}
+
+/*
+ * qla_nvmet_ls_rsp -
+ * Invoked by the nvme-t to complete the LS req.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_ls_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+   struct srb_iocb   *nvme;
+   int rval = QLA_FUNCTION_FAILED;
+   srb_t *sp;
+
+   ql_dbg(ql_dbg_nvme + ql_dbg_buffer, vha, 0x11002,
+   "Dumping the NVMET-LS response buffer\n");
+   ql_dump_buffer(ql_dbg_nvme + ql_dbg_buffer, vha, 0x2075,
+   (uint8_t *)rsp->rspbuf, rsp->rsplen);
+
+   /* Alloc SRB structure */
+   sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC);
+   if (!sp) {
+   ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n");
+   return -ENOMEM;
+   }
+
+   sp->type = SRB_NVMET_LS;
+   sp->done = qlt_nvmet_ls_done;
+   sp->vha = vha;
+   sp->fcport = tgt_cmd->fcport;
+
+   nvme = >u.iocb_cmd;
+   nvme->u.nvme.rsp_dma = rsp->rspdma;
+   nvme->u.nvme.rsp_len = rsp->rsplen;
+   nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address;
+   nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle;
+   nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index;
+
+   nvme->u.nvme.cmd = tgt_cmd; /* To be freed */
+   nvme->u.nvme.desc = rsp; /* Call back to nvmet */
+
+   rval = qla2x00_start_sp(sp);
+   if (rval != QLA_SUCCESS) {
+   ql_log(ql_log_warn, vha, 0x11004,
+   "qla2x00_start_sp failed = %d\n", rval);
+   return rval;
+   }
+
+   return 0;
+}
+
+/*
+ * qla_nvmet_fcp_op -
+ * Invoked by the nvme-t to complete the IO.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_fcp_op(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_fcp_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.fcp_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return 0;
+
+   /* Prepare and send CTIO 82h */
+   qla_nvmet_send_resp_ctio(vha->qpair, tgt_cmd, rsp);
+
+   return

[PATCH v4 1/5] qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling

2018-10-31 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch provides link service pass through feature handling
in the driver. This feature is implemented mainly by the firmware
and the same implementation is handled in the driver via an
IOCB interface.

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c|  1 +
 drivers/scsi/qla2xxx/qla_dbg.h|  2 ++
 drivers/scsi/qla2xxx/qla_def.h|  3 +++
 drivers/scsi/qla2xxx/qla_gbl.h|  7 +++
 drivers/scsi/qla2xxx/qla_iocb.c   |  8 +++-
 drivers/scsi/qla2xxx/qla_target.c | 11 +++
 6 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ed9c228f7d11 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -67,6 +67,7 @@
  * | Target Mode Management  |   0xf09b   | 0xf002 |
  * |  || 0xf046-0xf049  |
  * | Target Mode Task Management  |  0x1000d  ||
+ * | NVME|   0x11000  ||
  * --
  */
 
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 8877aa97d829..4ad97923e40b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char 
*fmt, ...);
 #define ql_dbg_tgt_tmr 0x1000 /* Target mode task management */
 #define ql_dbg_tgt_dif  0x0800 /* Target mode dif */
 
+#define ql_dbg_nvme 0x0400 /* NVME Target */
+
 extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
 extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 26b93c563f92..a37a4d2261e2 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -515,6 +515,9 @@ struct srb_iocb {
 #define SRB_PRLI_CMD   21
 #define SRB_CTRL_VP22
 #define SRB_PRLO_CMD   23
+#define SRB_NVME_ELS_RSP 24
+#define SRB_NVMET_LS   25
+#define SRB_NVMET_FCP  26
 
 enum {
TYPE_SRB,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 3673fcdb033a..2946c65812cd 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -119,6 +119,13 @@ void qla_do_iidma_work(struct scsi_qla_host *vha, 
fc_port_t *fcport);
 int qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *);
 void qla_rscn_replay(fc_port_t *fcport);
 
+
+/*
+ * Used by FC-NVMe Target
+ */
+int qla_nvmet_ls(srb_t *sp, void *rsp_pkt);
+int qlt_send_els_resp(srb_t *sp, void *pkt);
+
 /*
  * Global Data in qla_os.c source file.
  */
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 032635321ad6..70cd55884842 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
 
-   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3491,6 +3491,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+   case SRB_NVMET_LS:
+   qla_nvmet_ls(sp, pkt);
+   break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3516,6 +3519,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+   case SRB_NVME_ELS_RSP:
+   qlt_send_els_resp(sp, pkt);
+   break;
default:
break;
}
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index c4504740f0e2..e15ea80916c1 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -445,6 +445,17 @@ static bool qlt_24xx_atio_pkt_all_vps(struct scsi_qla_host 
*vha,
return false;
 }
 
+int qlt_send_els_resp(srb_t *sp, void *pkt)
+{
+   return 0;
+}
+
+int
+qla_nvmet_ls(srb_t *sp, void *rsp_pkt)
+{
+   return 0;
+}
+
 void qlt_response_pkt_all_vps(struct scsi_qla_host *vha,
struct rsp_que *rsp, response_t *pkt)
 {
-- 
2.12.0



[PATCH v4 0/5] qla2xxx: Add FC-NVMe Target support

2018-10-31 Thread Himanshu Madhani
Hi Martin, 

This series adds support for FC-NVMe Target.

Patch #1 adds infrastructure to support FC-NVMeT Link Service processing. 
Patch #2 adds addes new qla_nvmet.[ch] files for FC-NVMe Target support.
Patch #3 has bulk of changes to add hooks into common code infrastucture and 
 adds support for FC-NVMe Target LS4 processing via Purex path.
Patch #4 adds SysFS hook to enable NVMe Target for the port.

Please apply them to 4.21/scsi-queue at your earliest convenience.

Changes from v3 -> v4
o Rebased Series on current 4.20/scsi-queue 
o Removed NVMET_FCTGTFEAT_{CMD|OPDONE}_IN_ISR as per James Smart's review 
comment. 

Changes from v2 -> v3
o Reordered patches so that each patch compiles individually and is bisectable.

Changes from v1 -> v2
o Addressed all comments from Bart.
o Consolidated Patch 1 and Patch 2 into single patch.
o Fixed smatch warning reported by kbuild autommation.
o NVMe Target mode is exclusive at the moment. Cavium driver does not support 
both
  FCP Target and NVMe Target at the same time. This will be fixed in later 
updates.
 
Thanks,
Himanshu 

Anil Gurumurthy (4):
  qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling
  qla2xxx_nvmet: Add files for FC-NVMe Target support
  qla2xxx_nvmet: Add FC-NVMe Target handling
  qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

Himanshu Madhani (1):
  qla2xxx: Update driver version to 11.00.00.00-k

 drivers/scsi/qla2xxx/Makefile  |   3 +-
 drivers/scsi/qla2xxx/qla_attr.c|  33 ++
 drivers/scsi/qla2xxx/qla_dbg.c |   1 +
 drivers/scsi/qla2xxx/qla_dbg.h |   2 +
 drivers/scsi/qla2xxx/qla_def.h |  35 +-
 drivers/scsi/qla2xxx/qla_fw.h  | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h |  24 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  16 +-
 drivers/scsi/qla2xxx/qla_init.c|  49 +-
 drivers/scsi/qla2xxx/qla_iocb.c|   8 +-
 drivers/scsi/qla2xxx/qla_isr.c | 112 -
 drivers/scsi/qla2xxx/qla_mbx.c | 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h|  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c   | 831 +++
 drivers/scsi/qla2xxx/qla_nvmet.h   | 129 +
 drivers/scsi/qla2xxx/qla_os.c  |  75 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 977 -
 drivers/scsi/qla2xxx/qla_target.h  |  90 
 drivers/scsi/qla2xxx/qla_version.h |   4 +-
 19 files changed, 2711 insertions(+), 75 deletions(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

-- 
2.12.0



[PATCH v4 3/5] qla2xxx_nvmet: Add FC-NVMe Target handling

2018-10-31 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch Adds following code in the driver to
support FC-NVMe Target

- Updated ql2xenablenvme to allow FC-NVMe Target operation
- Added Link Service Request handling for NVMe Target
- Added passthru IOCB for LS4 request
- Added CTIO for sending response to FW
- Added FC4 Registration for FC-NVMe Target
- Added PUREX IOCB support for login processing in FC-NVMe Target mode
- Added Continuation IOCB for PUREX
- Added Session creation with PUREX IOCB in FC-NVMe Target mode
- To enable FC-NVMe Target mode use ql2xnvmeenable=2 while loading driver

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/Makefile |   3 +-
 drivers/scsi/qla2xxx/qla_def.h|  32 +-
 drivers/scsi/qla2xxx/qla_fw.h | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h|  21 +-
 drivers/scsi/qla2xxx/qla_gs.c |  14 +-
 drivers/scsi/qla2xxx/qla_init.c   |  46 +-
 drivers/scsi/qla2xxx/qla_isr.c| 112 -
 drivers/scsi/qla2xxx/qla_mbx.c| 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h   |  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c  |  36 ++
 drivers/scsi/qla2xxx/qla_os.c |  75 ++-
 drivers/scsi/qla2xxx/qla_target.c | 988 --
 drivers/scsi/qla2xxx/qla_target.h |  90 
 13 files changed, 1731 insertions(+), 83 deletions(-)

diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile
index 17d5bc1cc56b..ec924733c10e 100644
--- a/drivers/scsi/qla2xxx/Makefile
+++ b/drivers/scsi/qla2xxx/Makefile
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
-   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o
+   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o \
+   qla_nvmet.o
 
 obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
 obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index a37a4d2261e2..9e2e2d9ddb30 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -480,6 +480,10 @@ struct srb_iocb {
uint32_t dl;
uint32_t timeout_sec;
struct  list_head   entry;
+   uint32_t exchange_address;
+   uint16_t nport_handle;
+   uint8_t vp_index;
+   void *cmd;
} nvme;
struct {
u16 cmd;
@@ -490,7 +494,11 @@ struct srb_iocb {
struct timer_list timer;
void (*timeout)(void *);
 };
-
+struct srb_nvme_els_rsp {
+   dma_addr_t dma_addr;
+   void *dma_ptr;
+   void *ptr;
+};
 /* Values for srb_ctx type */
 #define SRB_LOGIN_CMD  1
 #define SRB_LOGOUT_CMD 2
@@ -518,6 +526,8 @@ struct srb_iocb {
 #define SRB_NVME_ELS_RSP 24
 #define SRB_NVMET_LS   25
 #define SRB_NVMET_FCP  26
+#define SRB_NVMET_ABTS 27
+#define SRB_NVMET_SEND_ABTS28
 
 enum {
TYPE_SRB,
@@ -548,10 +558,13 @@ typedef struct srb {
int rc;
int retry_count;
struct completion comp;
+   struct work_struct nvmet_comp_work;
+   uint16_t comp_status;
union {
struct srb_iocb iocb_cmd;
struct bsg_job *bsg_job;
struct srb_cmd scmd;
+   struct srb_nvme_els_rsp snvme_els;
} u;
void (*done)(void *, int);
void (*free)(void *);
@@ -2276,6 +2289,15 @@ struct qlt_plogi_ack_t {
void*fcport;
 };
 
+/* NVMET */
+struct qlt_purex_plogi_ack_t {
+   struct list_headlist;
+   struct __fc_plogi rcvd_plogi;
+   port_id_t   id;
+   int ref_count;
+   void*fcport;
+};
+
 struct ct_sns_desc {
struct ct_sns_pkt   *ct_sns;
dma_addr_t  ct_sns_dma;
@@ -3238,6 +3260,7 @@ enum qla_work_type {
QLA_EVT_SP_RETRY,
QLA_EVT_IIDMA,
QLA_EVT_ELS_PLOGI,
+   QLA_EVT_NEW_NVMET_SESS,
 };
 
 
@@ -4232,6 +4255,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvmet_enabled:1;
} flags;
 
atomic_tloop_state;
@@ -4277,6 +4301,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define NVMET_PUREX33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4317,6 +4342,7 @@ typedef struct scsi_qla_host {
uint8_t fabric_node_name[WWN_SIZE];
 
struct

[PATCH v3 5/5] qla2xxx: Update driver version to 11.00.00.00-k

2018-09-28 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 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 12bafff71a1a..0d58aa629c08 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.11-k"
+#define QLA2XXX_VERSION  "11.00.00.00-k"
 
-#define QLA_DRIVER_MAJOR_VER   10
+#define QLA_DRIVER_MAJOR_VER   11
 #define QLA_DRIVER_MINOR_VER   0
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v3 3/5] qla2xxx_nvmet: Add FC-NVMe Target handling

2018-09-28 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch Adds following code in the driver to
support FC-NVMe Target

- Updated ql2xenablenvme to allow FC-NVMe Target operation
- Added Link Service Request handling for NVMe Target
- Added passthru IOCB for LS4 request
- Added CTIO for sending response to FW
- Added FC4 Registration for FC-NVMe Target
- Added PUREX IOCB support for login processing in FC-NVMe Target mode
- Added Continuation IOCB for PUREX
- Added Session creation with PUREX IOCB in FC-NVMe Target mode
- To enable FC-NVMe Target mode use ql2xnvmeenable=2 while loading driver

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/Makefile |   3 +-
 drivers/scsi/qla2xxx/qla_def.h|  32 +-
 drivers/scsi/qla2xxx/qla_fw.h | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h|  21 +-
 drivers/scsi/qla2xxx/qla_gs.c |  14 +-
 drivers/scsi/qla2xxx/qla_init.c   |  46 +-
 drivers/scsi/qla2xxx/qla_isr.c| 112 -
 drivers/scsi/qla2xxx/qla_mbx.c| 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h   |  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c  |  36 ++
 drivers/scsi/qla2xxx/qla_os.c |  75 ++-
 drivers/scsi/qla2xxx/qla_target.c | 988 --
 drivers/scsi/qla2xxx/qla_target.h |  90 
 13 files changed, 1731 insertions(+), 83 deletions(-)

diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile
index 17d5bc1cc56b..ec924733c10e 100644
--- a/drivers/scsi/qla2xxx/Makefile
+++ b/drivers/scsi/qla2xxx/Makefile
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
-   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o
+   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o \
+   qla_nvmet.o
 
 obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
 obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index a37a4d2261e2..9e2e2d9ddb30 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -480,6 +480,10 @@ struct srb_iocb {
uint32_t dl;
uint32_t timeout_sec;
struct  list_head   entry;
+   uint32_t exchange_address;
+   uint16_t nport_handle;
+   uint8_t vp_index;
+   void *cmd;
} nvme;
struct {
u16 cmd;
@@ -490,7 +494,11 @@ struct srb_iocb {
struct timer_list timer;
void (*timeout)(void *);
 };
-
+struct srb_nvme_els_rsp {
+   dma_addr_t dma_addr;
+   void *dma_ptr;
+   void *ptr;
+};
 /* Values for srb_ctx type */
 #define SRB_LOGIN_CMD  1
 #define SRB_LOGOUT_CMD 2
@@ -518,6 +526,8 @@ struct srb_iocb {
 #define SRB_NVME_ELS_RSP 24
 #define SRB_NVMET_LS   25
 #define SRB_NVMET_FCP  26
+#define SRB_NVMET_ABTS 27
+#define SRB_NVMET_SEND_ABTS28
 
 enum {
TYPE_SRB,
@@ -548,10 +558,13 @@ typedef struct srb {
int rc;
int retry_count;
struct completion comp;
+   struct work_struct nvmet_comp_work;
+   uint16_t comp_status;
union {
struct srb_iocb iocb_cmd;
struct bsg_job *bsg_job;
struct srb_cmd scmd;
+   struct srb_nvme_els_rsp snvme_els;
} u;
void (*done)(void *, int);
void (*free)(void *);
@@ -2276,6 +2289,15 @@ struct qlt_plogi_ack_t {
void*fcport;
 };
 
+/* NVMET */
+struct qlt_purex_plogi_ack_t {
+   struct list_headlist;
+   struct __fc_plogi rcvd_plogi;
+   port_id_t   id;
+   int ref_count;
+   void*fcport;
+};
+
 struct ct_sns_desc {
struct ct_sns_pkt   *ct_sns;
dma_addr_t  ct_sns_dma;
@@ -3238,6 +3260,7 @@ enum qla_work_type {
QLA_EVT_SP_RETRY,
QLA_EVT_IIDMA,
QLA_EVT_ELS_PLOGI,
+   QLA_EVT_NEW_NVMET_SESS,
 };
 
 
@@ -4232,6 +4255,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvmet_enabled:1;
} flags;
 
atomic_tloop_state;
@@ -4277,6 +4301,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define NVMET_PUREX33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4317,6 +4342,7 @@ typedef struct scsi_qla_host {
uint8_t fabric_node_name[WWN_SIZE];
 
struct

[PATCH v3 4/5] qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

2018-09-28 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node for NVMe Target configuration

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 33 +
 drivers/scsi/qla2xxx/qla_gs.c   |  2 +-
 drivers/scsi/qla2xxx/qla_init.c |  3 ++-
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index a31d23905753..0d2d4f33701b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -13,6 +13,7 @@
 #include 
 
 static int qla24xx_vport_disable(struct fc_vport *, bool);
+extern void qlt_set_mode(struct scsi_qla_host *vha);
 
 /* SYSFS attributes - 
*/
 
@@ -631,6 +632,37 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_write_nvmet(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr,
+   char *buf, loff_t off, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+   struct device, kobj)));
+   struct qla_hw_data *ha = vha->hw;
+   scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+   ql_log(ql_log_info, vha, 0x706e,
+   "Bringing up target mode!! vha:%p\n", vha);
+   qlt_op_target_mode = 1;
+   qlt_set_mode(base_vha);
+   set_bit(ISP_ABORT_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   qla2x00_wait_for_hba_online(vha);
+
+   return count;
+}
+
+static struct bin_attribute sysfs_nvmet_attr = {
+   .attr = {
+   .name = "nvmet",
+   .mode = 0200,
+   },
+   .size = 0,
+   .write = qla2x00_sysfs_write_nvmet,
+};
+
+
+static ssize_t
 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -943,6 +975,7 @@ static struct sysfs_entry {
{ "issue_logo", _issue_logo_attr, },
{ "xgmac_stats", _xgmac_stats_attr, 3 },
{ "dcbx_tlv", _dcbx_tlv_attr, 3 },
+   { "nvmet", _nvmet_attr, },
{ NULL },
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index ea55ed972eed..cfc6818952a0 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -698,7 +698,7 @@ qla2x00_rff_id(scsi_qla_host_t *vha, u8 type)
return (QLA_SUCCESS);
 
return qla_async_rffid(vha, >d_id, qlt_rff_id(vha),
-   FC4_TYPE_FCP_SCSI);
+   type);
 }
 
 static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cad8e0185a3b..fe1c1892386a 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5526,7 +5526,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
 * will be newer than discovery_gen. */
qlt_do_generation_tick(vha, _gen);
 
-   if (USE_ASYNC_SCAN(ha)) {
+   if (USE_ASYNC_SCAN(ha) && !(vha->flags.nvmet_enabled)) {
+   /* If NVME target mode is enabled, go through regular scan */
rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
NULL);
if (rval)
-- 
2.12.0



[PATCH v3 2/5] qla2xxx_nvmet: Add files for FC-NVMe Target support

2018-09-28 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds files to enable NVMe Target Support

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvmet.c | 797 +++
 drivers/scsi/qla2xxx/qla_nvmet.h | 129 +++
 2 files changed, 926 insertions(+)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
new file mode 100644
index ..9d9a0ed68501
--- /dev/null
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -0,0 +1,797 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2017 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "qla_nvme.h"
+#include "qla_nvmet.h"
+
+static void qla_nvmet_send_resp_ctio(struct qla_qpair *qpair,
+   struct qla_nvmet_cmd *cmd, struct nvmefc_tgt_fcp_req *rsp);
+static void qla_nvmet_send_abts_ctio(struct scsi_qla_host *vha,
+   struct abts_recv_from_24xx *abts, bool flag);
+
+/*
+ * qla_nvmet_targetport_delete -
+ * Invoked by the nvmet to indicate that the target port has
+ * been deleted
+ */
+static void
+qla_nvmet_targetport_delete(struct nvmet_fc_target_port *targetport)
+{
+   struct qla_nvmet_tgtport *tport = targetport->private;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   complete(>tport_del);
+}
+
+/*
+ * qlt_nvmet_ls_done -
+ * Invoked by the firmware interface to indicate the completion
+ * of an LS cmd
+ * Free all associated resources of the LS cmd
+ */
+static void qlt_nvmet_ls_done(void *ptr, int res)
+{
+   struct srb *sp = ptr;
+   struct srb_iocb   *nvme = >u.iocb_cmd;
+   struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc;
+   struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   ql_dbg(ql_dbg_nvme, sp->vha, 0x11001,
+   "%s: sp %p vha %p, rsp %p, cmd %p\n", __func__,
+   sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd);
+
+   rsp->done(rsp);
+
+   /* Free tgt_cmd */
+   kfree(tgt_cmd->buf);
+   kfree(tgt_cmd);
+   qla2x00_rel_sp(sp);
+}
+
+/*
+ * qla_nvmet_ls_rsp -
+ * Invoked by the nvme-t to complete the LS req.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_ls_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+   struct srb_iocb   *nvme;
+   int rval = QLA_FUNCTION_FAILED;
+   srb_t *sp;
+
+   ql_dbg(ql_dbg_nvme + ql_dbg_buffer, vha, 0x11002,
+   "Dumping the NVMET-LS response buffer\n");
+   ql_dump_buffer(ql_dbg_nvme + ql_dbg_buffer, vha, 0x2075,
+   (uint8_t *)rsp->rspbuf, rsp->rsplen);
+
+   /* Alloc SRB structure */
+   sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC);
+   if (!sp) {
+   ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n");
+   return -ENOMEM;
+   }
+
+   sp->type = SRB_NVMET_LS;
+   sp->done = qlt_nvmet_ls_done;
+   sp->vha = vha;
+   sp->fcport = tgt_cmd->fcport;
+
+   nvme = >u.iocb_cmd;
+   nvme->u.nvme.rsp_dma = rsp->rspdma;
+   nvme->u.nvme.rsp_len = rsp->rsplen;
+   nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address;
+   nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle;
+   nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index;
+
+   nvme->u.nvme.cmd = tgt_cmd; /* To be freed */
+   nvme->u.nvme.desc = rsp; /* Call back to nvmet */
+
+   rval = qla2x00_start_sp(sp);
+   if (rval != QLA_SUCCESS) {
+   ql_log(ql_log_warn, vha, 0x11004,
+   "qla2x00_start_sp failed = %d\n", rval);
+   return rval;
+   }
+
+   return 0;
+}
+
+/*
+ * qla_nvmet_fcp_op -
+ * Invoked by the nvme-t to complete the IO.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_fcp_op(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_fcp_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.fcp_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return 0;
+
+   /* Prepare and send CTIO 82h */
+   qla_nvmet_send_resp_ctio(vha->qpair, tgt_cmd, rsp);
+
+   return

[PATCH v3 0/5] qla2xxx: Add FC-NVMe Target support

2018-09-28 Thread Himanshu Madhani
Hi Martin, 

This series adds support for FC-NVMe Target.

Patch #1 adds infrastructure to support FC-NVMeT Link Service processing. 
Patch #2 adds addes new qla_nvmet.[ch] files for FC-NVMe Target support.
Patch #3 has bulk of changes to add hooks into common code infrastucture and 
 adds support for FC-NVMe Target LS4 processing via Purex path.
Patch #4 adds SysFS hook to enable NVMe Target for the port.

Please apply them to 4.20/scsi-queue at your earliest convenience.

Changes from v2 -> v3
o Reordered patches so that each patch compiles individually and is bisectable.

Changes from v1 -> v2
o Addressed all comments from Bart.
o Consolidated Patch 1 and Patch 2 into single patch.
o Fixed smatch warning reported by kbuild autommation.
o NVMe Target mode is exclusive at the moment. Cavium driver does not support 
both
  FCP Target and NVMe Target at the same time. This will be fixed in later 
updates.
 
Thanks,
Himanshu 

Anil Gurumurthy (4):
  qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling
  qla2xxx_nvmet: Add files for FC-NVMe Target support
  qla2xxx_nvmet: Add FC-NVMe Target handling
  qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

Himanshu Madhani (1):
  qla2xxx: Update driver version to 11.00.00.00-k

 drivers/scsi/qla2xxx/Makefile  |   3 +-
 drivers/scsi/qla2xxx/qla_attr.c|  33 ++
 drivers/scsi/qla2xxx/qla_dbg.c |   1 +
 drivers/scsi/qla2xxx/qla_dbg.h |   2 +
 drivers/scsi/qla2xxx/qla_def.h |  35 +-
 drivers/scsi/qla2xxx/qla_fw.h  | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h |  24 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  16 +-
 drivers/scsi/qla2xxx/qla_init.c|  49 +-
 drivers/scsi/qla2xxx/qla_iocb.c|   8 +-
 drivers/scsi/qla2xxx/qla_isr.c | 112 -
 drivers/scsi/qla2xxx/qla_mbx.c | 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h|  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c   | 833 +++
 drivers/scsi/qla2xxx/qla_nvmet.h   | 129 +
 drivers/scsi/qla2xxx/qla_os.c  |  75 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 977 -
 drivers/scsi/qla2xxx/qla_target.h  |  90 
 drivers/scsi/qla2xxx/qla_version.h |   4 +-
 19 files changed, 2713 insertions(+), 75 deletions(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

-- 
2.12.0



[PATCH v3 1/5] qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling

2018-09-28 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch provides link service pass through feature handling
in the driver. This feature is implemented mainly by the firmware
and the same implementation is handled in the driver via an
IOCB interface.

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c|  1 +
 drivers/scsi/qla2xxx/qla_dbg.h|  2 ++
 drivers/scsi/qla2xxx/qla_def.h|  3 +++
 drivers/scsi/qla2xxx/qla_gbl.h|  7 +++
 drivers/scsi/qla2xxx/qla_iocb.c   |  8 +++-
 drivers/scsi/qla2xxx/qla_target.c | 11 +++
 6 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ed9c228f7d11 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -67,6 +67,7 @@
  * | Target Mode Management  |   0xf09b   | 0xf002 |
  * |  || 0xf046-0xf049  |
  * | Target Mode Task Management  |  0x1000d  ||
+ * | NVME|   0x11000  ||
  * --
  */
 
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 8877aa97d829..4ad97923e40b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char 
*fmt, ...);
 #define ql_dbg_tgt_tmr 0x1000 /* Target mode task management */
 #define ql_dbg_tgt_dif  0x0800 /* Target mode dif */
 
+#define ql_dbg_nvme 0x0400 /* NVME Target */
+
 extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
 extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 26b93c563f92..a37a4d2261e2 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -515,6 +515,9 @@ struct srb_iocb {
 #define SRB_PRLI_CMD   21
 #define SRB_CTRL_VP22
 #define SRB_PRLO_CMD   23
+#define SRB_NVME_ELS_RSP 24
+#define SRB_NVMET_LS   25
+#define SRB_NVMET_FCP  26
 
 enum {
TYPE_SRB,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 3673fcdb033a..2946c65812cd 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -119,6 +119,13 @@ void qla_do_iidma_work(struct scsi_qla_host *vha, 
fc_port_t *fcport);
 int qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *);
 void qla_rscn_replay(fc_port_t *fcport);
 
+
+/*
+ * Used by FC-NVMe Target
+ */
+int qla_nvmet_ls(srb_t *sp, void *rsp_pkt);
+int qlt_send_els_resp(srb_t *sp, void *pkt);
+
 /*
  * Global Data in qla_os.c source file.
  */
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 4de910231ba6..19f8eb46f128 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
 
-   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3493,6 +3493,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+   case SRB_NVMET_LS:
+   qla_nvmet_ls(sp, pkt);
+   break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3518,6 +3521,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+   case SRB_NVME_ELS_RSP:
+   qlt_send_els_resp(sp, pkt);
+   break;
default:
break;
}
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 3015f1bbcf1a..dc680ffe2f49 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -445,6 +445,17 @@ static bool qlt_24xx_atio_pkt_all_vps(struct scsi_qla_host 
*vha,
return false;
 }
 
+int qlt_send_els_resp(srb_t *sp, void *pkt)
+{
+   return 0;
+}
+
+int
+qla_nvmet_ls(srb_t *sp, void *rsp_pkt)
+{
+   return 0;
+}
+
 void qlt_response_pkt_all_vps(struct scsi_qla_host *vha,
struct rsp_que *rsp, response_t *pkt)
 {
-- 
2.12.0



[PATCH] qla2xxx: Return switch command on a timeout

2018-09-28 Thread Himanshu Madhani
This patch fixes commit bcc71cc3cde1468958a3ea859276d8d1a1a68265
which misplaced code in worng routines.

Also updated the use of WARN_ON() to WARN_ON_ONCE() to prevent flooding
log messages.

Fixes: bcc71cc3cde1 ("scsi: qla2xxx: Fix for double free of SRB structure")
Signed-off-by: Himanshu Madhani 
---
Hi Martin,

I noticed patch got applied incorrectly on the tree, So sending this correction
patch to fix it. 

Please apply to 4.20/scsi-queue at your earliest convenience. 

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_init.c | 11 +--
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index ea7951eb05ce..c72d8012fe2a 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -54,7 +54,7 @@ qla2x00_sp_timeout(struct timer_list *t)
unsigned long flags;
struct qla_hw_data *ha = sp->vha->hw;
 
-   WARN_ON(irqs_disabled());
+   WARN_ON_ONCE(irqs_disabled());
spin_lock_irqsave(>hardware_lock, flags);
req = sp->qpair->req;
req->outstanding_cmds[sp->handle] = NULL;
@@ -792,6 +792,9 @@ qla24xx_async_gnl_sp_done(void *s, 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(, 0, sizeof(ea));
ea.sp = sp;
@@ -974,17 +977,13 @@ void qla24xx_async_gpdb_sp_done(void *s, int res)
"Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n",
sp->name, res, fcport->port_name, mb[1], mb[2]);
 
-   fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
-
-   if (res == QLA_FUNCTION_TIMEOUT)
-   return;
-
if (res == QLA_FUNCTION_TIMEOUT) {
dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in,
sp->u.iocb_cmd.u.mbx.in_dma);
return;
}
 
+   fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
memset(, 0, sizeof(ea));
ea.event = FCME_GPDB_DONE;
ea.fcport = fcport;
-- 
2.19.0.rc0



[PATCH 4/8] qla2xxx: Fix re-using LoopID when handle is in use

2018-09-26 Thread Himanshu Madhani
From: Quinn Tran 

This patch fixes issue where driver clears Nport ID map
instead of marking handle in use. Once driver clears
NPort ID from the database, it can reuse same NPort ID
resulting in a PLOGI failure.

Fixes: a084fd68e1d2 ("scsi: qla2xxx: Fix re-login for Nport Handle in use")
Cc: 
Signed-of-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c   | 18 --
 drivers/scsi/qla2xxx/qla_target.c |  3 ++-
 2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index b934977c5c26..dbeb85f161e3 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1952,25 +1952,15 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host 
*vha, struct event_arg *ea)
cid.b.rsvd_1 = 0;
 
ql_dbg(ql_dbg_disc, vha, 0x20ec,
-   "%s %d %8phC LoopID 0x%x in use post gnl\n",
+   "%s %d %8phC lid %#x in use with pid %06x post gnl\n",
__func__, __LINE__, ea->fcport->port_name,
-   ea->fcport->loop_id);
+   ea->fcport->loop_id, cid.b24);
 
-   if (IS_SW_RESV_ADDR(cid)) {
-   set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
-   ea->fcport->loop_id = FC_NO_LOOP_ID;
-   } else {
-   qla2x00_clear_loop_id(ea->fcport);
-   }
+   set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
+   ea->fcport->loop_id = FC_NO_LOOP_ID;
qla24xx_post_gnl_work(vha, ea->fcport);
break;
case MBS_PORT_ID_USED:
-   ql_dbg(ql_dbg_disc, vha, 0x20ed,
-   "%s %d %8phC NPortId %02x%02x%02x inuse post gidpn\n",
-   __func__, __LINE__, ea->fcport->port_name,
-   ea->fcport->d_id.b.domain, ea->fcport->d_id.b.area,
-   ea->fcport->d_id.b.al_pa);
-
lid = ea->iop[1] & 0x;
qlt_find_sess_invalidate_other(vha,
wwn_to_u64(ea->fcport->port_name),
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 8c811b251d42..d2888b30a8a3 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1261,7 +1261,8 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
qla24xx_chk_fcp_state(sess);
 
ql_dbg(ql_dbg_tgt, sess->vha, 0xe001,
-   "Scheduling sess %p for deletion\n", sess);
+   "Scheduling sess %p for deletion %8phC\n",
+   sess, sess->port_name);
 
INIT_WORK(>del_work, qla24xx_delete_sess_fn);
WARN_ON(!queue_work(sess->vha->hw->wq, >del_work));
-- 
2.12.0



[PATCH 0/8] qla2xxx: Bug fixes for the driver

2018-09-26 Thread Himanshu Madhani
Hi Martin, 

This series fixes issues found during out last test cycle. 

Patch 1,2 and 5 fixes misc NVMe discovery and unload hang in the driver. 

Patch 3 fixes issue discovered during BFS test setup resulting into
installation failure and hand because driver could not discover BFS Luns.

Patch 4 fixes case where driver was not clearing up Loop ID resulting into
PLOGI failure.

Patch 6 was corner case which could lead to recursive mailbox timeout.

Patch 7 and 8 are fixes for SRB double free. 

These patches were made against 4.19/fixes branch. Please consider this
for next rc inclusion. 

Thanks,
Himanshu
 

Giridhar Malavali (2):
  qla2xxx: Fix for double free of SRB structure used in Async switch
query commands
  qla2xxx: Move log messages before issuing command to firmware

Himanshu Madhani (1):
  qla2xxx: Fix driver hang when FC-NVMe LUNs are configured

Quinn Tran (5):
  qla2xxx: fix nvme session hang on unload
  qla2xxx: Fix NVMe Target discovery
  qla2xxx: Fix duplicate switch database entries
  qla2xxx: Fix re-using LoopID when handle is in use
  qla2xxx: Fix recursive mailbox timeout

 drivers/scsi/qla2xxx/qla_gs.c | 24 +++-
 drivers/scsi/qla2xxx/qla_init.c   | 81 ---
 drivers/scsi/qla2xxx/qla_mbx.c|  2 +-
 drivers/scsi/qla2xxx/qla_nvme.c   |  5 +--
 drivers/scsi/qla2xxx/qla_os.c |  4 +-
 drivers/scsi/qla2xxx/qla_target.c |  3 +-
 6 files changed, 62 insertions(+), 57 deletions(-)

-- 
2.12.0



[PATCH 1/8] qla2xxx: fix nvme session hang on unload

2018-09-26 Thread Himanshu Madhani
From: Quinn Tran 

Send aborts only when chip is active.

Fixes: 623ee824e579 ("scsi: qla2xxx: Fix FC-NVMe IO abort during driver reset")
Cc:  # 4.14
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 20d9dc39f0fb..8dc7a5c64800 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -607,7 +607,7 @@ void qla_nvme_abort(struct qla_hw_data *ha, struct srb *sp, 
int res)
 {
int rval;
 
-   if (!test_bit(ABORT_ISP_ACTIVE, >vha->dpc_flags)) {
+   if (ha->flags.fw_started) {
rval = ha->isp_ops->abort_command(sp);
if (!rval && !qla_nvme_wait_on_command(sp))
ql_log(ql_log_warn, NULL, 0x2112,
-- 
2.12.0



[PATCH 7/8] qla2xxx: Fix for double free of SRB structure used in Async switch query commands

2018-09-26 Thread Himanshu Madhani
From: Giridhar Malavali 

This patch fixes issue during switch command query where driver was
freeing SRB resources multiple times

Following stack trace will be seen
[  853.436234] BUG: unable to handle kernel NULL pointer dereference at
0001
[  853.436348] IP: [] kmem_cache_alloc+0x74/0x1e0
[  853.436476] PGD 0
[  853.436601] Oops:  [#1] SMP

[  853.454700]  [] ? mod_timer+0x14a/0x220
[  853.455543]  [] mempool_alloc_slab+0x15/0x20
[  853.456395]  [] mempool_alloc+0x69/0x170
[  853.457257]  [] ? internal_add_timer+0x32/0x70
[  853.458136]  [] qla2xxx_queuecommand+0x29b/0x3f0 [qla2xxx]
[  853.459024]  [] scsi_dispatch_cmd+0xaa/0x230
[  853.459923]  [] scsi_request_fn+0x4df/0x680
[  853.460829]  [] ? __switch_to+0xd7/0x510
[  853.461747]  [] __blk_run_queue+0x33/0x40
[  853.462670]  [] blk_delay_work+0x25/0x40
[  853.463603]  [] process_one_work+0x17a/0x440
[  853.464546]  [] worker_thread+0x126/0x3c0
[  853.465501]  [] ? manage_workers.isra.24+0x2a0/0x2a0
[  853.466447]  [] kthread+0xcf/0xe0
[  853.467379]  [] ? insert_kthread_work+0x40/0x40
[  853.470172] Code: db e2 7e 49 8b 50 08 4d 8b 20 49 8b 40 10 4d 85 e4 0f 84 20
01 00 00 48 85 c0 0f 84 17 01 00 00 49 63 46 20 48 8d 4a 01 4d 8b 06 <49> 8b 1c
04 4c 89 e0 65 49 0f c7 08 0f 94 c0 84 c0 74 ba 49 63
[  853.472072] RIP  [] kmem_cache_alloc+0x74/0x1e0
[  853.472971]  RSP 

Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
Cc: 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c   |  3 +++
 drivers/scsi/qla2xxx/qla_init.c | 15 +--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index e22c038e47a8..de3f2a097451 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3261,6 +3261,9 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
"Async done-%s res %x, WWPN %8phC \n",
sp->name, res, fcport->port_name);
 
+   if (res == QLA_FUNCTION_TIMEOUT)
+   return;
+
if (res == (DID_ERROR << 16)) {
/* entry status error */
goto done;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index dbeb85f161e3..afb6cd7b6800 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -52,12 +52,14 @@ qla2x00_sp_timeout(struct timer_list *t)
struct srb_iocb *iocb;
struct req_que *req;
unsigned long flags;
+   struct qla_hw_data *ha = sp->vha->hw;
 
-   spin_lock_irqsave(sp->qpair->qp_lock_ptr, flags);
+   WARN_ON(irqs_disabled());
+   spin_lock_irqsave(>hardware_lock, flags);
req = sp->qpair->req;
req->outstanding_cmds[sp->handle] = NULL;
iocb = >u.iocb_cmd;
-   spin_unlock_irqrestore(sp->qpair->qp_lock_ptr, flags);
+   spin_unlock_irqrestore(>hardware_lock, flags);
iocb->timeout(sp);
 }
 
@@ -787,6 +789,9 @@ qla24xx_async_gnl_sp_done(void *s, 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;
+
memset(, 0, sizeof(ea));
ea.sp = sp;
ea.rc = res;
@@ -972,6 +977,12 @@ void qla24xx_async_gpdb_sp_done(void *s, int res)
 
fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 
+   if (res == QLA_FUNCTION_TIMEOUT) {
+   dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in,
+   sp->u.iocb_cmd.u.mbx.in_dma);
+   return;
+   }
+
memset(, 0, sizeof(ea));
ea.event = FCME_GPDB_DONE;
ea.fcport = fcport;
-- 
2.12.0



[PATCH 5/8] qla2xxx: Fix driver hang when FC-NVMe LUNs are configured

2018-09-26 Thread Himanshu Madhani
This patch fixes multiple call for qla_nvme_unregister_remote_port()
as part of qlt_schedule_session_for_deletion(), Do not call it again
during qla_nvme_delete()

Fixes: e473b3074104 ("scsi: qla2xxx: Add FC-NVMe abort processing")
Cc: 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 8dc7a5c64800..e6545cb9a2c1 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -660,9 +660,6 @@ void qla_nvme_delete(struct scsi_qla_host *vha)
__func__, fcport);
 
nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
-   init_completion(>nvme_del_done);
-   nvme_fc_unregister_remoteport(fcport->nvme_remote_port);
-   wait_for_completion(>nvme_del_done);
}
 
if (vha->nvme_local_port) {
-- 
2.12.0



[PATCH 3/8] qla2xxx: Fix duplicate switch database entries

2018-09-26 Thread Himanshu Madhani
From: Quinn Tran 

The response data buffer used in switch scan is reused 4 times.
(For example, for commands  GPN_FT, GNN_FT for FCP and FC-NVME)
Before driver reuses this buffer, clear it to prevent duplicate
entries in our database.

Fixes: a4239945b8ad1 ("scsi: qla2xxx: Add switch command to simplify fabric 
discovery"
Cc: 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index a0038d879b9d..e22c038e47a8 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -,9 +,9 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 
fc4_type, srb_t *sp)
sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
 
-   rspsz = sizeof(struct ct_sns_gpnft_rsp) +
-   ((vha->hw->max_fibre_devices - 1) *
-   sizeof(struct ct_sns_gpn_ft_data));
+   rspsz = sp->u.iocb_cmd.u.ctarg.rsp_size;
+   memset(sp->u.iocb_cmd.u.ctarg.rsp, 0, sp->u.iocb_cmd.u.ctarg.rsp_size);
+   memset(sp->u.iocb_cmd.u.ctarg.req, 0, sp->u.iocb_cmd.u.ctarg.req_size);
 
ct_sns = (struct ct_sns_pkt *)sp->u.iocb_cmd.u.ctarg.req;
/* CT_IU preamble  */
-- 
2.12.0



[PATCH 2/8] qla2xxx: Fix NVMe Target discovery

2018-09-26 Thread Himanshu Madhani
From: Quinn Tran 

This patch fixes issue when remoteport registers itself as
both FCP and FC-NVMe with the switch, driver will pick FC-NVMe
personality as default when scanning for targets.

Driver was using comaprative operator instead of bitwise operator
to check for fc4_type for both FCP and FC-NVME.

Fixes: 2b5b96473efc ("scsi: qla2xxx: Fix FC-NVMe LUN discovery")
Cc: 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_os.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 42b8f0d3e580..ae9fd2d01004 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -4808,10 +4808,10 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, 
struct qla_work_evt *e)
fcport->d_id = e->u.new_sess.id;
fcport->flags |= FCF_FABRIC_DEVICE;
fcport->fw_login_state = DSC_LS_PLOGI_PEND;
-   if (e->u.new_sess.fc4_type == FS_FC4TYPE_FCP)
+   if (e->u.new_sess.fc4_type & FS_FC4TYPE_FCP)
fcport->fc4_type = FC4_TYPE_FCP_SCSI;
 
-   if (e->u.new_sess.fc4_type == FS_FC4TYPE_NVME) {
+   if (e->u.new_sess.fc4_type & FS_FC4TYPE_NVME) {
fcport->fc4_type = FC4_TYPE_OTHER;
fcport->fc4f_nvme = FC4_TYPE_NVME;
}
-- 
2.12.0



[PATCH 6/8] qla2xxx: Fix recursive mailbox timeout

2018-09-26 Thread Himanshu Madhani
From: Quinn Tran 

This patch prevents user space mailbox request from doing
chip reset if the mailbox timed out. The chip reset is
only reserved for the DPC thread to ensure all mailbox
requests are flushed properly. The DPC thread is responsible
for the flushing all MBs and chip reset.

Fixes: b2000805a975 ("scsi: qla2xxx: Flush mailbox commands on chip reset")
Cc: 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_mbx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 2c6c2cd5a0d0..596a9b214df1 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -493,7 +493,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t 
*mcp)
set_bit(ISP_ABORT_NEEDED, >dpc_flags);
qla2xxx_wake_dpc(vha);
}
-   } else if (!abort_active) {
+   } else if (current == ha->dpc_thread) {
/* call abort directly since we are in the DPC thread */
ql_dbg(ql_dbg_mbx, vha, 0x101d,
"Timeout, calling abort_isp.\n");
-- 
2.12.0



[PATCH v2 5/5] qla2xxx: Update driver version to 11.00.00.00-k

2018-09-26 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 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 12bafff71a1a..0d58aa629c08 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.11-k"
+#define QLA2XXX_VERSION  "11.00.00.00-k"
 
-#define QLA_DRIVER_MAJOR_VER   10
+#define QLA_DRIVER_MAJOR_VER   11
 #define QLA_DRIVER_MINOR_VER   0
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v2 2/5] qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling

2018-09-26 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch provides link service pass through feature handling
in the driver. This feature is implemented mainly by the firmware
and the same implementation is handled in the driver via an
IOCB interface.

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c  |  1 +
 drivers/scsi/qla2xxx/qla_dbg.h  |  2 ++
 drivers/scsi/qla2xxx/qla_iocb.c | 42 -
 3 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ed9c228f7d11 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -67,6 +67,7 @@
  * | Target Mode Management  |   0xf09b   | 0xf002 |
  * |  || 0xf046-0xf049  |
  * | Target Mode Task Management  |  0x1000d  ||
+ * | NVME|   0x11000  ||
  * --
  */
 
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 8877aa97d829..4ad97923e40b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char 
*fmt, ...);
 #define ql_dbg_tgt_tmr 0x1000 /* Target mode task management */
 #define ql_dbg_tgt_dif  0x0800 /* Target mode dif */
 
+#define ql_dbg_nvme 0x0400 /* NVME Target */
+
 extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
 extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 4de910231ba6..cce32362cf21 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
 
-   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3433,6 +3433,40 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
logio->vp_index = sp->fcport->vha->vp_idx;
 }
 
+/*
+ * Build NVMET LS response
+ */
+static int
+qla_nvmet_ls(srb_t *sp, struct pt_ls4_request *rsp_pkt)
+{
+   struct srb_iocb *nvme;
+   int rval = QLA_SUCCESS;
+
+   nvme = >u.iocb_cmd;
+
+   rsp_pkt->entry_type = PT_LS4_REQUEST;
+   rsp_pkt->entry_count = 1;
+   rsp_pkt->control_flags = cpu_to_le16(CF_LS4_RESPONDER << CF_LS4_SHIFT);
+   rsp_pkt->handle = sp->handle;
+
+   rsp_pkt->nport_handle = sp->fcport->loop_id;
+   rsp_pkt->vp_index = nvme->u.nvme.vp_index;
+   rsp_pkt->exchange_address = cpu_to_le32(nvme->u.nvme.exchange_address);
+
+   rsp_pkt->tx_dseg_count = 1;
+   rsp_pkt->tx_byte_count = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_len = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_address[0] = cpu_to_le32(LSD(nvme->u.nvme.rsp_dma));
+   rsp_pkt->dseg0_address[1] = cpu_to_le32(MSD(nvme->u.nvme.rsp_dma));
+
+   ql_log(ql_log_info, sp->vha, 0x,
+   "Dumping the NVME-LS response IOCB\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, sp->vha, 0x2075,
+   (uint8_t *)rsp_pkt, sizeof(*rsp_pkt));
+
+   return rval;
+}
+
 int
 qla2x00_start_sp(srb_t *sp)
 {
@@ -3493,6 +3527,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+   case SRB_NVMET_LS:
+   qla_nvmet_ls(sp, pkt);
+   break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3518,6 +3555,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+   case SRB_NVME_ELS_RSP:
+   qlt_send_els_resp(sp, pkt);
+   break;
default:
break;
}
-- 
2.12.0



[PATCH v2 3/5] qla2xxx_nvmet: Add FC-NVMe Target handling

2018-09-26 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch Adds following code in the driver to
support FC-NVMe Target

- Updated ql2xenablenvme to allow FC-NVMe Target operation
- Added Link Serviccce Request handling for NVMe Target
- Added passthru IOCB for LS4 request
- Added CTIO for sending response to FW
- Added FC4 Registration for FC-NVMe Target
- Added PUREX IOCB support for login processing in FC-NVMe Target mode
- Added Continuation IOCB for PUREX
- Added Session creation with PUREX IOCB in FC-NVMe Target mode

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  35 +-
 drivers/scsi/qla2xxx/qla_fw.h | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h|  17 +-
 drivers/scsi/qla2xxx/qla_gs.c |  14 +-
 drivers/scsi/qla2xxx/qla_init.c   |  46 +-
 drivers/scsi/qla2xxx/qla_isr.c| 112 -
 drivers/scsi/qla2xxx/qla_mbx.c| 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h   |  33 --
 drivers/scsi/qla2xxx/qla_os.c |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c | 977 +-
 drivers/scsi/qla2xxx/qla_target.h |  90 
 11 files changed, 1697 insertions(+), 68 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 26b93c563f92..feda0b90f62e 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -480,6 +480,10 @@ struct srb_iocb {
uint32_t dl;
uint32_t timeout_sec;
struct  list_head   entry;
+   uint32_t exchange_address;
+   uint16_t nport_handle;
+   uint8_t vp_index;
+   void *cmd;
} nvme;
struct {
u16 cmd;
@@ -490,7 +494,11 @@ struct srb_iocb {
struct timer_list timer;
void (*timeout)(void *);
 };
-
+struct srb_nvme_els_rsp {
+   dma_addr_t dma_addr;
+   void *dma_ptr;
+   void *ptr;
+};
 /* Values for srb_ctx type */
 #define SRB_LOGIN_CMD  1
 #define SRB_LOGOUT_CMD 2
@@ -515,6 +523,11 @@ struct srb_iocb {
 #define SRB_PRLI_CMD   21
 #define SRB_CTRL_VP22
 #define SRB_PRLO_CMD   23
+#define SRB_NVME_ELS_RSP 24
+#define SRB_NVMET_LS   25
+#define SRB_NVMET_FCP  26
+#define SRB_NVMET_ABTS 27
+#define SRB_NVMET_SEND_ABTS28
 
 enum {
TYPE_SRB,
@@ -545,10 +558,13 @@ typedef struct srb {
int rc;
int retry_count;
struct completion comp;
+   struct work_struct nvmet_comp_work;
+   uint16_t comp_status;
union {
struct srb_iocb iocb_cmd;
struct bsg_job *bsg_job;
struct srb_cmd scmd;
+   struct srb_nvme_els_rsp snvme_els;
} u;
void (*done)(void *, int);
void (*free)(void *);
@@ -2273,6 +2289,15 @@ struct qlt_plogi_ack_t {
void*fcport;
 };
 
+/* NVMET */
+struct qlt_purex_plogi_ack_t {
+   struct list_headlist;
+   struct __fc_plogi rcvd_plogi;
+   port_id_t   id;
+   int ref_count;
+   void*fcport;
+};
+
 struct ct_sns_desc {
struct ct_sns_pkt   *ct_sns;
dma_addr_t  ct_sns_dma;
@@ -3235,6 +3260,7 @@ enum qla_work_type {
QLA_EVT_SP_RETRY,
QLA_EVT_IIDMA,
QLA_EVT_ELS_PLOGI,
+   QLA_EVT_NEW_NVMET_SESS,
 };
 
 
@@ -4229,6 +4255,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvmet_enabled:1;
} flags;
 
atomic_tloop_state;
@@ -4274,6 +4301,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define NVMET_PUREX33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4314,6 +4342,7 @@ typedef struct scsi_qla_host {
uint8_t fabric_node_name[WWN_SIZE];
 
struct  nvme_fc_local_port *nvme_local_port;
+   struct  nvmet_fc_target_port *targetport;
struct completion nvme_del_done;
struct list_head nvme_rport_list;
 
@@ -4394,6 +4423,9 @@ typedef struct scsi_qla_host {
uint16_tn2n_id;
struct list_head gpnid_list;
struct fab_scan scan;
+   /*NVMET*/
+   struct list_headpurex_atio_list;
+   struct completion   purex_plogi_sess;
 } scsi_qla_host_t;
 
 struct qla27xx_image_status {
@@ -4664,6 +4696,7 @@ struct sff_8247_a0 {
 !ha->current_topology)
 
 #include "qla_target.h"
+#include "qla_nvmet.h"
 #include "qla_gbl.h"
 #include "qla_dbg.h"
 #include "qla_inline.h"
diff --git a

[PATCH v2 0/5] qla2xxx: Add FC-NVMe Target support

2018-09-26 Thread Himanshu Madhani
Hi Martin, 

This series adds support for FC-NVMe Target.

Patch #1 addes new qla_nvmet files for FC-NVMe Target support.
Patch #2 adds Kconfig and Makefile changes to prepare code compile.
Patch #3, #4 has bulk of changes to handle FC-NVMe Target LS4 processing 
 via Purex pass through path.
Patch #4 adds SysFS hook to enable NVMe Target for the port.

Note: All the patches in this series must be applied before they can be 
compilable.

Please apply them to 4.20/scsi-queue

Changes from v1 -> v2
o Addressed all comments from Bart.
o Consolidated Patch 1 and Patch 2 into single patch.
o Fixed smatch warning reported by kbuild autommation.
o NVMe Target mode is exclusive at the moment. Qlogic driver does not support 
both
  FCP Target and NVMe Target at the same time. This will be fixed in later 
updates.
 
Thanks,
Himanshu

Anil Gurumurthy (4):
  qla2xxx_nvmet: Add files for FC-NVMe Target support
  qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling
  qla2xxx_nvmet: Add FC-NVMe Target handling
  qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

Himanshu Madhani (1):
  qla2xxx: Update driver version to 11.00.00.00-k

 drivers/scsi/qla2xxx/Makefile  |   3 +-
 drivers/scsi/qla2xxx/qla_attr.c|  33 ++
 drivers/scsi/qla2xxx/qla_dbg.c |   1 +
 drivers/scsi/qla2xxx/qla_dbg.h |   2 +
 drivers/scsi/qla2xxx/qla_def.h |  35 +-
 drivers/scsi/qla2xxx/qla_fw.h  | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h |  17 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  16 +-
 drivers/scsi/qla2xxx/qla_init.c|  49 +-
 drivers/scsi/qla2xxx/qla_iocb.c|  42 +-
 drivers/scsi/qla2xxx/qla_isr.c | 112 -
 drivers/scsi/qla2xxx/qla_mbx.c | 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h|  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c   | 798 ++
 drivers/scsi/qla2xxx/qla_nvmet.h   | 129 +
 drivers/scsi/qla2xxx/qla_os.c  |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 977 -
 drivers/scsi/qla2xxx/qla_target.h  |  90 
 drivers/scsi/qla2xxx/qla_version.h |   4 +-
 19 files changed, 2708 insertions(+), 74 deletions(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

-- 
2.12.0



[PATCH v2 4/5] qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

2018-09-26 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node for NVMe Target configuration

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c  | 33 +
 drivers/scsi/qla2xxx/qla_gs.c|  2 +-
 drivers/scsi/qla2xxx/qla_init.c  |  3 ++-
 drivers/scsi/qla2xxx/qla_nvmet.c |  6 +++---
 4 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index a31d23905753..0d2d4f33701b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -13,6 +13,7 @@
 #include 
 
 static int qla24xx_vport_disable(struct fc_vport *, bool);
+extern void qlt_set_mode(struct scsi_qla_host *vha);
 
 /* SYSFS attributes - 
*/
 
@@ -631,6 +632,37 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_write_nvmet(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr,
+   char *buf, loff_t off, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+   struct device, kobj)));
+   struct qla_hw_data *ha = vha->hw;
+   scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+   ql_log(ql_log_info, vha, 0x706e,
+   "Bringing up target mode!! vha:%p\n", vha);
+   qlt_op_target_mode = 1;
+   qlt_set_mode(base_vha);
+   set_bit(ISP_ABORT_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   qla2x00_wait_for_hba_online(vha);
+
+   return count;
+}
+
+static struct bin_attribute sysfs_nvmet_attr = {
+   .attr = {
+   .name = "nvmet",
+   .mode = 0200,
+   },
+   .size = 0,
+   .write = qla2x00_sysfs_write_nvmet,
+};
+
+
+static ssize_t
 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -943,6 +975,7 @@ static struct sysfs_entry {
{ "issue_logo", _issue_logo_attr, },
{ "xgmac_stats", _xgmac_stats_attr, 3 },
{ "dcbx_tlv", _dcbx_tlv_attr, 3 },
+   { "nvmet", _nvmet_attr, },
{ NULL },
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 55dc11d91b35..ba58cfe7ff9b 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -698,7 +698,7 @@ qla2x00_rff_id(scsi_qla_host_t *vha, u8 type)
return (QLA_SUCCESS);
 
return qla_async_rffid(vha, >d_id, qlt_rff_id(vha),
-   FC4_TYPE_FCP_SCSI);
+   type);
 }
 
 static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 841541201671..01676345018f 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5523,7 +5523,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
 * will be newer than discovery_gen. */
qlt_do_generation_tick(vha, _gen);
 
-   if (USE_ASYNC_SCAN(ha)) {
+   if (USE_ASYNC_SCAN(ha) && !(vha->flags.nvmet_enabled)) {
+   /* If NVME target mode is enabled, go through regular scan */
rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
NULL);
if (rval)
diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
index 5335c0618f00..cc0fb83b8f69 100644
--- a/drivers/scsi/qla2xxx/qla_nvmet.c
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -546,7 +546,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
case NVMET_FCOP_READDATA:
case NVMET_FCOP_READDATA_RSP:
/* Populate the CTIO resp with the SGL present in the rsp */
-   ql_log(ql_log_info, vha, 0x1100c,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100c,
"op: %#x, ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
rsp_buf->op, ctio->ox_id, c_flags,
rsp_buf->transfer_length, req_cnt, tot_dsds);
@@ -632,7 +632,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 
case NVMET_FCOP_WRITEDATA:
/* Send transfer rdy */
-   ql_log(ql_log_info, vha, 0x1100e,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100e,
"FCOP_WRITE: ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
ctio->ox_id, c_flags, rsp_buf->transfer_length,
req_cnt, tot_dsds);
@@ -707,7 +707,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 

[PATCH v2 1/5] qla2xxx_nvmet: Add files for FC-NVMe Target support

2018-09-26 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds initial files to enable NVMe Target Support

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/Makefile|   3 +-
 drivers/scsi/qla2xxx/qla_nvmet.c | 798 +++
 drivers/scsi/qla2xxx/qla_nvmet.h | 129 +++
 3 files changed, 929 insertions(+), 1 deletion(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile
index 17d5bc1cc56b..ec924733c10e 100644
--- a/drivers/scsi/qla2xxx/Makefile
+++ b/drivers/scsi/qla2xxx/Makefile
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
-   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o
+   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o \
+   qla_nvmet.o
 
 obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
 obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
new file mode 100644
index ..5335c0618f00
--- /dev/null
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -0,0 +1,798 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2017 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "qla_nvme.h"
+#include "qla_nvmet.h"
+
+static void qla_nvmet_send_resp_ctio(struct qla_qpair *qpair,
+   struct qla_nvmet_cmd *cmd, struct nvmefc_tgt_fcp_req *rsp);
+static void qla_nvmet_send_abts_ctio(struct scsi_qla_host *vha,
+   struct abts_recv_from_24xx *abts, bool flag);
+
+/*
+ * qla_nvmet_targetport_delete -
+ * Invoked by the nvmet to indicate that the target port has
+ * been deleted
+ */
+static void
+qla_nvmet_targetport_delete(struct nvmet_fc_target_port *targetport)
+{
+   struct qla_nvmet_tgtport *tport = targetport->private;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   complete(>tport_del);
+}
+
+/*
+ * qlt_nvmet_ls_done -
+ * Invoked by the firmware interface to indicate the completion
+ * of an LS cmd
+ * Free all associated resources of the LS cmd
+ */
+static void qlt_nvmet_ls_done(void *ptr, int res)
+{
+   struct srb *sp = ptr;
+   struct srb_iocb   *nvme = >u.iocb_cmd;
+   struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc;
+   struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   ql_log(ql_log_info, sp->vha, 0x11000,
+   "Done with NVME LS4 req\n");
+
+   ql_log(ql_log_info, sp->vha, 0x11001,
+   "sp: %p vha: %p, rsp: %p, cmd: %p\n",
+   sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd);
+
+   rsp->done(rsp);
+   /* Free tgt_cmd */
+   kfree(tgt_cmd->buf);
+   kfree(tgt_cmd);
+   qla2x00_rel_sp(sp);
+}
+
+/*
+ * qla_nvmet_ls_rsp -
+ * Invoked by the nvme-t to complete the LS req.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_ls_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+   struct srb_iocb   *nvme;
+   int rval = QLA_FUNCTION_FAILED;
+   srb_t *sp;
+
+   ql_log(ql_log_info, vha, 0x11002,
+   "Dumping the NVMET-LS response buffer\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075,
+   (uint8_t *)rsp->rspbuf, rsp->rsplen);
+
+   /* Alloc SRB structure */
+   sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC);
+   if (!sp) {
+   ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n");
+   return -ENOMEM;
+   }
+
+   sp->type = SRB_NVMET_LS;
+   sp->done = qlt_nvmet_ls_done;
+   sp->vha = vha;
+   sp->fcport = tgt_cmd->fcport;
+
+   nvme = >u.iocb_cmd;
+   nvme->u.nvme.rsp_dma = rsp->rspdma;
+   nvme->u.nvme.rsp_len = rsp->rsplen;
+   nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address;
+   nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle;
+   nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index;
+
+   nvme->u.nvme.cmd = tgt_cmd; /* To be freed */
+   nvme->u.nvme.desc = rsp; /* Call back to nvmet */
+
+   rval = qla2x00_start_sp(sp);
+   if (rval !

[PATCH v2 1/5] qla2xxx_nvmet: Add files for FC-NVMe Target support

2018-09-25 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds initial files to enable NVMe Target Support

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/Makefile|   3 +-
 drivers/scsi/qla2xxx/qla_nvmet.c | 798 +++
 drivers/scsi/qla2xxx/qla_nvmet.h | 129 +++
 3 files changed, 929 insertions(+), 1 deletion(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile
index 17d5bc1cc56b..ec924733c10e 100644
--- a/drivers/scsi/qla2xxx/Makefile
+++ b/drivers/scsi/qla2xxx/Makefile
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
-   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o
+   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o \
+   qla_nvmet.o
 
 obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
 obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
new file mode 100644
index ..5335c0618f00
--- /dev/null
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -0,0 +1,798 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2017 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "qla_nvme.h"
+#include "qla_nvmet.h"
+
+static void qla_nvmet_send_resp_ctio(struct qla_qpair *qpair,
+   struct qla_nvmet_cmd *cmd, struct nvmefc_tgt_fcp_req *rsp);
+static void qla_nvmet_send_abts_ctio(struct scsi_qla_host *vha,
+   struct abts_recv_from_24xx *abts, bool flag);
+
+/*
+ * qla_nvmet_targetport_delete -
+ * Invoked by the nvmet to indicate that the target port has
+ * been deleted
+ */
+static void
+qla_nvmet_targetport_delete(struct nvmet_fc_target_port *targetport)
+{
+   struct qla_nvmet_tgtport *tport = targetport->private;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   complete(>tport_del);
+}
+
+/*
+ * qlt_nvmet_ls_done -
+ * Invoked by the firmware interface to indicate the completion
+ * of an LS cmd
+ * Free all associated resources of the LS cmd
+ */
+static void qlt_nvmet_ls_done(void *ptr, int res)
+{
+   struct srb *sp = ptr;
+   struct srb_iocb   *nvme = >u.iocb_cmd;
+   struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc;
+   struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd;
+
+   if (!IS_ENABLED(CONFIG_NVME_TARGET_FC))
+   return;
+
+   ql_log(ql_log_info, sp->vha, 0x11000,
+   "Done with NVME LS4 req\n");
+
+   ql_log(ql_log_info, sp->vha, 0x11001,
+   "sp: %p vha: %p, rsp: %p, cmd: %p\n",
+   sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd);
+
+   rsp->done(rsp);
+   /* Free tgt_cmd */
+   kfree(tgt_cmd->buf);
+   kfree(tgt_cmd);
+   qla2x00_rel_sp(sp);
+}
+
+/*
+ * qla_nvmet_ls_rsp -
+ * Invoked by the nvme-t to complete the LS req.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_ls_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+   struct srb_iocb   *nvme;
+   int rval = QLA_FUNCTION_FAILED;
+   srb_t *sp;
+
+   ql_log(ql_log_info, vha, 0x11002,
+   "Dumping the NVMET-LS response buffer\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075,
+   (uint8_t *)rsp->rspbuf, rsp->rsplen);
+
+   /* Alloc SRB structure */
+   sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC);
+   if (!sp) {
+   ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n");
+   return -ENOMEM;
+   }
+
+   sp->type = SRB_NVMET_LS;
+   sp->done = qlt_nvmet_ls_done;
+   sp->vha = vha;
+   sp->fcport = tgt_cmd->fcport;
+
+   nvme = >u.iocb_cmd;
+   nvme->u.nvme.rsp_dma = rsp->rspdma;
+   nvme->u.nvme.rsp_len = rsp->rsplen;
+   nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address;
+   nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle;
+   nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index;
+
+   nvme->u.nvme.cmd = tgt_cmd; /* To be freed */
+   nvme->u.nvme.desc = rsp; /* Call back to nvmet */
+
+   rval = qla2x00_start_sp(sp);
+   if (rval !

[PATCH v2 2/5] qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling

2018-09-25 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch provides link service pass through feature handling
in the driver. This feature is implemented mainly by the firmware
and the same implementation is handled in the driver via an
IOCB interface.

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c  |  1 +
 drivers/scsi/qla2xxx/qla_dbg.h  |  2 ++
 drivers/scsi/qla2xxx/qla_iocb.c | 42 -
 3 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ed9c228f7d11 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -67,6 +67,7 @@
  * | Target Mode Management  |   0xf09b   | 0xf002 |
  * |  || 0xf046-0xf049  |
  * | Target Mode Task Management  |  0x1000d  ||
+ * | NVME|   0x11000  ||
  * --
  */
 
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 8877aa97d829..4ad97923e40b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char 
*fmt, ...);
 #define ql_dbg_tgt_tmr 0x1000 /* Target mode task management */
 #define ql_dbg_tgt_dif  0x0800 /* Target mode dif */
 
+#define ql_dbg_nvme 0x0400 /* NVME Target */
+
 extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
 extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 4de910231ba6..cce32362cf21 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
 
-   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3433,6 +3433,40 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
logio->vp_index = sp->fcport->vha->vp_idx;
 }
 
+/*
+ * Build NVMET LS response
+ */
+static int
+qla_nvmet_ls(srb_t *sp, struct pt_ls4_request *rsp_pkt)
+{
+   struct srb_iocb *nvme;
+   int rval = QLA_SUCCESS;
+
+   nvme = >u.iocb_cmd;
+
+   rsp_pkt->entry_type = PT_LS4_REQUEST;
+   rsp_pkt->entry_count = 1;
+   rsp_pkt->control_flags = cpu_to_le16(CF_LS4_RESPONDER << CF_LS4_SHIFT);
+   rsp_pkt->handle = sp->handle;
+
+   rsp_pkt->nport_handle = sp->fcport->loop_id;
+   rsp_pkt->vp_index = nvme->u.nvme.vp_index;
+   rsp_pkt->exchange_address = cpu_to_le32(nvme->u.nvme.exchange_address);
+
+   rsp_pkt->tx_dseg_count = 1;
+   rsp_pkt->tx_byte_count = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_len = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_address[0] = cpu_to_le32(LSD(nvme->u.nvme.rsp_dma));
+   rsp_pkt->dseg0_address[1] = cpu_to_le32(MSD(nvme->u.nvme.rsp_dma));
+
+   ql_log(ql_log_info, sp->vha, 0x,
+   "Dumping the NVME-LS response IOCB\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, sp->vha, 0x2075,
+   (uint8_t *)rsp_pkt, sizeof(*rsp_pkt));
+
+   return rval;
+}
+
 int
 qla2x00_start_sp(srb_t *sp)
 {
@@ -3493,6 +3527,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+   case SRB_NVMET_LS:
+   qla_nvmet_ls(sp, pkt);
+   break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3518,6 +3555,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+   case SRB_NVME_ELS_RSP:
+   qlt_send_els_resp(sp, pkt);
+   break;
default:
break;
}
-- 
2.12.0



[PATCH v2 4/5] qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

2018-09-25 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node for NVMe Target configuration

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c  | 33 +
 drivers/scsi/qla2xxx/qla_gs.c|  2 +-
 drivers/scsi/qla2xxx/qla_init.c  |  3 ++-
 drivers/scsi/qla2xxx/qla_nvmet.c |  6 +++---
 4 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index a31d23905753..0d2d4f33701b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -13,6 +13,7 @@
 #include 
 
 static int qla24xx_vport_disable(struct fc_vport *, bool);
+extern void qlt_set_mode(struct scsi_qla_host *vha);
 
 /* SYSFS attributes - 
*/
 
@@ -631,6 +632,37 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_write_nvmet(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr,
+   char *buf, loff_t off, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+   struct device, kobj)));
+   struct qla_hw_data *ha = vha->hw;
+   scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+   ql_log(ql_log_info, vha, 0x706e,
+   "Bringing up target mode!! vha:%p\n", vha);
+   qlt_op_target_mode = 1;
+   qlt_set_mode(base_vha);
+   set_bit(ISP_ABORT_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   qla2x00_wait_for_hba_online(vha);
+
+   return count;
+}
+
+static struct bin_attribute sysfs_nvmet_attr = {
+   .attr = {
+   .name = "nvmet",
+   .mode = 0200,
+   },
+   .size = 0,
+   .write = qla2x00_sysfs_write_nvmet,
+};
+
+
+static ssize_t
 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -943,6 +975,7 @@ static struct sysfs_entry {
{ "issue_logo", _issue_logo_attr, },
{ "xgmac_stats", _xgmac_stats_attr, 3 },
{ "dcbx_tlv", _dcbx_tlv_attr, 3 },
+   { "nvmet", _nvmet_attr, },
{ NULL },
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 55dc11d91b35..ba58cfe7ff9b 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -698,7 +698,7 @@ qla2x00_rff_id(scsi_qla_host_t *vha, u8 type)
return (QLA_SUCCESS);
 
return qla_async_rffid(vha, >d_id, qlt_rff_id(vha),
-   FC4_TYPE_FCP_SCSI);
+   type);
 }
 
 static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 841541201671..01676345018f 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5523,7 +5523,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
 * will be newer than discovery_gen. */
qlt_do_generation_tick(vha, _gen);
 
-   if (USE_ASYNC_SCAN(ha)) {
+   if (USE_ASYNC_SCAN(ha) && !(vha->flags.nvmet_enabled)) {
+   /* If NVME target mode is enabled, go through regular scan */
rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
NULL);
if (rval)
diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
index 5335c0618f00..cc0fb83b8f69 100644
--- a/drivers/scsi/qla2xxx/qla_nvmet.c
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -546,7 +546,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
case NVMET_FCOP_READDATA:
case NVMET_FCOP_READDATA_RSP:
/* Populate the CTIO resp with the SGL present in the rsp */
-   ql_log(ql_log_info, vha, 0x1100c,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100c,
"op: %#x, ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
rsp_buf->op, ctio->ox_id, c_flags,
rsp_buf->transfer_length, req_cnt, tot_dsds);
@@ -632,7 +632,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 
case NVMET_FCOP_WRITEDATA:
/* Send transfer rdy */
-   ql_log(ql_log_info, vha, 0x1100e,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100e,
"FCOP_WRITE: ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
ctio->ox_id, c_flags, rsp_buf->transfer_length,
req_cnt, tot_dsds);
@@ -707,7 +707,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 

[PATCH v2 3/5] qla2xxx_nvmet: Add FC-NVMe Target handling

2018-09-25 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch Adds following code in the driver to
support FC-NVMe Target

- Updated ql2xenablenvme to allow FC-NVMe Target operation
- Added Link Serviccce Request handling for NVMe Target
- Added passthru IOCB for LS4 request
- Added CTIO for sending response to FW
- Added FC4 Registration for FC-NVMe Target
- Added PUREX IOCB support for login processing in FC-NVMe Target mode
- Added Continuation IOCB for PUREX
- Added Session creation with PUREX IOCB in FC-NVMe Target mode

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  35 +-
 drivers/scsi/qla2xxx/qla_fw.h | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h|  17 +-
 drivers/scsi/qla2xxx/qla_gs.c |  14 +-
 drivers/scsi/qla2xxx/qla_init.c   |  46 +-
 drivers/scsi/qla2xxx/qla_isr.c| 112 -
 drivers/scsi/qla2xxx/qla_mbx.c| 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h   |  33 --
 drivers/scsi/qla2xxx/qla_os.c |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c | 977 +-
 drivers/scsi/qla2xxx/qla_target.h |  90 
 11 files changed, 1697 insertions(+), 68 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 26b93c563f92..feda0b90f62e 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -480,6 +480,10 @@ struct srb_iocb {
uint32_t dl;
uint32_t timeout_sec;
struct  list_head   entry;
+   uint32_t exchange_address;
+   uint16_t nport_handle;
+   uint8_t vp_index;
+   void *cmd;
} nvme;
struct {
u16 cmd;
@@ -490,7 +494,11 @@ struct srb_iocb {
struct timer_list timer;
void (*timeout)(void *);
 };
-
+struct srb_nvme_els_rsp {
+   dma_addr_t dma_addr;
+   void *dma_ptr;
+   void *ptr;
+};
 /* Values for srb_ctx type */
 #define SRB_LOGIN_CMD  1
 #define SRB_LOGOUT_CMD 2
@@ -515,6 +523,11 @@ struct srb_iocb {
 #define SRB_PRLI_CMD   21
 #define SRB_CTRL_VP22
 #define SRB_PRLO_CMD   23
+#define SRB_NVME_ELS_RSP 24
+#define SRB_NVMET_LS   25
+#define SRB_NVMET_FCP  26
+#define SRB_NVMET_ABTS 27
+#define SRB_NVMET_SEND_ABTS28
 
 enum {
TYPE_SRB,
@@ -545,10 +558,13 @@ typedef struct srb {
int rc;
int retry_count;
struct completion comp;
+   struct work_struct nvmet_comp_work;
+   uint16_t comp_status;
union {
struct srb_iocb iocb_cmd;
struct bsg_job *bsg_job;
struct srb_cmd scmd;
+   struct srb_nvme_els_rsp snvme_els;
} u;
void (*done)(void *, int);
void (*free)(void *);
@@ -2273,6 +2289,15 @@ struct qlt_plogi_ack_t {
void*fcport;
 };
 
+/* NVMET */
+struct qlt_purex_plogi_ack_t {
+   struct list_headlist;
+   struct __fc_plogi rcvd_plogi;
+   port_id_t   id;
+   int ref_count;
+   void*fcport;
+};
+
 struct ct_sns_desc {
struct ct_sns_pkt   *ct_sns;
dma_addr_t  ct_sns_dma;
@@ -3235,6 +3260,7 @@ enum qla_work_type {
QLA_EVT_SP_RETRY,
QLA_EVT_IIDMA,
QLA_EVT_ELS_PLOGI,
+   QLA_EVT_NEW_NVMET_SESS,
 };
 
 
@@ -4229,6 +4255,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvmet_enabled:1;
} flags;
 
atomic_tloop_state;
@@ -4274,6 +4301,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define NVMET_PUREX33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4314,6 +4342,7 @@ typedef struct scsi_qla_host {
uint8_t fabric_node_name[WWN_SIZE];
 
struct  nvme_fc_local_port *nvme_local_port;
+   struct  nvmet_fc_target_port *targetport;
struct completion nvme_del_done;
struct list_head nvme_rport_list;
 
@@ -4394,6 +4423,9 @@ typedef struct scsi_qla_host {
uint16_tn2n_id;
struct list_head gpnid_list;
struct fab_scan scan;
+   /*NVMET*/
+   struct list_headpurex_atio_list;
+   struct completion   purex_plogi_sess;
 } scsi_qla_host_t;
 
 struct qla27xx_image_status {
@@ -4664,6 +4696,7 @@ struct sff_8247_a0 {
 !ha->current_topology)
 
 #include "qla_target.h"
+#include "qla_nvmet.h"
 #include "qla_gbl.h"
 #include "qla_dbg.h"
 #include "qla_inline.h"
diff --git a

[PATCH v2 0/5] qla2xxx: Add FC-NVMe Target support

2018-09-25 Thread Himanshu Madhani
Hi Martin, 

This series adds support for FC-NVMe Target.

Patch #1 addes new qla_nvmet files for FC-NVMe Target support.
Patch #2 adds Kconfig and Makefile changes to prepare code compile.
Patch #3, #4 has bulk of changes to handle FC-NVMe Target LS4 processing 
 via Purex pass through path.
Patch #4 adds SysFS hook to enable NVMe Target for the port.

Note: All the patches in this series must be applied before they can be 
compilable.

Please apply them to 4.20/scsi-queue

Changes from v1 -> v2
o Addressed all comments from Bart.
o Consolidated Patch 1 and Patch 2 into single patch.
o Fixed smatch warning reported by kbuild autommation.
o NVMe Target mode is exclusive at the moment. Qlogic driver does not support 
both
  FCP Target and NVMe Target at the same time. This will be fixed in later 
updates.
 
Thanks,
Himanshu

Anil Gurumurthy (4):
  qla2xxx_nvmet: Add files for FC-NVMe Target support
  qla2xxx_nvmet: Add FC-NVMe Target Link Service request handling
  qla2xxx_nvmet: Add FC-NVMe Target handling
  qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

Himanshu Madhani (1):
  qla2xxx: Update driver version to 11.00.00.00-k

 drivers/scsi/qla2xxx/Makefile  |   3 +-
 drivers/scsi/qla2xxx/qla_attr.c|  33 ++
 drivers/scsi/qla2xxx/qla_dbg.c |   1 +
 drivers/scsi/qla2xxx/qla_dbg.h |   2 +
 drivers/scsi/qla2xxx/qla_def.h |  35 +-
 drivers/scsi/qla2xxx/qla_fw.h  | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h |  17 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  16 +-
 drivers/scsi/qla2xxx/qla_init.c|  49 +-
 drivers/scsi/qla2xxx/qla_iocb.c|  42 +-
 drivers/scsi/qla2xxx/qla_isr.c | 112 -
 drivers/scsi/qla2xxx/qla_mbx.c | 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h|  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c   | 798 ++
 drivers/scsi/qla2xxx/qla_nvmet.h   | 129 +
 drivers/scsi/qla2xxx/qla_os.c  |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 977 -
 drivers/scsi/qla2xxx/qla_target.h  |  90 
 drivers/scsi/qla2xxx/qla_version.h |   4 +-
 19 files changed, 2708 insertions(+), 74 deletions(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

-- 
2.12.0



[PATCH v2 5/5] qla2xxx: Update driver version to 11.00.00.00-k

2018-09-25 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 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 12bafff71a1a..0d58aa629c08 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.11-k"
+#define QLA2XXX_VERSION  "11.00.00.00-k"
 
-#define QLA_DRIVER_MAJOR_VER   10
+#define QLA_DRIVER_MAJOR_VER   11
 #define QLA_DRIVER_MINOR_VER   0
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH 0/6] qla2xxx: Add FC-NVMe Target support

2018-09-14 Thread Himanshu Madhani
This series adds support for FC-NVMe Target.

Patch #1 addes new qla_nvmet files for FC-NVMe Target support.
Patch #2 adds Kconfig and Makefile changes to prepare code compile.
Patch #3, #4 has bulk of changes to handle FC-NVMe Target LS4 processing 
 via Purex pass through path.
Patch #4 adds SysFS hook to enable NVMe Target for the port.

Note: All the patches in this series must be applied before they can be 
compilable.

Please apply them to 4.20/scsi-queue

Thanks,
Himanshu

Anil Gurumurthy (5):
  qla2xxx_nvmet: Add files for FC-NVMe Target support
  qla2xxx_nvmet: Added Makefile and Kconfig changes
  qla2xxx_nvmet: Add FC-NVMe Target LS request handling
  qla2xxx_nvmet: Add FC-NVMe Target handling
  qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

Himanshu Madhani (1):
  qla2xxx: Update driver version to 11.00.00.00-k

 drivers/scsi/qla2xxx/Kconfig   |   1 +
 drivers/scsi/qla2xxx/Makefile  |   3 +-
 drivers/scsi/qla2xxx/qla_attr.c|  33 ++
 drivers/scsi/qla2xxx/qla_dbg.c |   1 +
 drivers/scsi/qla2xxx/qla_dbg.h |   2 +
 drivers/scsi/qla2xxx/qla_def.h |  35 +-
 drivers/scsi/qla2xxx/qla_fw.h  | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h |  17 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  16 +-
 drivers/scsi/qla2xxx/qla_init.c|  49 +-
 drivers/scsi/qla2xxx/qla_iocb.c|  42 +-
 drivers/scsi/qla2xxx/qla_isr.c | 112 -
 drivers/scsi/qla2xxx/qla_mbx.c | 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h|  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c   | 778 +
 drivers/scsi/qla2xxx/qla_nvmet.h   | 129 +
 drivers/scsi/qla2xxx/qla_os.c  |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 977 -
 drivers/scsi/qla2xxx/qla_target.h  |  90 
 drivers/scsi/qla2xxx/qla_version.h |   4 +-
 20 files changed, 2689 insertions(+), 74 deletions(-)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

-- 
2.12.0



[PATCH 3/6] qla2xxx_nvmet: Add FC-NVMe Target LS request handling

2018-09-14 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds LS handling into driver

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c  |  1 +
 drivers/scsi/qla2xxx/qla_dbg.h  |  2 ++
 drivers/scsi/qla2xxx/qla_iocb.c | 42 -
 3 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ed9c228f7d11 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -67,6 +67,7 @@
  * | Target Mode Management  |   0xf09b   | 0xf002 |
  * |  || 0xf046-0xf049  |
  * | Target Mode Task Management  |  0x1000d  ||
+ * | NVME|   0x11000  ||
  * --
  */
 
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 8877aa97d829..4ad97923e40b 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -367,6 +367,8 @@ ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char 
*fmt, ...);
 #define ql_dbg_tgt_tmr 0x1000 /* Target mode task management */
 #define ql_dbg_tgt_dif  0x0800 /* Target mode dif */
 
+#define ql_dbg_nvme 0x0400 /* NVME Target */
+
 extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
 extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 4de910231ba6..cce32362cf21 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2113,7 +2113,7 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
req_cnt = 1;
handle = 0;
 
-   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   if (sp && (sp->type != SRB_SCSI_CMD) && (sp->type != SRB_NVMET_FCP)) {
/* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
}
@@ -3433,6 +3433,40 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
logio->vp_index = sp->fcport->vha->vp_idx;
 }
 
+/*
+ * Build NVMET LS response
+ */
+static int
+qla_nvmet_ls(srb_t *sp, struct pt_ls4_request *rsp_pkt)
+{
+   struct srb_iocb *nvme;
+   int rval = QLA_SUCCESS;
+
+   nvme = >u.iocb_cmd;
+
+   rsp_pkt->entry_type = PT_LS4_REQUEST;
+   rsp_pkt->entry_count = 1;
+   rsp_pkt->control_flags = cpu_to_le16(CF_LS4_RESPONDER << CF_LS4_SHIFT);
+   rsp_pkt->handle = sp->handle;
+
+   rsp_pkt->nport_handle = sp->fcport->loop_id;
+   rsp_pkt->vp_index = nvme->u.nvme.vp_index;
+   rsp_pkt->exchange_address = cpu_to_le32(nvme->u.nvme.exchange_address);
+
+   rsp_pkt->tx_dseg_count = 1;
+   rsp_pkt->tx_byte_count = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_len = cpu_to_le16(nvme->u.nvme.rsp_len);
+   rsp_pkt->dseg0_address[0] = cpu_to_le32(LSD(nvme->u.nvme.rsp_dma));
+   rsp_pkt->dseg0_address[1] = cpu_to_le32(MSD(nvme->u.nvme.rsp_dma));
+
+   ql_log(ql_log_info, sp->vha, 0x,
+   "Dumping the NVME-LS response IOCB\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, sp->vha, 0x2075,
+   (uint8_t *)rsp_pkt, sizeof(*rsp_pkt));
+
+   return rval;
+}
+
 int
 qla2x00_start_sp(srb_t *sp)
 {
@@ -3493,6 +3527,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_NVME_LS:
qla_nvme_ls(sp, pkt);
break;
+   case SRB_NVMET_LS:
+   qla_nvmet_ls(sp, pkt);
+   break;
case SRB_ABT_CMD:
IS_QLAFX00(ha) ?
qlafx00_abort_iocb(sp, pkt) :
@@ -3518,6 +3555,9 @@ qla2x00_start_sp(srb_t *sp)
case SRB_PRLO_CMD:
qla24xx_prlo_iocb(sp, pkt);
break;
+   case SRB_NVME_ELS_RSP:
+   qlt_send_els_resp(sp, pkt);
+   break;
default:
break;
}
-- 
2.12.0



[PATCH 2/6] qla2xxx_nvmet: Added Makefile and Kconfig changes

2018-09-14 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch updates kconfig and make file to include
compilation of new NVMe Target files

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/Kconfig  | 1 +
 drivers/scsi/qla2xxx/Makefile | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig
index 036cc3f217b1..f1539d8b68ef 100644
--- a/drivers/scsi/qla2xxx/Kconfig
+++ b/drivers/scsi/qla2xxx/Kconfig
@@ -3,6 +3,7 @@ config SCSI_QLA_FC
depends on PCI && SCSI
depends on SCSI_FC_ATTRS
depends on NVME_FC || !NVME_FC
+   depends on NVME_TARGET_FC || !NVME_TARGET_FC
select FW_LOADER
select BTREE
---help---
diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile
index 17d5bc1cc56b..ec924733c10e 100644
--- a/drivers/scsi/qla2xxx/Makefile
+++ b/drivers/scsi/qla2xxx/Makefile
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
-   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o
+   qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o qla_nvme.o \
+   qla_nvmet.o
 
 obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
 obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
-- 
2.12.0



[PATCH 6/6] qla2xxx: Update driver version to 11.00.00.00-k

2018-09-14 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 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 12bafff71a1a..0d58aa629c08 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.11-k"
+#define QLA2XXX_VERSION  "11.00.00.00-k"
 
-#define QLA_DRIVER_MAJOR_VER   10
+#define QLA_DRIVER_MAJOR_VER   11
 #define QLA_DRIVER_MINOR_VER   0
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH 1/6] qla2xxx_nvmet: Add files for FC-NVMe Target support

2018-09-14 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds initial files to enable NVMe Target Support

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvmet.c | 780 +++
 drivers/scsi/qla2xxx/qla_nvmet.h | 129 +++
 2 files changed, 909 insertions(+)
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.c
 create mode 100644 drivers/scsi/qla2xxx/qla_nvmet.h

diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
new file mode 100644
index ..13a59a7ea8ae
--- /dev/null
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -0,0 +1,780 @@
+/*
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2017 QLogic Corporation
+ *
+ * See LICENSE.qla2xxx for copyright and licensing details.
+ */
+#include 
+#include 
+#include 
+#include 
+
+#include "qla_nvme.h"
+#include "qla_nvmet.h"
+
+#ifIS_ENABLED(CONFIG_NVME_TARGET_FC)
+static void qla_nvmet_send_resp_ctio(struct qla_qpair *qpair,
+   struct qla_nvmet_cmd *cmd, struct nvmefc_tgt_fcp_req *rsp);
+static void qla_nvmet_send_abts_ctio(struct scsi_qla_host *vha,
+   struct abts_recv_from_24xx *abts, bool flag);
+
+/*
+ * qla_nvmet_targetport_delete -
+ * Invoked by the nvmet to indicate that the target port has
+ * been deleted
+ */
+static void
+qla_nvmet_targetport_delete(struct nvmet_fc_target_port *targetport)
+{
+   struct qla_nvmet_tgtport *tport = targetport->private;
+
+   complete(>tport_del);
+}
+#endif
+
+#ifIS_ENABLED(CONFIG_NVME_TARGET_FC)
+/*
+ * qlt_nvmet_ls_done -
+ * Invoked by the firmware interface to indicate the completion
+ * of an LS cmd
+ * Free all associated resources of the LS cmd
+ */
+static void qlt_nvmet_ls_done(void *ptr, int res)
+{
+   struct srb *sp = ptr;
+   struct srb_iocb   *nvme = >u.iocb_cmd;
+   struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc;
+   struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd;
+
+   ql_log(ql_log_info, sp->vha, 0x11000,
+   "Done with NVME LS4 req\n");
+
+   ql_log(ql_log_info, sp->vha, 0x11001,
+   "sp: %p vha: %p, rsp: %p, cmd: %p\n",
+   sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd);
+
+   rsp->done(rsp);
+   /* Free tgt_cmd */
+   kfree(tgt_cmd->buf);
+   kfree(tgt_cmd);
+   qla2x00_rel_sp(sp);
+}
+
+/*
+ * qla_nvmet_ls_rsp -
+ * Invoked by the nvme-t to complete the LS req.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_ls_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+   struct srb_iocb   *nvme;
+   int rval = QLA_FUNCTION_FAILED;
+   srb_t *sp;
+
+   ql_log(ql_log_info, vha, 0x11002,
+   "Dumping the NVMET-LS response buffer\n");
+   ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075,
+   (uint8_t *)rsp->rspbuf, rsp->rsplen);
+
+   /* Alloc SRB structure */
+   sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC);
+   if (!sp) {
+   ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n");
+   return -ENOMEM;
+   }
+
+   sp->type = SRB_NVMET_LS;
+   sp->done = qlt_nvmet_ls_done;
+   sp->vha = vha;
+   sp->fcport = tgt_cmd->fcport;
+
+   nvme = >u.iocb_cmd;
+   nvme->u.nvme.rsp_dma = rsp->rspdma;
+   nvme->u.nvme.rsp_len = rsp->rsplen;
+   nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address;
+   nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle;
+   nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index;
+
+   nvme->u.nvme.cmd = tgt_cmd; /* To be freed */
+   nvme->u.nvme.desc = rsp; /* Call back to nvmet */
+
+   rval = qla2x00_start_sp(sp);
+   if (rval != QLA_SUCCESS) {
+   ql_log(ql_log_warn, vha, 0x11004,
+   "qla2x00_start_sp failed = %d\n", rval);
+   return rval;
+   }
+
+   return 0;
+}
+
+/*
+ * qla_nvmet_fcp_op -
+ * Invoked by the nvme-t to complete the IO.
+ * Prepare and send a response CTIO to the firmware.
+ */
+static int
+qla_nvmet_fcp_op(struct nvmet_fc_target_port *tgtport,
+   struct nvmefc_tgt_fcp_req *rsp)
+{
+   struct qla_nvmet_cmd *tgt_cmd =
+   container_of(rsp, struct qla_nvmet_cmd, cmd.fcp_req);
+   struct scsi_qla_host *vha = tgt_cmd->vha;
+
+   /* Prepare and send CTIO 82h */
+   qla_nvmet_send_resp_ctio(vha->qpair, tgt_cmd, rsp);
+
+   return 0;
+}
+/*
+ * qla_nvmet_fcp_abort_done
+ * free 

[PATCH 5/6] qla2xxx_nvmet: Add SysFS node for FC-NVMe Target

2018-09-14 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node for NVMe Target configuration

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c  | 33 +
 drivers/scsi/qla2xxx/qla_gs.c|  2 +-
 drivers/scsi/qla2xxx/qla_init.c  |  3 ++-
 drivers/scsi/qla2xxx/qla_nvmet.c |  6 +++---
 4 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index a31d23905753..0d2d4f33701b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -13,6 +13,7 @@
 #include 
 
 static int qla24xx_vport_disable(struct fc_vport *, bool);
+extern void qlt_set_mode(struct scsi_qla_host *vha);
 
 /* SYSFS attributes - 
*/
 
@@ -631,6 +632,37 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_write_nvmet(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr,
+   char *buf, loff_t off, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+   struct device, kobj)));
+   struct qla_hw_data *ha = vha->hw;
+   scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+   ql_log(ql_log_info, vha, 0x706e,
+   "Bringing up target mode!! vha:%p\n", vha);
+   qlt_op_target_mode = 1;
+   qlt_set_mode(base_vha);
+   set_bit(ISP_ABORT_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   qla2x00_wait_for_hba_online(vha);
+
+   return count;
+}
+
+static struct bin_attribute sysfs_nvmet_attr = {
+   .attr = {
+   .name = "nvmet",
+   .mode = 0200,
+   },
+   .size = 0,
+   .write = qla2x00_sysfs_write_nvmet,
+};
+
+
+static ssize_t
 qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
@@ -943,6 +975,7 @@ static struct sysfs_entry {
{ "issue_logo", _issue_logo_attr, },
{ "xgmac_stats", _xgmac_stats_attr, 3 },
{ "dcbx_tlv", _dcbx_tlv_attr, 3 },
+   { "nvmet", _nvmet_attr, },
{ NULL },
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 55dc11d91b35..ba58cfe7ff9b 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -698,7 +698,7 @@ qla2x00_rff_id(scsi_qla_host_t *vha, u8 type)
return (QLA_SUCCESS);
 
return qla_async_rffid(vha, >d_id, qlt_rff_id(vha),
-   FC4_TYPE_FCP_SCSI);
+   type);
 }
 
 static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 841541201671..01676345018f 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5523,7 +5523,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
 * will be newer than discovery_gen. */
qlt_do_generation_tick(vha, _gen);
 
-   if (USE_ASYNC_SCAN(ha)) {
+   if (USE_ASYNC_SCAN(ha) && !(vha->flags.nvmet_enabled)) {
+   /* If NVME target mode is enabled, go through regular scan */
rval = qla24xx_async_gpnft(vha, FC4_TYPE_FCP_SCSI,
NULL);
if (rval)
diff --git a/drivers/scsi/qla2xxx/qla_nvmet.c b/drivers/scsi/qla2xxx/qla_nvmet.c
index 5ce796aeb24e..60093651c91e 100644
--- a/drivers/scsi/qla2xxx/qla_nvmet.c
+++ b/drivers/scsi/qla2xxx/qla_nvmet.c
@@ -525,7 +525,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
case NVMET_FCOP_READDATA:
case NVMET_FCOP_READDATA_RSP:
/* Populate the CTIO resp with the SGL present in the rsp */
-   ql_log(ql_log_info, vha, 0x1100c,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100c,
"op: %#x, ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
rsp_buf->op, ctio->ox_id, c_flags,
rsp_buf->transfer_length, req_cnt, tot_dsds);
@@ -611,7 +611,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 
case NVMET_FCOP_WRITEDATA:
/* Send transfer rdy */
-   ql_log(ql_log_info, vha, 0x1100e,
+   ql_dbg(ql_dbg_nvme, vha, 0x1100e,
"FCOP_WRITE: ox_id=%x c_flags=%x transfer_length: %#x 
req_cnt: %#x, tot_dsds: %#x\n",
ctio->ox_id, c_flags, rsp_buf->transfer_length,
req_cnt, tot_dsds);
@@ -686,7 +686,7 @@ static void qla_nvmet_send_resp_ctio(struct qla_qpair 
*qpair,
 

[PATCH 4/6] qla2xxx_nvmet: Add FC-NVMe Target handling

2018-09-14 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch Adds following code in the driver to
support FC-NVMe Target

- Updated ql2xenablenvme to allow FC-NVMe Target operation
- Added LS Request handling for NVMe Target
- Added passthr IOCB for LS4 request
- Added CTIO for sending response to FW
- Added FC4 Registration for FC-NVMe Target
- Added PUREX IOCB support for login processing in FC-NVMe Target mode
- Added Continuation IOCB for PUREX
- Added Session creation with PUREX IOCB in FC-NVMe Target mode

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Giridhar Malavali 
Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  35 +-
 drivers/scsi/qla2xxx/qla_fw.h | 263 ++
 drivers/scsi/qla2xxx/qla_gbl.h|  17 +-
 drivers/scsi/qla2xxx/qla_gs.c |  14 +-
 drivers/scsi/qla2xxx/qla_init.c   |  46 +-
 drivers/scsi/qla2xxx/qla_isr.c| 112 -
 drivers/scsi/qla2xxx/qla_mbx.c| 101 +++-
 drivers/scsi/qla2xxx/qla_nvme.h   |  33 --
 drivers/scsi/qla2xxx/qla_nvmet.c  |   4 +-
 drivers/scsi/qla2xxx/qla_os.c |  77 ++-
 drivers/scsi/qla2xxx/qla_target.c | 977 +-
 drivers/scsi/qla2xxx/qla_target.h |  90 
 12 files changed, 1698 insertions(+), 71 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 26b93c563f92..feda0b90f62e 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -480,6 +480,10 @@ struct srb_iocb {
uint32_t dl;
uint32_t timeout_sec;
struct  list_head   entry;
+   uint32_t exchange_address;
+   uint16_t nport_handle;
+   uint8_t vp_index;
+   void *cmd;
} nvme;
struct {
u16 cmd;
@@ -490,7 +494,11 @@ struct srb_iocb {
struct timer_list timer;
void (*timeout)(void *);
 };
-
+struct srb_nvme_els_rsp {
+   dma_addr_t dma_addr;
+   void *dma_ptr;
+   void *ptr;
+};
 /* Values for srb_ctx type */
 #define SRB_LOGIN_CMD  1
 #define SRB_LOGOUT_CMD 2
@@ -515,6 +523,11 @@ struct srb_iocb {
 #define SRB_PRLI_CMD   21
 #define SRB_CTRL_VP22
 #define SRB_PRLO_CMD   23
+#define SRB_NVME_ELS_RSP 24
+#define SRB_NVMET_LS   25
+#define SRB_NVMET_FCP  26
+#define SRB_NVMET_ABTS 27
+#define SRB_NVMET_SEND_ABTS28
 
 enum {
TYPE_SRB,
@@ -545,10 +558,13 @@ typedef struct srb {
int rc;
int retry_count;
struct completion comp;
+   struct work_struct nvmet_comp_work;
+   uint16_t comp_status;
union {
struct srb_iocb iocb_cmd;
struct bsg_job *bsg_job;
struct srb_cmd scmd;
+   struct srb_nvme_els_rsp snvme_els;
} u;
void (*done)(void *, int);
void (*free)(void *);
@@ -2273,6 +2289,15 @@ struct qlt_plogi_ack_t {
void*fcport;
 };
 
+/* NVMET */
+struct qlt_purex_plogi_ack_t {
+   struct list_headlist;
+   struct __fc_plogi rcvd_plogi;
+   port_id_t   id;
+   int ref_count;
+   void*fcport;
+};
+
 struct ct_sns_desc {
struct ct_sns_pkt   *ct_sns;
dma_addr_t  ct_sns_dma;
@@ -3235,6 +3260,7 @@ enum qla_work_type {
QLA_EVT_SP_RETRY,
QLA_EVT_IIDMA,
QLA_EVT_ELS_PLOGI,
+   QLA_EVT_NEW_NVMET_SESS,
 };
 
 
@@ -4229,6 +4255,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvmet_enabled:1;
} flags;
 
atomic_tloop_state;
@@ -4274,6 +4301,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define NVMET_PUREX33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4314,6 +4342,7 @@ typedef struct scsi_qla_host {
uint8_t fabric_node_name[WWN_SIZE];
 
struct  nvme_fc_local_port *nvme_local_port;
+   struct  nvmet_fc_target_port *targetport;
struct completion nvme_del_done;
struct list_head nvme_rport_list;
 
@@ -4394,6 +4423,9 @@ typedef struct scsi_qla_host {
uint16_tn2n_id;
struct list_head gpnid_list;
struct fab_scan scan;
+   /*NVMET*/
+   struct list_headpurex_atio_list;
+   struct completion   purex_plogi_sess;
 } scsi_qla_host_t;
 
 struct qla27xx_image_status {
@@ -4664,6 +4696,7 @@ struct sff_8247_a0 {
 !ha->current_topology)
 
 #include "qla_target.h"
+#include "qla_nvmet.h"
 #include "qla_gbl.h"
 #include "qla_dbg.h"
 #include "

[PATCH 00/16] qla2xxx: Driver updates for scsi-misc

2018-09-11 Thread Himanshu Madhani
Hi Martin, 

This patch series fixes issues found during our testing for qla2xxx. 

Please apply this series to 4.20/scsi-queue at your earliest.

Thanks,
Himanshu

Darren Trapp (1):
  qla2xxx: Allow FC-NVMe underrun to be handled by transport

Himanshu Madhani (1):
  qla2xxx: Update driver version to 10.00.00.11-k

Quinn Tran (13):
  qla2xxx: Increase abort timeout value
  qla2xxx: Fix port speed display on chip reset
  qla2xxx: Fix dropped srb resource.
  qla2xxx: Fix race condition for resource cleanup
  qla2xxx: Add mode control for each physical port
  qla2xxx: Fix early srb free on abort
  qla2xxx: Fix stuck session in PLOGI state
  qla2xxx: shutdown chip if reset fail
  qla2xxx: Reject bsg request if chip is down.
  qla2xxx: Fix premature command free
  qla2xxx: Remove stale debug trace message from tcm_qla2xxx
  qla2xxx: Fix duplicate switch's Nport ID entries
  qla2xxx: Fix double increment of switch scan retry count

Sawan Chandak (1):
  qla2xxx: Check for Register disconnect

 drivers/scsi/qla2xxx/qla_attr.c| 449 +
 drivers/scsi/qla2xxx/qla_bsg.c |   2 +-
 drivers/scsi/qla2xxx/qla_def.h |   7 +
 drivers/scsi/qla2xxx/qla_gbl.h |   5 +-
 drivers/scsi/qla2xxx/qla_gs.c  |  61 +++--
 drivers/scsi/qla2xxx/qla_init.c|  49 +++-
 drivers/scsi/qla2xxx/qla_inline.h  |   6 +-
 drivers/scsi/qla2xxx/qla_iocb.c|   3 +-
 drivers/scsi/qla2xxx/qla_isr.c |  36 +--
 drivers/scsi/qla2xxx/qla_os.c  |  60 +++--
 drivers/scsi/qla2xxx/qla_target.c  |  34 ++-
 drivers/scsi/qla2xxx/qla_target.h  |   1 +
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 drivers/scsi/qla2xxx/tcm_qla2xxx.c |  49 +++-
 14 files changed, 683 insertions(+), 81 deletions(-)

-- 
2.12.0



[PATCH 13/16] qla2xxx: Remove stale debug trace message from tcm_qla2xxx

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

remove stale debug trace.

Fixes: 1eb42f965ced ("qla2xxx: Make trace flags more readable")
Cc: sta...@vger.kernel.org #4.10
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/tcm_qla2xxx.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c 
b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index 7d3d4a82fe96..731a094d2386 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -757,10 +757,6 @@ static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd)
cmd->sg_cnt = 0;
cmd->offset = 0;
cmd->dma_data_direction = target_reverse_dma_direction(se_cmd);
-   if (cmd->trc_flags & TRC_XMIT_STATUS) {
-   pr_crit("Multiple calls for status = %p.\n", cmd);
-   dump_stack();
-   }
cmd->trc_flags |= TRC_XMIT_STATUS;
 
if (se_cmd->data_direction == DMA_FROM_DEVICE) {
-- 
2.12.0



[PATCH 07/16] qla2xxx: Add mode control for each physical port

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Add ability to allow each physical port to control operating mode.
Current code forces all ports to behave in one mode (i.e. initiator,
target or dual). This patch allows user to select the operating
mode for each port.

- Driver must be loaded in dual mode to allow resource allocation

modprobe qla2xxx qlini_mode=dual

- In addition user can make adjustment to exchange resources using
  following command

echo 1024 > /sys/class/scsi_host/host/ql2xiniexchg
echo 1024 > /sys/class/scsi_host/host/ql2xexchoffld

- trigger mode change and new setting of ql2xexchoffld|ql2xiniexchg

echo [] > /sys/class/scsi_host/host/qlini_mode

where, value can be one of following
  - enabled
  - disabled
  - dual
  - exclusive

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 449 ++
 drivers/scsi/qla2xxx/qla_def.h|   7 +
 drivers/scsi/qla2xxx/qla_gbl.h|   5 +-
 drivers/scsi/qla2xxx/qla_init.c   |  15 ++
 drivers/scsi/qla2xxx/qla_inline.h |   6 +-
 drivers/scsi/qla2xxx/qla_os.c |  59 +++--
 drivers/scsi/qla2xxx/qla_target.c |  26 ++-
 7 files changed, 542 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index e1ae880d5b68..a31d23905753 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1632,6 +1632,433 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
ha->max_speed_sup ? "32Gps" : "16Gps");
 }
 
+/* - */
+
+static ssize_t
+qlini_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   int len = 0;
+
+   len += scnprintf(buf + len, PAGE_SIZE-len,
+   "Supported options: enabled | disabled | dual | exclusive\n");
+
+   /* --- */
+   len += scnprintf(buf + len, PAGE_SIZE-len, "Current selection: ");
+
+   switch (vha->qlini_mode) {
+   case QLA2XXX_INI_MODE_EXCLUSIVE:
+   len += scnprintf(buf + len, PAGE_SIZE-len,
+   QLA2XXX_INI_MODE_STR_EXCLUSIVE);
+   break;
+   case QLA2XXX_INI_MODE_DISABLED:
+   len += scnprintf(buf + len, PAGE_SIZE-len,
+   QLA2XXX_INI_MODE_STR_DISABLED);
+   break;
+   case QLA2XXX_INI_MODE_ENABLED:
+   len += scnprintf(buf + len, PAGE_SIZE-len,
+   QLA2XXX_INI_MODE_STR_ENABLED);
+   break;
+   case QLA2XXX_INI_MODE_DUAL:
+   len += scnprintf(buf + len, PAGE_SIZE-len,
+   QLA2XXX_INI_MODE_STR_DUAL);
+   break;
+   }
+   len += scnprintf(buf + len, PAGE_SIZE-len, "\n");
+
+   return len;
+}
+
+static char *mode_to_str[] = {
+   "exclusive",
+   "disabled",
+   "enabled",
+   "dual",
+};
+
+#define NEED_EXCH_OFFLOAD(_exchg) ((_exchg) > FW_DEF_EXCHANGES_CNT)
+static int qla_set_ini_mode(scsi_qla_host_t *vha, int op)
+{
+   int rc = 0;
+   enum {
+   NO_ACTION,
+   MODE_CHANGE_ACCEPT,
+   MODE_CHANGE_NO_ACTION,
+   TARGET_STILL_ACTIVE,
+   };
+   int action = NO_ACTION;
+   int set_mode = 0;
+   u8  eo_toggle = 0;  /* exchange offload flipped */
+
+   switch (vha->qlini_mode) {
+   case QLA2XXX_INI_MODE_DISABLED:
+   switch (op) {
+   case QLA2XXX_INI_MODE_DISABLED:
+   if (qla_tgt_mode_enabled(vha)) {
+   if (NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld) !=
+   vha->hw->flags.exchoffld_enabled)
+   eo_toggle = 1;
+   if (((vha->ql2xexchoffld !=
+   vha->u_ql2xexchoffld) &&
+   NEED_EXCH_OFFLOAD(vha->u_ql2xexchoffld)) ||
+   eo_toggle) {
+   /*
+* The number of exchange to be offload
+* was tweaked or offload option was
+* flipped
+*/
+   action = MODE_CHANGE_ACCEPT;
+   } else {
+   action = MODE_CHANGE_NO_ACTION;
+   }
+   } else {
+   action = MODE_CHANGE_NO_ACTION;
+   }
+   break;
+   case QLA2XXX_INI_MODE_EXCLUSIVE:
+   if (qla_tgt_mode_enabled(vha)) {
+   if (NEED_EXCH_OFFLOAD(vha->u_q

[PATCH 08/16] qla2xxx: Fix early srb free on abort

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Task abort can take 2 paths: 1) serial/synchronous abort
where the calling thread will put to sleep, wait for completion
and free cmd resource.  2) async abort where the cmd free will
be free by the completion thread.  For path 2, driver is freeing
the SRB too early.

Fixes: f6145e86d21f ("scsi: qla2xxx: Fix race between switch cmd completion and 
timeout")
Cc: sta...@vger.kernel.org # 4.19
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2e836d1427bb..0575210aa8f1 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1850,6 +1850,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
wait_for_completion(_iocb->u.abt.comp);
rval = abt_iocb->u.abt.comp_status == CS_COMPLETE ?
QLA_SUCCESS : QLA_FUNCTION_FAILED;
+   } else {
+   goto done;
}
 
 done_free_sp:
-- 
2.12.0



[PATCH 10/16] qla2xxx: shutdown chip if reset fail

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

if chip unable to fully initialize, use full shutdown
sequence to clear out any stale FW state.

Fixes: e315cd28b9ef ("[SCSI] qla2xxx: Code changes for qla data structure 
refactoring")
Cc: sta...@vger.kernel.org  #4.10
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index bd1afa3063ee..41e5358d3739 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -6784,7 +6784,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
 * The next call disables the board
 * completely.
 */
-   ha->isp_ops->reset_adapter(vha);
+   qla2x00_abort_isp_cleanup(vha);
vha->flags.online = 0;
clear_bit(ISP_ABORT_RETRY,
>dpc_flags);
-- 
2.12.0



[PATCH 02/16] qla2xxx: Increase abort timeout value

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Abort IOCB request can take up to 40s or 2 ABTS timeout.
We will wait for ABTS response for 20s. On a timeout, second
ABTS can go out with another 20s timeout. On 2nd ABTS timeout
FW will automatically do Logout.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cb2538a91f4c..096743331ec4 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1830,7 +1830,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
 
abt_iocb->timeout = qla24xx_abort_iocb_timeout;
init_completion(_iocb->u.abt.comp);
-   qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha));
+   /* FW can send 2 x ABTS's timeout/20s */
+   qla2x00_init_timer(sp, 42);
 
abt_iocb->u.abt.cmd_hndl = cmd_sp->handle;
abt_iocb->u.abt.req_que_no = cpu_to_le16(cmd_sp->qpair->req->id);
-- 
2.12.0



[PATCH 04/16] qla2xxx: Fix port speed display on chip reset

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Clear port speed value on chip reset.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 096743331ec4..4d04603dd4ae 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -6560,6 +6560,7 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
if (!(IS_P3P_TYPE(ha)))
ha->isp_ops->reset_chip(vha);
 
+   ha->link_data_rate = PORT_SPEED_UNKNOWN;
SAVE_TOPO(ha);
ha->flags.rida_fmt2 = 0;
ha->flags.n2n_ae = 0;
-- 
2.12.0



[PATCH 14/16] qla2xxx: Fix duplicate switch's Nport ID entries

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Current code relies on switch to provide a unique combination
of WWPN + NPORTID to tract an FC port.  This patch tries to detect
a case where switch data base can get corrupted where multiple WWPNs
can have the same Nport ID.  The 1st Nport ID on the list will be
kept while the duplicate Nport ID will be discard.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 24 +++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 56a80c6e50e3..84e234c1f302 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3619,9 +3619,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
fc_port_t *fcport;
u32 i, rc;
bool found;
-   struct fab_scan_rp *rp;
+   struct fab_scan_rp *rp, *trp;
unsigned long flags;
u8 recheck = 0;
+   u16 dup = 0, dup_cnt = 0;
 
ql_dbg(ql_dbg_disc, vha, 0x,
"%s enter\n", __func__);
@@ -3652,6 +3653,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
 
for (i = 0; i < vha->hw->max_fibre_devices; i++) {
u64 wwn;
+   int k;
 
rp = >scan.l[i];
found = false;
@@ -3660,6 +3662,20 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
if (wwn == 0)
continue;
 
+   /* Remove duplicate NPORT ID entries from switch data base */
+   for (k = i + 1; k < vha->hw->max_fibre_devices; k++) {
+   trp = >scan.l[k];
+   if (rp->id.b24 == trp->id.b24) {
+   dup = 1;
+   dup_cnt++;
+   ql_dbg(ql_dbg_disc + ql_dbg_verbose,
+   vha, 0x,
+   "Detected duplicate NPORT ID from switch 
data base: ID %06x WWN %8phN WWN %8phN\n",
+   rp->id.b24, rp->port_name, trp->port_name);
+   memset(trp, 0, sizeof(*trp));
+   }
+   }
+
if (!memcmp(rp->port_name, vha->port_name, WWN_SIZE))
continue;
 
@@ -3699,6 +3715,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
}
}
 
+   if (dup) {
+   ql_log(ql_log_warn, vha, 0x,
+   "Detected %d duplicate NPORT ID(s) from switch data base\n",
+   dup_cnt);
+   }
+
/*
 * Logout all previous fabric dev marked lost, except FCP2 devices.
 */
-- 
2.12.0



[PATCH 15/16] qla2xxx: Fix double increment of switch scan retry count

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

This patch fixes issue when switch command fails, current code
increments retry count twice. This results into less number
of retries.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 37 +
 1 file changed, 17 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 84e234c1f302..64ebd790b922 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3800,7 +3800,7 @@ static int qla2x00_post_gnnft_gpnft_done_work(struct 
scsi_qla_host *vha,
return qla2x00_post_work(vha, e);
 }
 
-static int qla2x00_post_nvme_gpnft_done_work(struct scsi_qla_host *vha,
+static int qla2x00_post_nvme_gpnft_work(struct scsi_qla_host *vha,
 srb_t *sp, int cmd)
 {
struct qla_work_evt *e;
@@ -3930,6 +3930,7 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
"Async done-%s res %x FC4Type %x\n",
sp->name, res, sp->gen2);
 
+   del_timer(>u.iocb_cmd.timer);
sp->rc = res;
if (res) {
unsigned long flags;
@@ -3945,48 +3946,44 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
if (rc) {
/* Cleanup here to prevent memory leak */
qla24xx_sp_unmap(vha, sp);
-   }
 
-   spin_lock_irqsave(>work_lock, flags);
-   vha->scan.scan_flags &= ~SF_SCANNING;
-   vha->scan.scan_retry++;
-   spin_unlock_irqrestore(>work_lock, flags);
+   spin_lock_irqsave(>work_lock, flags);
+   vha->scan.scan_flags &= ~SF_SCANNING;
+   vha->scan.scan_retry++;
+   spin_unlock_irqrestore(>work_lock, flags);
 
-   if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
-   set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
-   set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
-   qla2xxx_wake_dpc(vha);
-   } else {
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "Async done-%s rescan failed on all retries.\n",
-   name);
+   if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
+   set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
+   set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   } else {
+   ql_dbg(ql_dbg_disc, vha, 0x,
+   "Async done-%s rescan failed on all 
retries.\n",
+   name);
+   }
}
return;
}
 
-   if (!res)
-   qla2x00_find_free_fcp_nvme_slot(vha, sp);
+   qla2x00_find_free_fcp_nvme_slot(vha, sp);
 
if ((fc4_type == FC4_TYPE_FCP_SCSI) && vha->flags.nvme_enabled &&
cmd == GNN_FT_CMD) {
-   del_timer(>u.iocb_cmd.timer);
spin_lock_irqsave(>work_lock, flags);
vha->scan.scan_flags &= ~SF_SCANNING;
spin_unlock_irqrestore(>work_lock, flags);
 
sp->rc = res;
-   rc = qla2x00_post_nvme_gpnft_done_work(vha, sp, QLA_EVT_GPNFT);
+   rc = qla2x00_post_nvme_gpnft_work(vha, sp, QLA_EVT_GPNFT);
if (rc) {
qla24xx_sp_unmap(vha, sp);
set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
-   return;
}
return;
}
 
if (cmd == GPN_FT_CMD) {
-   del_timer(>u.iocb_cmd.timer);
rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp,
QLA_EVT_GPNFT_DONE);
} else {
-- 
2.12.0



[PATCH 12/16] qla2xxx: Fix premature command free

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

When qla2xxx and Target Core gets out of sync, during
command cleanup, qla2xxx will not free command until
it is out of firmware's hand and Target Core has called
the release on the command.

This patch adds synchronization using cmd_lock and release flag.
if the release flag is set then qla2xxx will free up the command
using qlt_free_cmd() otherwise transport_generic_free_cmd() will
be responsible for relase of the command.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_target.c  |  4 
 drivers/scsi/qla2xxx/qla_target.h  |  1 +
 drivers/scsi/qla2xxx/tcm_qla2xxx.c | 45 +++---
 3 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 666146a86d10..a69ec4519d81 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -3383,7 +3383,9 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int 
xmit_type,
 
 
cmd->state = QLA_TGT_STATE_PROCESSED; /* Mid-level is done processing */
+   spin_lock(>cmd_lock);
cmd->cmd_sent_to_fw = 1;
+   spin_unlock(>cmd_lock);
cmd->ctio_flags = le16_to_cpu(pkt->u.status0.flags);
 
/* Memory Barrier */
@@ -3462,7 +3464,9 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
qlt_load_data_segments();
 
cmd->state = QLA_TGT_STATE_NEED_DATA;
+   spin_lock(>cmd_lock);
cmd->cmd_sent_to_fw = 1;
+   spin_unlock(>cmd_lock);
cmd->ctio_flags = le16_to_cpu(pkt->u.status0.flags);
 
/* Memory Barrier */
diff --git a/drivers/scsi/qla2xxx/qla_target.h 
b/drivers/scsi/qla2xxx/qla_target.h
index 6a59c99a63da..91403269b204 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -900,6 +900,7 @@ struct qla_tgt_cmd {
unsigned int aborted:1;
unsigned int data_work:1;
unsigned int data_work_free:1;
+   unsigned int released:1;
 
struct scatterlist *sg; /* cmd data buffer SG vector */
int sg_cnt; /* SG segments count */
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c 
b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index e03d12a5f986..7d3d4a82fe96 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -277,14 +277,25 @@ static void tcm_qla2xxx_free_mcmd(struct qla_tgt_mgmt_cmd 
*mcmd)
 static void tcm_qla2xxx_complete_free(struct work_struct *work)
 {
struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work);
+   bool released = false;
+   unsigned long flags;
 
cmd->cmd_in_wq = 0;
 
WARN_ON(cmd->trc_flags & TRC_CMD_FREE);
 
+   spin_lock_irqsave(>cmd_lock, flags);
cmd->qpair->tgt_counters.qla_core_ret_sta_ctio++;
cmd->trc_flags |= TRC_CMD_FREE;
-   transport_generic_free_cmd(>se_cmd, 0);
+   cmd->cmd_sent_to_fw = 0;
+   if (cmd->released)
+   released = true;
+   spin_unlock_irqrestore(>cmd_lock, flags);
+
+   if (released)
+   qlt_free_cmd(cmd);
+   else
+   transport_generic_free_cmd(>se_cmd, 0);
 }
 
 /*
@@ -325,6 +336,7 @@ static int tcm_qla2xxx_check_stop_free(struct se_cmd 
*se_cmd)
 static void tcm_qla2xxx_release_cmd(struct se_cmd *se_cmd)
 {
struct qla_tgt_cmd *cmd;
+   unsigned long flags;
 
if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) {
struct qla_tgt_mgmt_cmd *mcmd = container_of(se_cmd,
@@ -332,9 +344,16 @@ static void tcm_qla2xxx_release_cmd(struct se_cmd *se_cmd)
qlt_free_mcmd(mcmd);
return;
}
-
cmd = container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
-   qlt_free_cmd(cmd);
+
+   spin_lock_irqsave(>cmd_lock, flags);
+   if (cmd->cmd_sent_to_fw) {
+   cmd->released = 1;
+   spin_unlock_irqrestore(>cmd_lock, flags);
+   } else {
+   spin_unlock_irqrestore(>cmd_lock, flags);
+   qlt_free_cmd(cmd);
+   }
 }
 
 static void tcm_qla2xxx_release_session(struct kref *kref)
@@ -499,6 +518,7 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, 
struct qla_tgt_cmd *cmd,
 static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
 {
struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work);
+   unsigned long flags;
 
/*
 * Ensure that the complete FCP WRITE payload has been received.
@@ -506,6 +526,25 @@ static void tcm_qla2xxx_handle_data_work(struct 
work_struct *work)
 */
cmd->cmd_in_wq = 0;
 
+   spin_lock_irqsave(>cmd_lock, flags);
+   cmd->cmd_sent_to_fw = 0;
+
+   if (cmd->released) {
+   spin_unlock_irqrestore(>cmd_lock, flags);
+   qlt_free_cmd(cmd);
+   retur

[PATCH 16/16] qla2xxx: Update driver version to 10.00.00.11-k

2018-09-11 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_version.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_version.h 
b/drivers/scsi/qla2xxx/qla_version.h
index 9559f1836170..12bafff71a1a 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,7 +7,7 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.10-k"
+#define QLA2XXX_VERSION  "10.00.00.11-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH 05/16] qla2xxx: Fix dropped srb resource.

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

When FW rejects a command due to "entry_status" error
(malform IOCB), the srb resource needs to be return back
for cleanup.  The filter to catch this is in the wrong
location.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_isr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 0087174d3766..d73b04e40590 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -2845,6 +2845,7 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que 
*rsp, sts_entry_t *pkt)
case ELS_IOCB_TYPE:
case ABORT_IOCB_TYPE:
case MBX_IOCB_TYPE:
+   default:
sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
if (sp) {
sp->done(sp, res);
@@ -2855,7 +2856,6 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que 
*rsp, sts_entry_t *pkt)
case ABTS_RESP_24XX:
case CTIO_TYPE7:
case CTIO_CRC2:
-   default:
return 1;
}
 fatal:
-- 
2.12.0



[PATCH 09/16] qla2xxx: Fix stuck session in PLOGI state

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

On PLOGI complete + RSCN received, driver tries
to handle RSCN but failed to reset the session back
to the beginning to restart the login process. Instead
the session was left in the Plogi complete without
moving forward.  This patch will push the session state
back to the delete state and restart the connection.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c   | 13 +
 drivers/scsi/qla2xxx/qla_target.c |  4 
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 0575210aa8f1..bd1afa3063ee 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -414,6 +414,7 @@ void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
return;
} else if (ea->sp->gen1 != ea->fcport->rscn_gen) {
qla_rscn_replay(fcport);
+   qlt_schedule_sess_for_deletion(fcport);
return;
}
 
@@ -538,6 +539,7 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t 
*vha,
 
if (fcport->last_rscn_gen != fcport->rscn_gen) {
qla_rscn_replay(fcport);
+   qlt_schedule_sess_for_deletion(fcport);
return;
} else if (fcport->last_login_gen != fcport->login_gen) {
ql_dbg(ql_dbg_disc, vha, 0x20e0,
@@ -1229,6 +1231,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
return;
} else if (ea->sp->gen1 != fcport->rscn_gen) {
qla_rscn_replay(fcport);
+   qlt_schedule_sess_for_deletion(fcport);
return;
}
 
@@ -1699,9 +1702,7 @@ void qla_rscn_replay(fc_port_t *fcport)
 #else
qla24xx_post_gpnid_work(fcport->vha, );
 #endif
-   } else {
-   qla24xx_post_gnl_work(fcport->vha, fcport);
-   }
+   }
 }
 
 static void
@@ -1938,7 +1939,7 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host 
*vha, struct event_arg *ea)
"%s %8phC DS %d LS %d rc %d login %d|%d rscn %d|%d data %x|%x iop 
%x|%x\n",
__func__, fcport->port_name, fcport->disc_state,
fcport->fw_login_state, ea->rc, ea->sp->gen2, fcport->login_gen,
-   ea->sp->gen2, fcport->rscn_gen|ea->sp->gen1,
+   ea->sp->gen1, fcport->rscn_gen,
ea->data[0], ea->data[1], ea->iop[0], ea->iop[1]);
 
if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) ||
@@ -1960,7 +1961,11 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host 
*vha, struct event_arg *ea)
set_bit(RELOGIN_NEEDED, >dpc_flags);
return;
} else if (ea->sp->gen1 != fcport->rscn_gen) {
+   ql_dbg(ql_dbg_disc, vha, 0x20d3,
+   "%s %8phC RSCN generation changed\n",
+   __func__, fcport->port_name);
qla_rscn_replay(fcport);
+   qlt_schedule_sess_for_deletion(fcport);
return;
}
 
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index c0b9e0d079c0..666146a86d10 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1260,9 +1260,6 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
break;
}
 
-   if (sess->deleted == QLA_SESS_DELETED)
-   sess->logout_on_delete = 0;
-
spin_lock_irqsave(>vha->work_lock, flags);
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
spin_unlock_irqrestore(>vha->work_lock, flags);
@@ -4080,7 +4077,6 @@ static void qlt_do_ctio_completion(struct scsi_qla_host 
*vha,
 * Session is already logged out, but we need
 * to notify initiator, who's not aware of this
 */
-   cmd->sess->logout_on_delete = 0;
cmd->sess->send_els_logo = 1;
ql_dbg(ql_dbg_disc, vha, 0x20f8,
"%s %d %8phC post del sess\n",
-- 
2.12.0



[PATCH 11/16] qla2xxx: Reject bsg request if chip is down.

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

Reject bsg request if chip is down.  This prevent erroneous
timeout.

Fixes: d051a5aa1c23 ("[SCSI] qla2xxx: Add an "is reset active" helper.")
Cc: sta...@vger.kernel.org # 4.10
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index c11a89be292c..4a9fd8d944d6 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2487,7 +2487,7 @@ qla24xx_bsg_request(struct bsg_job *bsg_job)
vha = shost_priv(host);
}
 
-   if (qla2x00_reset_active(vha)) {
+   if (qla2x00_chip_is_down(vha)) {
ql_dbg(ql_dbg_user, vha, 0x709f,
"BSG: ISP abort active/needed -- cmd=%d.\n",
bsg_request->msgcode);
-- 
2.12.0



[PATCH 03/16] qla2xxx: Check for Register disconnect

2018-09-11 Thread Himanshu Madhani
From: Sawan Chandak 

During adapter shutdown process check for register disconnect
before proceeding to call PCI functions.

Signed-off-by: Sawan Chandak 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_os.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 8a2ba6bb5d1b..3befe11d6425 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1783,6 +1783,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
!ha->flags.eeh_busy &&
(!test_bit(ABORT_ISP_ACTIVE,
>dpc_flags)) &&
+   !qla2x00_isp_reg_stat(ha) &&
(sp->type == SRB_SCSI_CMD)) {
/*
 * Don't abort commands in adapter
-- 
2.12.0



[PATCH 06/16] qla2xxx: Fix race condition for resource cleanup

2018-09-11 Thread Himanshu Madhani
From: Quinn Tran 

For Loop topology + Initiator, FW is in control of PLOGI/PRLI.
When link is reset, driver will try to cleanup the session by
doing an Implicit Logout.  Instead, the code is doing an
Explicit Logout.  The explicit logout interferes with FW state
machine in trying to reconnect.  The implicit logout was meant
for FW to flush commands.  In loop, it is not needed because
FW will auto flush.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 13 +
 drivers/scsi/qla2xxx/qla_iocb.c |  3 +--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 4d04603dd4ae..6f6739b945ea 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -4991,6 +4991,19 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
(uint8_t *)ha->gid_list,
entries * sizeof(struct gid_list_info));
 
+   if (entries == 0) {
+   spin_lock_irqsave(>work_lock, flags);
+   vha->scan.scan_retry++;
+   spin_unlock_irqrestore(>work_lock, flags);
+
+   if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
+   set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
+   set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
+   }
+   } else {
+   vha->scan.scan_retry = 0;
+   }
+
list_for_each_entry(fcport, >vp_fcports, list) {
fcport->scan_state = QLA_FCPORT_SCAN;
}
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 6335b8ce5fbd..4de910231ba6 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2270,8 +2270,7 @@ qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
logio->control_flags =
cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);
-   if (!sp->fcport->se_sess ||
-   !sp->fcport->keep_nport_handle)
+   if (!sp->fcport->keep_nport_handle)
logio->control_flags |= cpu_to_le16(LCF_FREE_NPORT);
logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
logio->port_id[0] = sp->fcport->d_id.b.al_pa;
-- 
2.12.0



[PATCH 01/16] qla2xxx: Allow FC-NVMe underrun to be handled by transport

2018-09-11 Thread Himanshu Madhani
From: Darren Trapp 

This patch allows FC-NVMe under-run to be handled by transport

Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_isr.c | 34 +-
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index bc97e3a1bef7..0087174d3766 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -1850,11 +1850,12 @@ static void qla24xx_nvme_iocb_entry(scsi_qla_host_t 
*vha, struct req_que *req,
struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
uint16_tstate_flags;
struct nvmefc_fcp_req *fd;
-   uint16_tret = 0;
+   uint16_tret = QLA_SUCCESS;
+   uint16_tcomp_status = le16_to_cpu(sts->comp_status);
 
iocb = >u.iocb_cmd;
fcport = sp->fcport;
-   iocb->u.nvme.comp_status = le16_to_cpu(sts->comp_status);
+   iocb->u.nvme.comp_status = comp_status;
state_flags  = le16_to_cpu(sts->state_flags);
fd = iocb->u.nvme.desc;
 
@@ -1892,28 +1893,35 @@ static void qla24xx_nvme_iocb_entry(scsi_qla_host_t 
*vha, struct req_que *req,
fd->transferred_length = fd->payload_length -
le32_to_cpu(sts->residual_len);
 
-   switch (le16_to_cpu(sts->comp_status)) {
+   if (unlikely(comp_status != CS_COMPLETE))
+   ql_log(ql_log_warn, fcport->vha, 0x5060,
+  "NVME-%s ERR Handling - hdl=%x status(%x) tr_len:%x resid=%x 
 ox_id=%x\n",
+  sp->name, sp->handle, comp_status,
+  fd->transferred_length, le32_to_cpu(sts->residual_len),
+  sts->ox_id);
+
+   /*
+* If transport error then Failure (HBA rejects request)
+* otherwise transport will handle.
+*/
+   switch (comp_status) {
case CS_COMPLETE:
-   ret = QLA_SUCCESS;
break;
-   case CS_ABORTED:
+
case CS_RESET:
case CS_PORT_UNAVAILABLE:
case CS_PORT_LOGGED_OUT:
+   fcport->nvme_flag |= NVME_FLAG_RESETTING;
+   /* fall through */
+   case CS_ABORTED:
case CS_PORT_BUSY:
-   ql_log(ql_log_warn, fcport->vha, 0x5060,
-   "NVME-%s ERR Handling - hdl=%x completion status(%x) 
resid=%x  ox_id=%x\n",
-   sp->name, sp->handle, sts->comp_status,
-   le32_to_cpu(sts->residual_len), sts->ox_id);
fd->transferred_length = 0;
iocb->u.nvme.rsp_pyld_len = 0;
ret = QLA_ABORTED;
break;
+   case CS_DATA_UNDERRUN:
+   break;
default:
-   ql_log(ql_log_warn, fcport->vha, 0x5060,
-   "NVME-%s error - hdl=%x completion status(%x) resid=%x  
ox_id=%x\n",
-   sp->name, sp->handle, sts->comp_status,
-   le32_to_cpu(sts->residual_len), sts->ox_id);
ret = QLA_FUNCTION_FAILED;
break;
}
-- 
2.12.0



[PATCH 05/13] qla2xxx: Fix out of order Termination and ABTS response

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

Following changes are added by this patch

- Prevent ABTS Response from getting in front of Termination of
  exchange. Firmware requires driver to cleanup exchanges before
  ABTS response can be sent. This reduces ABTS response error
  which triggers extra command re-termination and re-sending of ABTS
  response.
- Add bits in driver and tracks CTIO/ATIO attribute bits for proper
  command Termination. A copy of the ATTR bits will be kept in the
  ABTS task management command as a back up copy, if an ABTS response
  encounters an error.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|   1 +
 drivers/scsi/qla2xxx/qla_os.c | 130 ++---
 drivers/scsi/qla2xxx/qla_target.c | 300 +-
 drivers/scsi/qla2xxx/qla_target.h |   6 +-
 4 files changed, 277 insertions(+), 160 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 8722abff7061..8cbfbeb0751c 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -519,6 +519,7 @@ struct srb_iocb {
 enum {
TYPE_SRB,
TYPE_TGT_CMD,
+   TYPE_TGT_TMCMD, /* task management */
 };
 
 typedef struct srb {
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index f3787fc48533..d0d5e332bafc 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1732,64 +1732,84 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
sp = req->outstanding_cmds[cnt];
if (sp) {
req->outstanding_cmds[cnt] = NULL;
-   if (sp->cmd_type == TYPE_SRB) {
-   if (sp->type == SRB_NVME_CMD ||
-   sp->type == SRB_NVME_LS) {
-   sp_get(sp);
-   spin_unlock_irqrestore(qp->qp_lock_ptr,
-   flags);
-   qla_nvme_abort(ha, sp, res);
-   spin_lock_irqsave(qp->qp_lock_ptr,
-   flags);
-   } else if (GET_CMD_SP(sp) &&
-   !ha->flags.eeh_busy &&
-   (!test_bit(ABORT_ISP_ACTIVE,
-   >dpc_flags)) &&
-   (sp->type == SRB_SCSI_CMD)) {
-   /*
-* Don't abort commands in
-* adapter during EEH
-* recovery as it's not
-* accessible/responding.
-*
-* Get a reference to the sp
-* and drop the lock. The
-* reference ensures this
-* sp->done() call and not the
-* call in qla2xxx_eh_abort()
-* ends the SCSI command (with
-* result 'res').
-*/
-   sp_get(sp);
-   spin_unlock_irqrestore(qp->qp_lock_ptr,
-   flags);
-   status = qla2xxx_eh_abort(
-   GET_CMD_SP(sp));
-   spin_lock_irqsave(qp->qp_lock_ptr,
-   flags);
+   switch (sp->cmd_type) {
+   case TYPE_SRB:
+   if (sp->cmd_type == TYPE_SRB) {
+   if (sp->type == SRB_NVME_CMD ||
+   sp->type == SRB_NVME_LS) {
+   sp_get(sp);
+   spin_unlock_irqrestore
+   (qp->qp_lock_ptr,
+flags);
+   qla_nvme_abort(ha, sp, res);
+   spin_lock_irqsave
+   (qp->qp_lock_ptr,
+flags);
+   } else if (GET_CMD_SP(sp) &&
+   !ha->flags.eeh_busy &&
+  

[PATCH 00/13] qla2xxx: Updates for driver

2018-09-04 Thread Himanshu Madhani
Hi Martin, 

This series contains support for ZIO interrupt threashold and cleanups. 

Please apply this series to 4.20/scsi-queue at your earliest convenience.

Thanks,
Himanshu

Himanshu Madhani (3):
  qla2xxx: Remove ASYNC GIDPN switch command
  qla2xxx: Remove stale ADISC_DONE event
  qla2xxx: Update driver version to 10.00.00.10-k

Quinn Tran (10):
  qla2xxx: Serialize mailbox request
  qla2xxx: Fix deadlock between ATIO and HW lock
  qla2xxx: Add appropriate debug info for invalid RX_ID
  qla2xxx: Add logic to detect ABTS hang and response completion
  qla2xxx: Fix out of order Termination and ABTS response
  qla2xxx: Add support for ZIO6 interrupt threshold
  qla2xxx: Move {get|rel}_sp to base_qpair struct
  qla2xxx: Reduce holding sess_lock to prevent CPU lock-up
  qla2xxx: Fix Remote port registration
  qla2xxx: Move ABTS code behind qpair

 drivers/scsi/qla2xxx/qla_attr.c| 138 +++--
 drivers/scsi/qla2xxx/qla_def.h |  17 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   7 +-
 drivers/scsi/qla2xxx/qla_gs.c  | 257 ++-
 drivers/scsi/qla2xxx/qla_init.c| 187 +
 drivers/scsi/qla2xxx/qla_inline.h  |  17 +-
 drivers/scsi/qla2xxx/qla_iocb.c|   9 +-
 drivers/scsi/qla2xxx/qla_isr.c |  48 ++---
 drivers/scsi/qla2xxx/qla_mbx.c |  44 +++-
 drivers/scsi/qla2xxx/qla_nvme.c|   2 +-
 drivers/scsi/qla2xxx/qla_os.c  | 203 +++---
 drivers/scsi/qla2xxx/qla_target.c  | 408 -
 drivers/scsi/qla2xxx/qla_target.h  |   7 +-
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 14 files changed, 732 insertions(+), 614 deletions(-)

-- 
2.12.0



[PATCH 01/13] qla2xxx: Serialize mailbox request

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

For driver MBX submission, use mbox_busy to serialize request.
For Userspace MBX submission, use optrom mutext to serialize request.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 106 +++---
 drivers/scsi/qla2xxx/qla_mbx.c|  36 ++---
 drivers/scsi/qla2xxx/qla_target.c |  25 -
 3 files changed, 127 insertions(+), 40 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 4888b999e82f..14c496bab280 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -158,9 +158,17 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN))
return 0;
 
+   mutex_lock(>optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
+   mutex_unlock(>optrom_mutex);
+   return -EAGAIN;
+   }
+
if (IS_NOCACHE_VPD_TYPE(ha))
ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram 
<< 2,
ha->nvram_size);
+   mutex_unlock(>optrom_mutex);
+
return memory_read_from_buffer(buf, count, , ha->nvram,
ha->nvram_size);
 }
@@ -208,10 +216,17 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct 
kobject *kobj,
return -EAGAIN;
}
 
+   mutex_lock(>optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
+   mutex_unlock(>hw->optrom_mutex);
+   return -EAGAIN;
+   }
+
/* Write NVRAM. */
ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count);
ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base,
-   count);
+count);
+   mutex_unlock(>optrom_mutex);
 
ql_dbg(ql_dbg_user, vha, 0x7060,
"Setting ISP_ABORT_NEEDED\n");
@@ -322,6 +337,10 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct 
kobject *kobj,
size = ha->optrom_size - start;
 
mutex_lock(>optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
+   mutex_unlock(>optrom_mutex);
+   return -EAGAIN;
+   }
switch (val) {
case 0:
if (ha->optrom_state != QLA_SREADING &&
@@ -499,8 +518,14 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
faddr = ha->flt_region_vpd_sec << 2;
 
+   mutex_lock(>optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
+   mutex_unlock(>optrom_mutex);
+   return -EAGAIN;
+   }
ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
ha->vpd_size);
+   mutex_unlock(>optrom_mutex);
}
return memory_read_from_buffer(buf, count, , ha->vpd, ha->vpd_size);
 }
@@ -518,9 +543,6 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
if (unlikely(pci_channel_offline(ha->pdev)))
return 0;
 
-   if (qla2x00_chip_is_down(vha))
-   return 0;
-
if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
!ha->isp_ops->write_nvram)
return 0;
@@ -531,16 +553,25 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
return -EAGAIN;
}
 
+   mutex_lock(>optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
+   mutex_unlock(>optrom_mutex);
+   return -EAGAIN;
+   }
+
/* Write NVRAM. */
ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count);
ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count);
 
/* Update flash version information for 4Gb & above. */
-   if (!IS_FWI2_CAPABLE(ha))
+   if (!IS_FWI2_CAPABLE(ha)) {
+   mutex_unlock(>optrom_mutex);
return -EINVAL;
+   }
 
tmp_data = vmalloc(256);
if (!tmp_data) {
+   mutex_unlock(>optrom_mutex);
ql_log(ql_log_warn, vha, 0x706b,
"Unable to allocate memory for VPD information update.\n");
return -ENOMEM;
@@ -548,6 +579,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
ha->isp_ops->get_flash_version(vha, tmp_data);
vfree(tmp_data);
 
+   mutex_unlock(>optrom_mutex);
+
return count;
 }
 
@@ -573,10 +606,15 @@ qla2x00_sysfs_read_sfp(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN) || off != 0 || count < SFP_DEV_SIZE)
return 0;
 
-   if (

[PATCH 08/13] qla2xxx: Reduce holding sess_lock to prevent CPU lock-up

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

- Reduce sess_lock holding to prevent CPU Lock up. sess_lock
was held across fc_port registration and deletion.  These calls
can be blocked by upper layer. Sess_lock is also being accessed
by interrupt thread.
- reduce number of loops in processing work_list to prevent
kernel complain of CPU lockup or holding sess_lock.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  2 +-
 drivers/scsi/qla2xxx/qla_gs.c | 18 --
 drivers/scsi/qla2xxx/qla_init.c   | 33 +
 drivers/scsi/qla2xxx/qla_os.c |  3 +--
 drivers/scsi/qla2xxx/qla_target.c |  2 ++
 5 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 3a03fe217ac2..8b8c7c8db1ca 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -262,8 +262,8 @@ struct name_list_extended {
struct get_name_list_extended *l;
dma_addr_t  ldma;
struct list_headfcports;
-   spinlock_t  fcports_lock;
u32 size;
+   u8  sent;
 };
 /*
  * Timeout timer counts in seconds
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 385c46f2576e..3c8882a3e6bc 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3946,11 +3946,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
if ((qla_dual_mode_enabled(vha) ||
qla_ini_mode_enabled(vha)) &&
atomic_read(>state) == FCS_ONLINE) {
-   qla2x00_mark_device_lost(vha, fcport,
-   ql2xplogiabsentdevice, 0);
+   if (fcport->loop_id != FC_NO_LOOP_ID) {
+   if (fcport->flags & FCF_FCP2_DEVICE)
+   fcport->logout_on_delete = 0;
 
-   if (fcport->loop_id != FC_NO_LOOP_ID &&
-   (fcport->flags & FCF_FCP2_DEVICE) == 0) {
ql_dbg(ql_dbg_disc, vha, 0x20f0,
"%s %d %8phC post del sess\n",
__func__, __LINE__,
@@ -4188,12 +4187,13 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
 
sp->rc = res;
rc = qla2x00_post_nvme_gpnft_done_work(vha, sp, QLA_EVT_GPNFT);
-   if (!rc) {
+   if (rc) {
qla24xx_sp_unmap(vha, sp);
set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
return;
}
+   return;
}
 
if (cmd == GPN_FT_CMD) {
@@ -4243,6 +4243,8 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, 
struct srb *sp,
vha->scan.scan_flags &= ~SF_SCANNING;
spin_unlock_irqrestore(>work_lock, flags);
WARN_ON(1);
+   set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
+   set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
goto done_free_sp;
}
 
@@ -4276,8 +4278,12 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, 
struct srb *sp,
sp->done = qla2x00_async_gpnft_gnnft_sp_done;
 
rval = qla2x00_start_sp(sp);
-   if (rval != QLA_SUCCESS)
+   if (rval != QLA_SUCCESS) {
+   spin_lock_irqsave(>work_lock, flags);
+   vha->scan.scan_flags &= ~SF_SCANNING;
+   spin_unlock_irqrestore(>work_lock, flags);
goto done_free_sp;
+   }
 
ql_dbg(ql_dbg_disc, vha, 0x,
"Async-%s hdl=%x FC4Type %x.\n", sp->name,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 49c8f0119620..c675066b080e 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -790,6 +790,7 @@ qla24xx_async_gnl_sp_done(void *s, int res)
sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1],
sp->u.iocb_cmd.u.mbx.in_mb[2]);
 
+   sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE);
memset(, 0, sizeof(ea));
ea.sp = sp;
ea.rc = res;
@@ -817,25 +818,24 @@ qla24xx_async_gnl_sp_done(void *s, int res)
(loop_id & 0x7fff));
}
 
-   spin_lock_irqsave(>gnl.fcports_lock, flags);
+   spin_lock_irqsave(>hw->tgt.sess_lock, flags);
 
INIT_LIST_HEAD();
fcport = tf = NULL;
if (!list_empty(>gnl.fcports))
list_splice_init(>gnl.fcports, );
+   spin_unlo

[PATCH 09/13] qla2xxx: Remove ASYNC GIDPN switch command

2018-09-04 Thread Himanshu Madhani
Using GPNFT/GNNFT command will be able to cover switch database
with less number of scans. This patch removes Get NportID with
provided WWPN/GIDPN switch command. By making this change, In
large fabric with lots of remote port or NPIV ports with noisy
SAN, the number of GIDPN commands issued by a port when it detects
large number of remote ports going away or coming back, can
overwhelmn the switch and it can becomde unresponsive. In a case
where the fabric has not change, GIDPN is not required.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |   3 -
 drivers/scsi/qla2xxx/qla_gbl.h  |   5 +-
 drivers/scsi/qla2xxx/qla_gs.c   | 238 +---
 drivers/scsi/qla2xxx/qla_init.c |  90 +++
 drivers/scsi/qla2xxx/qla_os.c   |   3 -
 5 files changed, 73 insertions(+), 266 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 8b8c7c8db1ca..0a1cae0153b0 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2281,7 +2281,6 @@ struct ct_sns_desc {
 enum discovery_state {
DSC_DELETED,
DSC_GNN_ID,
-   DSC_GID_PN,
DSC_GNL,
DSC_LOGIN_PEND,
DSC_LOGIN_FAILED,
@@ -2306,7 +2305,6 @@ enum login_state {/* FW control Target side */
 enum fcport_mgt_event {
FCME_RELOGIN = 1,
FCME_RSCN,
-   FCME_GIDPN_DONE,
FCME_PLOGI_DONE,/* Initiator side sent LLIOCB */
FCME_PRLI_DONE,
FCME_GNL_DONE,
@@ -3219,7 +3217,6 @@ enum qla_work_type {
QLA_EVT_ASYNC_ADISC_DONE,
QLA_EVT_UEVENT,
QLA_EVT_AENFX,
-   QLA_EVT_GIDPN,
QLA_EVT_GPNID,
QLA_EVT_UNMAP,
QLA_EVT_NEW_SESS,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index b8e4abe804d5..db642ea5358f 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -119,6 +119,8 @@ extern int qla2x00_post_async_prlo_done_work(struct 
scsi_qla_host *,
 int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
 void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport);
 int qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *);
+void qla_rscn_replay(fc_port_t *fcport);
+
 /*
  * Global Data in qla_os.c source file.
  */
@@ -645,9 +647,6 @@ extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, 
uint8_t *, size_t);
 extern int qla2x00_chk_ms_status(scsi_qla_host_t *, ms_iocb_entry_t *,
struct ct_sns_rsp *, const char *);
 extern void qla2x00_async_iocb_timeout(void *data);
-extern int qla24xx_async_gidpn(scsi_qla_host_t *, fc_port_t *);
-int qla24xx_post_gidpn_work(struct scsi_qla_host *, fc_port_t *);
-void qla24xx_handle_gidpn_event(scsi_qla_host_t *, struct event_arg *);
 
 extern void qla2x00_free_fcport(fc_port_t *);
 
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 3c8882a3e6bc..56a80c6e50e3 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -2973,237 +2973,6 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list)
}
 }
 
-/* GID_PN completion processing. */
-void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, struct event_arg *ea)
-{
-   fc_port_t *fcport = ea->fcport;
-
-   ql_dbg(ql_dbg_disc, vha, 0x201d,
-   "%s %8phC DS %d LS %d rc %d login %d|%d rscn %d|%d lid %d\n",
-   __func__, fcport->port_name, fcport->disc_state,
-   fcport->fw_login_state, ea->rc, fcport->login_gen, ea->sp->gen2,
-   fcport->rscn_gen, ea->sp->gen1, fcport->loop_id);
-
-   if (fcport->disc_state == DSC_DELETE_PEND)
-   return;
-
-   if (ea->sp->gen2 != fcport->login_gen) {
-   /* PLOGI/PRLI/LOGO came in while cmd was out.*/
-   ql_dbg(ql_dbg_disc, vha, 0x201e,
-   "%s %8phC generation changed rscn %d|%d n",
-   __func__, fcport->port_name, fcport->last_rscn_gen,
-   fcport->rscn_gen);
-   return;
-   }
-
-   if (!ea->rc) {
-   if (ea->sp->gen1 == fcport->rscn_gen) {
-   fcport->scan_state = QLA_FCPORT_FOUND;
-   fcport->flags |= FCF_FABRIC_DEVICE;
-
-   if (fcport->d_id.b24 == ea->id.b24) {
-   /* cable plugged into the same place */
-   switch (vha->host->active_mode) {
-   case MODE_TARGET:
-   if (fcport->fw_login_state ==
-   DSC_LS_PRLI_COMP) {
-   u16 data[2];
-   /*
-

[PATCH 12/13] qla2xxx: Move ABTS code behind qpair

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

Current abort code default to legacy single queue
where hardware_lock is used to protect command search.
This patch move this code behind the QPair where the
qp_lock_ptr will reference the appropriate lock for
either legacy/single queue or MQ.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c |  12 ++-
 drivers/scsi/qla2xxx/qla_mbx.c  |   7 +-
 drivers/scsi/qla2xxx/qla_os.c   | 178 ++--
 3 files changed, 107 insertions(+), 90 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 245baf269656..cb2538a91f4c 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1864,19 +1864,17 @@ qla24xx_async_abort_command(srb_t *sp)
 
uint32_thandle;
fc_port_t   *fcport = sp->fcport;
+   struct qla_qpair *qpair = sp->qpair;
struct scsi_qla_host *vha = fcport->vha;
-   struct qla_hw_data *ha = vha->hw;
-   struct req_que *req = vha->req;
-
-   if (vha->flags.qpairs_available && sp->qpair)
-   req = sp->qpair->req;
+   struct req_que *req = qpair->req;
 
-   spin_lock_irqsave(>hardware_lock, flags);
+   spin_lock_irqsave(qpair->qp_lock_ptr, flags);
for (handle = 1; handle < req->num_outstanding_cmds; handle++) {
if (req->outstanding_cmds[handle] == sp)
break;
}
-   spin_unlock_irqrestore(>hardware_lock, flags);
+   spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
+
if (handle == req->num_outstanding_cmds) {
/* Command not found. */
return QLA_FUNCTION_FAILED;
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 3213017658a6..e016ee9c6d8e 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3097,22 +3097,25 @@ qla24xx_abort_command(srb_t *sp)
struct scsi_qla_host *vha = fcport->vha;
struct qla_hw_data *ha = vha->hw;
struct req_que *req = vha->req;
+   struct qla_qpair *qpair = sp->qpair;
 
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x108c,
"Entered %s.\n", __func__);
 
if (vha->flags.qpairs_available && sp->qpair)
req = sp->qpair->req;
+   else
+   return QLA_FUNCTION_FAILED;
 
if (ql2xasynctmfenable)
return qla24xx_async_abort_command(sp);
 
-   spin_lock_irqsave(>hardware_lock, flags);
+   spin_lock_irqsave(qpair->qp_lock_ptr, flags);
for (handle = 1; handle < req->num_outstanding_cmds; handle++) {
if (req->outstanding_cmds[handle] == sp)
break;
}
-   spin_unlock_irqrestore(>hardware_lock, flags);
+   spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
if (handle == req->num_outstanding_cmds) {
/* Command not found. */
return QLA_FUNCTION_FAILED;
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 6ce5a7326932..8a2ba6bb5d1b 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -14,6 +14,8 @@
 #include 
 #include 
 #include 
+#include 
+
 #include 
 #include 
 #include 
@@ -1214,10 +1216,14 @@ qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha)
return return_status;
 }
 
-static void
+static int
 sp_get(struct srb *sp)
 {
-   atomic_inc(>ref_count);
+   if (!refcount_inc_not_zero((refcount_t*)>ref_count))
+   /* kref get fail */
+   return ENXIO;
+   else
+   return 0;
 }
 
 #define ISP_REG_DISCONNECT 0xU
@@ -1275,38 +1281,51 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
unsigned long flags;
int rval, wait = 0;
struct qla_hw_data *ha = vha->hw;
+   struct qla_qpair *qpair;
 
if (qla2x00_isp_reg_stat(ha)) {
ql_log(ql_log_info, vha, 0x8042,
"PCI/Register disconnect, exiting.\n");
return FAILED;
}
-   if (!CMD_SP(cmd))
-   return SUCCESS;
 
ret = fc_block_scsi_eh(cmd);
if (ret != 0)
return ret;
ret = SUCCESS;
 
-   id = cmd->device->id;
-   lun = cmd->device->lun;
-
-   spin_lock_irqsave(>hardware_lock, flags);
sp = (srb_t *) CMD_SP(cmd);
-   if (!sp) {
-   spin_unlock_irqrestore(>hardware_lock, flags);
+   if (!sp)
+   return SUCCESS;
+
+   qpair = sp->qpair;
+   if (!qpair)
+   return SUCCESS;
+
+   spin_lock_irqsave(qpair->qp_lock_ptr, flags);
+   if (!CMD_SP(cmd)) {
+   /* there's a chance an interrupt could clear
+  the ptr as part of done &am

[PATCH 11/13] qla2xxx: Remove stale ADISC_DONE event

2018-09-04 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  1 -
 drivers/scsi/qla2xxx/qla_gbl.h  |  2 --
 drivers/scsi/qla2xxx/qla_init.c | 20 
 drivers/scsi/qla2xxx/qla_os.c   |  5 -
 4 files changed, 28 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 0a1cae0153b0..8145636c759d 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3214,7 +3214,6 @@ enum qla_work_type {
QLA_EVT_ASYNC_LOGOUT,
QLA_EVT_ASYNC_LOGOUT_DONE,
QLA_EVT_ASYNC_ADISC,
-   QLA_EVT_ASYNC_ADISC_DONE,
QLA_EVT_UEVENT,
QLA_EVT_AENFX,
QLA_EVT_GPNID,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index db642ea5358f..7018067b5707 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -73,8 +73,6 @@ extern void qla2x00_async_login_done(struct scsi_qla_host *, 
fc_port_t *,
 uint16_t *);
 extern void qla2x00_async_logout_done(struct scsi_qla_host *, fc_port_t *,
 uint16_t *);
-extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *,
-uint16_t *);
 struct qla_work_evt *qla2x00_alloc_work(struct scsi_qla_host *,
 enum qla_work_type);
 extern int qla24xx_async_gnl(struct scsi_qla_host *, fc_port_t *);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e7de6f149e34..245baf269656 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -2075,26 +2075,6 @@ qla2x00_async_logout_done(struct scsi_qla_host *vha, 
fc_port_t *fcport,
return;
 }
 
-void
-qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
-uint16_t *data)
-{
-   fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
-   if (data[0] == MBS_COMMAND_COMPLETE) {
-   qla2x00_update_fcport(vha, fcport);
-
-   return;
-   }
-
-   /* Retry login. */
-   if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
-   set_bit(RELOGIN_NEEDED, >dpc_flags);
-   else
-   qla2x00_mark_device_lost(vha, fcport, 1, 0);
-
-   return;
-}
-
 //
 /*QLogic ISP2x00 Hardware Support Functions.*/
 //
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 842456132e27..6ce5a7326932 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -4733,7 +4733,6 @@ qla2x00_post_async_work(login, QLA_EVT_ASYNC_LOGIN);
 qla2x00_post_async_work(logout, QLA_EVT_ASYNC_LOGOUT);
 qla2x00_post_async_work(logout_done, QLA_EVT_ASYNC_LOGOUT_DONE);
 qla2x00_post_async_work(adisc, QLA_EVT_ASYNC_ADISC);
-qla2x00_post_async_work(adisc_done, QLA_EVT_ASYNC_ADISC_DONE);
 qla2x00_post_async_work(prlo, QLA_EVT_ASYNC_PRLO);
 qla2x00_post_async_work(prlo_done, QLA_EVT_ASYNC_PRLO_DONE);
 
@@ -5022,10 +5021,6 @@ qla2x00_do_work(struct scsi_qla_host *vha)
qla2x00_async_adisc(vha, e->u.logio.fcport,
e->u.logio.data);
break;
-   case QLA_EVT_ASYNC_ADISC_DONE:
-   qla2x00_async_adisc_done(vha, e->u.logio.fcport,
-   e->u.logio.data);
-   break;
case QLA_EVT_UEVENT:
qla2x00_uevent_emit(vha, e->u.uevent.code);
break;
-- 
2.12.0



[PATCH 10/13] qla2xxx: Fix Remote port registration

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 3fdd4336017c..e7de6f149e34 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -5291,8 +5291,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t 
*fcport)
fcport->login_retry = vha->hw->login_retry_count;
fcport->n2n_chip_reset = fcport->n2n_link_reset_cnt = 0;
 
-   qla2x00_iidma_fcport(vha, fcport);
-
switch (vha->hw->current_topology) {
case ISP_CFG_N:
case ISP_CFG_NL:
@@ -5302,6 +5300,8 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t 
*fcport)
break;
}
 
+   qla2x00_iidma_fcport(vha, fcport);
+
if (fcport->fc4f_nvme) {
qla_nvme_register_remote(vha, fcport);
fcport->disc_state = DSC_LOGIN_COMPLETE;
@@ -5330,6 +5330,8 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t 
*fcport)
break;
}
 
+   qla2x00_set_fcport_state(fcport, FCS_ONLINE);
+
if (IS_IIDMA_CAPABLE(vha->hw) && vha->hw->flags.gpsc_supported) {
if (fcport->id_changed) {
fcport->id_changed = 0;
@@ -5346,7 +5348,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t 
*fcport)
qla24xx_post_gpsc_work(vha, fcport);
}
}
-   qla2x00_set_fcport_state(fcport, FCS_ONLINE);
 
fcport->disc_state = DSC_LOGIN_COMPLETE;
 }
-- 
2.12.0



[PATCH 06/13] qla2xxx: Add support for ZIO6 interrupt threshold

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

Add SysFS support to control zio6 interrupt threshold. Using this
SysFS hook user can set when to generate intrrupts. This value will
be used to tell firmware to generate interrupt at a cetratin interval.
If the number of exchanges/commands fall below defiened  setting, then
the interrupt will be generated immediately by the firmware.

By default ZIO6 will coalesce interrupts to a specified interval
regardless of low traffic or high traffic.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 32 +
 drivers/scsi/qla2xxx/qla_def.h|  7 ++-
 drivers/scsi/qla2xxx/qla_init.c   |  5 +
 drivers/scsi/qla2xxx/qla_mbx.c|  1 +
 drivers/scsi/qla2xxx/qla_os.c | 42 ++-
 drivers/scsi/qla2xxx/qla_target.c | 17 
 6 files changed, 77 insertions(+), 27 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 14c496bab280..e1ae880d5b68 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1208,6 +1208,34 @@ qla2x00_zio_timer_store(struct device *dev, struct 
device_attribute *attr,
 }
 
 static ssize_t
+qla_zio_threshold_show(struct device *dev, struct device_attribute *attr,
+  char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+
+   return scnprintf(buf, PAGE_SIZE, "%d exchanges\n",
+   vha->hw->last_zio_threshold);
+}
+
+static ssize_t
+qla_zio_threshold_store(struct device *dev, struct device_attribute *attr,
+const char *buf, size_t count)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   int val = 0;
+
+   if (vha->hw->zio_mode != QLA_ZIO_MODE_6)
+   return -EINVAL;
+   if (sscanf(buf, "%d", ) != 1)
+   return -EINVAL;
+   if (val > 256)
+   return -ERANGE;
+
+   atomic_set(>hw->zio_threshold, val);
+   return strlen(buf);
+}
+
+static ssize_t
 qla2x00_beacon_show(struct device *dev, struct device_attribute *attr,
char *buf)
 {
@@ -1651,6 +1679,9 @@ static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
 static DEVICE_ATTR(pep_version, S_IRUGO, qla2x00_pep_version_show, NULL);
 static DEVICE_ATTR(min_link_speed, S_IRUGO, qla2x00_min_link_speed_show, NULL);
 static DEVICE_ATTR(max_speed_sup, S_IRUGO, qla2x00_max_speed_sup_show, NULL);
+static DEVICE_ATTR(zio_threshold, 0644,
+qla_zio_threshold_show,
+qla_zio_threshold_store);
 
 struct device_attribute *qla2x00_host_attrs[] = {
_attr_driver_version,
@@ -1687,6 +1718,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
_attr_pep_version,
_attr_min_link_speed,
_attr_max_speed_sup,
+   _attr_zio_threshold,
NULL,
 };
 
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 8cbfbeb0751c..3a03fe217ac2 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4190,6 +4190,10 @@ struct qla_hw_data {
 
atomic_tnvme_active_aen_cnt;
uint16_tnvme_last_rptd_aen; /* Last recorded aen 
count */
+
+   atomic_t zio_threshold;
+   uint16_t last_zio_threshold;
+#define DEFAULT_ZIO_THRESHOLD 64
 };
 
 #define FW_ABILITY_MAX_SPEED_MASK  0xFUL
@@ -4269,10 +4273,11 @@ typedef struct scsi_qla_host {
 #define FX00_CRITEMP_RECOVERY  25
 #define FX00_HOST_INFO_RESEND  26
 #define QPAIR_ONLINE_CHECK_NEEDED  27
-#define SET_ZIO_THRESHOLD_NEEDED   28
+#define SET_NVME_ZIO_THRESHOLD_NEEDED  28
 #define DETECT_SFP_CHANGE  29
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
+#define SET_ZIO_THRESHOLD_NEEDED 32
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index c3c7ab6fe6e1..fbbf530a38e0 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3532,6 +3532,11 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
if (rval == QLA_SUCCESS) {
qla24xx_detect_sfp(vha);
 
+   if ((IS_QLA83XX(ha) || IS_QLA27XX(ha)) &&
+   (ha->zio_mode == QLA_ZIO_MODE_6))
+   qla27xx_set_zio_threshold(vha,
+   ha->last_zio_threshold);
+
rval = qla2x00_set_exlogins_buffer(vha);
if (rval != QLA_SUCCESS)
goto failed;
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 9d5e320fc1bc..3213017658a6 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -60,6 +60,7 @@ st

[PATCH 07/13] qla2xxx: Move {get|rel}_sp to base_qpair struct

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

Currently, qla2x00_[get_sp|rel_sp] routines does {get|release}
of srb resource/srb_mempool directly from qla_hw_data.
qla2x00_start_sp() is used to issue management commands thorugh
the default Request Q 0 & Response Q 0 or base_qpair. This patch
moves access of these resources through base_qpair. Instead
of having knowledge of specific Q number and lock to rsp/req queue,
this change will key off the qpair that is assigned to the srb
resource. This lays the ground work for other routines to see this
resource through the qpair.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c |  1 -
 drivers/scsi/qla2xxx/qla_init.c   |  3 ++-
 drivers/scsi/qla2xxx/qla_inline.h | 17 +
 drivers/scsi/qla2xxx/qla_iocb.c   |  9 +
 drivers/scsi/qla2xxx/qla_nvme.c   |  2 +-
 drivers/scsi/qla2xxx/qla_os.c |  3 ++-
 6 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 902106f97020..385c46f2576e 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -4157,7 +4157,6 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
if (rc) {
/* Cleanup here to prevent memory leak */
qla24xx_sp_unmap(vha, sp);
-   sp->free(sp);
}
 
spin_lock_irqsave(>work_lock, flags);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index fbbf530a38e0..49c8f0119620 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1761,7 +1761,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
srb_t *sp;
int rval = QLA_FUNCTION_FAILED;
 
-   sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL);
+   sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport,
+   GFP_KERNEL);
if (!sp)
goto done;
 
diff --git a/drivers/scsi/qla2xxx/qla_inline.h 
b/drivers/scsi/qla2xxx/qla_inline.h
index 4351736b2426..bf9a6f01fd9f 100644
--- a/drivers/scsi/qla2xxx/qla_inline.h
+++ b/drivers/scsi/qla2xxx/qla_inline.h
@@ -209,7 +209,8 @@ qla2x00_chip_is_down(scsi_qla_host_t *vha)
 }
 
 static inline srb_t *
-qla2xxx_get_qpair_sp(struct qla_qpair *qpair, fc_port_t *fcport, gfp_t flag)
+qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair,
+fc_port_t *fcport, gfp_t flag)
 {
srb_t *sp = NULL;
uint8_t bail;
@@ -225,7 +226,9 @@ qla2xxx_get_qpair_sp(struct qla_qpair *qpair, fc_port_t 
*fcport, gfp_t flag)
memset(sp, 0, sizeof(*sp));
sp->fcport = fcport;
sp->iocbs = 1;
-   sp->vha = qpair->vha;
+   sp->vha = vha;
+   sp->qpair = qpair;
+   sp->cmd_type = TYPE_SRB;
INIT_LIST_HEAD(>elem);
 
 done:
@@ -246,19 +249,17 @@ qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, 
gfp_t flag)
 {
srb_t *sp = NULL;
uint8_t bail;
+   struct qla_qpair *qpair;
 
QLA_VHA_MARK_BUSY(vha, bail);
if (unlikely(bail))
return NULL;
 
-   sp = mempool_alloc(vha->hw->srb_mempool, flag);
+   qpair = vha->hw->base_qpair;
+   sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, flag);
if (!sp)
goto done;
 
-   memset(sp, 0, sizeof(*sp));
-   sp->fcport = fcport;
-   sp->cmd_type = TYPE_SRB;
-   sp->iocbs = 1;
sp->vha = vha;
 done:
if (!sp)
@@ -270,7 +271,7 @@ static inline void
 qla2x00_rel_sp(srb_t *sp)
 {
QLA_VHA_MARK_NOT_BUSY(sp->vha);
-   mempool_free(sp, sp->vha->hw->srb_mempool);
+   qla2xxx_rel_qpair_sp(sp->qpair, sp);
 }
 
 static inline void
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index c699bbb8485b..6335b8ce5fbd 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -3440,12 +3440,13 @@ qla2x00_start_sp(srb_t *sp)
int rval;
scsi_qla_host_t *vha = sp->vha;
struct qla_hw_data *ha = vha->hw;
+   struct qla_qpair *qp = sp->qpair;
void *pkt;
unsigned long flags;
 
rval = QLA_FUNCTION_FAILED;
-   spin_lock_irqsave(>hardware_lock, flags);
-   pkt = qla2x00_alloc_iocbs(vha, sp);
+   spin_lock_irqsave(qp->qp_lock_ptr, flags);
+   pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
if (!pkt) {
ql_log(ql_log_warn, vha, 0x700c,
"qla2x00_alloc_iocbs failed.\n");
@@ -3523,9 +3524,9 @@ qla2x00_start_sp(srb_t *sp)
}
 
wmb();
-   qla2x00_start_iocbs(vha, ha->req_q_map[0]);
+   qla2x00_start_iocbs(vha, qp->req);
 done:
-   spin_unlock_irqrestore(>hardware_lock, flags);
+   spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
r

[PATCH 03/13] qla2xxx: Add appropriate debug info for invalid RX_ID

2018-09-04 Thread Himanshu Madhani
From: Quinn Tran 

When driver detect CTIO_INVALID_RX_ID status for CTIO, print
message with correct information to help with debugging.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_target.c | 12 +++-
 drivers/scsi/qla2xxx/qla_target.h |  1 +
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 29fbb0aad489..3796525aec71 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -3291,6 +3291,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int 
xmit_type,
 
cmd->state = QLA_TGT_STATE_PROCESSED; /* Mid-level is done processing */
cmd->cmd_sent_to_fw = 1;
+   cmd->ctio_flags = le16_to_cpu(pkt->u.status0.flags);
 
/* Memory Barrier */
wmb();
@@ -3369,6 +3370,7 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
 
cmd->state = QLA_TGT_STATE_NEED_DATA;
cmd->cmd_sent_to_fw = 1;
+   cmd->ctio_flags = le16_to_cpu(pkt->u.status0.flags);
 
/* Memory Barrier */
wmb();
@@ -3942,12 +3944,20 @@ static void qlt_do_ctio_completion(struct scsi_qla_host 
*vha,
 
if (unlikely(status != CTIO_SUCCESS)) {
switch (status & 0x) {
+   case CTIO_INVALID_RX_ID:
+   if (printk_ratelimit())
+   dev_info(>hw->pdev->dev,
+   "qla_target(%d): CTIO with INVALID_RX_ID 
ATIO attr %x CTIO Flags %x|%x\n",
+   vha->vp_idx, cmd->atio.u.isp24.attr,
+   ((cmd->ctio_flags >> 9) & 0xf),
+   cmd->ctio_flags);
+
+   break;
case CTIO_LIP_RESET:
case CTIO_TARGET_RESET:
case CTIO_ABORTED:
/* driver request abort via Terminate exchange */
case CTIO_TIMEOUT:
-   case CTIO_INVALID_RX_ID:
/* They are OK */
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf058,
"qla_target(%d): CTIO with "
diff --git a/drivers/scsi/qla2xxx/qla_target.h 
b/drivers/scsi/qla2xxx/qla_target.h
index fecf96f0225c..cda41f2074cf 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -908,6 +908,7 @@ struct qla_tgt_cmd {
u64 unpacked_lun;
enum dma_data_direction dma_data_direction;
 
+   uint16_t ctio_flags;
uint16_t vp_idx;
uint16_t loop_id;   /* to save extra sess dereferences */
struct qla_tgt *tgt;/* to save extra sess dereferences */
-- 
2.12.0



[PATCH v2 02/14] qla2xxx: Fix incorrect port speed being set for FC adapters

2018-08-31 Thread Himanshu Madhani
Fixes: 6246b8a1d26c7c ("[SCSI] qla2xxx: Enhancements to support ISP83xx.")
Fixes: 1bb395485160d2 ("qla2xxx: Correct iiDMA-update calling conventions.")
Cc: 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_mbx.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 2c6c2cd5a0d0..c73039916c03 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3762,10 +3762,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t 
loop_id,
mcp->mb[0] = MBC_PORT_PARAMS;
mcp->mb[1] = loop_id;
mcp->mb[2] = BIT_0;
-   if (IS_CNA_CAPABLE(vha->hw))
-   mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
-   else
-   mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
+   mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
mcp->mb[9] = vha->vp_idx;
mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
mcp->in_mb = MBX_3|MBX_1|MBX_0;
-- 
2.12.0



[PATCH v2 03/14] qla2xxx: Use correct qpair for ABTS/CMD

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

On Abort of initiator scsi command, the abort needs to
follow the same qpair as the the scsi command to prevent
out of order processing.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 15 +--
 drivers/scsi/qla2xxx/qla_iocb.c | 12 +++-
 2 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 4686fb5f26aa..3eb3c4f554fa 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1747,18 +1747,18 @@ int
 qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
 {
scsi_qla_host_t *vha = cmd_sp->vha;
-   fc_port_t *fcport = cmd_sp->fcport;
struct srb_iocb *abt_iocb;
srb_t *sp;
int rval = QLA_FUNCTION_FAILED;
 
-   sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
+   sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL);
if (!sp)
goto done;
 
abt_iocb = >u.iocb_cmd;
sp->type = SRB_ABT_CMD;
sp->name = "abort";
+   sp->qpair = cmd_sp->qpair;
if (wait)
sp->flags = SRB_WAKEUP_ON_COMP;
 
@@ -1767,12 +1767,7 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha));
 
abt_iocb->u.abt.cmd_hndl = cmd_sp->handle;
-
-   if (vha->flags.qpairs_available && cmd_sp->qpair)
-   abt_iocb->u.abt.req_que_no =
-   cpu_to_le16(cmd_sp->qpair->req->id);
-   else
-   abt_iocb->u.abt.req_que_no = cpu_to_le16(vha->req->id);
+   abt_iocb->u.abt.req_que_no = cpu_to_le16(cmd_sp->qpair->req->id);
 
sp->done = qla24xx_abort_sp_done;
 
@@ -1781,8 +1776,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
goto done_free_sp;
 
ql_dbg(ql_dbg_async, vha, 0x507c,
-   "Abort command issued - hdl=%x, target_id=%x\n",
-   cmd_sp->handle, fcport->tgt_id);
+   "Abort command issued - hdl=%x, type=%x\n",
+   cmd_sp->handle, cmd_sp->type);
 
if (wait) {
wait_for_completion(_iocb->u.abt.comp);
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 119927220299..c699bbb8485b 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -3297,19 +3297,21 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx 
*abt_iocb)
 {
struct srb_iocb *aio = >u.iocb_cmd;
scsi_qla_host_t *vha = sp->vha;
-   struct req_que *req = vha->req;
+   struct req_que *req = sp->qpair->req;
 
memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
abt_iocb->entry_type = ABORT_IOCB_TYPE;
abt_iocb->entry_count = 1;
abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle));
-   abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+   if (sp->fcport) {
+   abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+   abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
+   abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
+   abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
+   }
abt_iocb->handle_to_abort =
cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
aio->u.abt.cmd_hndl));
-   abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
-   abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
-   abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
abt_iocb->vp_index = vha->vp_idx;
abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no);
/* Send the command to the firmware */
-- 
2.12.0



[PATCH v2 10/14] qla2xxx: Remove all rports if fabric scan retry fails

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

When all fabric scan retries fail, remove all RPorts, DMA resources
for the command otherwise we have stale Rports.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 128 +-
 1 file changed, 64 insertions(+), 64 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 1cb27eb46731..85cbe59b4f58 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3995,6 +3995,41 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
}
 }
 
+static int qla2x00_post_gnnft_gpnft_done_work(struct scsi_qla_host *vha,
+srb_t *sp, int cmd)
+{
+   struct qla_work_evt *e;
+
+   if (cmd != QLA_EVT_GPNFT_DONE && cmd != QLA_EVT_GNNFT_DONE)
+   return QLA_PARAMETER_ERROR;
+
+   e = qla2x00_alloc_work(vha, cmd);
+   if (!e)
+   return QLA_FUNCTION_FAILED;
+
+   e->u.iosb.sp = sp;
+
+   return qla2x00_post_work(vha, e);
+}
+
+static int qla2x00_post_nvme_gpnft_done_work(struct scsi_qla_host *vha,
+srb_t *sp, int cmd)
+{
+   struct qla_work_evt *e;
+
+   if (cmd != QLA_EVT_GPNFT)
+   return QLA_PARAMETER_ERROR;
+
+   e = qla2x00_alloc_work(vha, cmd);
+   if (!e)
+   return QLA_FUNCTION_FAILED;
+
+   e->u.gpnft.fc4_type = FC4_TYPE_NVME;
+   e->u.gpnft.sp = sp;
+
+   return qla2x00_post_work(vha, e);
+}
+
 static void qla2x00_find_free_fcp_nvme_slot(struct scsi_qla_host *vha,
struct srb *sp)
 {
@@ -4095,22 +4130,36 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
 {
struct srb *sp = s;
struct scsi_qla_host *vha = sp->vha;
-   struct qla_work_evt *e;
struct ct_sns_req *ct_req =
(struct ct_sns_req *)sp->u.iocb_cmd.u.ctarg.req;
u16 cmd = be16_to_cpu(ct_req->command);
u8 fc4_type = sp->gen2;
unsigned long flags;
+   int rc;
 
/* gen2 field is holding the fc4type */
ql_dbg(ql_dbg_disc, vha, 0x,
"Async done-%s res %x FC4Type %x\n",
sp->name, res, sp->gen2);
 
+   sp->rc = res;
if (res) {
unsigned long flags;
+   const char *name = sp->name;
+
+   /*
+* We are in an Interrupt context, queue up this
+* sp for GNNFT_DONE work. This will allow all
+* the resource to get freed up.
+*/
+   rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp,
+   QLA_EVT_GNNFT_DONE);
+   if (rc) {
+   /* Cleanup here to prevent memory leak */
+   qla24xx_sp_unmap(vha, sp);
+   sp->free(sp);
+   }
 
-   sp->free(sp);
spin_lock_irqsave(>work_lock, flags);
vha->scan.scan_flags &= ~SF_SCANNING;
vha->scan.scan_retry++;
@@ -4121,9 +4170,9 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
qla2xxx_wake_dpc(vha);
} else {
-   ql_dbg(ql_dbg_disc, sp->vha, 0x,
-   "Async done-%s rescan failed on all retries\n",
-   sp->name);
+   ql_dbg(ql_dbg_disc, vha, 0x,
+   "Async done-%s rescan failed on all retries.\n",
+   name);
}
return;
}
@@ -4138,80 +4187,31 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
vha->scan.scan_flags &= ~SF_SCANNING;
spin_unlock_irqrestore(>work_lock, flags);
 
-   e = qla2x00_alloc_work(vha, QLA_EVT_GPNFT);
-   if (!e) {
-   /*
-* please ignore kernel warning. Otherwise,
-* we have mem leak.
-*/
-   if (sp->u.iocb_cmd.u.ctarg.req) {
-   dma_free_coherent(>hw->pdev->dev,
-   sp->u.iocb_cmd.u.ctarg.req_allocated_size,
-   sp->u.iocb_cmd.u.ctarg.req,
-   sp->u.iocb_cmd.u.ctarg.req_dma);
-   sp->u.iocb_cmd.u.ctarg.req = NULL;
-   }
-   if (sp->u.iocb_cmd.u.ctarg.rsp) {
-   dma_free_coherent(>hw->pdev->dev,
-   sp->u.iocb_cmd.u.ctarg.rsp_allocated_size,
-   sp->u.iocb_cmd.u.ctarg.rsp,
-   sp->

[PATCH v2 11/14] qla2xxx: Fix iIDMA error

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

when switch responds with error for Get Port Speed Command (GPSC),
driver should not proceed with telling FW about the speed
of the remote port.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 85cbe59b4f58..902106f97020 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3272,7 +3272,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
ql_dbg(ql_dbg_disc, vha, 0x2019,
"GPSC command unsupported, disabling query.\n");
ha->flags.gpsc_supported = 0;
-   res = QLA_SUCCESS;
+   goto done;
}
} else {
switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) {
@@ -3305,7 +3305,6 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
be16_to_cpu(ct_rsp->rsp.gpsc.speeds),
be16_to_cpu(ct_rsp->rsp.gpsc.speed));
}
-done:
memset(, 0, sizeof(ea));
ea.event = FCME_GPSC_DONE;
ea.rc = res;
@@ -3313,6 +3312,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
ea.sp = sp;
qla2x00_fcport_event_handler(vha, );
 
+done:
sp->free(sp);
 }
 
-- 
2.12.0



[PATCH v2 14/14] qla2xxx: Update driver to version 10.00.00.09-k

2018-08-31 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_version.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_version.h 
b/drivers/scsi/qla2xxx/qla_version.h
index 3850b28518e5..0dbba38c408f 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,7 +7,7 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.08-k"
+#define QLA2XXX_VERSION  "10.00.00.09-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH v2 05/14] qla2xxx: Remove redundant check for fcport deletion

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Remove redundant check for fcport is deleted or being delete.
The same check is already in the deletion routine.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 62 +++
 1 file changed, 9 insertions(+), 53 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index c0c738bbdace..6e95ba0d3c8b 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3442,26 +3442,10 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
if (ea->rc) {
/* cable is disconnected */
list_for_each_entry_safe(fcport, t, >vp_fcports, list) {
-   if (fcport->d_id.b24 == ea->id.b24) {
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC DS %d\n",
-   __func__, __LINE__,
-   fcport->port_name,
-   fcport->disc_state);
+   if (fcport->d_id.b24 == ea->id.b24)
fcport->scan_state = QLA_FCPORT_SCAN;
-   switch (fcport->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-   default:
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC post del sess\n",
-   __func__, __LINE__,
-   fcport->port_name);
-   qlt_schedule_sess_for_deletion(fcport);
-   break;
-   }
-   }
+
+   qlt_schedule_sess_for_deletion(fcport);
}
} else {
/* cable is connected */
@@ -3470,32 +3454,16 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
list_for_each_entry_safe(conflict, t, >vp_fcports,
list) {
if ((conflict->d_id.b24 == ea->id.b24) &&
-   (fcport != conflict)) {
-   /* 2 fcports with conflict Nport ID or
+   (fcport != conflict))
+   /*
+* 2 fcports with conflict Nport ID or
 * an existing fcport is having nport ID
 * conflict with new fcport.
 */
 
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC DS %d\n",
-   __func__, __LINE__,
-   conflict->port_name,
-   conflict->disc_state);
conflict->scan_state = QLA_FCPORT_SCAN;
-   switch (conflict->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-   default:
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC post del 
sess\n",
-   __func__, __LINE__,
-   conflict->port_name);
-   qlt_schedule_sess_for_deletion
-   (conflict);
-   break;
-   }
-   }
+
+   qlt_schedule_sess_for_deletion(conflict);
}
 
fcport->rscn_gen++;
@@ -3548,19 +3516,7 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
conflict->disc_state);
 
conflict->scan_state = QLA_FCPORT_SCAN;
-   switch (conflict->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-  

[PATCH v2 13/14] qla2xxx: Terminate Plogi/PRLI if WWN is 0

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

When driver receive PLOGI/PRLI from FW, the WWPN value
will be provided.  If it is not, then driver will terminate it.
The WWPN allows driver to locate the session or create a
new session.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_target.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 34fadd320f55..396c8a6d502c 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -4723,6 +4723,12 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
sess = qlt_find_sess_invalidate_other(vha, wwn,
port_id, loop_id, _sess);
spin_unlock_irqrestore(>hw->tgt.sess_lock, flags);
+   } else {
+   ql_dbg(ql_dbg_disc, vha, 0x,
+   "%s %d Term INOT due to WWN=0 lid=%d, NportID %06X ",
+   __func__, __LINE__, loop_id, port_id.b24);
+   qlt_send_term_imm_notif(vha, iocb, 1);
+   goto out;
}
 
if (IS_SW_RESV_ADDR(port_id)) {
-- 
2.12.0



[PATCH v2 07/14] qla2xxx: Decrement login retry count for only plogi

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Decrement login retry count only for plogi, instead of
number of attempt made for login.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 18 +-
 1 file changed, 5 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 39710ebd5950..0f069eb06d8b 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1276,7 +1276,8 @@ static void qla_chk_n2n_b4_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
login = 1;
}
 
-   if (login) {
+   if (login && fcport->login_retry) {
+   fcport->login_retry--;
if (fcport->loop_id == FC_NO_LOOP_ID) {
fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
rc = qla2x00_find_new_loop_id(vha, fcport);
@@ -1302,13 +1303,12 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
u64 wwn;
u16 sec;
 
-   ql_dbg(ql_dbg_disc, vha, 0x20d8,
-   "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d retry 
%d lid %d scan %d\n",
+   ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20d8,
+   "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d lid 
%d scan %d\n",
__func__, fcport->port_name, fcport->disc_state,
fcport->fw_login_state, fcport->login_pause, fcport->flags,
fcport->conflict, fcport->last_rscn_gen, fcport->rscn_gen,
-   fcport->login_gen, fcport->login_retry,
-   fcport->loop_id, fcport->scan_state);
+   fcport->login_gen, fcport->loop_id, fcport->scan_state);
 
if (fcport->scan_state != QLA_FCPORT_FOUND)
return 0;
@@ -1407,10 +1407,6 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
break;
 
case DSC_LOGIN_FAILED:
-   fcport->login_retry--;
-   ql_dbg(ql_dbg_disc, vha, 0x20d0,
-   "%s %d %8phC post gidpn\n",
-   __func__, __LINE__, fcport->port_name);
if (N2N_TOPO(vha->hw))
qla_chk_n2n_b4_login(vha, fcport);
else
@@ -1419,10 +1415,6 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
 
case DSC_LOGIN_COMPLETE:
/* recheck login state */
-   ql_dbg(ql_dbg_disc, vha, 0x20d1,
-   "%s %d %8phC post adisc\n",
-   __func__, __LINE__, fcport->port_name);
-   fcport->login_retry--;
data[0] = data[1] = 0;
qla2x00_post_async_adisc_work(vha, fcport, data);
break;
-- 
2.12.0



[PATCH v2 09/14] qla2xxx: Force fw cleanup on ADISC error

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Turn ON logout_on_delete flag to make sure firmware
resource for fcport is cleaned up on ADISC error.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 0f069eb06d8b..f8f55184f542 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -396,6 +396,9 @@ void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
ql_dbg(ql_dbg_disc, vha, 0x2066,
"%s %8phC: adisc fail: post delete\n",
__func__, ea->fcport->port_name);
+   /* deleted = 0 & logout_on_delete = force fw cleanup */
+   fcport->deleted = 0;
+   fcport->logout_on_delete = 1;
qlt_schedule_sess_for_deletion(ea->fcport);
return;
}
-- 
2.12.0



[PATCH v2 12/14] qla2xxx: Defer chip reset until target mode is enabled

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

For target mode, any chip reset is triggered before target mode
is enabled will be hold off until user is ready to enable.  This
prevents the chip from starting or running before it is intended.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_os.c | 28 +---
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 1ae31a119a37..9628fe4a967f 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -6047,12 +6047,27 @@ qla2x00_do_dpc(void *data)
if (test_and_clear_bit
(ISP_ABORT_NEEDED, _vha->dpc_flags) &&
!test_bit(UNLOADING, _vha->dpc_flags)) {
+   bool do_reset = true;
+
+   switch (ql2x_ini_mode) {
+   case QLA2XXX_INI_MODE_ENABLED:
+   break;
+   case QLA2XXX_INI_MODE_DISABLED:
+   if (!qla_tgt_mode_enabled(base_vha))
+   do_reset = false;
+   break;
+   case QLA2XXX_INI_MODE_DUAL:
+   if (!qla_dual_mode_enabled(base_vha))
+   do_reset = false;
+   break;
+   default:
+   break;
+   }
 
-   ql_dbg(ql_dbg_dpc, base_vha, 0x4007,
-   "ISP abort scheduled.\n");
-   if (!(test_and_set_bit(ABORT_ISP_ACTIVE,
+   if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE,
_vha->dpc_flags))) {
-
+   ql_dbg(ql_dbg_dpc, base_vha, 0x4007,
+   "ISP abort scheduled.\n");
if (ha->isp_ops->abort_isp(base_vha)) {
/* failed. retry later */
set_bit(ISP_ABORT_NEEDED,
@@ -6060,10 +6075,9 @@ qla2x00_do_dpc(void *data)
}
clear_bit(ABORT_ISP_ACTIVE,
_vha->dpc_flags);
+   ql_dbg(ql_dbg_dpc, base_vha, 0x4008,
+   "ISP abort end.\n");
}
-
-   ql_dbg(ql_dbg_dpc, base_vha, 0x4008,
-   "ISP abort end.\n");
}
 
if (test_and_clear_bit(FCPORT_UPDATE_NEEDED,
-- 
2.12.0



[PATCH v2 06/14] qla2xxx: Move rport registration out of internal work_list

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Currently, the rport registration is being called from a single
work element that is used to process QLA internal "work_list".
This work_list is meant for quick and simple task (ie no sleep).
The Rport registration process sometime can be delayed by upper
layer.  This causes back pressure with the internal queue where
other jobs are unable to move forward.

This patch will schedule the registration process with a new work
element (fc_port.reg_work).  While the RPort is being registered,
the current state of the fcport will not move forward until the
registration is done.  If the state of the fabric has changed, a new
field/next_disc_state will record the next action on whether to
'DELETE' or 'Reverify the session/ADISC'.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  6 ++-
 drivers/scsi/qla2xxx/qla_gbl.h|  5 ++-
 drivers/scsi/qla2xxx/qla_init.c   | 66 ++-
 drivers/scsi/qla2xxx/qla_os.c | 26 +++-
 drivers/scsi/qla2xxx/qla_target.c | 83 +++
 5 files changed, 147 insertions(+), 39 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c41d0dbbbd79..16dd59bcd60a 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2375,11 +2375,13 @@ typedef struct fc_port {
unsigned long expires;
struct list_head del_list_entry;
struct work_struct free_work;
-
+   struct work_struct reg_work;
+   uint64_t jiffies_at_registration;
struct qlt_plogi_ack_t *plogi_link[QLT_PLOGI_LINK_MAX];
 
uint16_t tgt_id;
uint16_t old_tgt_id;
+   uint16_t sec_since_registration;
 
uint8_t fcp_prio;
 
@@ -2412,6 +2414,7 @@ typedef struct fc_port {
struct qla_tgt_sess *tgt_session;
struct ct_sns_desc ct_desc;
enum discovery_state disc_state;
+   enum discovery_state next_disc_state;
enum login_state fw_login_state;
unsigned long dm_login_expire;
unsigned long plogi_nack_done_deadline;
@@ -3222,7 +3225,6 @@ enum qla_work_type {
QLA_EVT_GPDB,
QLA_EVT_PRLI,
QLA_EVT_GPSC,
-   QLA_EVT_UPD_FCPORT,
QLA_EVT_GNL,
QLA_EVT_NACK,
QLA_EVT_RELOGIN,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 178974896b5c..b8e4abe804d5 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -54,7 +54,7 @@ extern void qla2x00_abort_isp_cleanup(scsi_qla_host_t *);
 extern void qla2x00_quiesce_io(scsi_qla_host_t *);
 
 extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
-
+void qla_register_fcport_fn(struct work_struct *);
 extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *);
 extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *);
 
@@ -109,6 +109,7 @@ int qla24xx_post_newsess_work(struct scsi_qla_host *, 
port_id_t *, u8 *, u8*,
 int qla24xx_fcport_handle_login(struct scsi_qla_host *, fc_port_t *);
 int qla24xx_detect_sfp(scsi_qla_host_t *vha);
 int qla24xx_post_gpdb_work(struct scsi_qla_host *, fc_port_t *, u8);
+
 void qla2x00_async_prlo_done(struct scsi_qla_host *, fc_port_t *,
 uint16_t *);
 extern int qla2x00_post_async_prlo_work(struct scsi_qla_host *, fc_port_t *,
@@ -208,7 +209,7 @@ extern void qla2x00_disable_board_on_pci_error(struct 
work_struct *);
 extern void qla2x00_sp_compl(void *, int);
 extern void qla2xxx_qpair_sp_free_dma(void *);
 extern void qla2xxx_qpair_sp_compl(void *, int);
-extern int qla24xx_post_upd_fcport_work(struct scsi_qla_host *, fc_port_t *);
+extern void qla24xx_sched_upd_fcport(fc_port_t *);
 void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *,
uint16_t *);
 int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 6d9c8a017ae9..39710ebd5950 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1182,11 +1182,7 @@ void __qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
vha->fcport_count++;
ea->fcport->login_succ = 1;
 
-   ql_dbg(ql_dbg_disc, vha, 0x20d6,
-   "%s %d %8phC post upd_fcport fcp_cnt %d\n",
-   __func__, __LINE__,  ea->fcport->port_name,
-   vha->fcport_count);
-   qla24xx_post_upd_fcport_work(vha, ea->fcport);
+   qla24xx_sched_upd_fcport(ea->fcport);
} else if (ea->fcport->login_succ) {
/*
 * We have an existing session. A late RSCN delivery
@@ -1304,6 +1300,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
 {
u16 data[2];
u64 wwn;
+   u16 sec;
 
ql_dbg(ql_dbg_disc, vha, 0x20d8,
"%s %8phC DS

[PATCH v2 04/14] qla2xxx: Update rscn_rcvd field to more meaningful scan_needed

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Rename rscn_rcvd field to scan_needed to be more meaningful.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  2 +-
 drivers/scsi/qla2xxx/qla_gs.c   | 12 ++--
 drivers/scsi/qla2xxx/qla_init.c |  2 +-
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index a9dc9c4a6382..c41d0dbbbd79 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2351,7 +2351,7 @@ typedef struct fc_port {
unsigned int login_succ:1;
unsigned int query:1;
unsigned int id_changed:1;
-   unsigned int rscn_rcvd:1;
+   unsigned int scan_needed:1;
 
struct work_struct nvme_del_work;
struct completion nvme_del_done;
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index a0038d879b9d..c0c738bbdace 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3951,7 +3951,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
list_for_each_entry(fcport, >vp_fcports, list) {
if (memcmp(rp->port_name, fcport->port_name, WWN_SIZE))
continue;
-   fcport->rscn_rcvd = 0;
+   fcport->scan_needed = 0;
fcport->scan_state = QLA_FCPORT_FOUND;
found = true;
/*
@@ -3981,12 +3981,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
 */
list_for_each_entry(fcport, >vp_fcports, list) {
if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) {
-   fcport->rscn_rcvd = 0;
+   fcport->scan_needed = 0;
continue;
}
 
if (fcport->scan_state != QLA_FCPORT_FOUND) {
-   fcport->rscn_rcvd = 0;
+   fcport->scan_needed = 0;
if ((qla_dual_mode_enabled(vha) ||
qla_ini_mode_enabled(vha)) &&
atomic_read(>state) == FCS_ONLINE) {
@@ -4005,7 +4005,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
}
}
} else {
-   if (fcport->rscn_rcvd ||
+   if (fcport->scan_needed ||
fcport->disc_state != DSC_LOGIN_COMPLETE) {
if (fcport->login_retry == 0) {
fcport->login_retry =
@@ -4015,7 +4015,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
fcport->port_name, fcport->loop_id,
fcport->login_retry);
}
-   fcport->rscn_rcvd = 0;
+   fcport->scan_needed = 0;
qla24xx_fcport_handle_login(vha, fcport);
}
}
@@ -4030,7 +4030,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
 
if (recheck) {
list_for_each_entry(fcport, >vp_fcports, list) {
-   if (fcport->rscn_rcvd) {
+   if (fcport->scan_needed) {
set_bit(LOCAL_LOOP_UPDATE, >dpc_flags);
set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
break;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 3eb3c4f554fa..6d9c8a017ae9 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1551,7 +1551,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, 
struct event_arg *ea)
fcport = qla2x00_find_fcport_by_nportid
(vha, >id, 1);
if (fcport)
-   fcport->rscn_rcvd = 1;
+   fcport->scan_needed = 1;
 
spin_lock_irqsave(>work_lock, flags);
if (vha->scan.scan_flags == 0) {
-- 
2.12.0



[PATCH v2 08/14] qla2xxx: Turn off IOCB timeout timer on IOCB completion

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

Turn off IOCB timeout timer on IOCB completion instead of
turning it off in a deferred task.  This prevent false
alarm if the deferred task is stalled out.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 6e95ba0d3c8b..1cb27eb46731 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -4175,10 +4175,13 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
return;
}
 
-   if (cmd == GPN_FT_CMD)
+   if (cmd == GPN_FT_CMD) {
+   del_timer(>u.iocb_cmd.timer);
e = qla2x00_alloc_work(vha, QLA_EVT_GPNFT_DONE);
-   else
+   } else {
e = qla2x00_alloc_work(vha, QLA_EVT_GNNFT_DONE);
+   }
+
if (!e) {
/* please ignore kernel warning. Otherwise, we have mem leak. */
if (sp->u.iocb_cmd.u.ctarg.req) {
@@ -4307,7 +4310,6 @@ void qla24xx_async_gpnft_done(scsi_qla_host_t *vha, srb_t 
*sp)
 {
ql_dbg(ql_dbg_disc, vha, 0x,
"%s enter\n", __func__);
-   del_timer(>u.iocb_cmd.timer);
qla24xx_async_gnnft(vha, sp, sp->gen2);
 }
 
-- 
2.12.0



[PATCH v2 00/14] qla2xxx: Driver updates for scsi-misc

2018-08-31 Thread Himanshu Madhani
Hi Martin,

This series updates driver for ABTS handling and rport management.
  
Please queue this patches to 4.20/scsi-misc at your earliest convenience.

Changes from v1 -> v2
o Fixed sparse warning in patch #3.

Thanks,
Himanshu


Himanshu Madhani (2):
  qla2xxx: Fix incorrect port speed being set for FC adapters
  qla2xxx: Update driver to version 10.00.00.09-k

Quinn Tran (12):
  qla2xxx: Fix process response queue for ISP26XX and above
  qla2xxx: Use correct qpair for ABTS/CMD
  qla2xxx: Update rscn_rcvd field to more meaningful scan_needed
  qla2xxx: Remove redundant check for fcport deletion
  qla2xxx: Move rport registration out of internal work_list
  qla2xxx: Decrement login retry count for only plogi
  qla2xxx: Turn off IOCB timeout timer on IOCB completion
  qla2xxx: Force fw cleanup on ADISC error
  qla2xxx: Remove all rports if fabric scan retry fails
  qla2xxx: Fix iIDMA error
  qla2xxx: Defer chip reset until target mode is enabled
  qla2xxx: Terminate Plogi/PRLI if WWN is 0

 drivers/scsi/qla2xxx/qla_def.h |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   5 +-
 drivers/scsi/qla2xxx/qla_gs.c  | 212 +++--
 drivers/scsi/qla2xxx/qla_init.c| 106 +--
 drivers/scsi/qla2xxx/qla_iocb.c|  29 ++---
 drivers/scsi/qla2xxx/qla_mbx.c |   5 +-
 drivers/scsi/qla2xxx/qla_os.c  |  54 +++---
 drivers/scsi/qla2xxx/qla_target.c  |  89 +---
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 9 files changed, 283 insertions(+), 227 deletions(-)

-- 
2.12.0



[PATCH v2 01/14] qla2xxx: Fix process response queue for ISP26XX and above

2018-08-31 Thread Himanshu Madhani
From: Quinn Tran 

This patch improves performance for 16G and above adaper by
removing additional call to process_response_queue().

Cc: 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c |  2 --
 drivers/scsi/qla2xxx/qla_iocb.c | 17 -
 2 files changed, 19 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index b934977c5c26..4686fb5f26aa 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7142,7 +7142,6 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
}
icb->firmware_options_2 &= cpu_to_le32(
~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
-   vha->flags.process_response_queue = 0;
if (ha->zio_mode != QLA_ZIO_DISABLED) {
ha->zio_mode = QLA_ZIO_MODE_6;
 
@@ -7153,7 +7152,6 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
icb->firmware_options_2 |= cpu_to_le32(
(uint32_t)ha->zio_mode);
icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer);
-   vha->flags.process_response_queue = 1;
}
 
if (rval) {
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 42ac8e097419..119927220299 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -1526,12 +1526,6 @@ qla24xx_start_scsi(srb_t *sp)
 
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
-   RD_REG_DWORD_RELAXED(>iobase->isp24.hccr);
-
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
 
spin_unlock_irqrestore(>hardware_lock, flags);
return QLA_SUCCESS;
@@ -1725,12 +1719,6 @@ qla24xx_dif_start_scsi(srb_t *sp)
 
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
-   RD_REG_DWORD_RELAXED(>iobase->isp24.hccr);
-
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
 
spin_unlock_irqrestore(>hardware_lock, flags);
 
@@ -1880,11 +1868,6 @@ qla2xxx_start_scsi_mq(srb_t *sp)
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
 
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
-
spin_unlock_irqrestore(>qp_lock, flags);
return QLA_SUCCESS;
 
-- 
2.12.0



[PATCH 09/14] qla2xxx: Force fw cleanup on ADISC error

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

Turn ON logout_on_delete flag to make sure firmware
resource for fcport is cleaned up on ADISC error.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index fa6f2400a508..f840199d31cc 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -396,6 +396,9 @@ void qla24xx_handle_adisc_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
ql_dbg(ql_dbg_disc, vha, 0x2066,
"%s %8phC: adisc fail: post delete\n",
__func__, ea->fcport->port_name);
+   /* deleted = 0 & logout_on_delete = force fw cleanup */
+   fcport->deleted = 0;
+   fcport->logout_on_delete = 1;
qlt_schedule_sess_for_deletion(ea->fcport);
return;
}
-- 
2.12.0



[PATCH 13/14] qla2xxx: Terminate Plogi/PRLI if WWN is 0

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

When driver receive PLOGI/PRLI from FW, the WWPN value
will be provided.  If it is not, then driver will terminate it.
The WWPN allows driver to locate the session or create a
new session.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_target.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 34fadd320f55..396c8a6d502c 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -4723,6 +4723,12 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
sess = qlt_find_sess_invalidate_other(vha, wwn,
port_id, loop_id, _sess);
spin_unlock_irqrestore(>hw->tgt.sess_lock, flags);
+   } else {
+   ql_dbg(ql_dbg_disc, vha, 0x,
+   "%s %d Term INOT due to WWN=0 lid=%d, NportID %06X ",
+   __func__, __LINE__, loop_id, port_id.b24);
+   qlt_send_term_imm_notif(vha, iocb, 1);
+   goto out;
}
 
if (IS_SW_RESV_ADDR(port_id)) {
-- 
2.12.0



[PATCH 11/14] qla2xxx: Fix iIDMA error

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

when switch responds with error for Get Port Speed Command (GPSC),
driver should not proceed with telling FW about the speed
of the remote port.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 85cbe59b4f58..902106f97020 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3272,7 +3272,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
ql_dbg(ql_dbg_disc, vha, 0x2019,
"GPSC command unsupported, disabling query.\n");
ha->flags.gpsc_supported = 0;
-   res = QLA_SUCCESS;
+   goto done;
}
} else {
switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) {
@@ -3305,7 +3305,6 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
be16_to_cpu(ct_rsp->rsp.gpsc.speeds),
be16_to_cpu(ct_rsp->rsp.gpsc.speed));
}
-done:
memset(, 0, sizeof(ea));
ea.event = FCME_GPSC_DONE;
ea.rc = res;
@@ -3313,6 +3312,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
ea.sp = sp;
qla2x00_fcport_event_handler(vha, );
 
+done:
sp->free(sp);
 }
 
-- 
2.12.0



[PATCH 03/14] qla2xxx: Use correct qpair for ABTS/CMD

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

On Abort of initiator scsi command, the abort needs to
follow the same qpair as the the scsi command to prevent
out of order processing.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 15 +--
 drivers/scsi/qla2xxx/qla_iocb.c | 12 +++-
 2 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 4686fb5f26aa..53c4eb3b9c27 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1747,18 +1747,18 @@ int
 qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
 {
scsi_qla_host_t *vha = cmd_sp->vha;
-   fc_port_t *fcport = cmd_sp->fcport;
struct srb_iocb *abt_iocb;
srb_t *sp;
int rval = QLA_FUNCTION_FAILED;
 
-   sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
+   sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL);
if (!sp)
goto done;
 
abt_iocb = >u.iocb_cmd;
sp->type = SRB_ABT_CMD;
sp->name = "abort";
+   sp->qpair = cmd_sp->qpair;
if (wait)
sp->flags = SRB_WAKEUP_ON_COMP;
 
@@ -1767,12 +1767,7 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha));
 
abt_iocb->u.abt.cmd_hndl = cmd_sp->handle;
-
-   if (vha->flags.qpairs_available && cmd_sp->qpair)
-   abt_iocb->u.abt.req_que_no =
-   cpu_to_le16(cmd_sp->qpair->req->id);
-   else
-   abt_iocb->u.abt.req_que_no = cpu_to_le16(vha->req->id);
+   abt_iocb->u.abt.req_que_no = cmd_sp->qpair->req->id;
 
sp->done = qla24xx_abort_sp_done;
 
@@ -1781,8 +1776,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
goto done_free_sp;
 
ql_dbg(ql_dbg_async, vha, 0x507c,
-   "Abort command issued - hdl=%x, target_id=%x\n",
-   cmd_sp->handle, fcport->tgt_id);
+   "Abort command issued - hdl=%x, type=%x\n",
+   cmd_sp->handle, cmd_sp->type);
 
if (wait) {
wait_for_completion(_iocb->u.abt.comp);
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 119927220299..c699bbb8485b 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -3297,19 +3297,21 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx 
*abt_iocb)
 {
struct srb_iocb *aio = >u.iocb_cmd;
scsi_qla_host_t *vha = sp->vha;
-   struct req_que *req = vha->req;
+   struct req_que *req = sp->qpair->req;
 
memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
abt_iocb->entry_type = ABORT_IOCB_TYPE;
abt_iocb->entry_count = 1;
abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle));
-   abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+   if (sp->fcport) {
+   abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
+   abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
+   abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
+   abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
+   }
abt_iocb->handle_to_abort =
cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
aio->u.abt.cmd_hndl));
-   abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
-   abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
-   abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
abt_iocb->vp_index = vha->vp_idx;
abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no);
/* Send the command to the firmware */
-- 
2.12.0



[PATCH 06/14] qla2xxx: Move rport registration out of internal work_list

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

Currently, the rport registration is being called from a single
work element that is used to process QLA internal "work_list".
This work_list is meant for quick and simple task (ie no sleep).
The Rport registration process sometime can be delayed by upper
layer.  This causes back pressure with the internal queue where
other jobs are unable to move forward.

This patch will schedule the registration process with a new work
element (fc_port.reg_work).  While the RPort is being registered,
the current state of the fcport will not move forward until the
registration is done.  If the state of the fabric has changed, a new
field/next_disc_state will record the next action on whether to
'DELETE' or 'Reverify the session/ADISC'.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h|  6 ++-
 drivers/scsi/qla2xxx/qla_gbl.h|  5 ++-
 drivers/scsi/qla2xxx/qla_init.c   | 66 ++-
 drivers/scsi/qla2xxx/qla_os.c | 26 +++-
 drivers/scsi/qla2xxx/qla_target.c | 83 +++
 5 files changed, 147 insertions(+), 39 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c41d0dbbbd79..16dd59bcd60a 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2375,11 +2375,13 @@ typedef struct fc_port {
unsigned long expires;
struct list_head del_list_entry;
struct work_struct free_work;
-
+   struct work_struct reg_work;
+   uint64_t jiffies_at_registration;
struct qlt_plogi_ack_t *plogi_link[QLT_PLOGI_LINK_MAX];
 
uint16_t tgt_id;
uint16_t old_tgt_id;
+   uint16_t sec_since_registration;
 
uint8_t fcp_prio;
 
@@ -2412,6 +2414,7 @@ typedef struct fc_port {
struct qla_tgt_sess *tgt_session;
struct ct_sns_desc ct_desc;
enum discovery_state disc_state;
+   enum discovery_state next_disc_state;
enum login_state fw_login_state;
unsigned long dm_login_expire;
unsigned long plogi_nack_done_deadline;
@@ -3222,7 +3225,6 @@ enum qla_work_type {
QLA_EVT_GPDB,
QLA_EVT_PRLI,
QLA_EVT_GPSC,
-   QLA_EVT_UPD_FCPORT,
QLA_EVT_GNL,
QLA_EVT_NACK,
QLA_EVT_RELOGIN,
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 178974896b5c..b8e4abe804d5 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -54,7 +54,7 @@ extern void qla2x00_abort_isp_cleanup(scsi_qla_host_t *);
 extern void qla2x00_quiesce_io(scsi_qla_host_t *);
 
 extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
-
+void qla_register_fcport_fn(struct work_struct *);
 extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *);
 extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *);
 
@@ -109,6 +109,7 @@ int qla24xx_post_newsess_work(struct scsi_qla_host *, 
port_id_t *, u8 *, u8*,
 int qla24xx_fcport_handle_login(struct scsi_qla_host *, fc_port_t *);
 int qla24xx_detect_sfp(scsi_qla_host_t *vha);
 int qla24xx_post_gpdb_work(struct scsi_qla_host *, fc_port_t *, u8);
+
 void qla2x00_async_prlo_done(struct scsi_qla_host *, fc_port_t *,
 uint16_t *);
 extern int qla2x00_post_async_prlo_work(struct scsi_qla_host *, fc_port_t *,
@@ -208,7 +209,7 @@ extern void qla2x00_disable_board_on_pci_error(struct 
work_struct *);
 extern void qla2x00_sp_compl(void *, int);
 extern void qla2xxx_qpair_sp_free_dma(void *);
 extern void qla2xxx_qpair_sp_compl(void *, int);
-extern int qla24xx_post_upd_fcport_work(struct scsi_qla_host *, fc_port_t *);
+extern void qla24xx_sched_upd_fcport(fc_port_t *);
 void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *,
uint16_t *);
 int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cb00fd740d29..6f26e6164c04 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1182,11 +1182,7 @@ void __qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
vha->fcport_count++;
ea->fcport->login_succ = 1;
 
-   ql_dbg(ql_dbg_disc, vha, 0x20d6,
-   "%s %d %8phC post upd_fcport fcp_cnt %d\n",
-   __func__, __LINE__,  ea->fcport->port_name,
-   vha->fcport_count);
-   qla24xx_post_upd_fcport_work(vha, ea->fcport);
+   qla24xx_sched_upd_fcport(ea->fcport);
} else if (ea->fcport->login_succ) {
/*
 * We have an existing session. A late RSCN delivery
@@ -1304,6 +1300,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
 {
u16 data[2];
u64 wwn;
+   u16 sec;
 
ql_dbg(ql_dbg_disc, vha, 0x20d8,
"%s %8phC DS

[PATCH 02/14] qla2xxx: Fix incorrect port speed being set for FC adapters

2018-08-30 Thread Himanshu Madhani
Fixes: 6246b8a1d26c7c ("[SCSI] qla2xxx: Enhancements to support ISP83xx.")
Fixes: 1bb395485160d2 ("qla2xxx: Correct iiDMA-update calling conventions.")
Cc: 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_mbx.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 2c6c2cd5a0d0..c73039916c03 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3762,10 +3762,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t 
loop_id,
mcp->mb[0] = MBC_PORT_PARAMS;
mcp->mb[1] = loop_id;
mcp->mb[2] = BIT_0;
-   if (IS_CNA_CAPABLE(vha->hw))
-   mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
-   else
-   mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
+   mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
mcp->mb[9] = vha->vp_idx;
mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
mcp->in_mb = MBX_3|MBX_1|MBX_0;
-- 
2.12.0



[PATCH 07/14] qla2xxx: Decrement login retry count for only plogi

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

Decrement login retry count only for plogi, instead of
number of attempt made for login.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 18 +-
 1 file changed, 5 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 6f26e6164c04..fa6f2400a508 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1276,7 +1276,8 @@ static void qla_chk_n2n_b4_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
login = 1;
}
 
-   if (login) {
+   if (login && fcport->login_retry) {
+   fcport->login_retry--;
if (fcport->loop_id == FC_NO_LOOP_ID) {
fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
rc = qla2x00_find_new_loop_id(vha, fcport);
@@ -1302,13 +1303,12 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
u64 wwn;
u16 sec;
 
-   ql_dbg(ql_dbg_disc, vha, 0x20d8,
-   "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d retry 
%d lid %d scan %d\n",
+   ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20d8,
+   "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d lid 
%d scan %d\n",
__func__, fcport->port_name, fcport->disc_state,
fcport->fw_login_state, fcport->login_pause, fcport->flags,
fcport->conflict, fcport->last_rscn_gen, fcport->rscn_gen,
-   fcport->login_gen, fcport->login_retry,
-   fcport->loop_id, fcport->scan_state);
+   fcport->login_gen, fcport->loop_id, fcport->scan_state);
 
if (fcport->scan_state != QLA_FCPORT_FOUND)
return 0;
@@ -1407,10 +1407,6 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
break;
 
case DSC_LOGIN_FAILED:
-   fcport->login_retry--;
-   ql_dbg(ql_dbg_disc, vha, 0x20d0,
-   "%s %d %8phC post gidpn\n",
-   __func__, __LINE__, fcport->port_name);
if (N2N_TOPO(vha->hw))
qla_chk_n2n_b4_login(vha, fcport);
else
@@ -1419,10 +1415,6 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
*vha, fc_port_t *fcport)
 
case DSC_LOGIN_COMPLETE:
/* recheck login state */
-   ql_dbg(ql_dbg_disc, vha, 0x20d1,
-   "%s %d %8phC post adisc\n",
-   __func__, __LINE__, fcport->port_name);
-   fcport->login_retry--;
data[0] = data[1] = 0;
qla2x00_post_async_adisc_work(vha, fcport, data);
break;
-- 
2.12.0



[PATCH 05/14] qla2xxx: Remove redundant check for fcport deletion

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

Remove redundant check for fcport is deleted or being delete.
The same check is already in the deletion routine.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 62 +++
 1 file changed, 9 insertions(+), 53 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index c0c738bbdace..6e95ba0d3c8b 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3442,26 +3442,10 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
if (ea->rc) {
/* cable is disconnected */
list_for_each_entry_safe(fcport, t, >vp_fcports, list) {
-   if (fcport->d_id.b24 == ea->id.b24) {
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC DS %d\n",
-   __func__, __LINE__,
-   fcport->port_name,
-   fcport->disc_state);
+   if (fcport->d_id.b24 == ea->id.b24)
fcport->scan_state = QLA_FCPORT_SCAN;
-   switch (fcport->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-   default:
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC post del sess\n",
-   __func__, __LINE__,
-   fcport->port_name);
-   qlt_schedule_sess_for_deletion(fcport);
-   break;
-   }
-   }
+
+   qlt_schedule_sess_for_deletion(fcport);
}
} else {
/* cable is connected */
@@ -3470,32 +3454,16 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
list_for_each_entry_safe(conflict, t, >vp_fcports,
list) {
if ((conflict->d_id.b24 == ea->id.b24) &&
-   (fcport != conflict)) {
-   /* 2 fcports with conflict Nport ID or
+   (fcport != conflict))
+   /*
+* 2 fcports with conflict Nport ID or
 * an existing fcport is having nport ID
 * conflict with new fcport.
 */
 
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC DS %d\n",
-   __func__, __LINE__,
-   conflict->port_name,
-   conflict->disc_state);
conflict->scan_state = QLA_FCPORT_SCAN;
-   switch (conflict->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-   default:
-   ql_dbg(ql_dbg_disc, vha, 0x,
-   "%s %d %8phC post del 
sess\n",
-   __func__, __LINE__,
-   conflict->port_name);
-   qlt_schedule_sess_for_deletion
-   (conflict);
-   break;
-   }
-   }
+
+   qlt_schedule_sess_for_deletion(conflict);
}
 
fcport->rscn_gen++;
@@ -3548,19 +3516,7 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
conflict->disc_state);
 
conflict->scan_state = QLA_FCPORT_SCAN;
-   switch (conflict->disc_state) {
-   case DSC_DELETED:
-   case DSC_DELETE_PEND:
-   break;
-  

[PATCH 10/14] qla2xxx: Remove all rports if fabric scan retry fails

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

When all fabric scan retries fail, remove all RPorts, DMA resources
for the command otherwise we have stale Rports.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gs.c | 128 +-
 1 file changed, 64 insertions(+), 64 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 1cb27eb46731..85cbe59b4f58 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3995,6 +3995,41 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, 
srb_t *sp)
}
 }
 
+static int qla2x00_post_gnnft_gpnft_done_work(struct scsi_qla_host *vha,
+srb_t *sp, int cmd)
+{
+   struct qla_work_evt *e;
+
+   if (cmd != QLA_EVT_GPNFT_DONE && cmd != QLA_EVT_GNNFT_DONE)
+   return QLA_PARAMETER_ERROR;
+
+   e = qla2x00_alloc_work(vha, cmd);
+   if (!e)
+   return QLA_FUNCTION_FAILED;
+
+   e->u.iosb.sp = sp;
+
+   return qla2x00_post_work(vha, e);
+}
+
+static int qla2x00_post_nvme_gpnft_done_work(struct scsi_qla_host *vha,
+srb_t *sp, int cmd)
+{
+   struct qla_work_evt *e;
+
+   if (cmd != QLA_EVT_GPNFT)
+   return QLA_PARAMETER_ERROR;
+
+   e = qla2x00_alloc_work(vha, cmd);
+   if (!e)
+   return QLA_FUNCTION_FAILED;
+
+   e->u.gpnft.fc4_type = FC4_TYPE_NVME;
+   e->u.gpnft.sp = sp;
+
+   return qla2x00_post_work(vha, e);
+}
+
 static void qla2x00_find_free_fcp_nvme_slot(struct scsi_qla_host *vha,
struct srb *sp)
 {
@@ -4095,22 +4130,36 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
 {
struct srb *sp = s;
struct scsi_qla_host *vha = sp->vha;
-   struct qla_work_evt *e;
struct ct_sns_req *ct_req =
(struct ct_sns_req *)sp->u.iocb_cmd.u.ctarg.req;
u16 cmd = be16_to_cpu(ct_req->command);
u8 fc4_type = sp->gen2;
unsigned long flags;
+   int rc;
 
/* gen2 field is holding the fc4type */
ql_dbg(ql_dbg_disc, vha, 0x,
"Async done-%s res %x FC4Type %x\n",
sp->name, res, sp->gen2);
 
+   sp->rc = res;
if (res) {
unsigned long flags;
+   const char *name = sp->name;
+
+   /*
+* We are in an Interrupt context, queue up this
+* sp for GNNFT_DONE work. This will allow all
+* the resource to get freed up.
+*/
+   rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp,
+   QLA_EVT_GNNFT_DONE);
+   if (rc) {
+   /* Cleanup here to prevent memory leak */
+   qla24xx_sp_unmap(vha, sp);
+   sp->free(sp);
+   }
 
-   sp->free(sp);
spin_lock_irqsave(>work_lock, flags);
vha->scan.scan_flags &= ~SF_SCANNING;
vha->scan.scan_retry++;
@@ -4121,9 +4170,9 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
set_bit(LOOP_RESYNC_NEEDED, >dpc_flags);
qla2xxx_wake_dpc(vha);
} else {
-   ql_dbg(ql_dbg_disc, sp->vha, 0x,
-   "Async done-%s rescan failed on all retries\n",
-   sp->name);
+   ql_dbg(ql_dbg_disc, vha, 0x,
+   "Async done-%s rescan failed on all retries.\n",
+   name);
}
return;
}
@@ -4138,80 +4187,31 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, 
int res)
vha->scan.scan_flags &= ~SF_SCANNING;
spin_unlock_irqrestore(>work_lock, flags);
 
-   e = qla2x00_alloc_work(vha, QLA_EVT_GPNFT);
-   if (!e) {
-   /*
-* please ignore kernel warning. Otherwise,
-* we have mem leak.
-*/
-   if (sp->u.iocb_cmd.u.ctarg.req) {
-   dma_free_coherent(>hw->pdev->dev,
-   sp->u.iocb_cmd.u.ctarg.req_allocated_size,
-   sp->u.iocb_cmd.u.ctarg.req,
-   sp->u.iocb_cmd.u.ctarg.req_dma);
-   sp->u.iocb_cmd.u.ctarg.req = NULL;
-   }
-   if (sp->u.iocb_cmd.u.ctarg.rsp) {
-   dma_free_coherent(>hw->pdev->dev,
-   sp->u.iocb_cmd.u.ctarg.rsp_allocated_size,
-   sp->u.iocb_cmd.u.ctarg.rsp,
-   sp->

[PATCH 14/14] qla2xxx: Update driver to version 10.00.00.09-k

2018-08-30 Thread Himanshu Madhani
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_version.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_version.h 
b/drivers/scsi/qla2xxx/qla_version.h
index 3850b28518e5..0dbba38c408f 100644
--- a/drivers/scsi/qla2xxx/qla_version.h
+++ b/drivers/scsi/qla2xxx/qla_version.h
@@ -7,7 +7,7 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION  "10.00.00.08-k"
+#define QLA2XXX_VERSION  "10.00.00.09-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH 12/14] qla2xxx: Defer chip reset until target mode is enabled

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

For target mode, any chip reset is triggered before target mode
is enabled will be hold off until user is ready to enable.  This
prevents the chip from starting or running before it is intended.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_os.c | 28 +---
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 1ae31a119a37..9628fe4a967f 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -6047,12 +6047,27 @@ qla2x00_do_dpc(void *data)
if (test_and_clear_bit
(ISP_ABORT_NEEDED, _vha->dpc_flags) &&
!test_bit(UNLOADING, _vha->dpc_flags)) {
+   bool do_reset = true;
+
+   switch (ql2x_ini_mode) {
+   case QLA2XXX_INI_MODE_ENABLED:
+   break;
+   case QLA2XXX_INI_MODE_DISABLED:
+   if (!qla_tgt_mode_enabled(base_vha))
+   do_reset = false;
+   break;
+   case QLA2XXX_INI_MODE_DUAL:
+   if (!qla_dual_mode_enabled(base_vha))
+   do_reset = false;
+   break;
+   default:
+   break;
+   }
 
-   ql_dbg(ql_dbg_dpc, base_vha, 0x4007,
-   "ISP abort scheduled.\n");
-   if (!(test_and_set_bit(ABORT_ISP_ACTIVE,
+   if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE,
_vha->dpc_flags))) {
-
+   ql_dbg(ql_dbg_dpc, base_vha, 0x4007,
+   "ISP abort scheduled.\n");
if (ha->isp_ops->abort_isp(base_vha)) {
/* failed. retry later */
set_bit(ISP_ABORT_NEEDED,
@@ -6060,10 +6075,9 @@ qla2x00_do_dpc(void *data)
}
clear_bit(ABORT_ISP_ACTIVE,
_vha->dpc_flags);
+   ql_dbg(ql_dbg_dpc, base_vha, 0x4008,
+   "ISP abort end.\n");
}
-
-   ql_dbg(ql_dbg_dpc, base_vha, 0x4008,
-   "ISP abort end.\n");
}
 
if (test_and_clear_bit(FCPORT_UPDATE_NEEDED,
-- 
2.12.0



[PATCH 01/14] qla2xxx: Fix process response queue for ISP26XX and above

2018-08-30 Thread Himanshu Madhani
From: Quinn Tran 

This patch improves performance for 16G and above adaper by
removing additional call to process_response_queue().

Cc: 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c |  2 --
 drivers/scsi/qla2xxx/qla_iocb.c | 17 -
 2 files changed, 19 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index b934977c5c26..4686fb5f26aa 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7142,7 +7142,6 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
}
icb->firmware_options_2 &= cpu_to_le32(
~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
-   vha->flags.process_response_queue = 0;
if (ha->zio_mode != QLA_ZIO_DISABLED) {
ha->zio_mode = QLA_ZIO_MODE_6;
 
@@ -7153,7 +7152,6 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
icb->firmware_options_2 |= cpu_to_le32(
(uint32_t)ha->zio_mode);
icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer);
-   vha->flags.process_response_queue = 1;
}
 
if (rval) {
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 42ac8e097419..119927220299 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -1526,12 +1526,6 @@ qla24xx_start_scsi(srb_t *sp)
 
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
-   RD_REG_DWORD_RELAXED(>iobase->isp24.hccr);
-
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
 
spin_unlock_irqrestore(>hardware_lock, flags);
return QLA_SUCCESS;
@@ -1725,12 +1719,6 @@ qla24xx_dif_start_scsi(srb_t *sp)
 
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
-   RD_REG_DWORD_RELAXED(>iobase->isp24.hccr);
-
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
 
spin_unlock_irqrestore(>hardware_lock, flags);
 
@@ -1880,11 +1868,6 @@ qla2xxx_start_scsi_mq(srb_t *sp)
/* Set chip new ring index. */
WRT_REG_DWORD(req->req_q_in, req->ring_index);
 
-   /* Manage unprocessed RIO/ZIO commands in response queue. */
-   if (vha->flags.process_response_queue &&
-   rsp->ring_ptr->signature != RESPONSE_PROCESSED)
-   qla24xx_process_response_queue(vha, rsp);
-
spin_unlock_irqrestore(>qp_lock, flags);
return QLA_SUCCESS;
 
-- 
2.12.0



[PATCH 00/14] qla2xxx: Driver updates for scsi-misc

2018-08-30 Thread Himanshu Madhani
Hi Martin, 

This series updates driver for ABTS handling and rport management. 

Please queue this patches to 4.20/scsi-misc at your earliest convenience.

Thanks,
Himanshu

Himanshu Madhani (2):
  qla2xxx: Fix incorrect port speed being set for FC adapters
  qla2xxx: Update driver to version 10.00.00.09-k

Quinn Tran (12):
  qla2xxx: Fix process response queue for ISP26XX and above
  qla2xxx: Use correct qpair for ABTS/CMD
  qla2xxx: Update rscn_rcvd field to more meaningful scan_needed
  qla2xxx: Remove redundant check for fcport deletion
  qla2xxx: Move rport registration out of internal work_list
  qla2xxx: Decrement login retry count for only plogi
  qla2xxx: Turn off IOCB timeout timer on IOCB completion
  qla2xxx: Force fw cleanup on ADISC error
  qla2xxx: Remove all rports if fabric scan retry fails
  qla2xxx: Fix iIDMA error
  qla2xxx: Defer chip reset until target mode is enabled
  qla2xxx: Terminate Plogi/PRLI if WWN is 0

 drivers/scsi/qla2xxx/qla_def.h |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   5 +-
 drivers/scsi/qla2xxx/qla_gs.c  | 212 +++--
 drivers/scsi/qla2xxx/qla_init.c| 106 +--
 drivers/scsi/qla2xxx/qla_iocb.c|  29 ++---
 drivers/scsi/qla2xxx/qla_mbx.c |   5 +-
 drivers/scsi/qla2xxx/qla_os.c  |  54 +++---
 drivers/scsi/qla2xxx/qla_target.c  |  89 +---
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 9 files changed, 283 insertions(+), 227 deletions(-)

-- 
2.12.0



[PATCH] qla2xxx: Fix issue reported by static checker for qla2x00_els_dcmd2_sp_done()

2018-08-07 Thread Himanshu Madhani
From: Quinn Tran 

This patch fixes following Smatch complaint:

drivers/scsi/qla2xxx/qla_iocb.c:2647 qla2x00_els_dcmd2_sp_done()
error: we previously assumed 'e' could be null (see line 2631)

Fixes: 8777e4314d39 ("scsi: qla2xxx: Migrate NVME N2N handling into state 
machine")
Reported-by: Dan Carpenter 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_iocb.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 059f2c9dc192..213321295753 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2642,6 +2642,7 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res)
elsio->u.els_plogi.els_resp_pyld,
elsio->u.els_plogi.els_resp_pyld_dma);
sp->free(sp);
+   return;
}
e->u.iosb.sp = sp;
qla2x00_post_work(vha, e);
-- 
2.17.0.rc1.35.g90bbd502d



  1   2   3   4   5   6   7   8   9   10   >