[PATCH 11/12] qla2xxx: Add new FW dump template entry types

2019-02-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new firmware dump template entries for
ISP27XX firmware dump.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 191 +---
 drivers/scsi/qla2xxx/qla_tmpl.h |  26 +-
 2 files changed, 142 insertions(+), 75 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index f0c7c0c75ef7..9e52500caff0 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -221,7 +221,13 @@ qla27xx_skip_entry(struct qla27xx_fwdt_entry *ent, void 
*buf)
ent->hdr.driver_flags |= DRIVER_FLAG_SKIP_ENTRY;
 }
 
-static int
+static inline struct qla27xx_fwdt_entry *
+qla27xx_next_entry(struct qla27xx_fwdt_entry *ent)
+{
+   return (void *)ent + ent->hdr.size;
+}
+
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -229,10 +235,10 @@ qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
"%s: nop [%lx]\n", __func__, *len);
qla27xx_skip_entry(ent, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -241,10 +247,10 @@ qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
qla27xx_skip_entry(ent, buf);
 
/* terminate */
-   return true;
+   return NULL;
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -255,10 +261,10 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t256.base_addr, ent->t256.pci_offset,
ent->t256.reg_count, ent->t256.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -269,10 +275,10 @@ qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, IOBASE_ADDR, ent->t257.base_addr, buf);
qla27xx_write_reg(reg, ent->t257.pci_offset, ent->t257.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -284,10 +290,10 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t258.base_addr, ent->t258.pci_offset,
ent->t258.reg_count, ent->t258.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -299,10 +305,10 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, ent->t259.banksel_offset, ent->t259.bank, buf);
qla27xx_write_reg(reg, ent->t259.pci_offset, ent->t259.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -313,10 +319,10 @@ qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
qla27xx_insert32(ent->t260.pci_offset, buf, len);
qla27xx_read_reg(reg, ent->t260.pci_offset, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -326,10 +332,10 @@ qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
"%s: wrpci [%lx]\n", __func__, *len);
qla27xx_write_reg(reg, ent->t261.pci_offset, ent->t261.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -362,6 +368,11 @@ qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
ent->t262.start_addr = start;
ent->t262.end_addr = end;
}
+   } else if (ent->t262.ram_area == T262_RAM_AREA_MISC) {
+   if (buf) {
+   ent->t262.start_addr = start;
+   ent->t262.end_addr = end;
+   }
} else {
ql_dbg(q

[PATCH 12/12] qla2xxx: Update driver version to 10.00.00.14-k

2019-02-12 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 537098e8f1c1..0690dac24081 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.13-k"
+#define QLA2XXX_VERSION  "10.00.00.14-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH v2 04/12] qla2xxx: Check for FW started flag before aborting

2019-02-13 Thread Himanshu Madhani
For FC-NVMe, if the fw_started flag is not set or
fcport is deleted, then do not send Abort command

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 232b987e79dd..41c85da3ab32 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -185,6 +185,14 @@ static void qla_nvme_abort_work(struct work_struct *work)
struct qla_hw_data *ha = fcport->vha->hw;
int rval;
 
+   if (fcport)
+   ql_dbg(ql_dbg_io, fcport->vha, 0x,
+   "%s called for sp=%p, hndl=%x on fcport=%p deleted=%d\n",
+   __func__, sp, sp->handle, fcport, fcport->deleted);
+
+   if (!ha->flags.fw_started && (fcport && fcport->deleted))
+   return;
+
rval = ha->isp_ops->abort_command(sp);
 
ql_dbg(ql_dbg_io, fcport->vha, 0x212b,
-- 
2.12.0



[PATCH v2 07/12] qla2xxx: Prevent SysFS access when chip is down

2019-02-13 Thread Himanshu Madhani
From: Quinn Tran 

Prevent user from sending commands through SysFS while
FW is not running or reset is in progress.

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

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index dcdfcf3bc955..ad947bdbc924 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -543,6 +543,9 @@ 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;
-- 
2.12.0



[PATCH v2 01/12] qla2xxx: Fix LUN discovery if loop id is not assigned yet by firmware

2019-02-13 Thread Himanshu Madhani
This patch fixes LUN discovery when loop ID is not yet assigned
by the firmware during driver load/sg_reset operations. Driver will
now search for new loop id before retrying login.

Fixes: 48acad099074 ("scsi: qla2xxx: Fix N2N link re-connect")
Cc: sta...@vger.kernel.org #4.19
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 8307eac796a2..cdf57eb643b3 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -644,11 +644,14 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t 
*vha,
break;
case DSC_LS_PORT_UNAVAIL:
default:
-   if (fcport->loop_id != FC_NO_LOOP_ID)
-   qla2x00_clear_loop_id(fcport);
-
-   fcport->loop_id = loop_id;
-   fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
+   if (fcport->loop_id == FC_NO_LOOP_ID) {
+   qla2x00_find_new_loop_id(vha, fcport);
+   fcport->fw_login_state =
+   DSC_LS_PORT_UNAVAIL;
+   }
+   ql_dbg(ql_dbg_disc, vha, 0x20e5,
+   "%s %d %8phC\n", __func__, __LINE__,
+   fcport->port_name);
qla24xx_fcport_handle_login(vha, fcport);
break;
}
-- 
2.12.0



[PATCH v2 00/12] qla2xxx: Misc bug fixes for the driver

2019-02-13 Thread Himanshu Madhani
Hi Martin, 

This series has misc bug fixes which includes cleanup for FC-NVMe code and
added first burst support for FC-NVMe devices. Other patches included in the
series adds new SysFS hook for setting port speed and patch to prevent access
to SysFS hook whle chip is down. Also added workqueue mechanism for deleting
fcport when called using BSG interface.

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

Changes from v1 -> v2
o Fixed 0-day kernel warning for patch #2
o Removed stale code which introduced error indicating lock was not acquired 
and not
  released in patch #7

Thanks,
Himanshu

Anil Gurumurthy (1):
  qla2xxx: Add support for setting port speed

Darren Trapp (1):
  qla2xxx: Add First Burst support for FC-NVMe devices

Himanshu Madhani (5):
  qla2xxx: Fix LUN discovery if loop id is not assigned yet by firmware
  qla2xxx: Fix unload when NVMe devices are configured
  qla2xxx: Check for FW started flag before aborting
  qla2xxx: Fix code indentation for qla27xx_fwdt_entry
  qla2xxx: Update driver version to 10.00.00.14-k

Joe Carnuccio (2):
  qla2xxx: Add workqueue to delete fcport from bsg sp->free().
  qla2xxx: Add new FW dump template entry types

Quinn Tran (3):
  qla2xxx: Prevent multiple ADISC commands per session
  qla2xxx: Prevent SysFS access when chip is down
  qla2xxx: Move marker request behind QPair

 drivers/scsi/qla2xxx/qla_attr.c| 106 +
 drivers/scsi/qla2xxx/qla_bsg.c |  18 ++-
 drivers/scsi/qla2xxx/qla_def.h |  11 ++
 drivers/scsi/qla2xxx/qla_gbl.h |   5 +-
 drivers/scsi/qla2xxx/qla_init.c|  64 +-
 drivers/scsi/qla2xxx/qla_iocb.c|  55 -
 drivers/scsi/qla2xxx/qla_isr.c |   9 ++
 drivers/scsi/qla2xxx/qla_mbx.c |  85 ++---
 drivers/scsi/qla2xxx/qla_nvme.c|  47 +---
 drivers/scsi/qla2xxx/qla_nvme.h|   2 +-
 drivers/scsi/qla2xxx/qla_os.c  |  11 ++
 drivers/scsi/qla2xxx/qla_tmpl.c| 237 ++---
 drivers/scsi/qla2xxx/qla_tmpl.h|  26 +++-
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 14 files changed, 480 insertions(+), 198 deletions(-)

-- 
2.12.0



[PATCH v2 05/12] qla2xxx: Prevent multiple ADISC commands per session

2019-02-13 Thread Himanshu Madhani
From: Quinn Tran 

add check to allow 1 discovery command per session to be sent.

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

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2d9336a87e42..ba5da365ee4a 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -471,9 +471,11 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t 
*fcport,
 {
srb_t *sp;
struct srb_iocb *lio;
-   int rval;
+   int rval = QLA_FUNCTION_FAILED;
+
+   if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
+   return rval;
 
-   rval = QLA_FUNCTION_FAILED;
fcport->flags |= FCF_ASYNC_SENT;
sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
if (!sp)
-- 
2.12.0



[PATCH v2 08/12] qla2xxx: Add workqueue to delete fcport from bsg sp->free().

2019-02-13 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds workqueue mechanism for deleting fcport
via BSG interface.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c | 18 +-
 drivers/scsi/qla2xxx/qla_def.h |  1 +
 drivers/scsi/qla2xxx/qla_os.c  | 11 +++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 4a9fd8d944d6..d9b6af975691 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -11,6 +11,14 @@
 #include 
 #include 
 
+static void qla2xxx_free_fcport_work(struct work_struct *work)
+{
+   struct fc_port *fcport = container_of(work, typeof(*fcport),
+   free_work);
+
+   qla2x00_free_fcport(fcport);
+}
+
 /* BSG support for ELS/CT pass through */
 void
 qla2x00_bsg_job_done(void *ptr, int res)
@@ -57,8 +65,16 @@ qla2x00_bsg_sp_free(void *ptr)
 
if (sp->type == SRB_CT_CMD ||
sp->type == SRB_FXIOCB_BCMD ||
-   sp->type == SRB_ELS_CMD_HST)
+   sp->type == SRB_ELS_CMD_HST) {
+   if (ha->free_fcport) {
+   INIT_WORK(&sp->fcport->free_work,
+   qla2xxx_free_fcport_work);
+   queue_work(ha->free_fcport, &sp->fcport->free_work);
+   goto done;
+   }
kfree(sp->fcport);
+   }
+done:
qla2x00_rel_sp(sp);
 }
 
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c0f7593666a1..a0304746e8a5 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4190,6 +4190,7 @@ struct qla_hw_data {
struct work_struct idc_state_handler;
struct work_struct nic_core_unrecoverable;
struct work_struct board_disable;
+   struct workqueue_struct *free_fcport;
 
struct mr_data_fx00 mr;
uint32_t chip_reset;
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 7bf23943c815..8bc60ba7fd13 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -3196,6 +3196,12 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct 
pci_device_id *id)
host->max_cmd_len, host->max_channel, host->max_lun,
host->transportt, sht->vendor_id);
 
+   ha->free_fcport = create_workqueue("free_fcport");
+   if (!ha->free_fcport) {
+   ql_log(ql_log_info, base_vha, 0xee00,
+   "Failed to allocate workqueue ha->free_fcport\n");
+   }
+
INIT_WORK(&base_vha->iocb_work, qla2x00_iocb_work_fn);
 
/* Set up the irqs */
@@ -3650,6 +3656,11 @@ qla2x00_destroy_deferred_work(struct qla_hw_data *ha)
ha->dpc_hp_wq = NULL;
}
 
+   if (ha->free_fcport) {
+   destroy_workqueue(ha->free_fcport);
+   ha->free_fcport = NULL;
+   }
+
/* Kill the kernel thread for this host */
if (ha->dpc_thread) {
struct task_struct *t = ha->dpc_thread;
-- 
2.12.0



[PATCH v2 02/12] qla2xxx: Add First Burst support for FC-NVMe devices

2019-02-13 Thread Himanshu Madhani
From: Darren Trapp 

Add Support for First Burst for FC-NVMe protocol. This
feature requires First Burst support in the firmware.

Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  4 
 drivers/scsi/qla2xxx/qla_init.c |  6 ++
 drivers/scsi/qla2xxx/qla_iocb.c |  5 -
 drivers/scsi/qla2xxx/qla_isr.c  |  9 +
 drivers/scsi/qla2xxx/qla_mbx.c  |  5 +++--
 drivers/scsi/qla2xxx/qla_nvme.c | 17 -
 drivers/scsi/qla2xxx/qla_nvme.h |  2 +-
 7 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 80acf30fd8a5..c256ba7fba84 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2367,7 +2367,9 @@ typedef struct fc_port {
 #define NVME_PRLI_SP_INITIATOR  BIT_5
 #define NVME_PRLI_SP_TARGET BIT_4
 #define NVME_PRLI_SP_DISCOVERY  BIT_3
+#define NVME_PRLI_SP_FIRST_BURST   BIT_0
uint8_t nvme_flag;
+   uint32_t nvme_first_burst_size;
 #define NVME_FLAG_REGISTERED 4
 #define NVME_FLAG_DELETING 2
 #define NVME_FLAG_RESETTING 1
@@ -3966,6 +3968,7 @@ struct qla_hw_data {
uint16_tfw_subminor_version;
uint16_tfw_attributes;
uint16_tfw_attributes_h;
+#define FW_ATTR_H_NVME_FBURST  BIT_1
 #define FW_ATTR_H_NVME BIT_10
 #define FW_ATTR_H_NVME_UPDATED  BIT_14
 
@@ -4260,6 +4263,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvme_first_burst:1;
} flags;
 
atomic_tloop_state;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cdf57eb643b3..2d9336a87e42 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1829,6 +1829,12 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host 
*vha, struct event_arg *ea)
 
ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
ea->fcport->logout_on_delete = 1;
+   ea->fcport->nvme_prli_service_param = ea->iop[0];
+   if (ea->iop[0] & NVME_PRLI_SP_FIRST_BURST)
+   ea->fcport->nvme_first_burst_size =
+   (ea->iop[1] & 0x) * 512;
+   else
+   ea->fcport->nvme_first_burst_size = 0;
qla24xx_post_gpdb_work(vha, ea->fcport, 0);
break;
default:
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 2c27ae1924c5..cdac282b5bd3 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2419,8 +2419,11 @@ qla24xx_prli_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
 
logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
logio->control_flags = cpu_to_le16(LCF_COMMAND_PRLI);
-   if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI)
+   if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI) {
logio->control_flags |= LCF_NVME_PRLI;
+   if (sp->vha->flags.nvme_first_burst)
+   logio->io_parameter[0] = NVME_PRLI_SP_FIRST_BURST;
+   }
 
logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
logio->port_id[0] = sp->fcport->d_id.b.al_pa;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index bde9940ea7d1..b5ae76869d5b 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -1715,6 +1715,15 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que 
*req,
 
vha->hw->exch_starvation = 0;
data[0] = MBS_COMMAND_COMPLETE;
+
+   if (sp->type == SRB_PRLI_CMD) {
+   lio->u.logio.iop[0] =
+   le32_to_cpu(logio->io_parameter[0]);
+   lio->u.logio.iop[1] =
+   le32_to_cpu(logio->io_parameter[1]);
+   goto logio_done;
+   }
+
if (sp->type != SRB_LOGIN_CMD)
goto logio_done;
 
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index f4adf6baee69..6c911f2e4cdb 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -1112,6 +1112,9 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
if ((ha->fw_attributes_h &
(FW_ATTR_H_NVME | FW_ATTR_H_NVME_UPDATED)) &&
ql2xnvmeenable) {
+   if (ha->fw_attributes_h & FW_ATTR_H_NVME_FBURST)
+   vha->flags.nvme_first_burst = 1;
+
vha->flags.nvme_enabled = 1;
ql_log(

[PATCH v2 03/12] qla2xxx: Fix unload when NVMe devices are configured

2019-02-13 Thread Himanshu Madhani
This patch fixes driver unload issue when FC-NVMe devices are
configured.

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 22 ++
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index d6ba078d8255..232b987e79dd 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -607,6 +607,7 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
struct fc_port *fcport = container_of(work, struct fc_port,
nvme_del_work);
struct qla_nvme_rport *qla_rport, *trport;
+   scsi_qla_host_t *base_vha;
 
if (!IS_ENABLED(CONFIG_NVME_FC))
return;
@@ -614,6 +615,15 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
ql_log(ql_log_warn, NULL, 0x2112,
"%s: unregister remoteport on %p\n",__func__, fcport);
 
+   base_vha = pci_get_drvdata(fcport->vha->hw->pdev);
+   if (test_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags)) {
+   ql_dbg(ql_dbg_disc, fcport->vha, 0x2114,
+   "%s: Notify FC-NVMe transport, set devloss=0\n",
+   __func__);
+
+   nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
+   }
+
list_for_each_entry_safe(qla_rport, trport,
&fcport->vha->nvme_rport_list, list) {
if (qla_rport->fcport == fcport) {
@@ -630,23 +640,11 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
 
 void qla_nvme_delete(struct scsi_qla_host *vha)
 {
-   struct qla_nvme_rport *qla_rport, *trport;
-   fc_port_t *fcport;
int nv_ret;
 
if (!IS_ENABLED(CONFIG_NVME_FC))
return;
 
-   list_for_each_entry_safe(qla_rport, trport,
-   &vha->nvme_rport_list, list) {
-   fcport = qla_rport->fcport;
-
-   ql_log(ql_log_info, fcport->vha, 0x2114, "%s: fcport=%p\n",
-   __func__, fcport);
-
-   nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
-   }
-
if (vha->nvme_local_port) {
init_completion(&vha->nvme_del_done);
ql_log(ql_log_info, vha, 0x2116,
-- 
2.12.0



[PATCH v2 10/12] qla2xxx: Fix code indentation for qla27xx_fwdt_entry

2019-02-13 Thread Himanshu Madhani
This patch fixes following checkpatch ERROR

 ERROR: space prohibited before that ',' (ctx:WxW)

No change is functionality due to this patch.

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 46 -
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 0ccd06f11f12..f0c7c0c75ef7 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -796,29 +796,29 @@ struct qla27xx_fwdt_entry_call {
 };
 
 static struct qla27xx_fwdt_entry_call ql27xx_fwdt_entry_call_list[] = {
-   { ENTRY_TYPE_NOP, qla27xx_fwdt_entry_t0} ,
-   { ENTRY_TYPE_TMP_END, qla27xx_fwdt_entry_t255  } ,
-   { ENTRY_TYPE_RD_IOB_T1  , qla27xx_fwdt_entry_t256  } ,
-   { ENTRY_TYPE_WR_IOB_T1  , qla27xx_fwdt_entry_t257  } ,
-   { ENTRY_TYPE_RD_IOB_T2  , qla27xx_fwdt_entry_t258  } ,
-   { ENTRY_TYPE_WR_IOB_T2  , qla27xx_fwdt_entry_t259  } ,
-   { ENTRY_TYPE_RD_PCI , qla27xx_fwdt_entry_t260  } ,
-   { ENTRY_TYPE_WR_PCI , qla27xx_fwdt_entry_t261  } ,
-   { ENTRY_TYPE_RD_RAM , qla27xx_fwdt_entry_t262  } ,
-   { ENTRY_TYPE_GET_QUEUE  , qla27xx_fwdt_entry_t263  } ,
-   { ENTRY_TYPE_GET_FCE, qla27xx_fwdt_entry_t264  } ,
-   { ENTRY_TYPE_PSE_RISC   , qla27xx_fwdt_entry_t265  } ,
-   { ENTRY_TYPE_RST_RISC   , qla27xx_fwdt_entry_t266  } ,
-   { ENTRY_TYPE_DIS_INTR   , qla27xx_fwdt_entry_t267  } ,
-   { ENTRY_TYPE_GET_HBUF   , qla27xx_fwdt_entry_t268  } ,
-   { ENTRY_TYPE_SCRATCH, qla27xx_fwdt_entry_t269  } ,
-   { ENTRY_TYPE_RDREMREG   , qla27xx_fwdt_entry_t270  } ,
-   { ENTRY_TYPE_WRREMREG   , qla27xx_fwdt_entry_t271  } ,
-   { ENTRY_TYPE_RDREMRAM   , qla27xx_fwdt_entry_t272  } ,
-   { ENTRY_TYPE_PCICFG , qla27xx_fwdt_entry_t273  } ,
-   { ENTRY_TYPE_GET_SHADOW , qla27xx_fwdt_entry_t274  } ,
-   { ENTRY_TYPE_WRITE_BUF  , qla27xx_fwdt_entry_t275  } ,
-   { -1, qla27xx_fwdt_entry_other }
+   { ENTRY_TYPE_NOP,   qla27xx_fwdt_entry_t0},
+   { ENTRY_TYPE_TMP_END,   qla27xx_fwdt_entry_t255  },
+   { ENTRY_TYPE_RD_IOB_T1, qla27xx_fwdt_entry_t256  },
+   { ENTRY_TYPE_WR_IOB_T1, qla27xx_fwdt_entry_t257  },
+   { ENTRY_TYPE_RD_IOB_T2, qla27xx_fwdt_entry_t258  },
+   { ENTRY_TYPE_WR_IOB_T2, qla27xx_fwdt_entry_t259  },
+   { ENTRY_TYPE_RD_PCI,qla27xx_fwdt_entry_t260  },
+   { ENTRY_TYPE_WR_PCI,qla27xx_fwdt_entry_t261  },
+   { ENTRY_TYPE_RD_RAM,qla27xx_fwdt_entry_t262  },
+   { ENTRY_TYPE_GET_QUEUE, qla27xx_fwdt_entry_t263  },
+   { ENTRY_TYPE_GET_FCE,   qla27xx_fwdt_entry_t264  },
+   { ENTRY_TYPE_PSE_RISC,  qla27xx_fwdt_entry_t265  },
+   { ENTRY_TYPE_RST_RISC,  qla27xx_fwdt_entry_t266  },
+   { ENTRY_TYPE_DIS_INTR,  qla27xx_fwdt_entry_t267  },
+   { ENTRY_TYPE_GET_HBUF,  qla27xx_fwdt_entry_t268  },
+   { ENTRY_TYPE_SCRATCH,   qla27xx_fwdt_entry_t269  },
+   { ENTRY_TYPE_RDREMREG,  qla27xx_fwdt_entry_t270  },
+   { ENTRY_TYPE_WRREMREG,  qla27xx_fwdt_entry_t271  },
+   { ENTRY_TYPE_RDREMRAM,  qla27xx_fwdt_entry_t272  },
+   { ENTRY_TYPE_PCICFG,qla27xx_fwdt_entry_t273  },
+   { ENTRY_TYPE_GET_SHADOW,qla27xx_fwdt_entry_t274  },
+   { ENTRY_TYPE_WRITE_BUF, qla27xx_fwdt_entry_t275  },
+   { -1,   qla27xx_fwdt_entry_other }
 };
 
 static inline int (*qla27xx_find_entry(uint type))
-- 
2.12.0



[PATCH v2 06/12] qla2xxx: Add support for setting port speed

2019-02-13 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node

1. There is a new sysfs node port_speed
2. The possible values are 2(Auto neg), 8, 16, 32
3. A value outside of the above defaults to Auto neg
4. Any update to the setting causes a link toggle
5. This feature is currently only for ISP27xx

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 103 
 drivers/scsi/qla2xxx/qla_def.h  |   6 +++
 drivers/scsi/qla2xxx/qla_gbl.h  |   1 +
 drivers/scsi/qla2xxx/qla_init.c |   9 
 drivers/scsi/qla2xxx/qla_mbx.c  |  62 +++-
 5 files changed, 180 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 8b4dd72011bf..dcdfcf3bc955 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -631,6 +631,108 @@ static struct bin_attribute sysfs_sfp_attr = {
 };
 
 static ssize_t
+qla2x00_sysfs_set_port_speed(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)));
+   int type;
+   int mode = QLA_SET_DATA_RATE_LR;
+   int rval;
+   struct qla_hw_data *ha = vha->hw;
+   int speed, oldspeed;
+
+   if (!IS_QLA27XX(vha->hw)) {
+   ql_log(ql_log_warn, vha, 0x70d8,
+   "Speed setting not supported \n");
+   return -EINVAL;
+   }
+
+   speed = type = simple_strtol(buf, NULL, 10);
+   if (type == 40 || type == 80 || type == 160 ||
+   type == 320) {
+   ql_log(ql_log_warn, vha, 0x70d9,
+   "Setting will be affected after a loss of sync\n");
+   type = type/10;
+   mode = QLA_SET_DATA_RATE_NOLR;
+   }
+
+   oldspeed = ha->set_data_rate;
+
+   switch (type) {
+   case 0:
+   ha->set_data_rate = PORT_SPEED_AUTO;
+   break;
+   case 4:
+   ha->set_data_rate = PORT_SPEED_4GB;
+   break;
+   case 8:
+   ha->set_data_rate = PORT_SPEED_8GB;
+   break;
+   case 16:
+   ha->set_data_rate = PORT_SPEED_16GB;
+   break;
+   case 32:
+   ha->set_data_rate = PORT_SPEED_32GB;
+   break;
+   default:
+   ql_log(ql_log_warn, vha, 0x1199,
+   "Unrecognized speed setting:%d. Setting Autoneg\n",
+   speed);
+   ha->set_data_rate = PORT_SPEED_AUTO;
+   }
+
+   if (qla2x00_chip_is_down(vha) || (oldspeed == ha->set_data_rate))
+   return count;
+
+   ql_log(ql_log_info, vha, 0x70da,
+   "Setting speed to %d Gbps \n", type);
+
+   rval = qla2x00_set_data_rate(vha, mode);
+   if (rval != QLA_SUCCESS)
+   return -EIO;
+
+   return count;
+}
+
+static ssize_t
+qla2x00_sysfs_get_port_speed(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;
+   ssize_t rval;
+   char *spd[7] = {"0", "0", "0", "4", "8", "16", "32"};
+
+   rval = qla2x00_get_data_rate(vha);
+   if (rval != QLA_SUCCESS) {
+   ql_log(ql_log_warn, vha, 0x70db,
+   "Unable to get port speed rval:%zd\n", rval);
+   return -EINVAL;
+   }
+
+   ql_log(ql_log_info, vha, 0x70d6,
+   "port speed:%d\n", ha->link_data_rate);
+
+   rval = memory_read_from_buffer(buf, count,
+   &off, spd[ha->link_data_rate], sizeof(ha->link_data_rate));
+
+   return rval;
+}
+
+static struct bin_attribute sysfs_port_speed_attr = {
+   .attr = {
+   .name = "port_speed",
+   .mode = 0600,
+   },
+   .size = 16,
+   .write = qla2x00_sysfs_set_port_speed,
+   .read = qla2x00_sysfs_get_port_speed,
+};
+
+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 +1045,7 @@ static struct sysfs_entry {
{ "issue_logo", &sysfs_issue_logo_attr, },
{ "xgmac_stats", &sysfs_xgmac_stats_attr, 3 },
{ "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 },
+   { "port_speed", &sysfs_port_speed_attr, },
{ NULL },
 };
 
di

[PATCH v2 12/12] qla2xxx: Update driver version to 10.00.00.14-k

2019-02-13 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 537098e8f1c1..0690dac24081 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.13-k"
+#define QLA2XXX_VERSION  "10.00.00.14-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH v2 09/12] qla2xxx: Move marker request behind QPair

2019-02-13 Thread Himanshu Madhani
From: Quinn Tran 

current code hard code marker request to use request
and response queue 0. This patch make use of the
qpair as the path to access the request/response queues.
It allows marker to be place on any hardware queues.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |  4 ++--
 drivers/scsi/qla2xxx/qla_init.c | 30 ++---
 drivers/scsi/qla2xxx/qla_iocb.c | 50 +
 drivers/scsi/qla2xxx/qla_mbx.c  | 18 +++
 4 files changed, 33 insertions(+), 69 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 3c59006e64bb..4eefe69ca807 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -270,8 +270,8 @@ extern void qla24xx_build_scsi_iocbs(srb_t *, struct 
cmd_type_7 *,
uint16_t, struct req_que *);
 extern int qla2x00_start_scsi(srb_t *sp);
 extern int qla24xx_start_scsi(srb_t *sp);
-int qla2x00_marker(struct scsi_qla_host *, struct req_que *, struct rsp_que *,
-   uint16_t, uint64_t, uint8_t);
+int qla2x00_marker(struct scsi_qla_host *, struct qla_qpair *,
+uint16_t, uint64_t, uint8_t);
 extern int qla2x00_start_sp(srb_t *);
 extern int qla24xx_dif_start_scsi(srb_t *);
 extern int qla2x00_start_bidir(srb_t *, struct scsi_qla_host *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index bb9bccb734f8..a95915881c87 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1703,8 +1703,8 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, 
uint32_t lun,
lun = (uint16_t)tm_iocb->u.tmf.lun;
 
/* Issue Marker IOCB */
-   qla2x00_marker(vha, vha->hw->req_q_map[0],
-   vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun,
+   qla2x00_marker(vha, vha->hw->base_qpair,
+   sp->fcport->loop_id, lun,
flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
}
 
@@ -6039,11 +6039,6 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 {
int rval = QLA_SUCCESS;
uint32_t wait_time;
-   struct req_que *req;
-   struct rsp_que *rsp;
-
-   req = vha->req;
-   rsp = req->rsp;
 
clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
if (vha->flags.online) {
@@ -6056,8 +6051,8 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 * Issue a marker after FW becomes
 * ready.
 */
-   qla2x00_marker(vha, req, rsp, 0, 0,
-   MK_SYNC_ALL);
+   qla2x00_marker(vha, vha->hw->base_qpair,
+   0, 0, MK_SYNC_ALL);
vha->marker_needed = 0;
}
 
@@ -6795,8 +6790,6 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
 {
int status = 0;
struct qla_hw_data *ha = vha->hw;
-   struct req_que *req = ha->req_q_map[0];
-   struct rsp_que *rsp = ha->rsp_q_map[0];
 
/* If firmware needs to be loaded */
if (qla2x00_isp_firmware(vha)) {
@@ -6816,7 +6809,7 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
status = qla2x00_fw_ready(vha);
if (!status) {
/* Issue a marker after FW becomes ready. */
-   qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+   qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
}
 
@@ -7871,22 +7864,15 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha)
uint16_t mb[MAILBOX_REGISTER_COUNT];
struct qla_hw_data *ha = vha->hw;
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
-   struct req_que *req;
-   struct rsp_que *rsp;
 
if (!vha->vp_idx)
return -EINVAL;
 
rval = qla2x00_fw_ready(base_vha);
-   if (vha->qpair)
-   req = vha->qpair->req;
-   else
-   req = ha->req_q_map[0];
-   rsp = req->rsp;
 
if (rval == QLA_SUCCESS) {
clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
-   qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+   qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
}
 
vha->flags.management_server_logged_in = 0;
@@ -8278,8 +8264,6 @@ qla82xx_restart_isp(scsi_qla_host_t *vha)
 {
int status, rval;
struct qla_hw_data *ha = vha->hw;
-   struct req_que *req = ha->req_q_map[0];
-   struct rsp_que *rsp = ha-&

[PATCH v2 11/12] qla2xxx: Add new FW dump template entry types

2019-02-13 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new firmware dump template entries for
ISP27XX firmware dump.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 191 +---
 drivers/scsi/qla2xxx/qla_tmpl.h |  26 +-
 2 files changed, 142 insertions(+), 75 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index f0c7c0c75ef7..9e52500caff0 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -221,7 +221,13 @@ qla27xx_skip_entry(struct qla27xx_fwdt_entry *ent, void 
*buf)
ent->hdr.driver_flags |= DRIVER_FLAG_SKIP_ENTRY;
 }
 
-static int
+static inline struct qla27xx_fwdt_entry *
+qla27xx_next_entry(struct qla27xx_fwdt_entry *ent)
+{
+   return (void *)ent + ent->hdr.size;
+}
+
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -229,10 +235,10 @@ qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
"%s: nop [%lx]\n", __func__, *len);
qla27xx_skip_entry(ent, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -241,10 +247,10 @@ qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
qla27xx_skip_entry(ent, buf);
 
/* terminate */
-   return true;
+   return NULL;
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -255,10 +261,10 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t256.base_addr, ent->t256.pci_offset,
ent->t256.reg_count, ent->t256.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -269,10 +275,10 @@ qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, IOBASE_ADDR, ent->t257.base_addr, buf);
qla27xx_write_reg(reg, ent->t257.pci_offset, ent->t257.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -284,10 +290,10 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t258.base_addr, ent->t258.pci_offset,
ent->t258.reg_count, ent->t258.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -299,10 +305,10 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, ent->t259.banksel_offset, ent->t259.bank, buf);
qla27xx_write_reg(reg, ent->t259.pci_offset, ent->t259.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -313,10 +319,10 @@ qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
qla27xx_insert32(ent->t260.pci_offset, buf, len);
qla27xx_read_reg(reg, ent->t260.pci_offset, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -326,10 +332,10 @@ qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
"%s: wrpci [%lx]\n", __func__, *len);
qla27xx_write_reg(reg, ent->t261.pci_offset, ent->t261.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -362,6 +368,11 @@ qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
ent->t262.start_addr = start;
ent->t262.end_addr = end;
}
+   } else if (ent->t262.ram_area == T262_RAM_AREA_MISC) {
+   if (buf) {
+   ent->t262.start_addr = start;
+   ent->t262.end_addr = end;
+   }
} else {
ql_dbg(q

Re: [PATCH] Move debug messages before sending srb preventing panic

2019-02-14 Thread Himanshu Madhani
2,6 +1074,11 @@ static int qla24xx_post_prli_work(struct 
scsi_qla_host *vha, fc_port_t *fcport)
if  (fcport->fc4f_nvme)
lio->u.logio.flags |= SRB_LOGIN_NVME_PRLI;

+   ql_dbg(ql_dbg_disc, vha, 0x211b,
+   "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d 
%s.\n",
+   fcport->port_name, sp->handle, fcport->loop_id, 
fcport->d_id.b24,
+   fcport->login_retry, fcport->fc4f_nvme ? "nvme" : "fc");
+
rval = qla2x00_start_sp(sp);
if (rval != QLA_SUCCESS) {
fcport->flags |= FCF_LOGIN_NEEDED;
@@ -1079,11 +1086,6 @@ static int qla24xx_post_prli_work(struct 
scsi_qla_host *vha, fc_port_t *fcport)
goto done_free_sp;
}

-   ql_dbg(ql_dbg_disc, vha, 0x211b,
-   "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d 
%s.\n",
-   fcport->port_name, sp->handle, fcport->loop_id, 
fcport->d_id.b24,
-   fcport->login_retry, fcport->fc4f_nvme ? "nvme" : "fc");
-
return rval;

 done_free_sp:
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 510337e..c21d55d 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -660,14 +660,14 @@ int qla24xx_async_notify_ack(scsi_qla_host_t *vha, 
fc_port_t *fcport,
sp->u.iocb_cmd.u.nack.ntfy = ntfy;
sp->done = qla2x00_async_nack_sp_done;

-   rval = qla2x00_start_sp(sp);
-   if (rval != QLA_SUCCESS)
-   goto done_free_sp;
-
ql_dbg(ql_dbg_disc, vha, 0x20f4,
"Async-%s %8phC hndl %x %s\n",
sp->name, fcport->port_name, sp->handle, c);

+   rval = qla2x00_start_sp(sp);
+   if (rval != QLA_SUCCESS)
+   goto done_free_sp;
+
return rval;

 done_free_sp:
--
1.8.3.1

Thanks for the patch.  Looks good. 

Acked-By: Himanshu Madhani 



Re: [PATCH v2 06/12] qla2xxx: Add support for setting port speed

2019-02-14 Thread Himanshu Madhani
Hi Bart, 


On 2/13/19, 4:55 PM, "Bart Van Assche"  wrote:

On Wed, 2019-02-13 at 10:53 -0800, Himanshu Madhani wrote:
>  static ssize_t
> +qla2x00_sysfs_set_port_speed(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)));
> + int type;
> + int mode = QLA_SET_DATA_RATE_LR;
> + int rval;
> + struct qla_hw_data *ha = vha->hw;
> + int speed, oldspeed;
> +
> + if (!IS_QLA27XX(vha->hw)) {
> + ql_log(ql_log_warn, vha, 0x70d8,
> + "Speed setting not supported \n");
> + return -EINVAL;
> + }
> +
> + speed = type = simple_strtol(buf, NULL, 10);
> + if (type == 40 || type == 80 || type == 160 ||
> + type == 320) {
> + ql_log(ql_log_warn, vha, 0x70d9,
> + "Setting will be affected after a loss of sync\n");
> + type = type/10;
> + mode = QLA_SET_DATA_RATE_NOLR;
> + }

Anil, you are supposed to use checkpatch before submitting a patch. 
Checkpatch
complains about the above code:

WARNING: simple_strtol is obsolete, use kstrtol instead
#197: FILE: drivers/scsi/qla2xxx/qla_attr.c:651:
+   speed = type = simple_strtol(buf, NULL, 10);

This Warning got missed in my checkpatch testing as well. Will fix up and 
repost this patch. 

> + oldspeed = ha->set_data_rate;
> +
> + switch (type) {
> + case 0:
> + ha->set_data_rate = PORT_SPEED_AUTO;
> + break;
> + case 4:
> + ha->set_data_rate = PORT_SPEED_4GB;
> + break;
> + case 8:
> + ha->set_data_rate = PORT_SPEED_8GB;
> + break;
> + case 16:
> + ha->set_data_rate = PORT_SPEED_16GB;
> + break;
> + case 32:
> + ha->set_data_rate = PORT_SPEED_32GB;
> + break;
> + default:
> + ql_log(ql_log_warn, vha, 0x1199,
> + "Unrecognized speed setting:%d. Setting Autoneg\n",
> + speed);
> + ha->set_data_rate = PORT_SPEED_AUTO;
> + }

The default case is weird. Most sysfs store methods do not change any 
settings
if an invalid input parameter has been supplied.

We do want to set data rate to Auto in case we get as default, if we don’t 
recognize user input. 

> +
> + if (qla2x00_chip_is_down(vha) || (oldspeed == ha->set_data_rate))
> + return count;

Wouldn't -EAGAIN be a better return value in this case?
   
Agree. Will fix this up

> +static ssize_t
> +qla2x00_sysfs_get_port_speed(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;
> + ssize_t rval;
> + char *spd[7] = {"0", "0", "0", "4", "8", "16", "32"};

This should be a "static const char *" array.
 
Yes.  Will update patch
   
> + ql_log(ql_log_info, vha, 0x70d6,
> + "port speed:%d\n", ha->link_data_rate);

This looks like a debug statement. Log level "debug" is probably more 
appropriate.

Yes.  Will update

> +static struct bin_attribute sysfs_port_speed_attr = {
> + .attr = {
> + .name = "port_speed",
> + .mode = 0600,
> + },
> + .size = 16,
> + .write = qla2x00_sysfs_set_port_speed,
> + .read = qla2x00_sysfs_get_port_speed,
> +};

This needs an explanation of why you choose to make this a binary 
attribute. And if
you don't have a very good reason to make this attribute a binary 
attribute, it should
be changed into a regular attribute.
   
It does look like there is no specific reason for this attribute to be binary. 
Will update it to use regular attribute and post revised patch
  
> +/* Set the specified data rate */
> +int
> +qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode)
> +{
> + int rval;
> + mbx_cmd_t mc;
> + mbx_cmd_t *mcp = &mc;
> + struct qla_hw_data *ha = vha->hw;
> + uint16_t val;
> +
> + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1106,
> + "Entered %s speed:0x%x mode:0x%x.\n", __func__, ha->set_data_rate,
> + mode);
> +
> + if (!IS_FWI2_CAPABLE(ha))
> + return QLA_FUNCTION_FAILED;
> +
> + memset(mcp, 0, sizeof(mbx_cmd_t));

Please change sizeof(mbx_cmd_t) into sizeof(*mcp).

Will Do. 

Thanks,

Bart.

Thanks,
-- Himanshu




Re: [EXT] Re: [PATCH v2 08/12] qla2xxx: Add workqueue to delete fcport from bsg sp->free().

2019-02-14 Thread Himanshu Madhani
Hi Bart,  

On 2/13/19, 4:57 PM, "Bart Van Assche"  wrote:

External Email

--
On Wed, 2019-02-13 at 10:53 -0800, Himanshu Madhani wrote:
> + ha->free_fcport = create_workqueue("free_fcport");
> + if (!ha->free_fcport) {
> + ql_log(ql_log_info, base_vha, 0xee00,
> + "Failed to allocate workqueue ha->free_fcport\n");
> + }

Above this code either an explanation should be added why the system
work queues are not appropriate or this code should be modified such
that it uses one of the system workqueues.

Will look into using system work queue and repost later. 

Bart.


Thanks,
Himanshu



Re: [PATCH][V2] scsi: qla2xxx: remove redundant null check on pointer sess

2019-02-15 Thread Himanshu Madhani
Hi Colin,

On 2/15/19, 1:52 AM, "Colin King"  wrote:

External Email

From: Colin Ian King 

The null check on pointer sess and the subsequent call is redundant
as sess is null on all the the paths that lead to the out_term2 label.
Hence the null check and the call can be removed.  Also remove the
redundant setting of sess to NULL as this is not required now.

Detected by CoverityScan, CID#1420663 ("Logically dead code")

Signed-off-by: Colin Ian King 
---

V2: Remove the redundant settings of sess to NULL, thanks to
Dan Carpenter for spotting this.

---
 drivers/scsi/qla2xxx/qla_target.c | 6 +-
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 6b8c655d9eb4..33131446b327 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -6343,7 +6343,7 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
struct atio_from_isp *a = &prm->tm_iocb2;
struct scsi_qla_host *vha = tgt->vha;
struct qla_hw_data *ha = vha->hw;
-   struct fc_port *sess = NULL;
+   struct fc_port *sess;
unsigned long flags;
uint8_t *s_id = NULL; /* to hide compiler warnings */
int rc;
@@ -6369,7 +6369,6 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
goto out_term2;
} else {
if (sess->deleted) {
-   sess = NULL;
goto out_term2;
}

@@ -6377,7 +6376,6 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
ql_dbg(ql_dbg_tgt_tmr, vha, 0xf020,
"%s: kref_get fail %8phC\n",
 __func__, sess->port_name);
-   sess = NULL;
goto out_term2;
}
}
@@ -6396,8 +6394,6 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
return;

 out_term2:
-   if (sess)
-   ha->tgt.tgt_ops->put_sess(sess);
spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
 out_term:
qlt_send_term_exchange(ha->base_qpair, NULL, &prm->tm_iocb2, 1, 0);
    --
2.20.1

Thanks for the Patch. Looks good

Acked-by: Himanshu Madhani 




[PATCH v3 09/11] qla2xxx: Fix code indentation for qla27xx_fwdt_entry

2019-02-15 Thread Himanshu Madhani
This patch fixes following checkpatch ERROR

 ERROR: space prohibited before that ',' (ctx:WxW)

No change is functionality due to this patch.

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 46 -
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 0ccd06f11f12..f0c7c0c75ef7 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -796,29 +796,29 @@ struct qla27xx_fwdt_entry_call {
 };
 
 static struct qla27xx_fwdt_entry_call ql27xx_fwdt_entry_call_list[] = {
-   { ENTRY_TYPE_NOP, qla27xx_fwdt_entry_t0} ,
-   { ENTRY_TYPE_TMP_END, qla27xx_fwdt_entry_t255  } ,
-   { ENTRY_TYPE_RD_IOB_T1  , qla27xx_fwdt_entry_t256  } ,
-   { ENTRY_TYPE_WR_IOB_T1  , qla27xx_fwdt_entry_t257  } ,
-   { ENTRY_TYPE_RD_IOB_T2  , qla27xx_fwdt_entry_t258  } ,
-   { ENTRY_TYPE_WR_IOB_T2  , qla27xx_fwdt_entry_t259  } ,
-   { ENTRY_TYPE_RD_PCI , qla27xx_fwdt_entry_t260  } ,
-   { ENTRY_TYPE_WR_PCI , qla27xx_fwdt_entry_t261  } ,
-   { ENTRY_TYPE_RD_RAM , qla27xx_fwdt_entry_t262  } ,
-   { ENTRY_TYPE_GET_QUEUE  , qla27xx_fwdt_entry_t263  } ,
-   { ENTRY_TYPE_GET_FCE, qla27xx_fwdt_entry_t264  } ,
-   { ENTRY_TYPE_PSE_RISC   , qla27xx_fwdt_entry_t265  } ,
-   { ENTRY_TYPE_RST_RISC   , qla27xx_fwdt_entry_t266  } ,
-   { ENTRY_TYPE_DIS_INTR   , qla27xx_fwdt_entry_t267  } ,
-   { ENTRY_TYPE_GET_HBUF   , qla27xx_fwdt_entry_t268  } ,
-   { ENTRY_TYPE_SCRATCH, qla27xx_fwdt_entry_t269  } ,
-   { ENTRY_TYPE_RDREMREG   , qla27xx_fwdt_entry_t270  } ,
-   { ENTRY_TYPE_WRREMREG   , qla27xx_fwdt_entry_t271  } ,
-   { ENTRY_TYPE_RDREMRAM   , qla27xx_fwdt_entry_t272  } ,
-   { ENTRY_TYPE_PCICFG , qla27xx_fwdt_entry_t273  } ,
-   { ENTRY_TYPE_GET_SHADOW , qla27xx_fwdt_entry_t274  } ,
-   { ENTRY_TYPE_WRITE_BUF  , qla27xx_fwdt_entry_t275  } ,
-   { -1, qla27xx_fwdt_entry_other }
+   { ENTRY_TYPE_NOP,   qla27xx_fwdt_entry_t0},
+   { ENTRY_TYPE_TMP_END,   qla27xx_fwdt_entry_t255  },
+   { ENTRY_TYPE_RD_IOB_T1, qla27xx_fwdt_entry_t256  },
+   { ENTRY_TYPE_WR_IOB_T1, qla27xx_fwdt_entry_t257  },
+   { ENTRY_TYPE_RD_IOB_T2, qla27xx_fwdt_entry_t258  },
+   { ENTRY_TYPE_WR_IOB_T2, qla27xx_fwdt_entry_t259  },
+   { ENTRY_TYPE_RD_PCI,qla27xx_fwdt_entry_t260  },
+   { ENTRY_TYPE_WR_PCI,qla27xx_fwdt_entry_t261  },
+   { ENTRY_TYPE_RD_RAM,qla27xx_fwdt_entry_t262  },
+   { ENTRY_TYPE_GET_QUEUE, qla27xx_fwdt_entry_t263  },
+   { ENTRY_TYPE_GET_FCE,   qla27xx_fwdt_entry_t264  },
+   { ENTRY_TYPE_PSE_RISC,  qla27xx_fwdt_entry_t265  },
+   { ENTRY_TYPE_RST_RISC,  qla27xx_fwdt_entry_t266  },
+   { ENTRY_TYPE_DIS_INTR,  qla27xx_fwdt_entry_t267  },
+   { ENTRY_TYPE_GET_HBUF,  qla27xx_fwdt_entry_t268  },
+   { ENTRY_TYPE_SCRATCH,   qla27xx_fwdt_entry_t269  },
+   { ENTRY_TYPE_RDREMREG,  qla27xx_fwdt_entry_t270  },
+   { ENTRY_TYPE_WRREMREG,  qla27xx_fwdt_entry_t271  },
+   { ENTRY_TYPE_RDREMRAM,  qla27xx_fwdt_entry_t272  },
+   { ENTRY_TYPE_PCICFG,qla27xx_fwdt_entry_t273  },
+   { ENTRY_TYPE_GET_SHADOW,qla27xx_fwdt_entry_t274  },
+   { ENTRY_TYPE_WRITE_BUF, qla27xx_fwdt_entry_t275  },
+   { -1,   qla27xx_fwdt_entry_other }
 };
 
 static inline int (*qla27xx_find_entry(uint type))
-- 
2.12.0



[PATCH v3 10/11] qla2xxx: Add new FW dump template entry types

2019-02-15 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new firmware dump template entries for
ISP27XX firmware dump.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 191 +---
 drivers/scsi/qla2xxx/qla_tmpl.h |  26 +-
 2 files changed, 142 insertions(+), 75 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index f0c7c0c75ef7..9e52500caff0 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -221,7 +221,13 @@ qla27xx_skip_entry(struct qla27xx_fwdt_entry *ent, void 
*buf)
ent->hdr.driver_flags |= DRIVER_FLAG_SKIP_ENTRY;
 }
 
-static int
+static inline struct qla27xx_fwdt_entry *
+qla27xx_next_entry(struct qla27xx_fwdt_entry *ent)
+{
+   return (void *)ent + ent->hdr.size;
+}
+
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -229,10 +235,10 @@ qla27xx_fwdt_entry_t0(struct scsi_qla_host *vha,
"%s: nop [%lx]\n", __func__, *len);
qla27xx_skip_entry(ent, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -241,10 +247,10 @@ qla27xx_fwdt_entry_t255(struct scsi_qla_host *vha,
qla27xx_skip_entry(ent, buf);
 
/* terminate */
-   return true;
+   return NULL;
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -255,10 +261,10 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t256.base_addr, ent->t256.pci_offset,
ent->t256.reg_count, ent->t256.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -269,10 +275,10 @@ qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, IOBASE_ADDR, ent->t257.base_addr, buf);
qla27xx_write_reg(reg, ent->t257.pci_offset, ent->t257.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -284,10 +290,10 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
qla27xx_read_window(reg, ent->t258.base_addr, ent->t258.pci_offset,
ent->t258.reg_count, ent->t258.reg_width, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -299,10 +305,10 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
qla27xx_write_reg(reg, ent->t259.banksel_offset, ent->t259.bank, buf);
qla27xx_write_reg(reg, ent->t259.pci_offset, ent->t259.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -313,10 +319,10 @@ qla27xx_fwdt_entry_t260(struct scsi_qla_host *vha,
qla27xx_insert32(ent->t260.pci_offset, buf, len);
qla27xx_read_reg(reg, ent->t260.pci_offset, buf, len);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -326,10 +332,10 @@ qla27xx_fwdt_entry_t261(struct scsi_qla_host *vha,
"%s: wrpci [%lx]\n", __func__, *len);
qla27xx_write_reg(reg, ent->t261.pci_offset, ent->t261.write_data, buf);
 
-   return false;
+   return qla27xx_next_entry(ent);
 }
 
-static int
+static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
@@ -362,6 +368,11 @@ qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha,
ent->t262.start_addr = start;
ent->t262.end_addr = end;
}
+   } else if (ent->t262.ram_area == T262_RAM_AREA_MISC) {
+   if (buf) {
+   ent->t262.start_addr = start;
+   ent->t262.end_addr = end;
+   }
} else {
ql_dbg(q

[PATCH v3 07/11] qla2xxx: Prevent SysFS access when chip is down

2019-02-15 Thread Himanshu Madhani
From: Quinn Tran 

Prevent user from sending commands through SysFS while
FW is not running or reset is in progress.

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

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index ee9f943f4d07..f8fd482a06e0 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -543,6 +543,9 @@ 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;
-- 
2.12.0



[PATCH v3 06/11] qla2xxx: Add support for setting port speed

2019-02-15 Thread Himanshu Madhani
From: Anil Gurumurthy 

This patch adds SysFS node

1. There is a new sysfs node port_speed
2. The possible values are 2(Auto neg), 8, 16, 32
3. A value outside of the above defaults to Auto neg
4. Any update to the setting causes a link toggle
5. This feature is currently only for ISP27xx

Signed-off-by: Anil Gurumurthy 
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 89 +
 drivers/scsi/qla2xxx/qla_def.h  |  6 +++
 drivers/scsi/qla2xxx/qla_gbl.h  |  1 +
 drivers/scsi/qla2xxx/qla_init.c |  9 +
 drivers/scsi/qla2xxx/qla_mbx.c  | 62 +++-
 5 files changed, 166 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 8b4dd72011bf..ee9f943f4d07 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1632,6 +1632,92 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
ha->max_speed_sup ? "32Gps" : "16Gps");
 }
 
+static ssize_t
+qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr,
+const char *buf, size_t count)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev));
+   ulong type, speed;
+   int oldspeed, rval;
+   int mode = QLA_SET_DATA_RATE_LR;
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(vha->hw)) {
+   ql_log(ql_log_warn, vha, 0x70d8,
+   "Speed setting not supported \n");
+   return -EINVAL;
+   }
+
+   rval = kstrtol(buf, 10, &type);
+   speed = type;
+   if (type == 40 || type == 80 || type == 160 ||
+   type == 320) {
+   ql_dbg(ql_dbg_user, vha, 0x70d9,
+   "Setting will be affected after a loss of sync\n");
+   type = type/10;
+   mode = QLA_SET_DATA_RATE_NOLR;
+   }
+
+   oldspeed = ha->set_data_rate;
+
+   switch (type) {
+   case 0:
+   ha->set_data_rate = PORT_SPEED_AUTO;
+   break;
+   case 4:
+   ha->set_data_rate = PORT_SPEED_4GB;
+   break;
+   case 8:
+   ha->set_data_rate = PORT_SPEED_8GB;
+   break;
+   case 16:
+   ha->set_data_rate = PORT_SPEED_16GB;
+   break;
+   case 32:
+   ha->set_data_rate = PORT_SPEED_32GB;
+   break;
+   default:
+   ql_log(ql_log_warn, vha, 0x1199,
+   "Unrecognized speed setting:%lx. Setting Autoneg\n",
+   speed);
+   ha->set_data_rate = PORT_SPEED_AUTO;
+   }
+
+   if (qla2x00_chip_is_down(vha) || (oldspeed == ha->set_data_rate))
+   return -EINVAL;
+
+   ql_log(ql_log_info, vha, 0x70da,
+   "Setting speed to %lx Gbps \n", type);
+
+   rval = qla2x00_set_data_rate(vha, mode);
+   if (rval != QLA_SUCCESS)
+   return -EIO;
+
+   return strlen(buf);
+}
+
+static ssize_t
+qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+   ssize_t rval;
+   char *spd[7] = {"0", "0", "0", "4", "8", "16", "32"};
+
+   rval = qla2x00_get_data_rate(vha);
+   if (rval != QLA_SUCCESS) {
+   ql_log(ql_log_warn, vha, 0x70db,
+   "Unable to get port speed rval:%zd\n", rval);
+   return -EINVAL;
+   }
+
+   ql_log(ql_log_info, vha, 0x70d6,
+   "port speed:%d\n", ha->link_data_rate);
+
+   return scnprintf(buf, PAGE_SIZE, "%s\n", spd[ha->link_data_rate]);
+}
+
 /* - */
 
 static ssize_t
@@ -2128,6 +2214,8 @@ static DEVICE_ATTR_RW(ql2xexchoffld);
 static DEVICE_ATTR_RW(ql2xiniexchg);
 static DEVICE_ATTR(dif_bundle_statistics, 0444,
 qla2x00_dif_bundle_statistics_show, NULL);
+static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
+qla2x00_port_speed_store);
 
 
 struct device_attribute *qla2x00_host_attrs[] = {
@@ -2167,6 +2255,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_max_speed_sup,
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
+   &dev_attr_port_speed,
NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c256ba7fba84..c0f7593666a1 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3698,12 +3698,14 @@ struct qla_hw_data {
 #define PORT_SPEED_UNKNOWN 0x
 #define POR

[PATCH v3 00/11] qla2xxx: Misc bug fixes for the driver

2019-02-15 Thread Himanshu Madhani
Hi Martin, 

This series has misc bug fixes which includes cleanup for FC-NVMe code and
added first burst support for FC-NVMe devices. Other patches included in the
series adds new SysFS hook for setting port speed and patch to prevent access
to SysFS hook whle chip is down. 

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

Changes from v2 -> v3
o Updated patch #6 to address review comments from Bart.
o Dropped patch #8 for rework.

Changes from v1 -> v2
o Fixed 0-day kernel warning for patch #2
o Removed stale code which introduced error indicating lock was not acquired 
and not
  released in patch #7

Thanks,
Himanshu

Anil Gurumurthy (1):
  qla2xxx: Add support for setting port speed

Darren Trapp (1):
  qla2xxx: Add First Burst support for FC-NVMe devices

Himanshu Madhani (5):
  qla2xxx: Fix LUN discovery if loop id is not assigned yet by firmware
  qla2xxx: Fix unload when NVMe devices are configured
  qla2xxx: Check for FW started flag before aborting
  qla2xxx: Fix code indentation for qla27xx_fwdt_entry
  qla2xxx: Update driver version to 10.00.00.14-k

Joe Carnuccio (1):
  qla2xxx: Add new FW dump template entry types

Quinn Tran (3):
  qla2xxx: Prevent multiple ADISC commands per session
  qla2xxx: Prevent SysFS access when chip is down
  qla2xxx: Move marker request behind QPair

 drivers/scsi/qla2xxx/qla_attr.c|  92 ++
 drivers/scsi/qla2xxx/qla_def.h |  10 ++
 drivers/scsi/qla2xxx/qla_gbl.h |   5 +-
 drivers/scsi/qla2xxx/qla_init.c|  64 +-
 drivers/scsi/qla2xxx/qla_iocb.c|  55 -
 drivers/scsi/qla2xxx/qla_isr.c |   9 ++
 drivers/scsi/qla2xxx/qla_mbx.c |  85 ++---
 drivers/scsi/qla2xxx/qla_nvme.c|  47 +---
 drivers/scsi/qla2xxx/qla_nvme.h|   2 +-
 drivers/scsi/qla2xxx/qla_tmpl.c| 237 ++---
 drivers/scsi/qla2xxx/qla_tmpl.h|  26 +++-
 drivers/scsi/qla2xxx/qla_version.h |   2 +-
 12 files changed, 437 insertions(+), 197 deletions(-)

-- 
2.12.0



[PATCH v3 01/11] qla2xxx: Fix LUN discovery if loop id is not assigned yet by firmware

2019-02-15 Thread Himanshu Madhani
This patch fixes LUN discovery when loop ID is not yet assigned
by the firmware during driver load/sg_reset operations. Driver will
now search for new loop id before retrying login.

Fixes: 48acad099074 ("scsi: qla2xxx: Fix N2N link re-connect")
Cc: sta...@vger.kernel.org #4.19
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 8307eac796a2..cdf57eb643b3 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -644,11 +644,14 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t 
*vha,
break;
case DSC_LS_PORT_UNAVAIL:
default:
-   if (fcport->loop_id != FC_NO_LOOP_ID)
-   qla2x00_clear_loop_id(fcport);
-
-   fcport->loop_id = loop_id;
-   fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
+   if (fcport->loop_id == FC_NO_LOOP_ID) {
+   qla2x00_find_new_loop_id(vha, fcport);
+   fcport->fw_login_state =
+   DSC_LS_PORT_UNAVAIL;
+   }
+   ql_dbg(ql_dbg_disc, vha, 0x20e5,
+   "%s %d %8phC\n", __func__, __LINE__,
+   fcport->port_name);
qla24xx_fcport_handle_login(vha, fcport);
break;
}
-- 
2.12.0



[PATCH v3 02/11] qla2xxx: Add First Burst support for FC-NVMe devices

2019-02-15 Thread Himanshu Madhani
From: Darren Trapp 

Add Support for First Burst for FC-NVMe protocol. This
feature requires First Burst support in the firmware.

Signed-off-by: Darren Trapp 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  4 
 drivers/scsi/qla2xxx/qla_init.c |  6 ++
 drivers/scsi/qla2xxx/qla_iocb.c |  5 -
 drivers/scsi/qla2xxx/qla_isr.c  |  9 +
 drivers/scsi/qla2xxx/qla_mbx.c  |  5 +++--
 drivers/scsi/qla2xxx/qla_nvme.c | 17 -
 drivers/scsi/qla2xxx/qla_nvme.h |  2 +-
 7 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 80acf30fd8a5..c256ba7fba84 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2367,7 +2367,9 @@ typedef struct fc_port {
 #define NVME_PRLI_SP_INITIATOR  BIT_5
 #define NVME_PRLI_SP_TARGET BIT_4
 #define NVME_PRLI_SP_DISCOVERY  BIT_3
+#define NVME_PRLI_SP_FIRST_BURST   BIT_0
uint8_t nvme_flag;
+   uint32_t nvme_first_burst_size;
 #define NVME_FLAG_REGISTERED 4
 #define NVME_FLAG_DELETING 2
 #define NVME_FLAG_RESETTING 1
@@ -3966,6 +3968,7 @@ struct qla_hw_data {
uint16_tfw_subminor_version;
uint16_tfw_attributes;
uint16_tfw_attributes_h;
+#define FW_ATTR_H_NVME_FBURST  BIT_1
 #define FW_ATTR_H_NVME BIT_10
 #define FW_ATTR_H_NVME_UPDATED  BIT_14
 
@@ -4260,6 +4263,7 @@ typedef struct scsi_qla_host {
uint32_tqpairs_req_created:1;
uint32_tqpairs_rsp_created:1;
uint32_tnvme_enabled:1;
+   uint32_tnvme_first_burst:1;
} flags;
 
atomic_tloop_state;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cdf57eb643b3..2d9336a87e42 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1829,6 +1829,12 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host 
*vha, struct event_arg *ea)
 
ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
ea->fcport->logout_on_delete = 1;
+   ea->fcport->nvme_prli_service_param = ea->iop[0];
+   if (ea->iop[0] & NVME_PRLI_SP_FIRST_BURST)
+   ea->fcport->nvme_first_burst_size =
+   (ea->iop[1] & 0x) * 512;
+   else
+   ea->fcport->nvme_first_burst_size = 0;
qla24xx_post_gpdb_work(vha, ea->fcport, 0);
break;
default:
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 2c27ae1924c5..cdac282b5bd3 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2419,8 +2419,11 @@ qla24xx_prli_iocb(srb_t *sp, struct logio_entry_24xx 
*logio)
 
logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
logio->control_flags = cpu_to_le16(LCF_COMMAND_PRLI);
-   if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI)
+   if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI) {
logio->control_flags |= LCF_NVME_PRLI;
+   if (sp->vha->flags.nvme_first_burst)
+   logio->io_parameter[0] = NVME_PRLI_SP_FIRST_BURST;
+   }
 
logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
logio->port_id[0] = sp->fcport->d_id.b.al_pa;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index bde9940ea7d1..b5ae76869d5b 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -1715,6 +1715,15 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que 
*req,
 
vha->hw->exch_starvation = 0;
data[0] = MBS_COMMAND_COMPLETE;
+
+   if (sp->type == SRB_PRLI_CMD) {
+   lio->u.logio.iop[0] =
+   le32_to_cpu(logio->io_parameter[0]);
+   lio->u.logio.iop[1] =
+   le32_to_cpu(logio->io_parameter[1]);
+   goto logio_done;
+   }
+
if (sp->type != SRB_LOGIN_CMD)
goto logio_done;
 
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index f4adf6baee69..6c911f2e4cdb 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -1112,6 +1112,9 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
if ((ha->fw_attributes_h &
(FW_ATTR_H_NVME | FW_ATTR_H_NVME_UPDATED)) &&
ql2xnvmeenable) {
+   if (ha->fw_attributes_h & FW_ATTR_H_NVME_FBURST)
+   vha->flags.nvme_first_burst = 1;
+
vha->flags.nvme_enabled = 1;
ql_log(

[PATCH v3 05/11] qla2xxx: Prevent multiple ADISC commands per session

2019-02-15 Thread Himanshu Madhani
From: Quinn Tran 

add check to allow 1 discovery command per session to be sent.

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

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2d9336a87e42..ba5da365ee4a 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -471,9 +471,11 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t 
*fcport,
 {
srb_t *sp;
struct srb_iocb *lio;
-   int rval;
+   int rval = QLA_FUNCTION_FAILED;
+
+   if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT))
+   return rval;
 
-   rval = QLA_FUNCTION_FAILED;
fcport->flags |= FCF_ASYNC_SENT;
sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
if (!sp)
-- 
2.12.0



[PATCH v3 11/11] qla2xxx: Update driver version to 10.00.00.14-k

2019-02-15 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 537098e8f1c1..0690dac24081 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.13-k"
+#define QLA2XXX_VERSION  "10.00.00.14-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
 #define QLA_DRIVER_MINOR_VER   0
-- 
2.12.0



[PATCH v3 08/11] qla2xxx: Move marker request behind QPair

2019-02-15 Thread Himanshu Madhani
From: Quinn Tran 

current code hard code marker request to use request
and response queue 0. This patch make use of the
qpair as the path to access the request/response queues.
It allows marker to be place on any hardware queues.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |  4 ++--
 drivers/scsi/qla2xxx/qla_init.c | 30 ++---
 drivers/scsi/qla2xxx/qla_iocb.c | 50 +
 drivers/scsi/qla2xxx/qla_mbx.c  | 18 +++
 4 files changed, 33 insertions(+), 69 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 3c59006e64bb..4eefe69ca807 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -270,8 +270,8 @@ extern void qla24xx_build_scsi_iocbs(srb_t *, struct 
cmd_type_7 *,
uint16_t, struct req_que *);
 extern int qla2x00_start_scsi(srb_t *sp);
 extern int qla24xx_start_scsi(srb_t *sp);
-int qla2x00_marker(struct scsi_qla_host *, struct req_que *, struct rsp_que *,
-   uint16_t, uint64_t, uint8_t);
+int qla2x00_marker(struct scsi_qla_host *, struct qla_qpair *,
+uint16_t, uint64_t, uint8_t);
 extern int qla2x00_start_sp(srb_t *);
 extern int qla24xx_dif_start_scsi(srb_t *);
 extern int qla2x00_start_bidir(srb_t *, struct scsi_qla_host *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index bb9bccb734f8..a95915881c87 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1703,8 +1703,8 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, 
uint32_t lun,
lun = (uint16_t)tm_iocb->u.tmf.lun;
 
/* Issue Marker IOCB */
-   qla2x00_marker(vha, vha->hw->req_q_map[0],
-   vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun,
+   qla2x00_marker(vha, vha->hw->base_qpair,
+   sp->fcport->loop_id, lun,
flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
}
 
@@ -6039,11 +6039,6 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 {
int rval = QLA_SUCCESS;
uint32_t wait_time;
-   struct req_que *req;
-   struct rsp_que *rsp;
-
-   req = vha->req;
-   rsp = req->rsp;
 
clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
if (vha->flags.online) {
@@ -6056,8 +6051,8 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 * Issue a marker after FW becomes
 * ready.
 */
-   qla2x00_marker(vha, req, rsp, 0, 0,
-   MK_SYNC_ALL);
+   qla2x00_marker(vha, vha->hw->base_qpair,
+   0, 0, MK_SYNC_ALL);
vha->marker_needed = 0;
}
 
@@ -6795,8 +6790,6 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
 {
int status = 0;
struct qla_hw_data *ha = vha->hw;
-   struct req_que *req = ha->req_q_map[0];
-   struct rsp_que *rsp = ha->rsp_q_map[0];
 
/* If firmware needs to be loaded */
if (qla2x00_isp_firmware(vha)) {
@@ -6816,7 +6809,7 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
status = qla2x00_fw_ready(vha);
if (!status) {
/* Issue a marker after FW becomes ready. */
-   qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+   qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
}
 
@@ -7871,22 +7864,15 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha)
uint16_t mb[MAILBOX_REGISTER_COUNT];
struct qla_hw_data *ha = vha->hw;
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
-   struct req_que *req;
-   struct rsp_que *rsp;
 
if (!vha->vp_idx)
return -EINVAL;
 
rval = qla2x00_fw_ready(base_vha);
-   if (vha->qpair)
-   req = vha->qpair->req;
-   else
-   req = ha->req_q_map[0];
-   rsp = req->rsp;
 
if (rval == QLA_SUCCESS) {
clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
-   qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
+   qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL);
}
 
vha->flags.management_server_logged_in = 0;
@@ -8278,8 +8264,6 @@ qla82xx_restart_isp(scsi_qla_host_t *vha)
 {
int status, rval;
struct qla_hw_data *ha = vha->hw;
-   struct req_que *req = ha->req_q_map[0];
-   struct rsp_que *rsp = ha-&

[PATCH v3 04/11] qla2xxx: Check for FW started flag before aborting

2019-02-15 Thread Himanshu Madhani
For FC-NVMe, if the fw_started flag is not set or
fcport is deleted, then do not send Abort command

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 232b987e79dd..41c85da3ab32 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -185,6 +185,14 @@ static void qla_nvme_abort_work(struct work_struct *work)
struct qla_hw_data *ha = fcport->vha->hw;
int rval;
 
+   if (fcport)
+   ql_dbg(ql_dbg_io, fcport->vha, 0x,
+   "%s called for sp=%p, hndl=%x on fcport=%p deleted=%d\n",
+   __func__, sp, sp->handle, fcport, fcport->deleted);
+
+   if (!ha->flags.fw_started && (fcport && fcport->deleted))
+   return;
+
rval = ha->isp_ops->abort_command(sp);
 
ql_dbg(ql_dbg_io, fcport->vha, 0x212b,
-- 
2.12.0



[PATCH v3 03/11] qla2xxx: Fix unload when NVMe devices are configured

2019-02-15 Thread Himanshu Madhani
This patch fixes driver unload issue when FC-NVMe devices are
configured.

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_nvme.c | 22 ++
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index d6ba078d8255..232b987e79dd 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -607,6 +607,7 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
struct fc_port *fcport = container_of(work, struct fc_port,
nvme_del_work);
struct qla_nvme_rport *qla_rport, *trport;
+   scsi_qla_host_t *base_vha;
 
if (!IS_ENABLED(CONFIG_NVME_FC))
return;
@@ -614,6 +615,15 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
ql_log(ql_log_warn, NULL, 0x2112,
"%s: unregister remoteport on %p\n",__func__, fcport);
 
+   base_vha = pci_get_drvdata(fcport->vha->hw->pdev);
+   if (test_bit(PFLG_DRIVER_REMOVING, &base_vha->pci_flags)) {
+   ql_dbg(ql_dbg_disc, fcport->vha, 0x2114,
+   "%s: Notify FC-NVMe transport, set devloss=0\n",
+   __func__);
+
+   nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
+   }
+
list_for_each_entry_safe(qla_rport, trport,
&fcport->vha->nvme_rport_list, list) {
if (qla_rport->fcport == fcport) {
@@ -630,23 +640,11 @@ static void qla_nvme_unregister_remote_port(struct 
work_struct *work)
 
 void qla_nvme_delete(struct scsi_qla_host *vha)
 {
-   struct qla_nvme_rport *qla_rport, *trport;
-   fc_port_t *fcport;
int nv_ret;
 
if (!IS_ENABLED(CONFIG_NVME_FC))
return;
 
-   list_for_each_entry_safe(qla_rport, trport,
-   &vha->nvme_rport_list, list) {
-   fcport = qla_rport->fcport;
-
-   ql_log(ql_log_info, fcport->vha, 0x2114, "%s: fcport=%p\n",
-   __func__, fcport);
-
-   nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
-   }
-
if (vha->nvme_local_port) {
init_completion(&vha->nvme_del_done);
ql_log(ql_log_info, vha, 0x2116,
-- 
2.12.0



[PATCH] qla2xxx: Avoid PCI IRQ affinity mapping when multiqueue is not supported.

2019-02-15 Thread Himanshu Madhani
From: Giridhar Malavali 

This patch fixes warning seen when BLK-MQ is enabled and hardware
does not support MQ. This will result into driver requesting MSIx
vectors which are equal or less than pre_desc via PCI IRQ Affinity
infrastructure.

[   19.746300] qla2xxx [:00:00.0]-0005: : QLogic Fibre Channel HBA 
Driver: 10.00.00.12-k.
[   19.746599] qla2xxx [:02:00.0]-001d: : Found an ISP2432 irq 18 
iobase 0x(ptrval).
[   20.203186] [ cut here ]
[   20.203306] WARNING: CPU: 8 PID: 268 at drivers/pci/msi.c:1273 
pci_irq_get_affinity+0xf4/0x120
[   20.203481] Modules linked in: tg3 ptp qla2xxx(+) pps_core sg libphy 
scsi_transport_fc flash loop autofs4
[   20.203700] CPU: 8 PID: 268 Comm: systemd-udevd Not tainted 
5.0.0-rc5-00358-gdf3865f #113
[   20.203830] Call Trace:
[   20.203933]  [00461bb0] __warn+0xb0/0xe0
[   20.204090]  [006c8f34] pci_irq_get_affinity+0xf4/0x120
[   20.204219]  [0068c764] blk_mq_pci_map_queues+0x24/0x120
[   20.204396]  [007162f4] scsi_map_queues+0x14/0x40
[   20.204626]  [00673654] blk_mq_update_queue_map+0x94/0xe0
[   20.204698]  [00676ce0] blk_mq_alloc_tag_set+0x120/0x300
[   20.204869]  [0071077c] scsi_add_host_with_dma+0x7c/0x300
[   20.205419]  [100ead54] qla2x00_probe_one+0x19d4/0x2640 [qla2xxx]
[   20.205621]  [006b3c88] pci_device_probe+0xc8/0x160
[   20.205697]  [00701c0c] really_probe+0x1ac/0x2e0
[   20.205770]  [00701f90] driver_probe_device+0x50/0x100
[   20.205843]  [00702134] __driver_attach+0xf4/0x120
[   20.205913]  [00700644] bus_for_each_dev+0x44/0x80
[   20.206081]  [00700c98] bus_add_driver+0x198/0x220
[   20.206300]  [00702950] driver_register+0x70/0x120
[   20.206582]  [10248224] qla2x00_module_init+0x224/0x284 [qla2xxx]
[   20.206857] ---[ end trace b1de7a3f79fab2c2 ]---

The fix is to check if the hardware does not have Multi Queue capabiltiy, use
pci_alloc_irq_vectors() call instead of pci_alloc_irq_affinity().

Fixes: f664a3cc17b7d ("scsi: kill off the legacy IO path")
Cc: sta...@vger.kernel.org #4.19
Signed-off-by: Giridhar Malavali 
Signed-off-by: Himanshu Madhani 
---
Hi Martin, 

This patch fixes issue, if BLK-MQ is enabled, driver will not map IRQ affinity
if the hardware does not support MQ. This was reported by Meelis Ross here 

https://marc.info/?l=linux-scsi&m=154980175720501&w=2

Please apply this on top of my earlier series for inclusion in 5.1/scsi-queue

https://marc.info/?l=linux-scsi&m=155027035917217&w=2

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_isr.c | 2 +-
 drivers/scsi/qla2xxx/qla_os.c  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index b5ae76869d5b..89ee82e6773b 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -3431,7 +3431,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct 
rsp_que *rsp)
min_vecs++;
}
 
-   if (USER_CTRL_IRQ(ha)) {
+   if (USER_CTRL_IRQ(ha) || !ha->mqiobase) {
/* user wants to control IRQ setting for target mode */
ret = pci_alloc_irq_vectors(ha->pdev, min_vecs,
ha->msix_count, PCI_IRQ_MSIX);
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 7bf23943c815..84cd6bff8b12 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -7181,7 +7181,7 @@ static int qla2xxx_map_queues(struct Scsi_Host *shost)
scsi_qla_host_t *vha = (scsi_qla_host_t *)shost->hostdata;
struct blk_mq_queue_map *qmap = &shost->tag_set.map[0];
 
-   if (USER_CTRL_IRQ(vha->hw))
+   if (USER_CTRL_IRQ(vha->hw) || !vha->hw->mqiobase)
rc = blk_mq_map_queues(qmap);
else
rc = blk_mq_pci_map_queues(qmap, vha->hw->pdev, 0);
-- 
2.12.0



Re: qla2xxx init warning with blk_mq at drivers/pci/msi.c:1273 pci_irq_get_affinity+0xf4/0x120

2019-02-15 Thread Himanshu Madhani
Hi Meelis,


On 2/12/19, 6:37 PM, "Ming Lei"  wrote:

External Email

On Wed, Feb 13, 2019 at 5:36 AM Meelis Roos  wrote:
>
> >  I tested todays 5.0.0-rc5-00358-gdf3865f on my sparcs and a couple 
of servers that have qla2xxx
> >  FC adapter gave me this warning:
>
> Now I got a very similar one on an x86-64 server:
>
>
> [   18.472568] qla2xxx [:00:00.0]-0005: : QLogic Fibre Channel HBA 
Driver: 10.00.00.12-k.
> [   18.474272] PCI Interrupt Link [LNKD] enabled at IRQ 19
> [   18.474272] qla2xxx [:04:00.0]-001d: : Found an ISP2432 irq 19 
iobase 0x(ptrval).
> [   18.917293] scsi host3: qla2xxx
> [   18.917412] WARNING: CPU: 0 PID: 1650 at drivers/pci/msi.c:1273 
pci_irq_get_affinity+0x35/0x80
> [   18.917554] Modules linked in: qla2xxx(+) scsi_transport_fc 
i2c_nforce2 e1000 pata_amd k8temp libata i2c_core hwmon forcedeth(+) 
powernow_k8 pcspkr autofs4
> [   18.917708] CPU: 0 PID: 1650 Comm: kworker/0:3 Not tainted 
5.0.0-rc6-00013-gaa0c38cf39de #14
> [   18.917848] Hardware name: Sun Microsystems Sun Fire X4200 M2/Sun Fire 
X4200 M2, BIOS 0ABJX104 04/09/2009
> [   18.918002] Workqueue: events work_for_cpu_fn
> [   18.918082] RIP: 0010:pci_irq_get_affinity+0x35/0x80
> [   18.918164] Code: 2e 48 8b 87 b8 02 00 00 48 8d 8f b8 02 00 00 48 39 
c1 74 16 85 f6 74 4e 31 d2 eb 04 39 d6 74 46 48 8b 00 ff c2 48 39 c8 75 f2 <0f> 
0b 31 c0 c3 83 e2 02 48 c7 c0 c0 46 d5 b8 74 29 48 8b 97 b8 02
> [   18.918374] RSP: 0018:a15f4108fcb0 EFLAGS: 00010246
> [   18.918460] RAX: 95e7995f52b8 RBX:  RCX: 
95e7995f52b8
> [   18.918547] RDX: 0002 RSI: 0002 RDI: 
95e7995f5000
> [   18.918629] RBP:  R08: ff80 R09: 
95e799008e60
> [   18.918712] R10: b90b0f01 R11: a15f4108fa90 R12: 
0002
> [   18.918795] R13: 95e7995f5000 R14:  R15: 
95e7969890a8
> [   18.918878] FS:  () GS:95e79b40() 
knlGS:
> [   18.919013] CS:  0010 DS:  ES:  CR0: 80050033
> [   18.919103] CR2: 7f213fb62000 CR3: 000217dc CR4: 
06f0
> [   18.919185] Call Trace:
> [   18.919269]  blk_mq_pci_map_queues+0x32/0xc0
> [   18.919354]  blk_mq_alloc_tag_set+0x12e/0x340
> [   18.919437]  scsi_add_host_with_dma+0xa1/0x310
> [   18.919549]  qla2x00_probe_one+0x1272/0x2400 [qla2xxx]
> [   18.919632]  ? try_to_wake_up+0x2c8/0x6f0
> [   18.919710]  local_pci_probe+0x4b/0xb0
> [   18.919787]  work_for_cpu_fn+0x11/0x20
> [   18.919866]  process_one_work+0x1d1/0x360
> [   18.919943]  worker_thread+0x20e/0x3f0
> [   18.920020]  ? wq_calc_node_cpumask+0x110/0x110
> [   18.920100]  kthread+0x109/0x120
> [   18.920176]  ? kthread_create_on_node+0x60/0x60
> [   18.920256]  ret_from_fork+0x35/0x40
> [   18.920334] ---[ end trace 56ed281ce2c61e69 ]---
> [   18.926988] qla2xxx [:04:00.0]-00fb:3: QLogic QLE2460 - 
SG-(X)PCIE1FC-QF4, Sun StorageTek 4 Gb FC Enterprise PCI-Express Single Channel.
> [   18.927148] qla2xxx [:04:00.0]-00fc:3: ISP2432: PCIe (2.5GT/s x4) 
@ :04:00.0 hdma+ host#=3 fw=8.07.00 (9496).
> [   18.927757] qla2xxx [:83:00.0]-001d: : Found an ISP2432 irq 30 
iobase 0x(ptrval).
> [   19.350303] qla2xxx [:83:00.0]-00fb:4: QLogic QLE2460 - 
SG-(X)PCIE1FC-QF4, Sun StorageTek 4 Gb FC Enterprise PCI-Express Single Channel.
> [   19.350474] qla2xxx [:83:00.0]-00fc:4: ISP2432: PCIe (2.5GT/s x4) 
@ :83:00.0 hdma+ host#=4 fw=8.07.00 (9496).
> [   40.421151] qla2xxx [:04:00.0]-8038:3: Cable is unplugged...
> [   40.837159] qla2xxx [:83:00.0]-8038:4: Cable is unplugged...

We saw such issue too in which .msix_count is too small, and equal to
.pre_vectors, and Himanshu is working on it.

Thanks,
Ming Lei

Can you try patch just posted here.

https://patchwork.kernel.org/patch/10816115/

Thanks,
Himanshu



Re: [PATCH] qla2xxx: Fix panic in qla_dfs_tgt_counters_show

2019-03-05 Thread Himanshu Madhani


On 3/4/19, 5:25 AM, "linux-scsi-ow...@vger.kernel.org on behalf of Bill 
Kuzeja"  wrote:

When trying to display tgt_counters in the debugfs, a panic can result. 

There is no null check for qpair after it is assigned in the for-loop. 
Unless vha->hw->queue_pair_map array is completely filled with entries, 
the system will panic dereferencing a null pointer.

Signed-off-by: Bill Kuzeja 
---
 drivers/scsi/qla2xxx/qla_dfs.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c
index 0b19008..d647760 100644
--- a/drivers/scsi/qla2xxx/qla_dfs.c
+++ b/drivers/scsi/qla2xxx/qla_dfs.c
@@ -193,6 +193,8 @@
 
for (i = 0; i < vha->hw->max_qpairs; i++) {
qpair = vha->hw->queue_pair_map[i];
+   if (!qpair)
+   continue;
qla_core_sbt_cmd += qpair->tgt_counters.qla_core_sbt_cmd;
core_qla_que_buf += qpair->tgt_counters.core_qla_que_buf;
qla_core_ret_ctio += qpair->tgt_counters.qla_core_ret_ctio;

Looks Good. 

Acked-by: Himanshu Madhani 

-- 
1.8.3.1





Re: [PATCH 3/4] scsi: qla2xxx: avoid printf format warning

2019-03-06 Thread Himanshu Madhani


On 3/4/19, 11:39 AM, "Arnd Bergmann"  wrote:

Depending on the target architecture and configuration, both phys_addr_t
and dma_addr_t may be smaller than 'long long', so we get a warning when
printing either of them using the %llx format string:

drivers/scsi/qla2xxx/qla_iocb.c: In function 
'qla24xx_walk_and_build_prot_sglist':
drivers/scsi/qla2xxx/qla_iocb.c:1140:46: error: format '%llx' expects 
argument of type 'long long unsigned int', but argument 6 has type 'dma_addr_t' 
{aka 'unsigned int'} [-Werror=format=]
 "%s: page boundary crossing (phys=%llx len=%x)\n",
   ~~~^
   %x
 __func__, sle_phys, sg->length);
   
drivers/scsi/qla2xxx/qla_iocb.c:1180:29: error: format '%llx' expects 
argument of type 'long long unsigned int', but argument 7 has type 'dma_addr_t' 
{aka 'unsigned int'} [-Werror=format=]
"%s: sg[%x] (phys=%llx sglen=%x) ldma_sg_len: %x dif_bundl_len: %x 
ldma_needed: %x\n",
  ~~~^

There are special %pad and %pap format strings in Linux that we could use 
here,
but since the driver already does 64-bit arithmetic on the values, using a
plain 'u64' seems more consistent here.

Note: A possible related issue may be that the driver possibly checks the
wrong kind of overflow: when an IOMMU is in use, buffers that cross a 32-bit
boundary in physical addresses would still be mapped into dma addresses
within the low 4GB space, so I suspect that we actually want to check
sg_dma_address() instead of sg_phys() here.

Fixes: 50b812755e97 ("scsi: qla2xxx: Fix DMA error when the DIF sg buffer 
crosses 4GB boundary")
Signed-off-by: Arnd Bergmann 
---
 drivers/scsi/qla2xxx/qla_iocb.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_iocb.c 
b/drivers/scsi/qla2xxx/qla_iocb.c
index 63f8e3c19841..456a41d2e2c6 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -1132,7 +1132,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data 
*ha, srb_t *sp,
/* if initiator doing write or target doing read */
if (direction_to_device) {
for_each_sg(sgl, sg, tot_dsds, i) {
-   dma_addr_t sle_phys = sg_phys(sg);
+   u64 sle_phys = sg_phys(sg);
 
/* If SGE addr + len flips bits in upper 32-bits */
if (MSD(sle_phys + sg->length) ^ MSD(sle_phys)) {
@@ -1178,7 +1178,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data 
*ha, srb_t *sp,
 
ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe023,
"%s: sg[%x] (phys=%llx sglen=%x) ldma_sg_len: %x 
dif_bundl_len: %x ldma_needed: %x\n",
-   __func__, i, sg_phys(sg), sglen, ldma_sg_len,
+   __func__, i, (u64)sg_phys(sg), sglen, ldma_sg_len,
    difctx->dif_bundl_len, ldma_needed);
 
while (sglen) {
-- 
2.20.0

Looks good

Acked-by: Himanshu Madhani 




[PATCH 02/14] qla2xxx: Remove FW default template

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch removed FW default template as there will
never be case where the default template would be invoked.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 -
 drivers/scsi/qla2xxx/qla_init.c |  94 +---
 drivers/scsi/qla2xxx/qla_tmpl.c | 104 +---
 3 files changed, 13 insertions(+), 187 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 4eefe69ca807..0fa0342f39f8 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -613,8 +613,6 @@ extern void qla27xx_fwdump(scsi_qla_host_t *, int);
 extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
-extern const void *qla27xx_fwdt_template_default(void);
-extern ulong qla27xx_fwdt_template_default_size(void);
 
 extern void qla2x00_dump_regs(scsi_qla_host_t *);
 extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e64d3d2d3c78..fd168c5e17d2 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7393,7 +7393,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_dbg(ql_dbg_init, vha, 0x0162,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (risc_size - 8) * sizeof(*dcode);
ql_dbg(ql_dbg_init, vha, 0x0163,
@@ -7402,7 +7402,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!ha->fw_dump_template) {
ql_log(ql_log_warn, vha, 0x0164,
"Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto default_template;
+   goto failed;
}
 
faddr += 7;
@@ -7415,7 +7415,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!qla27xx_fwdt_template_valid(dcode)) {
ql_log(ql_log_warn, vha, 0x0165,
"Failed fwdump template validate\n");
-   goto default_template;
+   goto failed;
}
 
dlen = qla27xx_fwdt_template_size(dcode);
@@ -7425,48 +7425,13 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_log(ql_log_warn, vha, 0x0167,
"Failed fwdump template exceeds array by %zx bytes\n",
(size_t)(dlen - risc_size * sizeof(*dcode)));
-   goto default_template;
-   }
-   ha->fw_dump_template_len = dlen;
-   return rval;
-
-default_template:
-   ql_log(ql_log_warn, vha, 0x0168, "Using default fwdump template\n");
-   if (ha->fw_dump_template)
-   vfree(ha->fw_dump_template);
-   ha->fw_dump_template = NULL;
-   ha->fw_dump_template_len = 0;
-
-   dlen = qla27xx_fwdt_template_default_size();
-   ql_dbg(ql_dbg_init, vha, 0x0169,
-   "-> template allocating %x bytes...\n", dlen);
-   ha->fw_dump_template = vmalloc(dlen);
-   if (!ha->fw_dump_template) {
-   ql_log(ql_log_warn, vha, 0x016a,
-   "Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto failed_template;
-   }
-
-   dcode = ha->fw_dump_template;
-   risc_size = dlen / sizeof(*dcode);
-   memcpy(dcode, qla27xx_fwdt_template_default(), dlen);
-   for (i = 0; i < risc_size; i++)
-   dcode[i] = be32_to_cpu(dcode[i]);
-
-   if (!qla27xx_fwdt_template_valid(ha->fw_dump_template)) {
-   ql_log(ql_log_warn, vha, 0x016b,
-   "Failed fwdump template validate\n");
-   goto failed_template;
+   goto failed;
}
-
-   dlen = qla27xx_fwdt_template_size(ha->fw_dump_template);
-   ql_dbg(ql_dbg_init, vha, 0x016c,
-   "-> template size %x bytes\n", dlen);
ha->fw_dump_template_len = dlen;
return rval;
 
-failed_template:
-   ql_log(ql_log_warn, vha, 0x016d, "Failed default fwdump template\n");
+failed:
+   ql_log(ql_log_warn, vha, 0x016d, "Failed fwdump template\n");
if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fw_dump_template = NULL;
@@ -7696,7 +7661,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t 
*srisc_addr)
ql_dbg(ql_dbg_init, vha, 0x172,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (

[PATCH 06/14] qla2xxx: Correctly report max/min supported speeds

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes reported speed for min_link and max_supported
speed. Also rename SysFS nodes link_speed and max_supported to
be consistent with {min|max}_suuported_speed.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 94 +
 drivers/scsi/qla2xxx/qla_def.h  |  7 +--
 drivers/scsi/qla2xxx/qla_fw.h   |  2 +-
 drivers/scsi/qla2xxx/qla_mbx.c  | 65 +++-
 4 files changed, 98 insertions(+), 70 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 833b082a7944..3adbb2c1a806 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1621,8 +1621,8 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
 }
 
 static ssize_t
-qla2x00_min_link_speed_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_min_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1631,16 +1631,17 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->min_link_speed == 5 ? "32Gps" :
-   ha->min_link_speed == 4 ? "16Gps" :
-   ha->min_link_speed == 3 ? "8Gps" :
-   ha->min_link_speed == 2 ? "4Gps" :
-   ha->min_link_speed != 0 ? "unknown" : "");
+   ha->min_supported_speed == 6 ? "64Gps" :
+   ha->min_supported_speed == 5 ? "32Gps" :
+   ha->min_supported_speed == 4 ? "16Gps" :
+   ha->min_supported_speed == 3 ? "8Gps" :
+   ha->min_supported_speed == 2 ? "4Gps" :
+   ha->min_supported_speed != 0 ? "unknown" : "");
 }
 
 static ssize_t
-qla2x00_max_speed_sup_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_max_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1649,7 +1650,9 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->max_speed_sup ? "32Gps" : "16Gps");
+   ha->max_supported_speed  == 2 ? "64Gps" :
+   ha->max_supported_speed  == 1 ? "32Gps" :
+   ha->max_supported_speed  == 0 ? "16Gps" : "unknown");
 }
 
 static ssize_t
@@ -2251,8 +2254,10 @@ static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
   qla2x00_allow_cna_fw_dump_show,
   qla2x00_allow_cna_fw_dump_store);
 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(min_supported_speed, 0444,
+  qla2x00_min_supported_speed_show, NULL);
+static DEVICE_ATTR(max_supported_speed, 0444,
+  qla2x00_max_supported_speed_show, NULL);
 static DEVICE_ATTR(zio_threshold, 0644,
 qla_zio_threshold_show,
 qla_zio_threshold_store);
@@ -2301,8 +2306,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_fw_dump_size,
&dev_attr_allow_cna_fw_dump,
&dev_attr_pep_version,
-   &dev_attr_min_link_speed,
-   &dev_attr_max_speed_sup,
+   &dev_attr_min_supported_speed,
+   &dev_attr_max_supported_speed,
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
@@ -3031,7 +3036,7 @@ void
 qla2x00_init_host_attr(scsi_qla_host_t *vha)
 {
struct qla_hw_data *ha = vha->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   u32 speeds = FC_PORTSPEED_UNKNOWN;
 
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@@ -3042,28 +3047,45 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
 
if (IS_CNA_CAPABLE(ha))
-   speed = FC_PORTSPEED_10GBIT;
-   else if (IS_QLA2031(ha))
-   speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT |
-   FC_PORTSPEED_4GBIT;
-   else if (IS_QLA25

[PATCH 03/14] qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes qla27xx_dump_{mpi|ram} api for ISP27XX

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c | 166 -
 1 file changed, 81 insertions(+), 85 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ec5bad0b0607 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -111,30 +111,25 @@ int
 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt)
 {
-   int rval;
-   uint32_t cnt, stat, timer, dwords, idx;
-   uint16_t mb0;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
dma_addr_t dump_dma = ha->gid_list_dma;
-   uint32_t *dump = (uint32_t *)ha->gid_list;
+   uint32_t *chunk = (void *)ha->gid_list;
+   uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+   uint32_t stat;
+   ulong i, j, timer = 600;
+   int rval = QLA_FUNCTION_FAILED;
 
-   rval = QLA_SUCCESS;
-   mb0 = 0;
-
-   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+   if (i + dwords > ram_dwords)
+   dwords = ram_dwords - i;
 
-   dwords = qla2x00_gid_list_size(ha) / 4;
-   for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-   cnt += dwords, addr += dwords) {
-   if (cnt + dwords > ram_dwords)
-   dwords = ram_dwords - cnt;
-
+   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
WRT_REG_WORD(®->mailbox1, LSW(addr));
WRT_REG_WORD(®->mailbox8, MSW(addr));
 
-   WRT_REG_WORD(®->mailbox2, MSW(dump_dma));
-   WRT_REG_WORD(®->mailbox3, LSW(dump_dma));
+   WRT_REG_WORD(®->mailbox2, MSW(LSD(dump_dma)));
+   WRT_REG_WORD(®->mailbox3, LSW(LSD(dump_dma)));
WRT_REG_WORD(®->mailbox6, MSW(MSD(dump_dma)));
WRT_REG_WORD(®->mailbox7, LSW(MSD(dump_dma)));
 
@@ -145,76 +140,75 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t 
addr, uint32_t *ram,
WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT);
 
ha->flags.mbox_int = 0;
-   for (timer = 600; timer; timer--) {
-   /* Check for pending interrupts. */
-   stat = RD_REG_DWORD(®->host_status);
-   if (stat & HSRX_RISC_INT) {
-   stat &= 0xff;
-
-   if (stat == 0x1 || stat == 0x2 ||
-   stat == 0x10 || stat == 0x11) {
-   set_bit(MBX_INTERRUPT,
-   &ha->mbx_cmd_flags);
+   while (timer--) {
+   udelay(5);
 
-   mb0 = RD_REG_WORD(®->mailbox0);
-   RD_REG_WORD(®->mailbox1);
+   stat = RD_REG_DWORD(®->host_status);
+   /* Check for pending interrupts. */
+   if (!(stat & HSRX_RISC_INT))
+   continue;
 
-   WRT_REG_DWORD(®->hccr,
-   HCCRX_CLR_RISC_INT);
-   RD_REG_DWORD(®->hccr);
-   break;
-   }
+   stat &= 0xff;
+   if (stat != 0x1 && stat != 0x2 &&
+   stat != 0x10 && stat != 0x11) {
 
/* Clear this intr; it wasn't a mailbox intr */
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
RD_REG_DWORD(®->hccr);
+   continue;
}
-   udelay(5);
+
+   set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   rval = RD_REG_WORD(®->mailbox0) & MBS_MASK;
+   WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
+   RD_REG_DWORD(®->hccr);
+   break;
}
ha->flags.mbox_int = 1;
+   *nxt = ram + i;
 
-   if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-   rval = mb0 & MBS_MASK;
-   for (idx = 0; idx < dwords; idx++)
-   ram[cnt + idx] = IS_QLA27XX(ha) ?
-   le32_to_cpu(dump[idx]) : swab32(d

[PATCH 11/14] qla2xxx: Simplification of register address used in qla_tmpl.c

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

Reduce stack space on each fwdt routine by eliminating local
variable reg.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 75 -
 1 file changed, 29 insertions(+), 46 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 07ebebcbc0db..5bf286496bcb 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -7,13 +7,9 @@
 #include "qla_def.h"
 #include "qla_tmpl.h"
 
-#define IOBASE(reg)offsetof(typeof(*reg), iobase_addr)
-
-static inline void __iomem *
-qla27xx_isp_reg(struct scsi_qla_host *vha)
-{
-   return &vha->hw->iobase->isp24;
-}
+#define ISPREG(vha)(&(vha)->hw->iobase->isp24)
+#define IOBAR(reg) offsetof(typeof(*(reg)), iobase_addr)
+#define IOBASE(vha)IOBAR(ISPREG(vha))
 
 static inline void
 qla27xx_insert16(uint16_t value, void *buf, ulong *len)
@@ -114,7 +110,7 @@ qla27xx_read_window(__iomem struct device_reg_24xx *reg,
void __iomem *window = (void __iomem *)reg + offset;
void (*readn)(void __iomem*, void *, ulong *) = 
qla27xx_read_vector(width);
 
-   qla27xx_write_reg(reg, IOBASE_ADDR, addr, buf);
+   qla27xx_write_reg(reg, IOBAR(reg), addr, buf);
while (count--) {
qla27xx_insert32(addr, buf, len);
readn(window, buf, len);
@@ -163,7 +159,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t256.base_addr);
uint offset = ent->t256.pci_offset;
ulong count = le16_to_cpu(ent->t256.reg_count);
@@ -171,7 +166,7 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd200,
"%s: rdio t1 [%lx]\n", __func__, *len);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -180,15 +175,14 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t257.base_addr);
uint offset = ent->t257.pci_offset;
ulong data = le32_to_cpu(ent->t257.write_data);
 
ql_dbg(ql_dbg_misc, vha, 0xd201,
"%s: wrio t1 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -197,7 +191,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
uint banksel = ent->t258.banksel_offset;
ulong bank = le32_to_cpu(ent->t258.bank);
ulong addr = le32_to_cpu(ent->t258.base_addr);
@@ -207,8 +200,8 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd202,
"%s: rdio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -217,7 +210,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t259.base_addr);
uint banksel = ent->t259.banksel_offset;
ulong bank = le32_to_cpu(ent->t259.bank);
@@ -226,9 +218,9 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd203,
"%s: wrio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -237,13 +229,12 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_ql

[PATCH 01/14] qla2xxx: Add fw_attr and port_no SysFS node

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new SysFS node to display firmware attributes
and port number

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 30 ++
 1 file changed, 30 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 2eb1ae721a7d..46fcc718337b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2162,6 +2162,32 @@ qla2x00_dif_bundle_statistics_show(struct device *dev,
ha->dif_bundle_dma_allocs, ha->pool.unusable.count);
 }
 
+static ssize_t
+qla2x00_fw_attr_show(struct device *dev,
+struct device_attribute *attr, char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%llx\n",
+   (uint64_t)ha->fw_attributes_ext[1] << 48 |
+   (uint64_t)ha->fw_attributes_ext[0] << 32 |
+   (uint64_t)ha->fw_attributes_h << 16 |
+   (uint64_t)ha->fw_attributes);
+}
+
+static ssize_t
+qla2x00_port_no_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, "%u\n", vha->hw->port_no);
+}
+
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -2219,6 +2245,8 @@ static DEVICE_ATTR(dif_bundle_statistics, 0444,
 qla2x00_dif_bundle_statistics_show, NULL);
 static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
 qla2x00_port_speed_store);
+static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
+static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
 
 
 struct device_attribute *qla2x00_host_attrs[] = {
@@ -2259,6 +2287,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
+   &dev_attr_port_no,
+   &dev_attr_fw_attr,
NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */
-- 
2.12.0



[PATCH 12/14] qla2xxx: Add 28xx flash primary/secondary status/image mechanism

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

Includes the following:
- correction to 27xx image status struct;
- factoring of 27xx image status validating routines to make common;
- image status generation compare that works across zero wrap;
- bsg interface to report current active images (as loaded by driver).

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  34 -
 drivers/scsi/qla2xxx/qla_bsg.c  |  42 +
 drivers/scsi/qla2xxx/qla_bsg.h  |  11 ++
 drivers/scsi/qla2xxx/qla_def.h  |  63 +---
 drivers/scsi/qla2xxx/qla_fw.h   |  12 ++
 drivers/scsi/qla2xxx/qla_gbl.h  |   6 +-
 drivers/scsi/qla2xxx/qla_init.c | 328 +---
 drivers/scsi/qla2xxx/qla_sup.c  |  71 +++--
 8 files changed, 470 insertions(+), 97 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 68a52173ed66..a69479956c5c 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -154,6 +154,8 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject 
*kobj,
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
+   uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (!capable(CAP_SYS_ADMIN))
return 0;
@@ -164,11 +166,21 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct 
kobject *kobj,
return -EAGAIN;
}
 
-   if (IS_NOCACHE_VPD_TYPE(ha))
-   ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram 
<< 2,
-   ha->nvram_size);
+   if (!IS_NOCACHE_VPD_TYPE(ha)) {
+   mutex_unlock(&ha->optrom_mutex);
+   goto skip;
+   }
+
+   faddr = ha->flt_region_nvram;
+   if (IS_QLA28XX(ha)) {
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_nvram_sec;
+   }
+   ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
+
mutex_unlock(&ha->optrom_mutex);
 
+skip:
return memory_read_from_buffer(buf, count, &off, ha->nvram,
ha->nvram_size);
 }
@@ -504,6 +516,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (unlikely(pci_channel_offline(ha->pdev)))
return -EAGAIN;
@@ -516,9 +529,16 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
faddr = ha->flt_region_vpd << 2;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   if (IS_QLA28XX(ha)) {
+   qla28xx_get_aux_images(vha, &active_regions);
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   ql_dbg(ql_dbg_init, vha, 0x7070,
+   "Loading %s nvram image.\n",
+   active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
+   "primary" : "secondary");
+   }
 
mutex_lock(&ha->optrom_mutex);
if (qla2x00_chip_is_down(vha)) {
@@ -528,6 +548,8 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
mutex_unlock(&ha->optrom_mutex);
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
 skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 4c294bcd100a..95b0ec3c2d40 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2389,6 +2389,45 @@ qla2x00_do_dport_diagnostics(struct bsg_job *bsg_job)
 }
 
 static int
+qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
+{
+   scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
+   struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+   struct qla_hw_data *ha = vha->hw;
+   struct qla_active_regions regions = { };
+   struct active_regions active_regions = { };
+
+   qla28xx_get_aux_images(vha, &active_regions);
+   regions.global_image = active_regions.global;
+
+   if (IS_QLA28XX(ha)) {
+   qla27xx_get_active_image(vha, &active_regions);
+   regions.board_config = active_regions.aux.board_config;
+   regions.vpd_nvram = active_regions.aux.v

[PATCH 00/14] qla2xxx: Add support for ISP28XX (Gen7) adapter

2019-03-07 Thread Himanshu Madhani
Hi Martin, 

This patch series adds support for our next generation ISP28XX (Gen7) adapter.  

Patch 1-3 adds SysFS node and misc cleanup in fw dump routines.
Patch 4-5 adds PCI IDs and serdes support for ISP28XX (Gen7) adapter.
Patch 6-11 cleans up overall firmware dump handling to prepare for new feature.
Patch 12 adds support for Primary/Secondary firmware images in the flash.
Patch 13 adds capability for secure flash update for ISP28XX (Gen7) adapter.

Please consider this series for 5.2/scsi-queue branch at your earliest 
convenience.

Thanks,
Himanshu

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

Joe Carnuccio (12):
  qla2xxx: Add fw_attr and port_no SysFS node
  qla2xxx: Remove FW default template
  qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().
  qla2xxx: Add Device ID for ISP28XX
  qla2xxx: Add Serdes support for ISP28XX
  qla2xxx: Correctly report max/min supported speeds
  qla2xxx: Cleanups for NVRAM/Flash read/write path
  qla2xxx: Add support for multiple fwdump templates/segments
  qla2xxx: Update flash read/write routine
  qla2xxx: Correction and improvement to fwdt processing
  qla2xxx: Simplification of register address used in qla_tmpl.c
  qla2xxx: Add 28xx flash primary/secondary status/image mechanism

Michael Hernandez (1):
  qla2xxx: Secure flash update support for ISP28XX

 drivers/scsi/qla2xxx/qla_attr.c|  274 +++---
 drivers/scsi/qla2xxx/qla_bsg.c |   63 ++-
 drivers/scsi/qla2xxx/qla_bsg.h |   11 +
 drivers/scsi/qla2xxx/qla_dbg.c |  190 ---
 drivers/scsi/qla2xxx/qla_dbg.h |   10 +-
 drivers/scsi/qla2xxx/qla_def.h |  186 +--
 drivers/scsi/qla2xxx/qla_dfs.c |6 +-
 drivers/scsi/qla2xxx/qla_fw.h  |   31 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   91 ++--
 drivers/scsi/qla2xxx/qla_gs.c  |   85 ++-
 drivers/scsi/qla2xxx/qla_init.c| 1027 ++--
 drivers/scsi/qla2xxx/qla_iocb.c|5 +-
 drivers/scsi/qla2xxx/qla_isr.c |   30 +-
 drivers/scsi/qla2xxx/qla_mbx.c |  319 ---
 drivers/scsi/qla2xxx/qla_mr.c  |   46 +-
 drivers/scsi/qla2xxx/qla_nx.c  |   17 +-
 drivers/scsi/qla2xxx/qla_nx2.c |8 +-
 drivers/scsi/qla2xxx/qla_os.c  |  121 -
 drivers/scsi/qla2xxx/qla_sup.c |  970 +++---
 drivers/scsi/qla2xxx/qla_target.c  |7 +-
 drivers/scsi/qla2xxx/qla_tmpl.c|  450 +++-
 drivers/scsi/qla2xxx/qla_tmpl.h|2 +-
 drivers/scsi/qla2xxx/qla_version.h |4 +-
 23 files changed, 2491 insertions(+), 1462 deletions(-)

-- 
2.12.0



[PATCH 10/14] qla2xxx: Correction and improvement to fwdt processing

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch cleans up and fixes firmware dump template
processing. These changes are added to support newer
features for ISP27XX/ISP28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 51 ++---
 drivers/scsi/qla2xxx/qla_tmpl.h |  2 +-
 2 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index fab09bcefc72..07ebebcbc0db 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -99,9 +99,9 @@ static inline void
 qla27xx_write_reg(__iomem struct device_reg_24xx *reg,
uint offset, uint32_t data, void *buf)
 {
-   __iomem void *window = (void __iomem *)reg + offset;
-
if (buf) {
+   void __iomem *window = (void __iomem *)reg + offset;
+
WRT_REG_DWORD(window, data);
}
 }
@@ -697,9 +697,9 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   ulong offset = offsetof(typeof(*ent), t275.buffer);
-   ulong length = le32_to_cpu(ent->t275.length);
ulong size = le32_to_cpu(ent->hdr.size);
+   ulong length = le32_to_cpu(ent->t275.length);
+   ulong offset = offsetof(typeof(*ent), t275.buffer);
void *buffer = ent->t275.buffer;
 
ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd213,
@@ -711,10 +711,10 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
goto done;
}
if (offset + length > size) {
+   length = size - offset;
ql_dbg(ql_dbg_misc, vha, 0xd030,
-   "%s: buffer overflow\n", __func__);
-   qla27xx_skip_entry(ent, buf);
-   goto done;
+   "%s: buffer overflow, truncate [%lx]\n", __func__, length);
+   ent->t275.length = cpu_to_le32(length);
}
 
qla27xx_insertbuf(buffer, length, buf, len);
@@ -726,17 +726,22 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha,
 struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   ulong cond1 = le32_to_cpu(ent->t276.cond1);
-   ulong cond2 = le32_to_cpu(ent->t276.cond2);
-   uint type = vha->hw->pdev->device >> 4 & 0xf;
-   uint func = vha->hw->port_no & 0x3;
-
ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd214,
"%s: cond [%lx]\n", __func__, *len);
 
-   if (type != cond1 || func != cond2) {
-   ent = qla27xx_next_entry(ent);
-   qla27xx_skip_entry(ent, buf);
+   if (buf) {
+   ulong cond1 = le32_to_cpu(ent->t276.cond1);
+   ulong cond2 = le32_to_cpu(ent->t276.cond2);
+   uint type = vha->hw->pdev->device >> 4 & 0xf;
+   uint func = vha->hw->port_no & 0x3;
+
+   if (type != cond1 || func != cond2) {
+   struct qla27xx_fwdt_template *tmp = buf;
+
+   tmp->count--;
+   ent = qla27xx_next_entry(ent);
+   qla27xx_skip_entry(ent, buf);
+   }
}
 
return qla27xx_next_entry(ent);
@@ -842,25 +847,25 @@ qla27xx_walk_template(struct scsi_qla_host *vha,
 {
struct qla27xx_fwdt_entry *ent =
(void *)tmp + le32_to_cpu(tmp->entry_offset);
-   ulong count = le32_to_cpu(tmp->entry_count);
-   ulong type = 0;
+   ulong type;
 
+   tmp->count = le32_to_cpu(tmp->entry_count);
ql_dbg(ql_dbg_misc, vha, 0xd01a,
-   "%s: entry count %lx\n", __func__, count);
-   while (count--) {
+   "%s: entry count %u\n", __func__, tmp->count);
+   while (ent && tmp->count--) {
type = le32_to_cpu(ent->hdr.type);
ent = qla27xx_find_entry(type)(vha, ent, buf, len);
-   if (!ent)
-   break;
}
 
-   if (count)
+   if (tmp->count)
ql_dbg(ql_dbg_misc, vha, 0xd018,
-   "%s: entry count residual=+%lu\n", __func__, count);
+   "%s: entry count residual=+%u\n", __func__, tmp->count);
 
if (ent)
ql_dbg(ql_dbg_misc, vha, 0xd019,
"%s: missing end entry\n", __func__);
+
+   cpu_to_le32s(&tmp->count);  /* endianize residual count */
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h
index 5c2c2a8a19c4..030633ee47f8 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.h
+++ b/drivers/scsi/qla2xxx/qla_tmpl.h
@@ -14,7 +14,7 @@ struct __packed qla27xx_fwdt_template {
uint32_t template_type;
uint32_t entry

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

2019-03-07 Thread Himanshu Madhani
This version Includes support for ISP28XX

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 0690dac24081..0f8cca27c183 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.14-k"
+#define QLA2XXX_VERSION  "10.01.00.15-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
-#define QLA_DRIVER_MINOR_VER   0
+#define QLA_DRIVER_MINOR_VER   1
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH 09/14] qla2xxx: Update flash read/write routine

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch made following changes to flash access routines
- updated return type for read_optrom
- use void instead of uint32_t * for buffer parameter in read
  and write optrom routines
- Fix flash/nvram addressing.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  65 +++---
 drivers/scsi/qla2xxx/qla_def.h  |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  47 ++---
 drivers/scsi/qla2xxx/qla_init.c |  24 +--
 drivers/scsi/qla2xxx/qla_nx.c   |  13 +-
 drivers/scsi/qla2xxx/qla_nx2.c  |   8 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 443 +++-
 7 files changed, 296 insertions(+), 312 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 3adbb2c1a806..68a52173ed66 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -223,9 +223,9 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
+   ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
+   count);
mutex_unlock(&ha->optrom_mutex);
 
ql_dbg(ql_dbg_user, vha, 0x7060,
@@ -511,22 +511,24 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN))
return -EINVAL;
 
-   if (IS_NOCACHE_VPD_TYPE(ha)) {
-   faddr = ha->flt_region_vpd << 2;
+   if (IS_NOCACHE_VPD_TYPE(ha))
+   goto skip;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   faddr = ha->flt_region_vpd << 2;
 
-   mutex_lock(&ha->optrom_mutex);
-   if (qla2x00_chip_is_down(vha)) {
-   mutex_unlock(&ha->optrom_mutex);
-   return -EAGAIN;
-   }
-   ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
-   ha->vpd_size);
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
+   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   mutex_lock(&ha->optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
mutex_unlock(&ha->optrom_mutex);
+   return -EAGAIN;
}
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
+   mutex_unlock(&ha->optrom_mutex);
+skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
 
@@ -563,8 +565,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
+   ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
 
/* Update flash version information for 4Gb & above. */
if (!IS_FWI2_CAPABLE(ha)) {
@@ -934,7 +936,7 @@ static struct bin_attribute sysfs_dcbx_tlv_attr = {
 static struct sysfs_entry {
char *name;
struct bin_attribute *attr;
-   int is4GBp_only;
+   int type;
 } bin_file_entries[] = {
{ "fw_dump", &sysfs_fw_dump_attr, },
{ "nvram", &sysfs_nvram_attr, },
@@ -957,11 +959,11 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
int ret;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
+   if (iter->type && !IS_FWI2_CAPABLE(vha->hw))
continue;
-   if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
+   if (iter->type == 2 && !IS_QLA25XX(vha->hw))
continue;
-   if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
+   if (iter->type == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
 
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
@@ -985,14 +987,14 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
struct qla_hw_data *ha = vha->hw;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha

[PATCH 13/14] qla2xxx: Secure flash update support for ISP28XX

2019-03-07 Thread Himanshu Madhani
From: Michael Hernandez 

This patch adds support for Secure flash update with ISP28xx

Signed-off-by: Michael Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  31 +++-
 drivers/scsi/qla2xxx/qla_fw.h   |   8 +
 drivers/scsi/qla2xxx/qla_gbl.h  |  22 ++-
 drivers/scsi/qla2xxx/qla_init.c |  47 -
 drivers/scsi/qla2xxx/qla_mbx.c  | 141 +++
 drivers/scsi/qla2xxx/qla_mr.c   |   7 +-
 drivers/scsi/qla2xxx/qla_nx.c   |   4 +-
 drivers/scsi/qla2xxx/qla_os.c   |  18 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 386 +---
 9 files changed, 615 insertions(+), 49 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 574797ac7f92..2ec878afa18d 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -1033,6 +1033,7 @@ struct mbx_cmd_32 {
 #define MBC_GET_FIRMWARE_VERSION   8   /* Get firmware revision. */
 #define MBC_LOAD_RISC_RAM  9   /* Load RAM command. */
 #define MBC_DUMP_RISC_RAM  0xa /* Dump RAM command. */
+#define MBC_SECURE_FLASH_UPDATE0xa /* Secure Flash 
Update(28xx) */
 #define MBC_LOAD_RISC_RAM_EXTENDED 0xb /* Load RAM extended. */
 #define MBC_DUMP_RISC_RAM_EXTENDED 0xc /* Dump RAM extended. */
 #define MBC_WRITE_RAM_WORD_EXTENDED0xd /* Write RAM word extended */
@@ -3135,10 +3136,10 @@ struct rsp_que;
 struct isp_operations {
 
int (*pci_config) (struct scsi_qla_host *);
-   void (*reset_chip) (struct scsi_qla_host *);
+   int (*reset_chip)(struct scsi_qla_host *);
int (*chip_diag) (struct scsi_qla_host *);
void (*config_rings) (struct scsi_qla_host *);
-   void (*reset_adapter) (struct scsi_qla_host *);
+   int (*reset_adapter)(struct scsi_qla_host *);
int (*nvram_config) (struct scsi_qla_host *);
void (*update_fw_options) (struct scsi_qla_host *);
int (*load_risc) (struct scsi_qla_host *, uint32_t *);
@@ -3627,6 +3628,8 @@ struct qla_hw_data {
uint32_trida_fmt2:1;
uint32_tpurge_mbox:1;
uint32_tn2n_bigger:1;
+   uint32_tsecure_adapter:1;
+   uint32_tsecure_fw:1;
} flags;
 
uint16_t max_exchg;
@@ -3915,6 +3918,9 @@ struct qla_hw_data {
void*sfp_data;
dma_addr_t  sfp_data_dma;
 
+   void*flt;
+   dma_addr_t  flt_dma;
+
 #define XGMAC_DATA_SIZE4096
void*xgmac_data;
dma_addr_t  xgmac_data_dma;
@@ -4362,6 +4368,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define ISP_ABORT_TO_ROM   33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4549,6 +4556,24 @@ struct qla2_sgx {
}   \
 }
 
+
+#define SFUB_CHECKSUM_SIZE 4
+
+struct secure_flash_update_block {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+};
+
+struct secure_flash_update_block_pk {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+   uint32_tpublic_key[0x41];
+};
+
 /*
  * Macros to help code, maintain, etc.
  */
@@ -4749,6 +4774,8 @@ struct sff_8247_a0 {
IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \
 IS_QLA28XX(_vha->hw)))
 
+#define FLASH_SEMAPHORE_REGISTER_ADDR   0x00101016
+
 #define USER_CTRL_IRQ(_ha) (ql2xuctrlirq && QLA_TGT_MODE_ENABLED() && \
(IS_QLA27XX(_ha) || IS_QLA28XX(_ha) || IS_QLA83XX(_ha)))
 
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index 9dbd0dce5a29..d53cd7875a85 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -1536,6 +1536,10 @@ struct qla_flt_region {
uint32_t end;
 };
 
+#define FLT_REGION_SIZE16
+#define FLT_MAX_REGIONS0xFF
+#define FLT_REGIONS_SIZE   (FLT_REGION_SIZE * FLT_MAX_REGIONS)
+
 /* Flash NPIV Configuration Table /
 
 struct qla_npiv_header {
@@ -1725,6 +1729,10 @@ struct access_chip_rsp_84xx {
 #define LR_DIST_FW_SHIFT   (LR_DIST_FW_POS - LR_DIST_NV_POS)
 #define LR_DIST_FW_FIELD(x)((x) << LR_DIST_FW_SHIFT & 0xf000)
 
+/* FAC semaphore defines */
+#define FAC_SEMAPHORE_UNLOCK0
+#define FAC_SEMAPHORE_LOCK  1
+
 struct nvram_81xx {
/* NVRAM header. */
uint8_t id[4];
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index d5c27ffb5f41..979f0156c99e 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drive

[PATCH 04/14] qla2xxx: Add Device ID for ISP28XX

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds PCI device ID ISP28XX for Gen7 support.
Also signature determination for primary/secondary flash
image for ISP27XX/28XX is aded as part of Gen7 support.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 30 -
 drivers/scsi/qla2xxx/qla_bsg.c| 12 +++---
 drivers/scsi/qla2xxx/qla_dbg.c|  9 ++--
 drivers/scsi/qla2xxx/qla_def.h| 62 +++
 drivers/scsi/qla2xxx/qla_dfs.c|  6 +--
 drivers/scsi/qla2xxx/qla_fw.h |  5 ++-
 drivers/scsi/qla2xxx/qla_gs.c |  4 +-
 drivers/scsi/qla2xxx/qla_init.c   | 51 +-
 drivers/scsi/qla2xxx/qla_iocb.c   |  5 ++-
 drivers/scsi/qla2xxx/qla_isr.c| 14 +++---
 drivers/scsi/qla2xxx/qla_mbx.c| 76 ++---
 drivers/scsi/qla2xxx/qla_os.c | 89 ---
 drivers/scsi/qla2xxx/qla_sup.c| 49 +++--
 drivers/scsi/qla2xxx/qla_target.c |  7 +--
 14 files changed, 272 insertions(+), 147 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 46fcc718337b..76ca7edde960 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -427,7 +427,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct 
kobject *kobj,
valid = 1;
else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
|| IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)
-   || IS_QLA27XX(ha))
+   || IS_QLA27XX(ha) || IS_QLA28XX(ha))
valid = 1;
if (!valid) {
ql_log(ql_log_warn, vha, 0x7065,
@@ -514,7 +514,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (IS_NOCACHE_VPD_TYPE(ha)) {
faddr = ha->flt_region_vpd << 2;
 
-   if (IS_QLA27XX(ha) &&
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
faddr = ha->flt_region_vpd_sec << 2;
 
@@ -682,7 +682,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject 
*kobj,
ql_log(ql_log_info, vha, 0x706f,
"Issuing MPI reset.\n");
 
-   if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
+   if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
uint32_t idc_control;
 
qla83xx_idc_lock(vha, 0);
@@ -991,7 +991,8 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
continue;
if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
-   if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
+   if (iter->is4GBp_only == 0x27 &&
+   (!IS_QLA27XX(vha->hw) || !IS_QLA28XX(ha)))
continue;
 
sysfs_remove_bin_file(&host->shost_gendev.kobj,
@@ -1336,7 +1337,8 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
+   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
@@ -1383,7 +1385,7 @@ qla2x00_mpi_version_show(struct device *dev, struct 
device_attribute *attr,
struct qla_hw_data *ha = vha->hw;
 
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
-   !IS_QLA27XX(ha))
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
@@ -1596,7 +1598,7 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
@@ -1610,7 +1612,7 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnpri

[PATCH 08/14] qla2xxx: Add support for multiple fwdump templates/segments

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds multipe firmware dump template and segments
support for ISP27XX/28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   3 +-
 drivers/scsi/qla2xxx/qla_def.h  |   9 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 +-
 drivers/scsi/qla2xxx/qla_init.c | 406 +++-
 drivers/scsi/qla2xxx/qla_os.c   |  14 +-
 drivers/scsi/qla2xxx/qla_sup.c  |   2 +
 drivers/scsi/qla2xxx/qla_tmpl.c |  89 +
 7 files changed, 302 insertions(+), 223 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 9547d9680bb2..4c294bcd100a 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -84,8 +84,7 @@ qla24xx_fcp_prio_cfg_valid(scsi_qla_host_t *vha,
return 0;
}
 
-   if (bcode[0] != 'H' || bcode[1] != 'Q' || bcode[2] != 'O' ||
-   bcode[3] != 'S') {
+   if (memcmp(bcode, "HQOS", 4)) {
/* Invalid FCP priority data header*/
ql_dbg(ql_dbg_user, vha, 0x7052,
"Invalid FCP Priority data header. bcode=0x%x.\n",
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 533e498c5346..cf2f597fa7f4 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4030,9 +4030,11 @@ struct qla_hw_data {
uint8_t pep_version[3];
 
/* Firmware dump template */
-   void*fw_dump_template;
-   uint32_tfw_dump_template_len;
-   /* Firmware dump information. */
+   struct fwdt {
+   void *template;
+   ulong length;
+   ulong dump_size;
+   } fwdt[2];
struct qla2xxx_fw_dump *fw_dump;
uint32_tfw_dump_len;
boolfw_dumped;
@@ -4075,7 +4077,6 @@ struct qla_hw_data {
uint16_tproduct_id[4];
 
uint8_t model_number[16+1];
-#define BINZERO"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
charmodel_desc[80];
uint8_t adapter_id[16+1];
 
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index e300a701296a..a222997141d3 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -611,7 +611,7 @@ extern void qla82xx_fw_dump(scsi_qla_host_t *, int);
 extern void qla8044_fw_dump(scsi_qla_host_t *, int);
 
 extern void qla27xx_fwdump(scsi_qla_host_t *, int);
-extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
+extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *, void *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
 
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 48624d4be9a5..50f69edfc399 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3088,12 +3088,15 @@ qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
 void
 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 {
+   int rval;
uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
eft_size, fce_size, mq_size;
struct qla_hw_data *ha = vha->hw;
struct req_que *req = ha->req_q_map[0];
struct rsp_que *rsp = ha->rsp_q_map[0];
struct qla2xxx_fw_dump *fw_dump;
+   dma_addr_t tc_dma;
+   void *tc;
 
dump_size = fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
req_q_size = rsp_q_size = 0;
@@ -3138,20 +3141,51 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
 try_eft:
+   if (ha->eft)
+   dma_free_coherent(&ha->pdev->dev,
+   EFT_SIZE, ha->eft, ha->eft_dma);
+
+   /* Allocate memory for Extended Trace Buffer. */
+   tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
+GFP_KERNEL);
+   if (!tc) {
+   ql_log(ql_log_warn, vha, 0x00c1,
+   "Unable to allocate (%d KB) for EFT.\n",
+   EFT_SIZE / 1024);
+   goto allocate;
+   }
+
+   rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
+   if (rval) {
+   ql_log(ql_log_warn, vha, 0x00c2,
+   "Unable to initialize EFT (%d).\n", rval);
+   dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
+   tc_dma);
+   }
ql_dbg(ql_dbg_init, vha, 0x00c3,
"Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
eft_

[PATCH 05/14] qla2xxx: Add Serdes support for ISP28XX

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds SysFS node for serdes_version
and also cleans up port_speed display.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 43 +--
 drivers/scsi/qla2xxx/qla_def.h  |  4 ++-
 drivers/scsi/qla2xxx/qla_gs.c   | 77 -
 drivers/scsi/qla2xxx/qla_isr.c  |  4 ++-
 drivers/scsi/qla2xxx/qla_mbx.c  | 25 +++--
 5 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 76ca7edde960..833b082a7944 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1378,6 +1378,21 @@ qla24xx_84xx_fw_version_show(struct device *dev,
 }
 
 static ssize_t
+qla2x00_serdes_version_show(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
+   ha->serdes_version[0], ha->serdes_version[1],
+   ha->serdes_version[2]);
+}
+
+static ssize_t
 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
 char *buf)
 {
@@ -2218,6 +2233,7 @@ static DEVICE_ATTR(84xx_fw_version, S_IRUGO, 
qla24xx_84xx_fw_version_show,
   NULL);
 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
   NULL);
+static DEVICE_ATTR(serdes_version, 0444, qla2x00_serdes_version_show, NULL);
 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
@@ -2270,6 +2286,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_optrom_fw_version,
&dev_attr_84xx_fw_version,
&dev_attr_total_isp_aborts,
+   &dev_attr_serdes_version,
&dev_attr_mpi_version,
&dev_attr_phy_version,
&dev_attr_flash_block_size,
@@ -2326,16 +2343,15 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost)
 static void
 qla2x00_get_host_speed(struct Scsi_Host *shost)
 {
-   struct qla_hw_data *ha = ((struct scsi_qla_host *)
-   (shost_priv(shost)))->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   scsi_qla_host_t *vha = shost_priv(shost);
+   u32 speed;
 
-   if (IS_QLAFX00(ha)) {
+   if (IS_QLAFX00(vha->hw)) {
qlafx00_get_host_speed(shost);
return;
}
 
-   switch (ha->link_data_rate) {
+   switch (vha->hw->link_data_rate) {
case PORT_SPEED_1GB:
speed = FC_PORTSPEED_1GBIT;
break;
@@ -2360,7 +2376,11 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
case PORT_SPEED_64GB:
speed = FC_PORTSPEED_64GBIT;
break;
+   default:
+   speed = FC_PORTSPEED_UNKNOWN;
+   break;
}
+
fc_host_speed(shost) = speed;
 }
 
@@ -2368,7 +2388,7 @@ static void
 qla2x00_get_host_port_type(struct Scsi_Host *shost)
 {
scsi_qla_host_t *vha = shost_priv(shost);
-   uint32_t port_type = FC_PORTTYPE_UNKNOWN;
+   uint32_t port_type;
 
if (vha->vp_idx) {
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
@@ -2387,7 +2407,11 @@ qla2x00_get_host_port_type(struct Scsi_Host *shost)
case ISP_CFG_F:
port_type = FC_PORTTYPE_NPORT;
break;
+   default:
+   port_type = FC_PORTTYPE_UNKNOWN;
+   break;
}
+
fc_host_port_type(shost) = port_type;
 }
 
@@ -2449,13 +2473,10 @@ qla2x00_get_starget_port_id(struct scsi_target *starget)
fc_starget_port_id(starget) = port_id;
 }
 
-static void
+static inline void
 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
 {
-   if (timeout)
-   rport->dev_loss_tmo = timeout;
-   else
-   rport->dev_loss_tmo = 1;
+   rport->dev_loss_tmo = timeout ? timeout : 1;
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c64cd555ef0d..a4661306cc34 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4023,6 +4023,7 @@ struct qla_hw_data {
uint8_t fw_seriallink_options[4];
uint16_tfw_seriallink_options24[4];
 
+   uint8_t serdes_version[3];
uint8_t mpi_version[3];
uint32_tmpi_capabilities;
uint8_t phy_version[3];
@@ -4034,7 +4035,8 @@ struct qla_hw_data {
/* Firmware dump information. */
struct q

[PATCH 07/14] qla2xxx: Cleanups for NVRAM/Flash read/write path

2019-03-07 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch does following
 - Clean up NVRAM code.
 - Optimizes reading of primary/secondary flash image validation.
 - Remove 0xff mask and make correct width in FLT structure.
 - Use endian macros to assign static fields in fwdump header.
 - Correct fdwt checksum calculation.
 - Simplify ql_dump_buffer() interface usage.
 - Add endianizers to 27xx firmware image validator.
 - fixes compiler warnings for big endian architecture.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   6 +-
 drivers/scsi/qla2xxx/qla_dbg.c  |  19 ++---
 drivers/scsi/qla2xxx/qla_dbg.h  |  10 +--
 drivers/scsi/qla2xxx/qla_def.h  |   2 +-
 drivers/scsi/qla2xxx/qla_fw.h   |   4 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  10 +--
 drivers/scsi/qla2xxx/qla_gs.c   |   4 +-
 drivers/scsi/qla2xxx/qla_init.c | 143 +++
 drivers/scsi/qla2xxx/qla_isr.c  |  12 +--
 drivers/scsi/qla2xxx/qla_mbx.c  |  16 +++-
 drivers/scsi/qla2xxx/qla_mr.c   |  39 -
 drivers/scsi/qla2xxx/qla_os.c   |   2 +-
 drivers/scsi/qla2xxx/qla_sup.c  |  41 -
 drivers/scsi/qla2xxx/qla_tmpl.c | 181 +---
 14 files changed, 256 insertions(+), 233 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 2fe194a06e67..9547d9680bb2 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -1962,7 +1962,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
 
/* Dump the vendor information */
ql_dump_buffer(ql_dbg_user + ql_dbg_verbose , vha, 0x70cf,
-   (uint8_t *)piocb_rqst, sizeof(struct qla_mt_iocb_rqst_fx00));
+   piocb_rqst, sizeof(*piocb_rqst));
 
if (!vha->flags.online) {
ql_log(ql_log_warn, vha, 0x70d0,
@@ -2324,8 +2324,8 @@ qla2x00_get_priv_stats(struct bsg_job *bsg_job)
rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, options);
 
if (rval == QLA_SUCCESS) {
-   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e3,
-   (uint8_t *)stats, sizeof(*stats));
+   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e5,
+   stats, sizeof(*stats));
sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
bsg_job->reply_payload.sg_cnt, stats, sizeof(*stats));
}
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 3cfd846cdb2a..94da4b9927e9 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -2520,7 +2520,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
 //
 
 static inline int
-ql_mask_match(uint32_t level)
+ql_mask_match(uint level)
 {
return (level & ql2xextended_error_logging) == level;
 }
@@ -2539,7 +2539,7 @@ ql_mask_match(uint32_t level)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2582,8 +2582,7 @@ ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2619,7 +2618,7 @@ ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
  * msg:   The message to be displayed.
  */
 void
-ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2677,8 +2676,7 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2718,7 +2716,7 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
 }
 
 void
-ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
+ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
 {
int i;
struct qla_hw_data *ha = vha->hw;
@@ -2740,13 +2738,12 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, 
int32_t id)
ql_dbg(level, vha, id, "Mailbox registers:\n");
for (i = 0; i < 6; i++, mbx_reg++)
ql_dbg(level, vha, id,
-   "mbox[%d] 0x%04x\n", i, RD_REG_WORD(mbx_reg));
+   "mbox[%d] %#04x\n", i, RD_REG_WORD

[PATCH v2 07/14] qla2xxx: Cleanups for NVRAM/Flash read/write path

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch does following
 - Clean up NVRAM code.
 - Optimizes reading of primary/secondary flash image validation.
 - Remove 0xff mask and make correct width in FLT structure.
 - Use endian macros to assign static fields in fwdump header.
 - Correct fdwt checksum calculation.
 - Simplify ql_dump_buffer() interface usage.
 - Add endianizers to 27xx firmware image validator.
 - fixes compiler warnings for big endian architecture.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 

qla2xxx: Fix sparse warnings in qla_tmpl.c

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c|   6 +-
 drivers/scsi/qla2xxx/qla_dbg.c|  19 ++---
 drivers/scsi/qla2xxx/qla_dbg.h|  10 +--
 drivers/scsi/qla2xxx/qla_def.h|   2 +-
 drivers/scsi/qla2xxx/qla_fw.h |   4 +-
 drivers/scsi/qla2xxx/qla_gbl.h|  10 +--
 drivers/scsi/qla2xxx/qla_gs.c |   4 +-
 drivers/scsi/qla2xxx/qla_init.c   | 143 --
 drivers/scsi/qla2xxx/qla_inline.h |  14 
 drivers/scsi/qla2xxx/qla_isr.c|  12 +--
 drivers/scsi/qla2xxx/qla_mbx.c|  16 +++-
 drivers/scsi/qla2xxx/qla_mr.c |  39 +-
 drivers/scsi/qla2xxx/qla_os.c |   2 +-
 drivers/scsi/qla2xxx/qla_sup.c|  41 --
 drivers/scsi/qla2xxx/qla_tmpl.c   | 156 --
 15 files changed, 255 insertions(+), 223 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 2fe194a06e67..9547d9680bb2 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -1962,7 +1962,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
 
/* Dump the vendor information */
ql_dump_buffer(ql_dbg_user + ql_dbg_verbose , vha, 0x70cf,
-   (uint8_t *)piocb_rqst, sizeof(struct qla_mt_iocb_rqst_fx00));
+   piocb_rqst, sizeof(*piocb_rqst));
 
if (!vha->flags.online) {
ql_log(ql_log_warn, vha, 0x70d0,
@@ -2324,8 +2324,8 @@ qla2x00_get_priv_stats(struct bsg_job *bsg_job)
rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, options);
 
if (rval == QLA_SUCCESS) {
-   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e3,
-   (uint8_t *)stats, sizeof(*stats));
+   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e5,
+   stats, sizeof(*stats));
sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
bsg_job->reply_payload.sg_cnt, stats, sizeof(*stats));
}
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 3cfd846cdb2a..94da4b9927e9 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -2520,7 +2520,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
 //
 
 static inline int
-ql_mask_match(uint32_t level)
+ql_mask_match(uint level)
 {
return (level & ql2xextended_error_logging) == level;
 }
@@ -2539,7 +2539,7 @@ ql_mask_match(uint32_t level)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2582,8 +2582,7 @@ ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2619,7 +2618,7 @@ ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
  * msg:   The message to be displayed.
  */
 void
-ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2677,8 +2676,7 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2718,7 +2716,7 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
 }
 
 void
-ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
+ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
 {
int i;
struct qla_hw_data *ha = vha->hw;
@@ -2740,13 +2738,12 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, 
int32_t id)
ql_dbg(level, vha, id, "Mailbox registers:\n");
for (i = 0; i < 6; i++, mbx_reg++)

[PATCH v2 12/14] qla2xxx: Add 28xx flash primary/secondary status/image mechanism

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

Includes the following:
- correction to 27xx image status struct;
- factoring of 27xx image status validating routines to make common;
- image status generation compare that works across zero wrap;
- bsg interface to report current active images (as loaded by driver).

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  34 -
 drivers/scsi/qla2xxx/qla_bsg.c  |  42 +
 drivers/scsi/qla2xxx/qla_bsg.h  |  11 ++
 drivers/scsi/qla2xxx/qla_def.h  |  63 +---
 drivers/scsi/qla2xxx/qla_fw.h   |  12 ++
 drivers/scsi/qla2xxx/qla_gbl.h  |   6 +-
 drivers/scsi/qla2xxx/qla_init.c | 328 +---
 drivers/scsi/qla2xxx/qla_sup.c  |  71 +++--
 8 files changed, 470 insertions(+), 97 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 68a52173ed66..a69479956c5c 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -154,6 +154,8 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject 
*kobj,
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
+   uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (!capable(CAP_SYS_ADMIN))
return 0;
@@ -164,11 +166,21 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct 
kobject *kobj,
return -EAGAIN;
}
 
-   if (IS_NOCACHE_VPD_TYPE(ha))
-   ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram 
<< 2,
-   ha->nvram_size);
+   if (!IS_NOCACHE_VPD_TYPE(ha)) {
+   mutex_unlock(&ha->optrom_mutex);
+   goto skip;
+   }
+
+   faddr = ha->flt_region_nvram;
+   if (IS_QLA28XX(ha)) {
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_nvram_sec;
+   }
+   ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
+
mutex_unlock(&ha->optrom_mutex);
 
+skip:
return memory_read_from_buffer(buf, count, &off, ha->nvram,
ha->nvram_size);
 }
@@ -504,6 +516,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (unlikely(pci_channel_offline(ha->pdev)))
return -EAGAIN;
@@ -516,9 +529,16 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
faddr = ha->flt_region_vpd << 2;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   if (IS_QLA28XX(ha)) {
+   qla28xx_get_aux_images(vha, &active_regions);
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   ql_dbg(ql_dbg_init, vha, 0x7070,
+   "Loading %s nvram image.\n",
+   active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
+   "primary" : "secondary");
+   }
 
mutex_lock(&ha->optrom_mutex);
if (qla2x00_chip_is_down(vha)) {
@@ -528,6 +548,8 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
mutex_unlock(&ha->optrom_mutex);
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
 skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 4c294bcd100a..95b0ec3c2d40 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2389,6 +2389,45 @@ qla2x00_do_dport_diagnostics(struct bsg_job *bsg_job)
 }
 
 static int
+qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
+{
+   scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
+   struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+   struct qla_hw_data *ha = vha->hw;
+   struct qla_active_regions regions = { };
+   struct active_regions active_regions = { };
+
+   qla28xx_get_aux_images(vha, &active_regions);
+   regions.global_image = active_regions.global;
+
+   if (IS_QLA28XX(ha)) {
+   qla27xx_get_active_image(vha, &active_regions);
+   regions.board_config = active_regions.aux.board_config;
+   regions.vpd_nvram = active_regions.aux.v

[PATCH v2 06/14] qla2xxx: Correctly report max/min supported speeds

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes reported speed for min_link and max_supported
speed. Also rename SysFS nodes link_speed and max_supported to
be consistent with {min|max}_suuported_speed.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 94 +
 drivers/scsi/qla2xxx/qla_def.h  |  7 +--
 drivers/scsi/qla2xxx/qla_fw.h   |  2 +-
 drivers/scsi/qla2xxx/qla_mbx.c  | 65 +++-
 4 files changed, 98 insertions(+), 70 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 833b082a7944..3adbb2c1a806 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1621,8 +1621,8 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
 }
 
 static ssize_t
-qla2x00_min_link_speed_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_min_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1631,16 +1631,17 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->min_link_speed == 5 ? "32Gps" :
-   ha->min_link_speed == 4 ? "16Gps" :
-   ha->min_link_speed == 3 ? "8Gps" :
-   ha->min_link_speed == 2 ? "4Gps" :
-   ha->min_link_speed != 0 ? "unknown" : "");
+   ha->min_supported_speed == 6 ? "64Gps" :
+   ha->min_supported_speed == 5 ? "32Gps" :
+   ha->min_supported_speed == 4 ? "16Gps" :
+   ha->min_supported_speed == 3 ? "8Gps" :
+   ha->min_supported_speed == 2 ? "4Gps" :
+   ha->min_supported_speed != 0 ? "unknown" : "");
 }
 
 static ssize_t
-qla2x00_max_speed_sup_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_max_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1649,7 +1650,9 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->max_speed_sup ? "32Gps" : "16Gps");
+   ha->max_supported_speed  == 2 ? "64Gps" :
+   ha->max_supported_speed  == 1 ? "32Gps" :
+   ha->max_supported_speed  == 0 ? "16Gps" : "unknown");
 }
 
 static ssize_t
@@ -2251,8 +2254,10 @@ static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
   qla2x00_allow_cna_fw_dump_show,
   qla2x00_allow_cna_fw_dump_store);
 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(min_supported_speed, 0444,
+  qla2x00_min_supported_speed_show, NULL);
+static DEVICE_ATTR(max_supported_speed, 0444,
+  qla2x00_max_supported_speed_show, NULL);
 static DEVICE_ATTR(zio_threshold, 0644,
 qla_zio_threshold_show,
 qla_zio_threshold_store);
@@ -2301,8 +2306,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_fw_dump_size,
&dev_attr_allow_cna_fw_dump,
&dev_attr_pep_version,
-   &dev_attr_min_link_speed,
-   &dev_attr_max_speed_sup,
+   &dev_attr_min_supported_speed,
+   &dev_attr_max_supported_speed,
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
@@ -3031,7 +3036,7 @@ void
 qla2x00_init_host_attr(scsi_qla_host_t *vha)
 {
struct qla_hw_data *ha = vha->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   u32 speeds = FC_PORTSPEED_UNKNOWN;
 
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@@ -3042,28 +3047,45 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
 
if (IS_CNA_CAPABLE(ha))
-   speed = FC_PORTSPEED_10GBIT;
-   else if (IS_QLA2031(ha))
-   speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT |
-   FC_PORTSPEED_4GBIT;
-   else if (IS_QLA25

[PATCH v2 08/14] qla2xxx: Add support for multiple fwdump templates/segments

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds multipe firmware dump template and segments
support for ISP27XX/28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   3 +-
 drivers/scsi/qla2xxx/qla_def.h  |   9 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 +-
 drivers/scsi/qla2xxx/qla_init.c | 406 +++-
 drivers/scsi/qla2xxx/qla_os.c   |  14 +-
 drivers/scsi/qla2xxx/qla_sup.c  |   2 +
 drivers/scsi/qla2xxx/qla_tmpl.c |  89 +
 7 files changed, 302 insertions(+), 223 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 9547d9680bb2..4c294bcd100a 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -84,8 +84,7 @@ qla24xx_fcp_prio_cfg_valid(scsi_qla_host_t *vha,
return 0;
}
 
-   if (bcode[0] != 'H' || bcode[1] != 'Q' || bcode[2] != 'O' ||
-   bcode[3] != 'S') {
+   if (memcmp(bcode, "HQOS", 4)) {
/* Invalid FCP priority data header*/
ql_dbg(ql_dbg_user, vha, 0x7052,
"Invalid FCP Priority data header. bcode=0x%x.\n",
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 533e498c5346..cf2f597fa7f4 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4030,9 +4030,11 @@ struct qla_hw_data {
uint8_t pep_version[3];
 
/* Firmware dump template */
-   void*fw_dump_template;
-   uint32_tfw_dump_template_len;
-   /* Firmware dump information. */
+   struct fwdt {
+   void *template;
+   ulong length;
+   ulong dump_size;
+   } fwdt[2];
struct qla2xxx_fw_dump *fw_dump;
uint32_tfw_dump_len;
boolfw_dumped;
@@ -4075,7 +4077,6 @@ struct qla_hw_data {
uint16_tproduct_id[4];
 
uint8_t model_number[16+1];
-#define BINZERO"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
charmodel_desc[80];
uint8_t adapter_id[16+1];
 
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index e300a701296a..a222997141d3 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -611,7 +611,7 @@ extern void qla82xx_fw_dump(scsi_qla_host_t *, int);
 extern void qla8044_fw_dump(scsi_qla_host_t *, int);
 
 extern void qla27xx_fwdump(scsi_qla_host_t *, int);
-extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
+extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *, void *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
 
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 48624d4be9a5..87b3629b63df 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3088,12 +3088,15 @@ qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
 void
 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 {
+   int rval;
uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
eft_size, fce_size, mq_size;
struct qla_hw_data *ha = vha->hw;
struct req_que *req = ha->req_q_map[0];
struct rsp_que *rsp = ha->rsp_q_map[0];
struct qla2xxx_fw_dump *fw_dump;
+   dma_addr_t tc_dma;
+   void *tc;
 
dump_size = fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
req_q_size = rsp_q_size = 0;
@@ -3138,20 +3141,51 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
 try_eft:
+   if (ha->eft)
+   dma_free_coherent(&ha->pdev->dev,
+   EFT_SIZE, ha->eft, ha->eft_dma);
+
+   /* Allocate memory for Extended Trace Buffer. */
+   tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
+GFP_KERNEL);
+   if (!tc) {
+   ql_log(ql_log_warn, vha, 0x00c1,
+   "Unable to allocate (%d KB) for EFT.\n",
+   EFT_SIZE / 1024);
+   goto allocate;
+   }
+
+   rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
+   if (rval) {
+   ql_log(ql_log_warn, vha, 0x00c2,
+   "Unable to initialize EFT (%d).\n", rval);
+   dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
+   tc_dma);
+   }
ql_dbg(ql_dbg_init, vha, 0x00c3,
"Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
eft_

[PATCH v2 11/14] qla2xxx: Simplification of register address used in qla_tmpl.c

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

Reduce stack space on each fwdt routine by eliminating local
variable reg.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 75 -
 1 file changed, 29 insertions(+), 46 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index dfaed4bba374..bfe02a9e3332 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -7,13 +7,9 @@
 #include "qla_def.h"
 #include "qla_tmpl.h"
 
-#define IOBASE(reg)offsetof(typeof(*reg), iobase_addr)
-
-static inline void __iomem *
-qla27xx_isp_reg(struct scsi_qla_host *vha)
-{
-   return &vha->hw->iobase->isp24;
-}
+#define ISPREG(vha)(&(vha)->hw->iobase->isp24)
+#define IOBAR(reg) offsetof(typeof(*(reg)), iobase_addr)
+#define IOBASE(vha)IOBAR(ISPREG(vha))
 
 static inline void
 qla27xx_insert16(uint16_t value, void *buf, ulong *len)
@@ -114,7 +110,7 @@ qla27xx_read_window(__iomem struct device_reg_24xx *reg,
void __iomem *window = (void __iomem *)reg + offset;
void (*readn)(void __iomem*, void *, ulong *) = 
qla27xx_read_vector(width);
 
-   qla27xx_write_reg(reg, IOBASE_ADDR, addr, buf);
+   qla27xx_write_reg(reg, IOBAR(reg), addr, buf);
while (count--) {
qla27xx_insert32(addr, buf, len);
readn(window, buf, len);
@@ -163,7 +159,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(*qla_fw_addr32(ent->t256.base_addr));
uint offset = ent->t256.pci_offset;
ulong count = le16_to_cpu(*qla_fw_addr16(ent->t256.reg_count));
@@ -171,7 +166,7 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd200,
"%s: rdio t1 [%lx]\n", __func__, *len);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -180,15 +175,14 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(*qla_fw_addr32(ent->t257.base_addr));
uint offset = ent->t257.pci_offset;
ulong data = le32_to_cpu(*qla_fw_addr32(ent->t257.write_data));
 
ql_dbg(ql_dbg_misc, vha, 0xd201,
"%s: wrio t1 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -197,7 +191,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
uint banksel = ent->t258.banksel_offset;
ulong bank = le32_to_cpu(*qla_fw_addr32(ent->t258.bank));
ulong addr = le32_to_cpu(*qla_fw_addr32(ent->t258.base_addr));
@@ -207,8 +200,8 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd202,
"%s: rdio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -217,7 +210,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(*qla_fw_addr32(ent->t259.base_addr));
uint banksel = ent->t259.banksel_offset;
ulong bank = le32_to_cpu(*qla_fw_addr32(ent->t259.bank));
@@ -226,9 +218,9 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd203,
"%s: wrio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
r

[PATCH v2 09/14] qla2xxx: Update flash read/write routine

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch made following changes to flash access routines
- updated return type for read_optrom
- use void instead of uint32_t * for buffer parameter in read
  and write optrom routines
- Fix flash/nvram addressing.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  65 +++---
 drivers/scsi/qla2xxx/qla_def.h  |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  47 ++---
 drivers/scsi/qla2xxx/qla_init.c |  24 +--
 drivers/scsi/qla2xxx/qla_nx.c   |  13 +-
 drivers/scsi/qla2xxx/qla_nx2.c  |   8 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 443 +++-
 7 files changed, 296 insertions(+), 312 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 3adbb2c1a806..68a52173ed66 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -223,9 +223,9 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
+   ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
+   count);
mutex_unlock(&ha->optrom_mutex);
 
ql_dbg(ql_dbg_user, vha, 0x7060,
@@ -511,22 +511,24 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN))
return -EINVAL;
 
-   if (IS_NOCACHE_VPD_TYPE(ha)) {
-   faddr = ha->flt_region_vpd << 2;
+   if (IS_NOCACHE_VPD_TYPE(ha))
+   goto skip;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   faddr = ha->flt_region_vpd << 2;
 
-   mutex_lock(&ha->optrom_mutex);
-   if (qla2x00_chip_is_down(vha)) {
-   mutex_unlock(&ha->optrom_mutex);
-   return -EAGAIN;
-   }
-   ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
-   ha->vpd_size);
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
+   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   mutex_lock(&ha->optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
mutex_unlock(&ha->optrom_mutex);
+   return -EAGAIN;
}
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
+   mutex_unlock(&ha->optrom_mutex);
+skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
 
@@ -563,8 +565,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
+   ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
 
/* Update flash version information for 4Gb & above. */
if (!IS_FWI2_CAPABLE(ha)) {
@@ -934,7 +936,7 @@ static struct bin_attribute sysfs_dcbx_tlv_attr = {
 static struct sysfs_entry {
char *name;
struct bin_attribute *attr;
-   int is4GBp_only;
+   int type;
 } bin_file_entries[] = {
{ "fw_dump", &sysfs_fw_dump_attr, },
{ "nvram", &sysfs_nvram_attr, },
@@ -957,11 +959,11 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
int ret;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
+   if (iter->type && !IS_FWI2_CAPABLE(vha->hw))
continue;
-   if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
+   if (iter->type == 2 && !IS_QLA25XX(vha->hw))
continue;
-   if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
+   if (iter->type == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
 
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
@@ -985,14 +987,14 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
struct qla_hw_data *ha = vha->hw;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha

[PATCH v2 13/14] qla2xxx: Secure flash update support for ISP28XX

2019-03-08 Thread Himanshu Madhani
From: Michael Hernandez 

This patch adds support for Secure flash update with ISP28xx

Signed-off-by: Michael Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  31 +++-
 drivers/scsi/qla2xxx/qla_fw.h   |   8 +
 drivers/scsi/qla2xxx/qla_gbl.h  |  22 ++-
 drivers/scsi/qla2xxx/qla_init.c |  47 -
 drivers/scsi/qla2xxx/qla_mbx.c  | 141 +++
 drivers/scsi/qla2xxx/qla_mr.c   |   7 +-
 drivers/scsi/qla2xxx/qla_nx.c   |   4 +-
 drivers/scsi/qla2xxx/qla_os.c   |  18 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 386 +---
 9 files changed, 615 insertions(+), 49 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 574797ac7f92..2ec878afa18d 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -1033,6 +1033,7 @@ struct mbx_cmd_32 {
 #define MBC_GET_FIRMWARE_VERSION   8   /* Get firmware revision. */
 #define MBC_LOAD_RISC_RAM  9   /* Load RAM command. */
 #define MBC_DUMP_RISC_RAM  0xa /* Dump RAM command. */
+#define MBC_SECURE_FLASH_UPDATE0xa /* Secure Flash 
Update(28xx) */
 #define MBC_LOAD_RISC_RAM_EXTENDED 0xb /* Load RAM extended. */
 #define MBC_DUMP_RISC_RAM_EXTENDED 0xc /* Dump RAM extended. */
 #define MBC_WRITE_RAM_WORD_EXTENDED0xd /* Write RAM word extended */
@@ -3135,10 +3136,10 @@ struct rsp_que;
 struct isp_operations {
 
int (*pci_config) (struct scsi_qla_host *);
-   void (*reset_chip) (struct scsi_qla_host *);
+   int (*reset_chip)(struct scsi_qla_host *);
int (*chip_diag) (struct scsi_qla_host *);
void (*config_rings) (struct scsi_qla_host *);
-   void (*reset_adapter) (struct scsi_qla_host *);
+   int (*reset_adapter)(struct scsi_qla_host *);
int (*nvram_config) (struct scsi_qla_host *);
void (*update_fw_options) (struct scsi_qla_host *);
int (*load_risc) (struct scsi_qla_host *, uint32_t *);
@@ -3627,6 +3628,8 @@ struct qla_hw_data {
uint32_trida_fmt2:1;
uint32_tpurge_mbox:1;
uint32_tn2n_bigger:1;
+   uint32_tsecure_adapter:1;
+   uint32_tsecure_fw:1;
} flags;
 
uint16_t max_exchg;
@@ -3915,6 +3918,9 @@ struct qla_hw_data {
void*sfp_data;
dma_addr_t  sfp_data_dma;
 
+   void*flt;
+   dma_addr_t  flt_dma;
+
 #define XGMAC_DATA_SIZE4096
void*xgmac_data;
dma_addr_t  xgmac_data_dma;
@@ -4362,6 +4368,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define ISP_ABORT_TO_ROM   33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4549,6 +4556,24 @@ struct qla2_sgx {
}   \
 }
 
+
+#define SFUB_CHECKSUM_SIZE 4
+
+struct secure_flash_update_block {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+};
+
+struct secure_flash_update_block_pk {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+   uint32_tpublic_key[0x41];
+};
+
 /*
  * Macros to help code, maintain, etc.
  */
@@ -4749,6 +4774,8 @@ struct sff_8247_a0 {
IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \
 IS_QLA28XX(_vha->hw)))
 
+#define FLASH_SEMAPHORE_REGISTER_ADDR   0x00101016
+
 #define USER_CTRL_IRQ(_ha) (ql2xuctrlirq && QLA_TGT_MODE_ENABLED() && \
(IS_QLA27XX(_ha) || IS_QLA28XX(_ha) || IS_QLA83XX(_ha)))
 
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index 9dbd0dce5a29..d53cd7875a85 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -1536,6 +1536,10 @@ struct qla_flt_region {
uint32_t end;
 };
 
+#define FLT_REGION_SIZE16
+#define FLT_MAX_REGIONS0xFF
+#define FLT_REGIONS_SIZE   (FLT_REGION_SIZE * FLT_MAX_REGIONS)
+
 /* Flash NPIV Configuration Table /
 
 struct qla_npiv_header {
@@ -1725,6 +1729,10 @@ struct access_chip_rsp_84xx {
 #define LR_DIST_FW_SHIFT   (LR_DIST_FW_POS - LR_DIST_NV_POS)
 #define LR_DIST_FW_FIELD(x)((x) << LR_DIST_FW_SHIFT & 0xf000)
 
+/* FAC semaphore defines */
+#define FAC_SEMAPHORE_UNLOCK0
+#define FAC_SEMAPHORE_LOCK  1
+
 struct nvram_81xx {
/* NVRAM header. */
uint8_t id[4];
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index d5c27ffb5f41..979f0156c99e 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drive

[PATCH v2 05/14] qla2xxx: Add Serdes support for ISP28XX

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds SysFS node for serdes_version
and also cleans up port_speed display.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 43 +--
 drivers/scsi/qla2xxx/qla_def.h  |  4 ++-
 drivers/scsi/qla2xxx/qla_gs.c   | 77 -
 drivers/scsi/qla2xxx/qla_isr.c  |  4 ++-
 drivers/scsi/qla2xxx/qla_mbx.c  | 25 +++--
 5 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 76ca7edde960..833b082a7944 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1378,6 +1378,21 @@ qla24xx_84xx_fw_version_show(struct device *dev,
 }
 
 static ssize_t
+qla2x00_serdes_version_show(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
+   ha->serdes_version[0], ha->serdes_version[1],
+   ha->serdes_version[2]);
+}
+
+static ssize_t
 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
 char *buf)
 {
@@ -2218,6 +2233,7 @@ static DEVICE_ATTR(84xx_fw_version, S_IRUGO, 
qla24xx_84xx_fw_version_show,
   NULL);
 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
   NULL);
+static DEVICE_ATTR(serdes_version, 0444, qla2x00_serdes_version_show, NULL);
 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
@@ -2270,6 +2286,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_optrom_fw_version,
&dev_attr_84xx_fw_version,
&dev_attr_total_isp_aborts,
+   &dev_attr_serdes_version,
&dev_attr_mpi_version,
&dev_attr_phy_version,
&dev_attr_flash_block_size,
@@ -2326,16 +2343,15 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost)
 static void
 qla2x00_get_host_speed(struct Scsi_Host *shost)
 {
-   struct qla_hw_data *ha = ((struct scsi_qla_host *)
-   (shost_priv(shost)))->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   scsi_qla_host_t *vha = shost_priv(shost);
+   u32 speed;
 
-   if (IS_QLAFX00(ha)) {
+   if (IS_QLAFX00(vha->hw)) {
qlafx00_get_host_speed(shost);
return;
}
 
-   switch (ha->link_data_rate) {
+   switch (vha->hw->link_data_rate) {
case PORT_SPEED_1GB:
speed = FC_PORTSPEED_1GBIT;
break;
@@ -2360,7 +2376,11 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
case PORT_SPEED_64GB:
speed = FC_PORTSPEED_64GBIT;
break;
+   default:
+   speed = FC_PORTSPEED_UNKNOWN;
+   break;
}
+
fc_host_speed(shost) = speed;
 }
 
@@ -2368,7 +2388,7 @@ static void
 qla2x00_get_host_port_type(struct Scsi_Host *shost)
 {
scsi_qla_host_t *vha = shost_priv(shost);
-   uint32_t port_type = FC_PORTTYPE_UNKNOWN;
+   uint32_t port_type;
 
if (vha->vp_idx) {
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
@@ -2387,7 +2407,11 @@ qla2x00_get_host_port_type(struct Scsi_Host *shost)
case ISP_CFG_F:
port_type = FC_PORTTYPE_NPORT;
break;
+   default:
+   port_type = FC_PORTTYPE_UNKNOWN;
+   break;
}
+
fc_host_port_type(shost) = port_type;
 }
 
@@ -2449,13 +2473,10 @@ qla2x00_get_starget_port_id(struct scsi_target *starget)
fc_starget_port_id(starget) = port_id;
 }
 
-static void
+static inline void
 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
 {
-   if (timeout)
-   rport->dev_loss_tmo = timeout;
-   else
-   rport->dev_loss_tmo = 1;
+   rport->dev_loss_tmo = timeout ? timeout : 1;
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c64cd555ef0d..a4661306cc34 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4023,6 +4023,7 @@ struct qla_hw_data {
uint8_t fw_seriallink_options[4];
uint16_tfw_seriallink_options24[4];
 
+   uint8_t serdes_version[3];
uint8_t mpi_version[3];
uint32_tmpi_capabilities;
uint8_t phy_version[3];
@@ -4034,7 +4035,8 @@ struct qla_hw_data {
/* Firmware dump information. */
struct q

[PATCH v2 10/14] qla2xxx: Correction and improvement to fwdt processing

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch cleans up and fixes firmware dump template
processing. These changes are added to support newer
features for ISP27XX/ISP28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 43 +++--
 drivers/scsi/qla2xxx/qla_tmpl.h |  2 +-
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index b6fc90c65765..dfaed4bba374 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -99,9 +99,9 @@ static inline void
 qla27xx_write_reg(__iomem struct device_reg_24xx *reg,
uint offset, uint32_t data, void *buf)
 {
-   __iomem void *window = (void __iomem *)reg + offset;
-
if (buf) {
+   void __iomem *window = (void __iomem *)reg + offset;
+
WRT_REG_DWORD(window, data);
}
 }
@@ -709,10 +709,10 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
goto done;
}
if (offset + length > size) {
+   length = size - offset;
ql_dbg(ql_dbg_misc, vha, 0xd030,
-   "%s: buffer overflow\n", __func__);
-   qla27xx_skip_entry(ent, buf);
-   goto done;
+   "%s: buffer overflow, truncate [%lx]\n", __func__, length);
+   ent->t275.length = length;
}
 
qla27xx_insertbuf(buffer, length, buf, len);
@@ -724,17 +724,22 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha,
 struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   ulong cond1 = le32_to_cpu(*qla_fw_addr32(ent->t276.cond1));
-   ulong cond2 = le32_to_cpu(*qla_fw_addr32(ent->t276.cond2));
-   uint type = vha->hw->pdev->device >> 4 & 0xf;
-   uint func = vha->hw->port_no & 0x3;
-
ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd214,
"%s: cond [%lx]\n", __func__, *len);
 
-   if (type != cond1 || func != cond2) {
-   ent = qla27xx_next_entry(ent);
-   qla27xx_skip_entry(ent, buf);
+   if (buf) {
+   ulong cond1 = le32_to_cpu(*qla_fw_addr32(ent->t276.cond1));
+   ulong cond2 = le32_to_cpu(*qla_fw_addr32(ent->t276.cond2));
+   uint type = vha->hw->pdev->device >> 4 & 0xf;
+   uint func = vha->hw->port_no & 0x3;
+
+   if (type != cond1 || func != cond2) {
+   struct qla27xx_fwdt_template *tmp = buf;
+
+   tmp->count--;
+   ent = qla27xx_next_entry(ent);
+   qla27xx_skip_entry(ent, buf);
+   }
}
 
return qla27xx_next_entry(ent);
@@ -840,21 +845,21 @@ qla27xx_walk_template(struct scsi_qla_host *vha,
 {
struct qla27xx_fwdt_entry *ent = (void *)tmp +
le32_to_cpu(*qla_fw_addr32(tmp->entry_offset));
-   ulong count = le32_to_cpu(*qla_fw_addr32(tmp->entry_count));
-   ulong type = 0;
+   ulong type;
 
+   tmp->count = le32_to_cpu(*qla_fw_addr32(tmp->entry_count));
ql_dbg(ql_dbg_misc, vha, 0xd01a,
-   "%s: entry count %lx\n", __func__, count);
-   while (count--) {
+   "%s: entry count %u\n", __func__, tmp->count);
+   while (ent && tmp->count--) {
type = le32_to_cpu(*qla_fw_addr32(ent->hdr.type));
ent = qla27xx_find_entry(type)(vha, ent, buf, len);
if (!ent)
break;
}
 
-   if (count)
+   if (tmp->count)
ql_dbg(ql_dbg_misc, vha, 0xd018,
-   "%s: entry count residual=+%lu\n", __func__, count);
+   "%s: entry count residual=+%u\n", __func__, tmp->count);
 
if (ent)
ql_dbg(ql_dbg_misc, vha, 0xd019,
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h
index 5c2c2a8a19c4..030633ee47f8 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.h
+++ b/drivers/scsi/qla2xxx/qla_tmpl.h
@@ -14,7 +14,7 @@ struct __packed qla27xx_fwdt_template {
uint32_t template_type;
uint32_t entry_offset;
uint32_t template_size;
-   uint32_t reserved_1;
+   uint32_t count; /* borrow field for running/residual count */
 
uint32_t entry_count;
uint32_t template_version;
-- 
2.12.0



[PATCH v2 02/14] qla2xxx: Remove FW default template

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch removed FW default template as there will
never be case where the default template would be invoked.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 -
 drivers/scsi/qla2xxx/qla_init.c |  94 +---
 drivers/scsi/qla2xxx/qla_tmpl.c | 104 +---
 3 files changed, 13 insertions(+), 187 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 4eefe69ca807..0fa0342f39f8 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -613,8 +613,6 @@ extern void qla27xx_fwdump(scsi_qla_host_t *, int);
 extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
-extern const void *qla27xx_fwdt_template_default(void);
-extern ulong qla27xx_fwdt_template_default_size(void);
 
 extern void qla2x00_dump_regs(scsi_qla_host_t *);
 extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e64d3d2d3c78..fd168c5e17d2 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7393,7 +7393,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_dbg(ql_dbg_init, vha, 0x0162,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (risc_size - 8) * sizeof(*dcode);
ql_dbg(ql_dbg_init, vha, 0x0163,
@@ -7402,7 +7402,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!ha->fw_dump_template) {
ql_log(ql_log_warn, vha, 0x0164,
"Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto default_template;
+   goto failed;
}
 
faddr += 7;
@@ -7415,7 +7415,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!qla27xx_fwdt_template_valid(dcode)) {
ql_log(ql_log_warn, vha, 0x0165,
"Failed fwdump template validate\n");
-   goto default_template;
+   goto failed;
}
 
dlen = qla27xx_fwdt_template_size(dcode);
@@ -7425,48 +7425,13 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_log(ql_log_warn, vha, 0x0167,
"Failed fwdump template exceeds array by %zx bytes\n",
(size_t)(dlen - risc_size * sizeof(*dcode)));
-   goto default_template;
-   }
-   ha->fw_dump_template_len = dlen;
-   return rval;
-
-default_template:
-   ql_log(ql_log_warn, vha, 0x0168, "Using default fwdump template\n");
-   if (ha->fw_dump_template)
-   vfree(ha->fw_dump_template);
-   ha->fw_dump_template = NULL;
-   ha->fw_dump_template_len = 0;
-
-   dlen = qla27xx_fwdt_template_default_size();
-   ql_dbg(ql_dbg_init, vha, 0x0169,
-   "-> template allocating %x bytes...\n", dlen);
-   ha->fw_dump_template = vmalloc(dlen);
-   if (!ha->fw_dump_template) {
-   ql_log(ql_log_warn, vha, 0x016a,
-   "Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto failed_template;
-   }
-
-   dcode = ha->fw_dump_template;
-   risc_size = dlen / sizeof(*dcode);
-   memcpy(dcode, qla27xx_fwdt_template_default(), dlen);
-   for (i = 0; i < risc_size; i++)
-   dcode[i] = be32_to_cpu(dcode[i]);
-
-   if (!qla27xx_fwdt_template_valid(ha->fw_dump_template)) {
-   ql_log(ql_log_warn, vha, 0x016b,
-   "Failed fwdump template validate\n");
-   goto failed_template;
+   goto failed;
}
-
-   dlen = qla27xx_fwdt_template_size(ha->fw_dump_template);
-   ql_dbg(ql_dbg_init, vha, 0x016c,
-   "-> template size %x bytes\n", dlen);
ha->fw_dump_template_len = dlen;
return rval;
 
-failed_template:
-   ql_log(ql_log_warn, vha, 0x016d, "Failed default fwdump template\n");
+failed:
+   ql_log(ql_log_warn, vha, 0x016d, "Failed fwdump template\n");
if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fw_dump_template = NULL;
@@ -7696,7 +7661,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t 
*srisc_addr)
ql_dbg(ql_dbg_init, vha, 0x172,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (

[PATCH v2 04/14] qla2xxx: Add Device ID for ISP28XX

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds PCI device ID ISP28XX for Gen7 support.
Also signature determination for primary/secondary flash
image for ISP27XX/28XX is aded as part of Gen7 support.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 30 -
 drivers/scsi/qla2xxx/qla_bsg.c| 12 +++---
 drivers/scsi/qla2xxx/qla_dbg.c|  9 ++--
 drivers/scsi/qla2xxx/qla_def.h| 62 +++
 drivers/scsi/qla2xxx/qla_dfs.c|  6 +--
 drivers/scsi/qla2xxx/qla_fw.h |  5 ++-
 drivers/scsi/qla2xxx/qla_gs.c |  4 +-
 drivers/scsi/qla2xxx/qla_init.c   | 51 +-
 drivers/scsi/qla2xxx/qla_iocb.c   |  5 ++-
 drivers/scsi/qla2xxx/qla_isr.c| 14 +++---
 drivers/scsi/qla2xxx/qla_mbx.c| 76 ++---
 drivers/scsi/qla2xxx/qla_os.c | 89 ---
 drivers/scsi/qla2xxx/qla_sup.c| 49 +++--
 drivers/scsi/qla2xxx/qla_target.c |  7 +--
 14 files changed, 272 insertions(+), 147 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 46fcc718337b..76ca7edde960 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -427,7 +427,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct 
kobject *kobj,
valid = 1;
else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
|| IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)
-   || IS_QLA27XX(ha))
+   || IS_QLA27XX(ha) || IS_QLA28XX(ha))
valid = 1;
if (!valid) {
ql_log(ql_log_warn, vha, 0x7065,
@@ -514,7 +514,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (IS_NOCACHE_VPD_TYPE(ha)) {
faddr = ha->flt_region_vpd << 2;
 
-   if (IS_QLA27XX(ha) &&
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
faddr = ha->flt_region_vpd_sec << 2;
 
@@ -682,7 +682,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject 
*kobj,
ql_log(ql_log_info, vha, 0x706f,
"Issuing MPI reset.\n");
 
-   if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
+   if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
uint32_t idc_control;
 
qla83xx_idc_lock(vha, 0);
@@ -991,7 +991,8 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
continue;
if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
-   if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
+   if (iter->is4GBp_only == 0x27 &&
+   (!IS_QLA27XX(vha->hw) || !IS_QLA28XX(ha)))
continue;
 
sysfs_remove_bin_file(&host->shost_gendev.kobj,
@@ -1336,7 +1337,8 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
+   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
@@ -1383,7 +1385,7 @@ qla2x00_mpi_version_show(struct device *dev, struct 
device_attribute *attr,
struct qla_hw_data *ha = vha->hw;
 
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
-   !IS_QLA27XX(ha))
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
@@ -1596,7 +1598,7 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
@@ -1610,7 +1612,7 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnpri

[PATCH v2 00/14] qla2xxx: Add support for ISP28XX (Gen7) adapter

2019-03-08 Thread Himanshu Madhani
Hi Martin, 

This patch series adds support for our next generation ISP28XX (Gen7) adapter.  

Patch 1-3 adds SysFS node and misc cleanup in fw dump routines.
Patch 4-5 adds PCI IDs and serdes support for ISP28XX (Gen7) adapter.
Patch 6-11 cleans up overall firmware dump handling to prepare for new feature.
Patch 12 adds support for Primary/Secondary firmware images in the flash.
Patch 13 adds capability for secure flash update for ISP28XX (Gen7) adapter.

Please consider this series for 5.2/scsi-queue branch at your earliest 
convenience.

Changes from v1 -> v2
o Fixed 0-day kernel warnings for patch #7, #8, #9

Thanks,
Himanshu

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

Joe Carnuccio (12):
  qla2xxx: Add fw_attr and port_no SysFS node
  qla2xxx: Remove FW default template
  qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().
  qla2xxx: Add Device ID for ISP28XX
  qla2xxx: Add Serdes support for ISP28XX
  qla2xxx: Correctly report max/min supported speeds
  qla2xxx: Cleanups for NVRAM/Flash read/write path
  qla2xxx: Add support for multiple fwdump templates/segments
  qla2xxx: Update flash read/write routine
  qla2xxx: Correction and improvement to fwdt processing
  qla2xxx: Simplification of register address used in qla_tmpl.c
  qla2xxx: Add 28xx flash primary/secondary status/image mechanism

Michael Hernandez (1):
  qla2xxx: Secure flash update support for ISP28XX

 drivers/scsi/qla2xxx/qla_attr.c|  274 +++---
 drivers/scsi/qla2xxx/qla_bsg.c |   63 ++-
 drivers/scsi/qla2xxx/qla_bsg.h |   11 +
 drivers/scsi/qla2xxx/qla_dbg.c |  190 ---
 drivers/scsi/qla2xxx/qla_dbg.h |   10 +-
 drivers/scsi/qla2xxx/qla_def.h |  186 +--
 drivers/scsi/qla2xxx/qla_dfs.c |6 +-
 drivers/scsi/qla2xxx/qla_fw.h  |   31 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   91 ++--
 drivers/scsi/qla2xxx/qla_gs.c  |   85 ++-
 drivers/scsi/qla2xxx/qla_init.c| 1027 ++--
 drivers/scsi/qla2xxx/qla_inline.h  |   14 +
 drivers/scsi/qla2xxx/qla_iocb.c|5 +-
 drivers/scsi/qla2xxx/qla_isr.c |   30 +-
 drivers/scsi/qla2xxx/qla_mbx.c |  319 ---
 drivers/scsi/qla2xxx/qla_mr.c  |   46 +-
 drivers/scsi/qla2xxx/qla_nx.c  |   17 +-
 drivers/scsi/qla2xxx/qla_nx2.c |8 +-
 drivers/scsi/qla2xxx/qla_os.c  |  121 -
 drivers/scsi/qla2xxx/qla_sup.c |  970 +++---
 drivers/scsi/qla2xxx/qla_target.c  |7 +-
 drivers/scsi/qla2xxx/qla_tmpl.c|  423 +++
 drivers/scsi/qla2xxx/qla_tmpl.h|2 +-
 drivers/scsi/qla2xxx/qla_version.h |4 +-
 24 files changed, 2489 insertions(+), 1451 deletions(-)

-- 
2.12.0



[PATCH v2 01/14] qla2xxx: Add fw_attr and port_no SysFS node

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new SysFS node to display firmware attributes
and port number

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 30 ++
 1 file changed, 30 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 2eb1ae721a7d..46fcc718337b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2162,6 +2162,32 @@ qla2x00_dif_bundle_statistics_show(struct device *dev,
ha->dif_bundle_dma_allocs, ha->pool.unusable.count);
 }
 
+static ssize_t
+qla2x00_fw_attr_show(struct device *dev,
+struct device_attribute *attr, char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%llx\n",
+   (uint64_t)ha->fw_attributes_ext[1] << 48 |
+   (uint64_t)ha->fw_attributes_ext[0] << 32 |
+   (uint64_t)ha->fw_attributes_h << 16 |
+   (uint64_t)ha->fw_attributes);
+}
+
+static ssize_t
+qla2x00_port_no_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, "%u\n", vha->hw->port_no);
+}
+
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -2219,6 +2245,8 @@ static DEVICE_ATTR(dif_bundle_statistics, 0444,
 qla2x00_dif_bundle_statistics_show, NULL);
 static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
 qla2x00_port_speed_store);
+static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
+static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
 
 
 struct device_attribute *qla2x00_host_attrs[] = {
@@ -2259,6 +2287,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
+   &dev_attr_port_no,
+   &dev_attr_fw_attr,
NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */
-- 
2.12.0



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

2019-03-08 Thread Himanshu Madhani
This version Includes support for ISP28XX

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 0690dac24081..0f8cca27c183 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.14-k"
+#define QLA2XXX_VERSION  "10.01.00.15-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
-#define QLA_DRIVER_MINOR_VER   0
+#define QLA_DRIVER_MINOR_VER   1
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v2 03/14] qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().

2019-03-08 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes qla27xx_dump_{mpi|ram} api for ISP27XX

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c | 166 -
 1 file changed, 81 insertions(+), 85 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ec5bad0b0607 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -111,30 +111,25 @@ int
 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt)
 {
-   int rval;
-   uint32_t cnt, stat, timer, dwords, idx;
-   uint16_t mb0;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
dma_addr_t dump_dma = ha->gid_list_dma;
-   uint32_t *dump = (uint32_t *)ha->gid_list;
+   uint32_t *chunk = (void *)ha->gid_list;
+   uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+   uint32_t stat;
+   ulong i, j, timer = 600;
+   int rval = QLA_FUNCTION_FAILED;
 
-   rval = QLA_SUCCESS;
-   mb0 = 0;
-
-   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+   if (i + dwords > ram_dwords)
+   dwords = ram_dwords - i;
 
-   dwords = qla2x00_gid_list_size(ha) / 4;
-   for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-   cnt += dwords, addr += dwords) {
-   if (cnt + dwords > ram_dwords)
-   dwords = ram_dwords - cnt;
-
+   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
WRT_REG_WORD(®->mailbox1, LSW(addr));
WRT_REG_WORD(®->mailbox8, MSW(addr));
 
-   WRT_REG_WORD(®->mailbox2, MSW(dump_dma));
-   WRT_REG_WORD(®->mailbox3, LSW(dump_dma));
+   WRT_REG_WORD(®->mailbox2, MSW(LSD(dump_dma)));
+   WRT_REG_WORD(®->mailbox3, LSW(LSD(dump_dma)));
WRT_REG_WORD(®->mailbox6, MSW(MSD(dump_dma)));
WRT_REG_WORD(®->mailbox7, LSW(MSD(dump_dma)));
 
@@ -145,76 +140,75 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t 
addr, uint32_t *ram,
WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT);
 
ha->flags.mbox_int = 0;
-   for (timer = 600; timer; timer--) {
-   /* Check for pending interrupts. */
-   stat = RD_REG_DWORD(®->host_status);
-   if (stat & HSRX_RISC_INT) {
-   stat &= 0xff;
-
-   if (stat == 0x1 || stat == 0x2 ||
-   stat == 0x10 || stat == 0x11) {
-   set_bit(MBX_INTERRUPT,
-   &ha->mbx_cmd_flags);
+   while (timer--) {
+   udelay(5);
 
-   mb0 = RD_REG_WORD(®->mailbox0);
-   RD_REG_WORD(®->mailbox1);
+   stat = RD_REG_DWORD(®->host_status);
+   /* Check for pending interrupts. */
+   if (!(stat & HSRX_RISC_INT))
+   continue;
 
-   WRT_REG_DWORD(®->hccr,
-   HCCRX_CLR_RISC_INT);
-   RD_REG_DWORD(®->hccr);
-   break;
-   }
+   stat &= 0xff;
+   if (stat != 0x1 && stat != 0x2 &&
+   stat != 0x10 && stat != 0x11) {
 
/* Clear this intr; it wasn't a mailbox intr */
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
RD_REG_DWORD(®->hccr);
+   continue;
}
-   udelay(5);
+
+   set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   rval = RD_REG_WORD(®->mailbox0) & MBS_MASK;
+   WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
+   RD_REG_DWORD(®->hccr);
+   break;
}
ha->flags.mbox_int = 1;
+   *nxt = ram + i;
 
-   if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-   rval = mb0 & MBS_MASK;
-   for (idx = 0; idx < dwords; idx++)
-   ram[cnt + idx] = IS_QLA27XX(ha) ?
-   le32_to_cpu(dump[idx]) : swab32(d

[PATCH v3 00/14] qla2xxx: Add support for ISP28XX (Gen7) adapter

2019-03-11 Thread Himanshu Madhani
Hi Martin, 

This patch series adds support for our next generation ISP28XX (Gen7) adapter.  

Patch 1-3 adds SysFS node and misc cleanup in fw dump routines.
Patch 4-5 adds PCI IDs and serdes support for ISP28XX (Gen7) adapter.
Patch 6-11 cleans up overall firmware dump handling to prepare for new feature.
Patch 12 adds support for Primary/Secondary firmware images in the flash.
Patch 13 adds capability for secure flash update for ISP28XX (Gen7) adapter.

Please consider this series for 5.2/scsi-queue branch at your earliest 
convenience.

Changes from v2 -> v3
o Fixed more 0-day kernel warnings for patch #7 and #8.

Changes from v1 -> v2
o Fixed 0-day kernel warnings for patch #7, #8, #9.

Thanks,
Himanshu

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

Joe Carnuccio (12):
  qla2xxx: Add fw_attr and port_no SysFS node
  qla2xxx: Remove FW default template
  qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().
  qla2xxx: Add Device ID for ISP28XX
  qla2xxx: Add Serdes support for ISP28XX
  qla2xxx: Correctly report max/min supported speeds
  qla2xxx: Cleanups for NVRAM/Flash read/write path
  qla2xxx: Add support for multiple fwdump templates/segments
  qla2xxx: Update flash read/write routine
  qla2xxx: Correction and improvement to fwdt processing
  qla2xxx: Simplification of register address used in qla_tmpl.c
  qla2xxx: Add 28xx flash primary/secondary status/image mechanism

Michael Hernandez (1):
  qla2xxx: Secure flash update support for ISP28XX

 drivers/scsi/qla2xxx/qla_attr.c|  274 +++---
 drivers/scsi/qla2xxx/qla_bsg.c |   63 ++-
 drivers/scsi/qla2xxx/qla_bsg.h |   11 +
 drivers/scsi/qla2xxx/qla_dbg.c |  190 ---
 drivers/scsi/qla2xxx/qla_dbg.h |   10 +-
 drivers/scsi/qla2xxx/qla_def.h |  186 +--
 drivers/scsi/qla2xxx/qla_dfs.c |6 +-
 drivers/scsi/qla2xxx/qla_fw.h  |   31 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   91 ++--
 drivers/scsi/qla2xxx/qla_gs.c  |   85 ++-
 drivers/scsi/qla2xxx/qla_init.c| 1029 ++--
 drivers/scsi/qla2xxx/qla_iocb.c|5 +-
 drivers/scsi/qla2xxx/qla_isr.c |   30 +-
 drivers/scsi/qla2xxx/qla_mbx.c |  319 ---
 drivers/scsi/qla2xxx/qla_mr.c  |   46 +-
 drivers/scsi/qla2xxx/qla_nx.c  |   17 +-
 drivers/scsi/qla2xxx/qla_nx2.c |8 +-
 drivers/scsi/qla2xxx/qla_os.c  |  121 -
 drivers/scsi/qla2xxx/qla_sup.c |  970 ++---
 drivers/scsi/qla2xxx/qla_target.c  |7 +-
 drivers/scsi/qla2xxx/qla_tmpl.c|  429 +++
 drivers/scsi/qla2xxx/qla_tmpl.h|   70 +--
 drivers/scsi/qla2xxx/qla_version.h |4 +-
 23 files changed, 2514 insertions(+), 1488 deletions(-)

-- 
2.12.0



[PATCH v3 02/14] qla2xxx: Remove FW default template

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch removed FW default template as there will
never be case where the default template would be invoked.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 -
 drivers/scsi/qla2xxx/qla_init.c |  94 +---
 drivers/scsi/qla2xxx/qla_tmpl.c | 104 +---
 3 files changed, 13 insertions(+), 187 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 4eefe69ca807..0fa0342f39f8 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -613,8 +613,6 @@ extern void qla27xx_fwdump(scsi_qla_host_t *, int);
 extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
-extern const void *qla27xx_fwdt_template_default(void);
-extern ulong qla27xx_fwdt_template_default_size(void);
 
 extern void qla2x00_dump_regs(scsi_qla_host_t *);
 extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e64d3d2d3c78..fd168c5e17d2 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7393,7 +7393,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_dbg(ql_dbg_init, vha, 0x0162,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (risc_size - 8) * sizeof(*dcode);
ql_dbg(ql_dbg_init, vha, 0x0163,
@@ -7402,7 +7402,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!ha->fw_dump_template) {
ql_log(ql_log_warn, vha, 0x0164,
"Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto default_template;
+   goto failed;
}
 
faddr += 7;
@@ -7415,7 +7415,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!qla27xx_fwdt_template_valid(dcode)) {
ql_log(ql_log_warn, vha, 0x0165,
"Failed fwdump template validate\n");
-   goto default_template;
+   goto failed;
}
 
dlen = qla27xx_fwdt_template_size(dcode);
@@ -7425,48 +7425,13 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_log(ql_log_warn, vha, 0x0167,
"Failed fwdump template exceeds array by %zx bytes\n",
(size_t)(dlen - risc_size * sizeof(*dcode)));
-   goto default_template;
-   }
-   ha->fw_dump_template_len = dlen;
-   return rval;
-
-default_template:
-   ql_log(ql_log_warn, vha, 0x0168, "Using default fwdump template\n");
-   if (ha->fw_dump_template)
-   vfree(ha->fw_dump_template);
-   ha->fw_dump_template = NULL;
-   ha->fw_dump_template_len = 0;
-
-   dlen = qla27xx_fwdt_template_default_size();
-   ql_dbg(ql_dbg_init, vha, 0x0169,
-   "-> template allocating %x bytes...\n", dlen);
-   ha->fw_dump_template = vmalloc(dlen);
-   if (!ha->fw_dump_template) {
-   ql_log(ql_log_warn, vha, 0x016a,
-   "Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto failed_template;
-   }
-
-   dcode = ha->fw_dump_template;
-   risc_size = dlen / sizeof(*dcode);
-   memcpy(dcode, qla27xx_fwdt_template_default(), dlen);
-   for (i = 0; i < risc_size; i++)
-   dcode[i] = be32_to_cpu(dcode[i]);
-
-   if (!qla27xx_fwdt_template_valid(ha->fw_dump_template)) {
-   ql_log(ql_log_warn, vha, 0x016b,
-   "Failed fwdump template validate\n");
-   goto failed_template;
+   goto failed;
}
-
-   dlen = qla27xx_fwdt_template_size(ha->fw_dump_template);
-   ql_dbg(ql_dbg_init, vha, 0x016c,
-   "-> template size %x bytes\n", dlen);
ha->fw_dump_template_len = dlen;
return rval;
 
-failed_template:
-   ql_log(ql_log_warn, vha, 0x016d, "Failed default fwdump template\n");
+failed:
+   ql_log(ql_log_warn, vha, 0x016d, "Failed fwdump template\n");
if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fw_dump_template = NULL;
@@ -7696,7 +7661,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t 
*srisc_addr)
ql_dbg(ql_dbg_init, vha, 0x172,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (

[PATCH v3 03/14] qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes qla27xx_dump_{mpi|ram} api for ISP27XX

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c | 166 -
 1 file changed, 81 insertions(+), 85 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ec5bad0b0607 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -111,30 +111,25 @@ int
 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt)
 {
-   int rval;
-   uint32_t cnt, stat, timer, dwords, idx;
-   uint16_t mb0;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
dma_addr_t dump_dma = ha->gid_list_dma;
-   uint32_t *dump = (uint32_t *)ha->gid_list;
+   uint32_t *chunk = (void *)ha->gid_list;
+   uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+   uint32_t stat;
+   ulong i, j, timer = 600;
+   int rval = QLA_FUNCTION_FAILED;
 
-   rval = QLA_SUCCESS;
-   mb0 = 0;
-
-   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+   if (i + dwords > ram_dwords)
+   dwords = ram_dwords - i;
 
-   dwords = qla2x00_gid_list_size(ha) / 4;
-   for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-   cnt += dwords, addr += dwords) {
-   if (cnt + dwords > ram_dwords)
-   dwords = ram_dwords - cnt;
-
+   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
WRT_REG_WORD(®->mailbox1, LSW(addr));
WRT_REG_WORD(®->mailbox8, MSW(addr));
 
-   WRT_REG_WORD(®->mailbox2, MSW(dump_dma));
-   WRT_REG_WORD(®->mailbox3, LSW(dump_dma));
+   WRT_REG_WORD(®->mailbox2, MSW(LSD(dump_dma)));
+   WRT_REG_WORD(®->mailbox3, LSW(LSD(dump_dma)));
WRT_REG_WORD(®->mailbox6, MSW(MSD(dump_dma)));
WRT_REG_WORD(®->mailbox7, LSW(MSD(dump_dma)));
 
@@ -145,76 +140,75 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t 
addr, uint32_t *ram,
WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT);
 
ha->flags.mbox_int = 0;
-   for (timer = 600; timer; timer--) {
-   /* Check for pending interrupts. */
-   stat = RD_REG_DWORD(®->host_status);
-   if (stat & HSRX_RISC_INT) {
-   stat &= 0xff;
-
-   if (stat == 0x1 || stat == 0x2 ||
-   stat == 0x10 || stat == 0x11) {
-   set_bit(MBX_INTERRUPT,
-   &ha->mbx_cmd_flags);
+   while (timer--) {
+   udelay(5);
 
-   mb0 = RD_REG_WORD(®->mailbox0);
-   RD_REG_WORD(®->mailbox1);
+   stat = RD_REG_DWORD(®->host_status);
+   /* Check for pending interrupts. */
+   if (!(stat & HSRX_RISC_INT))
+   continue;
 
-   WRT_REG_DWORD(®->hccr,
-   HCCRX_CLR_RISC_INT);
-   RD_REG_DWORD(®->hccr);
-   break;
-   }
+   stat &= 0xff;
+   if (stat != 0x1 && stat != 0x2 &&
+   stat != 0x10 && stat != 0x11) {
 
/* Clear this intr; it wasn't a mailbox intr */
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
RD_REG_DWORD(®->hccr);
+   continue;
}
-   udelay(5);
+
+   set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   rval = RD_REG_WORD(®->mailbox0) & MBS_MASK;
+   WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
+   RD_REG_DWORD(®->hccr);
+   break;
}
ha->flags.mbox_int = 1;
+   *nxt = ram + i;
 
-   if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-   rval = mb0 & MBS_MASK;
-   for (idx = 0; idx < dwords; idx++)
-   ram[cnt + idx] = IS_QLA27XX(ha) ?
-   le32_to_cpu(dump[idx]) : swab32(d

[PATCH v3 05/14] qla2xxx: Add Serdes support for ISP28XX

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds SysFS node for serdes_version
and also cleans up port_speed display.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 43 +--
 drivers/scsi/qla2xxx/qla_def.h  |  4 ++-
 drivers/scsi/qla2xxx/qla_gs.c   | 77 -
 drivers/scsi/qla2xxx/qla_isr.c  |  4 ++-
 drivers/scsi/qla2xxx/qla_mbx.c  | 25 +++--
 5 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 76ca7edde960..833b082a7944 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1378,6 +1378,21 @@ qla24xx_84xx_fw_version_show(struct device *dev,
 }
 
 static ssize_t
+qla2x00_serdes_version_show(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
+   ha->serdes_version[0], ha->serdes_version[1],
+   ha->serdes_version[2]);
+}
+
+static ssize_t
 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
 char *buf)
 {
@@ -2218,6 +2233,7 @@ static DEVICE_ATTR(84xx_fw_version, S_IRUGO, 
qla24xx_84xx_fw_version_show,
   NULL);
 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
   NULL);
+static DEVICE_ATTR(serdes_version, 0444, qla2x00_serdes_version_show, NULL);
 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
@@ -2270,6 +2286,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_optrom_fw_version,
&dev_attr_84xx_fw_version,
&dev_attr_total_isp_aborts,
+   &dev_attr_serdes_version,
&dev_attr_mpi_version,
&dev_attr_phy_version,
&dev_attr_flash_block_size,
@@ -2326,16 +2343,15 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost)
 static void
 qla2x00_get_host_speed(struct Scsi_Host *shost)
 {
-   struct qla_hw_data *ha = ((struct scsi_qla_host *)
-   (shost_priv(shost)))->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   scsi_qla_host_t *vha = shost_priv(shost);
+   u32 speed;
 
-   if (IS_QLAFX00(ha)) {
+   if (IS_QLAFX00(vha->hw)) {
qlafx00_get_host_speed(shost);
return;
}
 
-   switch (ha->link_data_rate) {
+   switch (vha->hw->link_data_rate) {
case PORT_SPEED_1GB:
speed = FC_PORTSPEED_1GBIT;
break;
@@ -2360,7 +2376,11 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
case PORT_SPEED_64GB:
speed = FC_PORTSPEED_64GBIT;
break;
+   default:
+   speed = FC_PORTSPEED_UNKNOWN;
+   break;
}
+
fc_host_speed(shost) = speed;
 }
 
@@ -2368,7 +2388,7 @@ static void
 qla2x00_get_host_port_type(struct Scsi_Host *shost)
 {
scsi_qla_host_t *vha = shost_priv(shost);
-   uint32_t port_type = FC_PORTTYPE_UNKNOWN;
+   uint32_t port_type;
 
if (vha->vp_idx) {
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
@@ -2387,7 +2407,11 @@ qla2x00_get_host_port_type(struct Scsi_Host *shost)
case ISP_CFG_F:
port_type = FC_PORTTYPE_NPORT;
break;
+   default:
+   port_type = FC_PORTTYPE_UNKNOWN;
+   break;
}
+
fc_host_port_type(shost) = port_type;
 }
 
@@ -2449,13 +2473,10 @@ qla2x00_get_starget_port_id(struct scsi_target *starget)
fc_starget_port_id(starget) = port_id;
 }
 
-static void
+static inline void
 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
 {
-   if (timeout)
-   rport->dev_loss_tmo = timeout;
-   else
-   rport->dev_loss_tmo = 1;
+   rport->dev_loss_tmo = timeout ? timeout : 1;
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c64cd555ef0d..a4661306cc34 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4023,6 +4023,7 @@ struct qla_hw_data {
uint8_t fw_seriallink_options[4];
uint16_tfw_seriallink_options24[4];
 
+   uint8_t serdes_version[3];
uint8_t mpi_version[3];
uint32_tmpi_capabilities;
uint8_t phy_version[3];
@@ -4034,7 +4035,8 @@ struct qla_hw_data {
/* Firmware dump information. */
struct q

[PATCH v3 06/14] qla2xxx: Correctly report max/min supported speeds

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes reported speed for min_link and max_supported
speed. Also rename SysFS nodes link_speed and max_supported to
be consistent with {min|max}_suuported_speed.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 94 +
 drivers/scsi/qla2xxx/qla_def.h  |  7 +--
 drivers/scsi/qla2xxx/qla_fw.h   |  2 +-
 drivers/scsi/qla2xxx/qla_mbx.c  | 65 +++-
 4 files changed, 98 insertions(+), 70 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 833b082a7944..3adbb2c1a806 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1621,8 +1621,8 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
 }
 
 static ssize_t
-qla2x00_min_link_speed_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_min_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1631,16 +1631,17 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->min_link_speed == 5 ? "32Gps" :
-   ha->min_link_speed == 4 ? "16Gps" :
-   ha->min_link_speed == 3 ? "8Gps" :
-   ha->min_link_speed == 2 ? "4Gps" :
-   ha->min_link_speed != 0 ? "unknown" : "");
+   ha->min_supported_speed == 6 ? "64Gps" :
+   ha->min_supported_speed == 5 ? "32Gps" :
+   ha->min_supported_speed == 4 ? "16Gps" :
+   ha->min_supported_speed == 3 ? "8Gps" :
+   ha->min_supported_speed == 2 ? "4Gps" :
+   ha->min_supported_speed != 0 ? "unknown" : "");
 }
 
 static ssize_t
-qla2x00_max_speed_sup_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_max_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1649,7 +1650,9 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->max_speed_sup ? "32Gps" : "16Gps");
+   ha->max_supported_speed  == 2 ? "64Gps" :
+   ha->max_supported_speed  == 1 ? "32Gps" :
+   ha->max_supported_speed  == 0 ? "16Gps" : "unknown");
 }
 
 static ssize_t
@@ -2251,8 +2254,10 @@ static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
   qla2x00_allow_cna_fw_dump_show,
   qla2x00_allow_cna_fw_dump_store);
 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(min_supported_speed, 0444,
+  qla2x00_min_supported_speed_show, NULL);
+static DEVICE_ATTR(max_supported_speed, 0444,
+  qla2x00_max_supported_speed_show, NULL);
 static DEVICE_ATTR(zio_threshold, 0644,
 qla_zio_threshold_show,
 qla_zio_threshold_store);
@@ -2301,8 +2306,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_fw_dump_size,
&dev_attr_allow_cna_fw_dump,
&dev_attr_pep_version,
-   &dev_attr_min_link_speed,
-   &dev_attr_max_speed_sup,
+   &dev_attr_min_supported_speed,
+   &dev_attr_max_supported_speed,
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
@@ -3031,7 +3036,7 @@ void
 qla2x00_init_host_attr(scsi_qla_host_t *vha)
 {
struct qla_hw_data *ha = vha->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   u32 speeds = FC_PORTSPEED_UNKNOWN;
 
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@@ -3042,28 +3047,45 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
 
if (IS_CNA_CAPABLE(ha))
-   speed = FC_PORTSPEED_10GBIT;
-   else if (IS_QLA2031(ha))
-   speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT |
-   FC_PORTSPEED_4GBIT;
-   else if (IS_QLA25

[PATCH v3 04/14] qla2xxx: Add Device ID for ISP28XX

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds PCI device ID ISP28XX for Gen7 support.
Also signature determination for primary/secondary flash
image for ISP27XX/28XX is aded as part of Gen7 support.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 30 -
 drivers/scsi/qla2xxx/qla_bsg.c| 12 +++---
 drivers/scsi/qla2xxx/qla_dbg.c|  9 ++--
 drivers/scsi/qla2xxx/qla_def.h| 62 +++
 drivers/scsi/qla2xxx/qla_dfs.c|  6 +--
 drivers/scsi/qla2xxx/qla_fw.h |  5 ++-
 drivers/scsi/qla2xxx/qla_gs.c |  4 +-
 drivers/scsi/qla2xxx/qla_init.c   | 51 +-
 drivers/scsi/qla2xxx/qla_iocb.c   |  5 ++-
 drivers/scsi/qla2xxx/qla_isr.c| 14 +++---
 drivers/scsi/qla2xxx/qla_mbx.c| 76 ++---
 drivers/scsi/qla2xxx/qla_os.c | 89 ---
 drivers/scsi/qla2xxx/qla_sup.c| 49 +++--
 drivers/scsi/qla2xxx/qla_target.c |  7 +--
 14 files changed, 272 insertions(+), 147 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 46fcc718337b..76ca7edde960 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -427,7 +427,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct 
kobject *kobj,
valid = 1;
else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
|| IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)
-   || IS_QLA27XX(ha))
+   || IS_QLA27XX(ha) || IS_QLA28XX(ha))
valid = 1;
if (!valid) {
ql_log(ql_log_warn, vha, 0x7065,
@@ -514,7 +514,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (IS_NOCACHE_VPD_TYPE(ha)) {
faddr = ha->flt_region_vpd << 2;
 
-   if (IS_QLA27XX(ha) &&
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
faddr = ha->flt_region_vpd_sec << 2;
 
@@ -682,7 +682,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject 
*kobj,
ql_log(ql_log_info, vha, 0x706f,
"Issuing MPI reset.\n");
 
-   if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
+   if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
uint32_t idc_control;
 
qla83xx_idc_lock(vha, 0);
@@ -991,7 +991,8 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
continue;
if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
-   if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
+   if (iter->is4GBp_only == 0x27 &&
+   (!IS_QLA27XX(vha->hw) || !IS_QLA28XX(ha)))
continue;
 
sysfs_remove_bin_file(&host->shost_gendev.kobj,
@@ -1336,7 +1337,8 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
+   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
@@ -1383,7 +1385,7 @@ qla2x00_mpi_version_show(struct device *dev, struct 
device_attribute *attr,
struct qla_hw_data *ha = vha->hw;
 
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
-   !IS_QLA27XX(ha))
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
@@ -1596,7 +1598,7 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
@@ -1610,7 +1612,7 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnpri

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

2019-03-11 Thread Himanshu Madhani
This version Includes support for ISP28XX

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 0690dac24081..0f8cca27c183 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.14-k"
+#define QLA2XXX_VERSION  "10.01.00.15-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
-#define QLA_DRIVER_MINOR_VER   0
+#define QLA_DRIVER_MINOR_VER   1
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v3 09/14] qla2xxx: Update flash read/write routine

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch made following changes to flash access routines
- updated return type for read_optrom
- use void instead of uint32_t * for buffer parameter in read
  and write optrom routines
- Fix flash/nvram addressing.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  65 +++---
 drivers/scsi/qla2xxx/qla_def.h  |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  47 ++---
 drivers/scsi/qla2xxx/qla_init.c |  24 +--
 drivers/scsi/qla2xxx/qla_nx.c   |  13 +-
 drivers/scsi/qla2xxx/qla_nx2.c  |   8 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 443 +++-
 7 files changed, 296 insertions(+), 312 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 3adbb2c1a806..68a52173ed66 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -223,9 +223,9 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
+   ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
+   count);
mutex_unlock(&ha->optrom_mutex);
 
ql_dbg(ql_dbg_user, vha, 0x7060,
@@ -511,22 +511,24 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN))
return -EINVAL;
 
-   if (IS_NOCACHE_VPD_TYPE(ha)) {
-   faddr = ha->flt_region_vpd << 2;
+   if (IS_NOCACHE_VPD_TYPE(ha))
+   goto skip;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   faddr = ha->flt_region_vpd << 2;
 
-   mutex_lock(&ha->optrom_mutex);
-   if (qla2x00_chip_is_down(vha)) {
-   mutex_unlock(&ha->optrom_mutex);
-   return -EAGAIN;
-   }
-   ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
-   ha->vpd_size);
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
+   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   mutex_lock(&ha->optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
mutex_unlock(&ha->optrom_mutex);
+   return -EAGAIN;
}
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
+   mutex_unlock(&ha->optrom_mutex);
+skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
 
@@ -563,8 +565,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
+   ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
 
/* Update flash version information for 4Gb & above. */
if (!IS_FWI2_CAPABLE(ha)) {
@@ -934,7 +936,7 @@ static struct bin_attribute sysfs_dcbx_tlv_attr = {
 static struct sysfs_entry {
char *name;
struct bin_attribute *attr;
-   int is4GBp_only;
+   int type;
 } bin_file_entries[] = {
{ "fw_dump", &sysfs_fw_dump_attr, },
{ "nvram", &sysfs_nvram_attr, },
@@ -957,11 +959,11 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
int ret;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
+   if (iter->type && !IS_FWI2_CAPABLE(vha->hw))
continue;
-   if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
+   if (iter->type == 2 && !IS_QLA25XX(vha->hw))
continue;
-   if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
+   if (iter->type == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
 
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
@@ -985,14 +987,14 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
struct qla_hw_data *ha = vha->hw;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha

[PATCH v3 12/14] qla2xxx: Add 28xx flash primary/secondary status/image mechanism

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

Includes the following:
- correction to 27xx image status struct;
- factoring of 27xx image status validating routines to make common;
- image status generation compare that works across zero wrap;
- bsg interface to report current active images (as loaded by driver).

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  34 -
 drivers/scsi/qla2xxx/qla_bsg.c  |  42 +
 drivers/scsi/qla2xxx/qla_bsg.h  |  11 ++
 drivers/scsi/qla2xxx/qla_def.h  |  63 +---
 drivers/scsi/qla2xxx/qla_fw.h   |  12 ++
 drivers/scsi/qla2xxx/qla_gbl.h  |   6 +-
 drivers/scsi/qla2xxx/qla_init.c | 328 +---
 drivers/scsi/qla2xxx/qla_sup.c  |  71 +++--
 8 files changed, 470 insertions(+), 97 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 68a52173ed66..a69479956c5c 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -154,6 +154,8 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject 
*kobj,
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
+   uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (!capable(CAP_SYS_ADMIN))
return 0;
@@ -164,11 +166,21 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct 
kobject *kobj,
return -EAGAIN;
}
 
-   if (IS_NOCACHE_VPD_TYPE(ha))
-   ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram 
<< 2,
-   ha->nvram_size);
+   if (!IS_NOCACHE_VPD_TYPE(ha)) {
+   mutex_unlock(&ha->optrom_mutex);
+   goto skip;
+   }
+
+   faddr = ha->flt_region_nvram;
+   if (IS_QLA28XX(ha)) {
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_nvram_sec;
+   }
+   ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
+
mutex_unlock(&ha->optrom_mutex);
 
+skip:
return memory_read_from_buffer(buf, count, &off, ha->nvram,
ha->nvram_size);
 }
@@ -504,6 +516,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (unlikely(pci_channel_offline(ha->pdev)))
return -EAGAIN;
@@ -516,9 +529,16 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
faddr = ha->flt_region_vpd << 2;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   if (IS_QLA28XX(ha)) {
+   qla28xx_get_aux_images(vha, &active_regions);
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   ql_dbg(ql_dbg_init, vha, 0x7070,
+   "Loading %s nvram image.\n",
+   active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
+   "primary" : "secondary");
+   }
 
mutex_lock(&ha->optrom_mutex);
if (qla2x00_chip_is_down(vha)) {
@@ -528,6 +548,8 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
mutex_unlock(&ha->optrom_mutex);
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
 skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 4c294bcd100a..95b0ec3c2d40 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2389,6 +2389,45 @@ qla2x00_do_dport_diagnostics(struct bsg_job *bsg_job)
 }
 
 static int
+qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
+{
+   scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
+   struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+   struct qla_hw_data *ha = vha->hw;
+   struct qla_active_regions regions = { };
+   struct active_regions active_regions = { };
+
+   qla28xx_get_aux_images(vha, &active_regions);
+   regions.global_image = active_regions.global;
+
+   if (IS_QLA28XX(ha)) {
+   qla27xx_get_active_image(vha, &active_regions);
+   regions.board_config = active_regions.aux.board_config;
+   regions.vpd_nvram = active_regions.aux.v

[PATCH v3 10/14] qla2xxx: Correction and improvement to fwdt processing

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch cleans up and fixes firmware dump template
processing. These changes are added to support newer
features for ISP27XX/ISP28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 43 +++--
 drivers/scsi/qla2xxx/qla_tmpl.h |  2 +-
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 428d94614a23..4bc958f5bda3 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -99,9 +99,9 @@ static inline void
 qla27xx_write_reg(__iomem struct device_reg_24xx *reg,
uint offset, uint32_t data, void *buf)
 {
-   __iomem void *window = (void __iomem *)reg + offset;
-
if (buf) {
+   void __iomem *window = (void __iomem *)reg + offset;
+
WRT_REG_DWORD(window, data);
}
 }
@@ -709,10 +709,10 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
goto done;
}
if (offset + length > size) {
+   length = size - offset;
ql_dbg(ql_dbg_misc, vha, 0xd030,
-   "%s: buffer overflow\n", __func__);
-   qla27xx_skip_entry(ent, buf);
-   goto done;
+   "%s: buffer overflow, truncate [%lx]\n", __func__, length);
+   ent->t275.length = length;
}
 
qla27xx_insertbuf(buffer, length, buf, len);
@@ -724,17 +724,22 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha,
 struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   ulong cond1 = le32_to_cpu(ent->t276.cond1);
-   ulong cond2 = le32_to_cpu(ent->t276.cond2);
-   uint type = vha->hw->pdev->device >> 4 & 0xf;
-   uint func = vha->hw->port_no & 0x3;
-
ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd214,
"%s: cond [%lx]\n", __func__, *len);
 
-   if (type != cond1 || func != cond2) {
-   ent = qla27xx_next_entry(ent);
-   qla27xx_skip_entry(ent, buf);
+   if (buf) {
+   ulong cond1 = le32_to_cpu(ent->t276.cond1);
+   ulong cond2 = le32_to_cpu(ent->t276.cond2);
+   uint type = vha->hw->pdev->device >> 4 & 0xf;
+   uint func = vha->hw->port_no & 0x3;
+
+   if (type != cond1 || func != cond2) {
+   struct qla27xx_fwdt_template *tmp = buf;
+
+   tmp->count--;
+   ent = qla27xx_next_entry(ent);
+   qla27xx_skip_entry(ent, buf);
+   }
}
 
return qla27xx_next_entry(ent);
@@ -840,21 +845,21 @@ qla27xx_walk_template(struct scsi_qla_host *vha,
 {
struct qla27xx_fwdt_entry *ent = (void *)tmp +
le32_to_cpu(tmp->entry_offset);
-   ulong count = le32_to_cpu(tmp->entry_count);
-   ulong type = 0;
+   ulong type;
 
+   tmp->count = le32_to_cpu(tmp->entry_count);
ql_dbg(ql_dbg_misc, vha, 0xd01a,
-   "%s: entry count %lx\n", __func__, count);
-   while (count--) {
+   "%s: entry count %u\n", __func__, tmp->count);
+   while (ent && tmp->count--) {
type = le32_to_cpu(ent->hdr.type);
ent = qla27xx_find_entry(type)(vha, ent, buf, len);
if (!ent)
break;
}
 
-   if (count)
+   if (tmp->count)
ql_dbg(ql_dbg_misc, vha, 0xd018,
-   "%s: entry count residual=+%lu\n", __func__, count);
+   "%s: entry count residual=+%u\n", __func__, tmp->count);
 
if (ent)
ql_dbg(ql_dbg_misc, vha, 0xd019,
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h
index c8360812660c..5c72293cffeb 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.h
+++ b/drivers/scsi/qla2xxx/qla_tmpl.h
@@ -14,7 +14,7 @@ struct __packed qla27xx_fwdt_template {
__le32 template_type;
__le32 entry_offset;
uint32_t template_size;
-   uint32_t reserved_1;
+   uint32_t count; /* borrow field for running/residual count */
 
__le32 entry_count;
uint32_t template_version;
-- 
2.12.0



[PATCH v3 13/14] qla2xxx: Secure flash update support for ISP28XX

2019-03-11 Thread Himanshu Madhani
From: Michael Hernandez 

This patch adds support for Secure flash update with ISP28xx

Signed-off-by: Michael Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  31 +++-
 drivers/scsi/qla2xxx/qla_fw.h   |   8 +
 drivers/scsi/qla2xxx/qla_gbl.h  |  22 ++-
 drivers/scsi/qla2xxx/qla_init.c |  47 -
 drivers/scsi/qla2xxx/qla_mbx.c  | 141 +++
 drivers/scsi/qla2xxx/qla_mr.c   |   7 +-
 drivers/scsi/qla2xxx/qla_nx.c   |   4 +-
 drivers/scsi/qla2xxx/qla_os.c   |  18 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 386 +---
 9 files changed, 615 insertions(+), 49 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 574797ac7f92..2ec878afa18d 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -1033,6 +1033,7 @@ struct mbx_cmd_32 {
 #define MBC_GET_FIRMWARE_VERSION   8   /* Get firmware revision. */
 #define MBC_LOAD_RISC_RAM  9   /* Load RAM command. */
 #define MBC_DUMP_RISC_RAM  0xa /* Dump RAM command. */
+#define MBC_SECURE_FLASH_UPDATE0xa /* Secure Flash 
Update(28xx) */
 #define MBC_LOAD_RISC_RAM_EXTENDED 0xb /* Load RAM extended. */
 #define MBC_DUMP_RISC_RAM_EXTENDED 0xc /* Dump RAM extended. */
 #define MBC_WRITE_RAM_WORD_EXTENDED0xd /* Write RAM word extended */
@@ -3135,10 +3136,10 @@ struct rsp_que;
 struct isp_operations {
 
int (*pci_config) (struct scsi_qla_host *);
-   void (*reset_chip) (struct scsi_qla_host *);
+   int (*reset_chip)(struct scsi_qla_host *);
int (*chip_diag) (struct scsi_qla_host *);
void (*config_rings) (struct scsi_qla_host *);
-   void (*reset_adapter) (struct scsi_qla_host *);
+   int (*reset_adapter)(struct scsi_qla_host *);
int (*nvram_config) (struct scsi_qla_host *);
void (*update_fw_options) (struct scsi_qla_host *);
int (*load_risc) (struct scsi_qla_host *, uint32_t *);
@@ -3627,6 +3628,8 @@ struct qla_hw_data {
uint32_trida_fmt2:1;
uint32_tpurge_mbox:1;
uint32_tn2n_bigger:1;
+   uint32_tsecure_adapter:1;
+   uint32_tsecure_fw:1;
} flags;
 
uint16_t max_exchg;
@@ -3915,6 +3918,9 @@ struct qla_hw_data {
void*sfp_data;
dma_addr_t  sfp_data_dma;
 
+   void*flt;
+   dma_addr_t  flt_dma;
+
 #define XGMAC_DATA_SIZE4096
void*xgmac_data;
dma_addr_t  xgmac_data_dma;
@@ -4362,6 +4368,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define ISP_ABORT_TO_ROM   33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4549,6 +4556,24 @@ struct qla2_sgx {
}   \
 }
 
+
+#define SFUB_CHECKSUM_SIZE 4
+
+struct secure_flash_update_block {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+};
+
+struct secure_flash_update_block_pk {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+   uint32_tpublic_key[0x41];
+};
+
 /*
  * Macros to help code, maintain, etc.
  */
@@ -4749,6 +4774,8 @@ struct sff_8247_a0 {
IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \
 IS_QLA28XX(_vha->hw)))
 
+#define FLASH_SEMAPHORE_REGISTER_ADDR   0x00101016
+
 #define USER_CTRL_IRQ(_ha) (ql2xuctrlirq && QLA_TGT_MODE_ENABLED() && \
(IS_QLA27XX(_ha) || IS_QLA28XX(_ha) || IS_QLA83XX(_ha)))
 
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index 9dbd0dce5a29..d53cd7875a85 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -1536,6 +1536,10 @@ struct qla_flt_region {
uint32_t end;
 };
 
+#define FLT_REGION_SIZE16
+#define FLT_MAX_REGIONS0xFF
+#define FLT_REGIONS_SIZE   (FLT_REGION_SIZE * FLT_MAX_REGIONS)
+
 /* Flash NPIV Configuration Table /
 
 struct qla_npiv_header {
@@ -1725,6 +1729,10 @@ struct access_chip_rsp_84xx {
 #define LR_DIST_FW_SHIFT   (LR_DIST_FW_POS - LR_DIST_NV_POS)
 #define LR_DIST_FW_FIELD(x)((x) << LR_DIST_FW_SHIFT & 0xf000)
 
+/* FAC semaphore defines */
+#define FAC_SEMAPHORE_UNLOCK0
+#define FAC_SEMAPHORE_LOCK  1
+
 struct nvram_81xx {
/* NVRAM header. */
uint8_t id[4];
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index d5c27ffb5f41..979f0156c99e 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drive

[PATCH v3 08/14] qla2xxx: Add support for multiple fwdump templates/segments

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds multipe firmware dump template and segments
support for ISP27XX/28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   3 +-
 drivers/scsi/qla2xxx/qla_def.h  |   9 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 +-
 drivers/scsi/qla2xxx/qla_init.c | 408 +++-
 drivers/scsi/qla2xxx/qla_os.c   |  14 +-
 drivers/scsi/qla2xxx/qla_sup.c  |   2 +
 drivers/scsi/qla2xxx/qla_tmpl.c |  89 +
 7 files changed, 304 insertions(+), 223 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 9547d9680bb2..4c294bcd100a 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -84,8 +84,7 @@ qla24xx_fcp_prio_cfg_valid(scsi_qla_host_t *vha,
return 0;
}
 
-   if (bcode[0] != 'H' || bcode[1] != 'Q' || bcode[2] != 'O' ||
-   bcode[3] != 'S') {
+   if (memcmp(bcode, "HQOS", 4)) {
/* Invalid FCP priority data header*/
ql_dbg(ql_dbg_user, vha, 0x7052,
"Invalid FCP Priority data header. bcode=0x%x.\n",
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 533e498c5346..cf2f597fa7f4 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4030,9 +4030,11 @@ struct qla_hw_data {
uint8_t pep_version[3];
 
/* Firmware dump template */
-   void*fw_dump_template;
-   uint32_tfw_dump_template_len;
-   /* Firmware dump information. */
+   struct fwdt {
+   void *template;
+   ulong length;
+   ulong dump_size;
+   } fwdt[2];
struct qla2xxx_fw_dump *fw_dump;
uint32_tfw_dump_len;
boolfw_dumped;
@@ -4075,7 +4077,6 @@ struct qla_hw_data {
uint16_tproduct_id[4];
 
uint8_t model_number[16+1];
-#define BINZERO"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
charmodel_desc[80];
uint8_t adapter_id[16+1];
 
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index e300a701296a..a222997141d3 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -611,7 +611,7 @@ extern void qla82xx_fw_dump(scsi_qla_host_t *, int);
 extern void qla8044_fw_dump(scsi_qla_host_t *, int);
 
 extern void qla27xx_fwdump(scsi_qla_host_t *, int);
-extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
+extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *, void *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
 
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 48624d4be9a5..66f57a0e7037 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3088,12 +3088,15 @@ qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
 void
 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 {
+   int rval;
uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
eft_size, fce_size, mq_size;
struct qla_hw_data *ha = vha->hw;
struct req_que *req = ha->req_q_map[0];
struct rsp_que *rsp = ha->rsp_q_map[0];
struct qla2xxx_fw_dump *fw_dump;
+   dma_addr_t tc_dma;
+   void *tc;
 
dump_size = fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
req_q_size = rsp_q_size = 0;
@@ -3138,20 +3141,51 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
 try_eft:
+   if (ha->eft)
+   dma_free_coherent(&ha->pdev->dev,
+   EFT_SIZE, ha->eft, ha->eft_dma);
+
+   /* Allocate memory for Extended Trace Buffer. */
+   tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
+GFP_KERNEL);
+   if (!tc) {
+   ql_log(ql_log_warn, vha, 0x00c1,
+   "Unable to allocate (%d KB) for EFT.\n",
+   EFT_SIZE / 1024);
+   goto allocate;
+   }
+
+   rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
+   if (rval) {
+   ql_log(ql_log_warn, vha, 0x00c2,
+   "Unable to initialize EFT (%d).\n", rval);
+   dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
+   tc_dma);
+   }
ql_dbg(ql_dbg_init, vha, 0x00c3,
"Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
eft_

[PATCH v3 01/14] qla2xxx: Add fw_attr and port_no SysFS node

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new SysFS node to display firmware attributes
and port number

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 30 ++
 1 file changed, 30 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 2eb1ae721a7d..46fcc718337b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2162,6 +2162,32 @@ qla2x00_dif_bundle_statistics_show(struct device *dev,
ha->dif_bundle_dma_allocs, ha->pool.unusable.count);
 }
 
+static ssize_t
+qla2x00_fw_attr_show(struct device *dev,
+struct device_attribute *attr, char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%llx\n",
+   (uint64_t)ha->fw_attributes_ext[1] << 48 |
+   (uint64_t)ha->fw_attributes_ext[0] << 32 |
+   (uint64_t)ha->fw_attributes_h << 16 |
+   (uint64_t)ha->fw_attributes);
+}
+
+static ssize_t
+qla2x00_port_no_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, "%u\n", vha->hw->port_no);
+}
+
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -2219,6 +2245,8 @@ static DEVICE_ATTR(dif_bundle_statistics, 0444,
 qla2x00_dif_bundle_statistics_show, NULL);
 static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
 qla2x00_port_speed_store);
+static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
+static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
 
 
 struct device_attribute *qla2x00_host_attrs[] = {
@@ -2259,6 +2287,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
+   &dev_attr_port_no,
+   &dev_attr_fw_attr,
NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */
-- 
2.12.0



[PATCH v3 07/14] qla2xxx: Cleanups for NVRAM/Flash read/write path

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch does following
 - Clean up NVRAM code.
 - Optimizes reading of primary/secondary flash image validation.
 - Remove 0xff mask and make correct width in FLT structure.
 - Use endian macros to assign static fields in fwdump header.
 - Correct fdwt checksum calculation.
 - Simplify ql_dump_buffer() interface usage.
 - Add endianizers to 27xx firmware image validator.
 - fixes compiler warnings for big endian architecture.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 

qla2xxx: Fix sparse warnings in qla_tmpl.c

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   6 +-
 drivers/scsi/qla2xxx/qla_dbg.c  |  19 ++---
 drivers/scsi/qla2xxx/qla_dbg.h  |  10 +--
 drivers/scsi/qla2xxx/qla_def.h  |   2 +-
 drivers/scsi/qla2xxx/qla_fw.h   |   4 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  10 +--
 drivers/scsi/qla2xxx/qla_gs.c   |   4 +-
 drivers/scsi/qla2xxx/qla_init.c | 143 ---
 drivers/scsi/qla2xxx/qla_isr.c  |  12 +--
 drivers/scsi/qla2xxx/qla_mbx.c  |  16 +++-
 drivers/scsi/qla2xxx/qla_mr.c   |  39 +-
 drivers/scsi/qla2xxx/qla_os.c   |   2 +-
 drivers/scsi/qla2xxx/qla_sup.c  |  41 --
 drivers/scsi/qla2xxx/qla_tmpl.c | 162 +---
 drivers/scsi/qla2xxx/qla_tmpl.h |  68 -
 15 files changed, 278 insertions(+), 260 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 2fe194a06e67..9547d9680bb2 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -1962,7 +1962,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
 
/* Dump the vendor information */
ql_dump_buffer(ql_dbg_user + ql_dbg_verbose , vha, 0x70cf,
-   (uint8_t *)piocb_rqst, sizeof(struct qla_mt_iocb_rqst_fx00));
+   piocb_rqst, sizeof(*piocb_rqst));
 
if (!vha->flags.online) {
ql_log(ql_log_warn, vha, 0x70d0,
@@ -2324,8 +2324,8 @@ qla2x00_get_priv_stats(struct bsg_job *bsg_job)
rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, options);
 
if (rval == QLA_SUCCESS) {
-   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e3,
-   (uint8_t *)stats, sizeof(*stats));
+   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e5,
+   stats, sizeof(*stats));
sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
bsg_job->reply_payload.sg_cnt, stats, sizeof(*stats));
}
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 3cfd846cdb2a..94da4b9927e9 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -2520,7 +2520,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
 //
 
 static inline int
-ql_mask_match(uint32_t level)
+ql_mask_match(uint level)
 {
return (level & ql2xextended_error_logging) == level;
 }
@@ -2539,7 +2539,7 @@ ql_mask_match(uint32_t level)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2582,8 +2582,7 @@ ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2619,7 +2618,7 @@ ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
  * msg:   The message to be displayed.
  */
 void
-ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2677,8 +2676,7 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2718,7 +2716,7 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
 }
 
 void
-ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
+ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
 {
int i;
struct qla_hw_data *ha = vha->hw;
@@ -2740,13 +2738,12 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, 
int32_t id)
ql_dbg(level, vha, id, "Mailbox registers:\n");
for (i = 0; i < 6; i++, mbx_reg++)
ql_dbg(level, vha, id,
-  

[PATCH v3 11/14] qla2xxx: Simplification of register address used in qla_tmpl.c

2019-03-11 Thread Himanshu Madhani
From: Joe Carnuccio 

Reduce stack space on each fwdt routine by eliminating local
variable reg.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 75 -
 1 file changed, 29 insertions(+), 46 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 4bc958f5bda3..f7f33081132c 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -7,13 +7,9 @@
 #include "qla_def.h"
 #include "qla_tmpl.h"
 
-#define IOBASE(reg)offsetof(typeof(*reg), iobase_addr)
-
-static inline void __iomem *
-qla27xx_isp_reg(struct scsi_qla_host *vha)
-{
-   return &vha->hw->iobase->isp24;
-}
+#define ISPREG(vha)(&(vha)->hw->iobase->isp24)
+#define IOBAR(reg) offsetof(typeof(*(reg)), iobase_addr)
+#define IOBASE(vha)IOBAR(ISPREG(vha))
 
 static inline void
 qla27xx_insert16(uint16_t value, void *buf, ulong *len)
@@ -114,7 +110,7 @@ qla27xx_read_window(__iomem struct device_reg_24xx *reg,
void __iomem *window = (void __iomem *)reg + offset;
void (*readn)(void __iomem*, void *, ulong *) = 
qla27xx_read_vector(width);
 
-   qla27xx_write_reg(reg, IOBASE_ADDR, addr, buf);
+   qla27xx_write_reg(reg, IOBAR(reg), addr, buf);
while (count--) {
qla27xx_insert32(addr, buf, len);
readn(window, buf, len);
@@ -163,7 +159,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t256.base_addr);
uint offset = ent->t256.pci_offset;
ulong count = le16_to_cpu(ent->t256.reg_count);
@@ -171,7 +166,7 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd200,
"%s: rdio t1 [%lx]\n", __func__, *len);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -180,15 +175,14 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t257.base_addr);
uint offset = ent->t257.pci_offset;
ulong data = le32_to_cpu(ent->t257.write_data);
 
ql_dbg(ql_dbg_misc, vha, 0xd201,
"%s: wrio t1 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -197,7 +191,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
uint banksel = ent->t258.banksel_offset;
ulong bank = le32_to_cpu(ent->t258.bank);
ulong addr = le32_to_cpu(ent->t258.base_addr);
@@ -207,8 +200,8 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd202,
"%s: rdio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -217,7 +210,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t259.base_addr);
uint banksel = ent->t259.banksel_offset;
ulong bank = le32_to_cpu(ent->t259.bank);
@@ -226,9 +218,9 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd203,
"%s: wrio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -237,13 +229,12 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_ql

[PATCH v4 00/14] qla2xxx: Add support for ISP28XX (Gen7) adapter

2019-03-12 Thread Himanshu Madhani
Hi Martin, 

This patch series adds support for our next generation ISP28XX (Gen7) adapter.  

Patch 1-3 adds SysFS node and misc cleanup in fw dump routines.
Patch 4-5 adds PCI IDs and serdes support for ISP28XX (Gen7) adapter.
Patch 6-11 cleans up overall firmware dump handling to prepare for new feature.
Patch 12 adds support for Primary/Secondary firmware images in the flash.
Patch 13 adds capability for secure flash update for ISP28XX (Gen7) adapter.

Please consider this series for 5.2/scsi-queue branch at your earliest 
convenience.

Changes from v3 -> v4
o Fixed some more 0-day kernel warnings for patch#7

Changes from v2 -> v3
o Fixed more 0-day kernel warnings for patch #7 and #8.

Changes from v1 -> v2
o Fixed 0-day kernel warnings for patch #7, #8, #9.

Thanks,
Himanshu


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

Joe Carnuccio (12):
  qla2xxx: Add fw_attr and port_no SysFS node
  qla2xxx: Remove FW default template
  qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().
  qla2xxx: Add Device ID for ISP28XX
  qla2xxx: Add Serdes support for ISP28XX
  qla2xxx: Correctly report max/min supported speeds
  qla2xxx: Cleanups for NVRAM/Flash read/write path
  qla2xxx: Add support for multiple fwdump templates/segments
  qla2xxx: Update flash read/write routine
  qla2xxx: Correction and improvement to fwdt processing
  qla2xxx: Simplification of register address used in qla_tmpl.c
  qla2xxx: Add 28xx flash primary/secondary status/image mechanism

Michael Hernandez (1):
  qla2xxx: Secure flash update support for ISP28XX

 drivers/scsi/qla2xxx/qla_attr.c|  274 +++---
 drivers/scsi/qla2xxx/qla_bsg.c |   63 ++-
 drivers/scsi/qla2xxx/qla_bsg.h |   11 +
 drivers/scsi/qla2xxx/qla_dbg.c |  190 ---
 drivers/scsi/qla2xxx/qla_dbg.h |   10 +-
 drivers/scsi/qla2xxx/qla_def.h |  186 +--
 drivers/scsi/qla2xxx/qla_dfs.c |6 +-
 drivers/scsi/qla2xxx/qla_fw.h  |   31 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   91 ++--
 drivers/scsi/qla2xxx/qla_gs.c  |   85 ++-
 drivers/scsi/qla2xxx/qla_init.c| 1029 ++--
 drivers/scsi/qla2xxx/qla_iocb.c|5 +-
 drivers/scsi/qla2xxx/qla_isr.c |   30 +-
 drivers/scsi/qla2xxx/qla_mbx.c |  319 ---
 drivers/scsi/qla2xxx/qla_mr.c  |   46 +-
 drivers/scsi/qla2xxx/qla_nx.c  |   17 +-
 drivers/scsi/qla2xxx/qla_nx2.c |8 +-
 drivers/scsi/qla2xxx/qla_os.c  |  121 -
 drivers/scsi/qla2xxx/qla_sup.c |  971 +++---
 drivers/scsi/qla2xxx/qla_target.c  |7 +-
 drivers/scsi/qla2xxx/qla_tmpl.c|  447 +++-
 drivers/scsi/qla2xxx/qla_tmpl.h|   76 +--
 drivers/scsi/qla2xxx/qla_version.h |4 +-
 23 files changed, 2527 insertions(+), 1500 deletions(-)

-- 
2.12.0



[PATCH v4 04/14] qla2xxx: Add Device ID for ISP28XX

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds PCI device ID ISP28XX for Gen7 support.
Also signature determination for primary/secondary flash
image for ISP27XX/28XX is aded as part of Gen7 support.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c   | 30 -
 drivers/scsi/qla2xxx/qla_bsg.c| 12 +++---
 drivers/scsi/qla2xxx/qla_dbg.c|  9 ++--
 drivers/scsi/qla2xxx/qla_def.h| 62 +++
 drivers/scsi/qla2xxx/qla_dfs.c|  6 +--
 drivers/scsi/qla2xxx/qla_fw.h |  5 ++-
 drivers/scsi/qla2xxx/qla_gs.c |  4 +-
 drivers/scsi/qla2xxx/qla_init.c   | 51 +-
 drivers/scsi/qla2xxx/qla_iocb.c   |  5 ++-
 drivers/scsi/qla2xxx/qla_isr.c| 14 +++---
 drivers/scsi/qla2xxx/qla_mbx.c| 76 ++---
 drivers/scsi/qla2xxx/qla_os.c | 89 ---
 drivers/scsi/qla2xxx/qla_sup.c| 49 +++--
 drivers/scsi/qla2xxx/qla_target.c |  7 +--
 14 files changed, 272 insertions(+), 147 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 46fcc718337b..76ca7edde960 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -427,7 +427,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct 
kobject *kobj,
valid = 1;
else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
|| IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)
-   || IS_QLA27XX(ha))
+   || IS_QLA27XX(ha) || IS_QLA28XX(ha))
valid = 1;
if (!valid) {
ql_log(ql_log_warn, vha, 0x7065,
@@ -514,7 +514,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (IS_NOCACHE_VPD_TYPE(ha)) {
faddr = ha->flt_region_vpd << 2;
 
-   if (IS_QLA27XX(ha) &&
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
faddr = ha->flt_region_vpd_sec << 2;
 
@@ -682,7 +682,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject 
*kobj,
ql_log(ql_log_info, vha, 0x706f,
"Issuing MPI reset.\n");
 
-   if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
+   if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
uint32_t idc_control;
 
qla83xx_idc_lock(vha, 0);
@@ -991,7 +991,8 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
continue;
if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
-   if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
+   if (iter->is4GBp_only == 0x27 &&
+   (!IS_QLA27XX(vha->hw) || !IS_QLA28XX(ha)))
continue;
 
sysfs_remove_bin_file(&host->shost_gendev.kobj,
@@ -1336,7 +1337,8 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
+   if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
@@ -1383,7 +1385,7 @@ qla2x00_mpi_version_show(struct device *dev, struct 
device_attribute *attr,
struct qla_hw_data *ha = vha->hw;
 
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha) &&
-   !IS_QLA27XX(ha))
+   !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
@@ -1596,7 +1598,7 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
@@ -1610,7 +1612,7 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
 
-   if (!IS_QLA27XX(ha))
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnpri

[PATCH v4 05/14] qla2xxx: Add Serdes support for ISP28XX

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds SysFS node for serdes_version
and also cleans up port_speed display.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 43 +--
 drivers/scsi/qla2xxx/qla_def.h  |  4 ++-
 drivers/scsi/qla2xxx/qla_gs.c   | 77 -
 drivers/scsi/qla2xxx/qla_isr.c  |  4 ++-
 drivers/scsi/qla2xxx/qla_mbx.c  | 25 +++--
 5 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 76ca7edde960..833b082a7944 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1378,6 +1378,21 @@ qla24xx_84xx_fw_version_show(struct device *dev,
 }
 
 static ssize_t
+qla2x00_serdes_version_show(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
+   ha->serdes_version[0], ha->serdes_version[1],
+   ha->serdes_version[2]);
+}
+
+static ssize_t
 qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
 char *buf)
 {
@@ -2218,6 +2233,7 @@ static DEVICE_ATTR(84xx_fw_version, S_IRUGO, 
qla24xx_84xx_fw_version_show,
   NULL);
 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
   NULL);
+static DEVICE_ATTR(serdes_version, 0444, qla2x00_serdes_version_show, NULL);
 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
 static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
 static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
@@ -2270,6 +2286,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_optrom_fw_version,
&dev_attr_84xx_fw_version,
&dev_attr_total_isp_aborts,
+   &dev_attr_serdes_version,
&dev_attr_mpi_version,
&dev_attr_phy_version,
&dev_attr_flash_block_size,
@@ -2326,16 +2343,15 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost)
 static void
 qla2x00_get_host_speed(struct Scsi_Host *shost)
 {
-   struct qla_hw_data *ha = ((struct scsi_qla_host *)
-   (shost_priv(shost)))->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   scsi_qla_host_t *vha = shost_priv(shost);
+   u32 speed;
 
-   if (IS_QLAFX00(ha)) {
+   if (IS_QLAFX00(vha->hw)) {
qlafx00_get_host_speed(shost);
return;
}
 
-   switch (ha->link_data_rate) {
+   switch (vha->hw->link_data_rate) {
case PORT_SPEED_1GB:
speed = FC_PORTSPEED_1GBIT;
break;
@@ -2360,7 +2376,11 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
case PORT_SPEED_64GB:
speed = FC_PORTSPEED_64GBIT;
break;
+   default:
+   speed = FC_PORTSPEED_UNKNOWN;
+   break;
}
+
fc_host_speed(shost) = speed;
 }
 
@@ -2368,7 +2388,7 @@ static void
 qla2x00_get_host_port_type(struct Scsi_Host *shost)
 {
scsi_qla_host_t *vha = shost_priv(shost);
-   uint32_t port_type = FC_PORTTYPE_UNKNOWN;
+   uint32_t port_type;
 
if (vha->vp_idx) {
fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
@@ -2387,7 +2407,11 @@ qla2x00_get_host_port_type(struct Scsi_Host *shost)
case ISP_CFG_F:
port_type = FC_PORTTYPE_NPORT;
break;
+   default:
+   port_type = FC_PORTTYPE_UNKNOWN;
+   break;
}
+
fc_host_port_type(shost) = port_type;
 }
 
@@ -2449,13 +2473,10 @@ qla2x00_get_starget_port_id(struct scsi_target *starget)
fc_starget_port_id(starget) = port_id;
 }
 
-static void
+static inline void
 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
 {
-   if (timeout)
-   rport->dev_loss_tmo = timeout;
-   else
-   rport->dev_loss_tmo = 1;
+   rport->dev_loss_tmo = timeout ? timeout : 1;
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index c64cd555ef0d..a4661306cc34 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4023,6 +4023,7 @@ struct qla_hw_data {
uint8_t fw_seriallink_options[4];
uint16_tfw_seriallink_options24[4];
 
+   uint8_t serdes_version[3];
uint8_t mpi_version[3];
uint32_tmpi_capabilities;
uint8_t phy_version[3];
@@ -4034,7 +4035,8 @@ struct qla_hw_data {
/* Firmware dump information. */
struct q

[PATCH v4 06/14] qla2xxx: Correctly report max/min supported speeds

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes reported speed for min_link and max_supported
speed. Also rename SysFS nodes link_speed and max_supported to
be consistent with {min|max}_suuported_speed.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 94 +
 drivers/scsi/qla2xxx/qla_def.h  |  7 +--
 drivers/scsi/qla2xxx/qla_fw.h   |  2 +-
 drivers/scsi/qla2xxx/qla_mbx.c  | 65 +++-
 4 files changed, 98 insertions(+), 70 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 833b082a7944..3adbb2c1a806 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1621,8 +1621,8 @@ qla2x00_pep_version_show(struct device *dev, struct 
device_attribute *attr,
 }
 
 static ssize_t
-qla2x00_min_link_speed_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_min_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1631,16 +1631,17 @@ qla2x00_min_link_speed_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->min_link_speed == 5 ? "32Gps" :
-   ha->min_link_speed == 4 ? "16Gps" :
-   ha->min_link_speed == 3 ? "8Gps" :
-   ha->min_link_speed == 2 ? "4Gps" :
-   ha->min_link_speed != 0 ? "unknown" : "");
+   ha->min_supported_speed == 6 ? "64Gps" :
+   ha->min_supported_speed == 5 ? "32Gps" :
+   ha->min_supported_speed == 4 ? "16Gps" :
+   ha->min_supported_speed == 3 ? "8Gps" :
+   ha->min_supported_speed == 2 ? "4Gps" :
+   ha->min_supported_speed != 0 ? "unknown" : "");
 }
 
 static ssize_t
-qla2x00_max_speed_sup_show(struct device *dev, struct device_attribute *attr,
-char *buf)
+qla2x00_max_supported_speed_show(struct device *dev,
+struct device_attribute *attr, char *buf)
 {
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw;
@@ -1649,7 +1650,9 @@ qla2x00_max_speed_sup_show(struct device *dev, struct 
device_attribute *attr,
return scnprintf(buf, PAGE_SIZE, "\n");
 
return scnprintf(buf, PAGE_SIZE, "%s\n",
-   ha->max_speed_sup ? "32Gps" : "16Gps");
+   ha->max_supported_speed  == 2 ? "64Gps" :
+   ha->max_supported_speed  == 1 ? "32Gps" :
+   ha->max_supported_speed  == 0 ? "16Gps" : "unknown");
 }
 
 static ssize_t
@@ -2251,8 +2254,10 @@ static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
   qla2x00_allow_cna_fw_dump_show,
   qla2x00_allow_cna_fw_dump_store);
 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(min_supported_speed, 0444,
+  qla2x00_min_supported_speed_show, NULL);
+static DEVICE_ATTR(max_supported_speed, 0444,
+  qla2x00_max_supported_speed_show, NULL);
 static DEVICE_ATTR(zio_threshold, 0644,
 qla_zio_threshold_show,
 qla_zio_threshold_store);
@@ -2301,8 +2306,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_fw_dump_size,
&dev_attr_allow_cna_fw_dump,
&dev_attr_pep_version,
-   &dev_attr_min_link_speed,
-   &dev_attr_max_speed_sup,
+   &dev_attr_min_supported_speed,
+   &dev_attr_max_supported_speed,
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
@@ -3031,7 +3036,7 @@ void
 qla2x00_init_host_attr(scsi_qla_host_t *vha)
 {
struct qla_hw_data *ha = vha->hw;
-   u32 speed = FC_PORTSPEED_UNKNOWN;
+   u32 speeds = FC_PORTSPEED_UNKNOWN;
 
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@@ -3042,28 +3047,45 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
 
if (IS_CNA_CAPABLE(ha))
-   speed = FC_PORTSPEED_10GBIT;
-   else if (IS_QLA2031(ha))
-   speed = FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT |
-   FC_PORTSPEED_4GBIT;
-   else if (IS_QLA25

[PATCH v4 03/14] qla2xxx: Fix routine qla27xx_dump_{mpi|ram}().

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch fixes qla27xx_dump_{mpi|ram} api for ISP27XX

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_dbg.c | 166 -
 1 file changed, 81 insertions(+), 85 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index c7533fa7f46e..ec5bad0b0607 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -111,30 +111,25 @@ int
 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt)
 {
-   int rval;
-   uint32_t cnt, stat, timer, dwords, idx;
-   uint16_t mb0;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
dma_addr_t dump_dma = ha->gid_list_dma;
-   uint32_t *dump = (uint32_t *)ha->gid_list;
+   uint32_t *chunk = (void *)ha->gid_list;
+   uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+   uint32_t stat;
+   ulong i, j, timer = 600;
+   int rval = QLA_FUNCTION_FAILED;
 
-   rval = QLA_SUCCESS;
-   mb0 = 0;
-
-   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+   if (i + dwords > ram_dwords)
+   dwords = ram_dwords - i;
 
-   dwords = qla2x00_gid_list_size(ha) / 4;
-   for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-   cnt += dwords, addr += dwords) {
-   if (cnt + dwords > ram_dwords)
-   dwords = ram_dwords - cnt;
-
+   WRT_REG_WORD(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
WRT_REG_WORD(®->mailbox1, LSW(addr));
WRT_REG_WORD(®->mailbox8, MSW(addr));
 
-   WRT_REG_WORD(®->mailbox2, MSW(dump_dma));
-   WRT_REG_WORD(®->mailbox3, LSW(dump_dma));
+   WRT_REG_WORD(®->mailbox2, MSW(LSD(dump_dma)));
+   WRT_REG_WORD(®->mailbox3, LSW(LSD(dump_dma)));
WRT_REG_WORD(®->mailbox6, MSW(MSD(dump_dma)));
WRT_REG_WORD(®->mailbox7, LSW(MSD(dump_dma)));
 
@@ -145,76 +140,75 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t 
addr, uint32_t *ram,
WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT);
 
ha->flags.mbox_int = 0;
-   for (timer = 600; timer; timer--) {
-   /* Check for pending interrupts. */
-   stat = RD_REG_DWORD(®->host_status);
-   if (stat & HSRX_RISC_INT) {
-   stat &= 0xff;
-
-   if (stat == 0x1 || stat == 0x2 ||
-   stat == 0x10 || stat == 0x11) {
-   set_bit(MBX_INTERRUPT,
-   &ha->mbx_cmd_flags);
+   while (timer--) {
+   udelay(5);
 
-   mb0 = RD_REG_WORD(®->mailbox0);
-   RD_REG_WORD(®->mailbox1);
+   stat = RD_REG_DWORD(®->host_status);
+   /* Check for pending interrupts. */
+   if (!(stat & HSRX_RISC_INT))
+   continue;
 
-   WRT_REG_DWORD(®->hccr,
-   HCCRX_CLR_RISC_INT);
-   RD_REG_DWORD(®->hccr);
-   break;
-   }
+   stat &= 0xff;
+   if (stat != 0x1 && stat != 0x2 &&
+   stat != 0x10 && stat != 0x11) {
 
/* Clear this intr; it wasn't a mailbox intr */
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
RD_REG_DWORD(®->hccr);
+   continue;
}
-   udelay(5);
+
+   set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+   rval = RD_REG_WORD(®->mailbox0) & MBS_MASK;
+   WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
+   RD_REG_DWORD(®->hccr);
+   break;
}
ha->flags.mbox_int = 1;
+   *nxt = ram + i;
 
-   if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-   rval = mb0 & MBS_MASK;
-   for (idx = 0; idx < dwords; idx++)
-   ram[cnt + idx] = IS_QLA27XX(ha) ?
-   le32_to_cpu(dump[idx]) : swab32(d

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

2019-03-12 Thread Himanshu Madhani
This version Includes support for ISP28XX

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 0690dac24081..0f8cca27c183 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.14-k"
+#define QLA2XXX_VERSION  "10.01.00.15-k"
 
 #define QLA_DRIVER_MAJOR_VER   10
-#define QLA_DRIVER_MINOR_VER   0
+#define QLA_DRIVER_MINOR_VER   1
 #define QLA_DRIVER_PATCH_VER   0
 #define QLA_DRIVER_BETA_VER0
-- 
2.12.0



[PATCH v4 01/14] qla2xxx: Add fw_attr and port_no SysFS node

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds new SysFS node to display firmware attributes
and port number

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c | 30 ++
 1 file changed, 30 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 2eb1ae721a7d..46fcc718337b 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2162,6 +2162,32 @@ qla2x00_dif_bundle_statistics_show(struct device *dev,
ha->dif_bundle_dma_allocs, ha->pool.unusable.count);
 }
 
+static ssize_t
+qla2x00_fw_attr_show(struct device *dev,
+struct device_attribute *attr, char *buf)
+{
+   scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+   struct qla_hw_data *ha = vha->hw;
+
+   if (!IS_QLA27XX(ha))
+   return scnprintf(buf, PAGE_SIZE, "\n");
+
+   return scnprintf(buf, PAGE_SIZE, "%llx\n",
+   (uint64_t)ha->fw_attributes_ext[1] << 48 |
+   (uint64_t)ha->fw_attributes_ext[0] << 32 |
+   (uint64_t)ha->fw_attributes_h << 16 |
+   (uint64_t)ha->fw_attributes);
+}
+
+static ssize_t
+qla2x00_port_no_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, "%u\n", vha->hw->port_no);
+}
+
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -2219,6 +2245,8 @@ static DEVICE_ATTR(dif_bundle_statistics, 0444,
 qla2x00_dif_bundle_statistics_show, NULL);
 static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
 qla2x00_port_speed_store);
+static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
+static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
 
 
 struct device_attribute *qla2x00_host_attrs[] = {
@@ -2259,6 +2287,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_zio_threshold,
&dev_attr_dif_bundle_statistics,
&dev_attr_port_speed,
+   &dev_attr_port_no,
+   &dev_attr_fw_attr,
NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */
-- 
2.12.0



[PATCH v4 10/14] qla2xxx: Correction and improvement to fwdt processing

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch cleans up and fixes firmware dump template
processing. These changes are added to support newer
features for ISP27XX/ISP28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 43 +++--
 drivers/scsi/qla2xxx/qla_tmpl.h |  2 +-
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index da1eb5644188..9f8a7a3d6726 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -99,9 +99,9 @@ static inline void
 qla27xx_write_reg(__iomem struct device_reg_24xx *reg,
uint offset, uint32_t data, void *buf)
 {
-   __iomem void *window = (void __iomem *)reg + offset;
-
if (buf) {
+   void __iomem *window = (void __iomem *)reg + offset;
+
WRT_REG_DWORD(window, data);
}
 }
@@ -709,10 +709,10 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
goto done;
}
if (offset + length > size) {
+   length = size - offset;
ql_dbg(ql_dbg_misc, vha, 0xd030,
-   "%s: buffer overflow\n", __func__);
-   qla27xx_skip_entry(ent, buf);
-   goto done;
+   "%s: buffer overflow, truncate [%lx]\n", __func__, length);
+   ent->t275.length = cpu_to_le32(length);
}
 
qla27xx_insertbuf(buffer, length, buf, len);
@@ -724,17 +724,22 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha,
 struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   ulong cond1 = le32_to_cpu(ent->t276.cond1);
-   ulong cond2 = le32_to_cpu(ent->t276.cond2);
-   uint type = vha->hw->pdev->device >> 4 & 0xf;
-   uint func = vha->hw->port_no & 0x3;
-
ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd214,
"%s: cond [%lx]\n", __func__, *len);
 
-   if (type != cond1 || func != cond2) {
-   ent = qla27xx_next_entry(ent);
-   qla27xx_skip_entry(ent, buf);
+   if (buf) {
+   ulong cond1 = le32_to_cpu(ent->t276.cond1);
+   ulong cond2 = le32_to_cpu(ent->t276.cond2);
+   uint type = vha->hw->pdev->device >> 4 & 0xf;
+   uint func = vha->hw->port_no & 0x3;
+
+   if (type != cond1 || func != cond2) {
+   struct qla27xx_fwdt_template *tmp = buf;
+
+   tmp->count--;
+   ent = qla27xx_next_entry(ent);
+   qla27xx_skip_entry(ent, buf);
+   }
}
 
return qla27xx_next_entry(ent);
@@ -840,21 +845,21 @@ qla27xx_walk_template(struct scsi_qla_host *vha,
 {
struct qla27xx_fwdt_entry *ent = (void *)tmp +
le32_to_cpu(tmp->entry_offset);
-   ulong count = le32_to_cpu(tmp->entry_count);
-   ulong type = 0;
+   ulong type;
 
+   tmp->count = le32_to_cpu(tmp->entry_count);
ql_dbg(ql_dbg_misc, vha, 0xd01a,
-   "%s: entry count %lx\n", __func__, count);
-   while (count--) {
+   "%s: entry count %u\n", __func__, tmp->count);
+   while (ent && tmp->count--) {
type = le32_to_cpu(ent->hdr.type);
ent = qla27xx_find_entry(type)(vha, ent, buf, len);
if (!ent)
break;
}
 
-   if (count)
+   if (tmp->count)
ql_dbg(ql_dbg_misc, vha, 0xd018,
-   "%s: entry count residual=+%lu\n", __func__, count);
+   "%s: entry count residual=+%u\n", __func__, tmp->count);
 
if (ent)
ql_dbg(ql_dbg_misc, vha, 0xd019,
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h
index 6ce7fff014ee..d2a0014e8b21 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.h
+++ b/drivers/scsi/qla2xxx/qla_tmpl.h
@@ -14,7 +14,7 @@ struct __packed qla27xx_fwdt_template {
__le32 template_type;
__le32 entry_offset;
uint32_t template_size;
-   uint32_t reserved_1;
+   uint32_t count; /* borrow field for running/residual count */
 
__le32 entry_count;
uint32_t template_version;
-- 
2.12.0



[PATCH v4 09/14] qla2xxx: Update flash read/write routine

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch made following changes to flash access routines
- updated return type for read_optrom
- use void instead of uint32_t * for buffer parameter in read
  and write optrom routines
- Fix flash/nvram addressing.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  65 +++---
 drivers/scsi/qla2xxx/qla_def.h  |   8 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  47 ++---
 drivers/scsi/qla2xxx/qla_init.c |  24 +--
 drivers/scsi/qla2xxx/qla_nx.c   |  13 +-
 drivers/scsi/qla2xxx/qla_nx2.c  |   8 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 443 +++-
 7 files changed, 296 insertions(+), 312 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 3adbb2c1a806..68a52173ed66 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -223,9 +223,9 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
+   ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
+   count);
mutex_unlock(&ha->optrom_mutex);
 
ql_dbg(ql_dbg_user, vha, 0x7060,
@@ -511,22 +511,24 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
if (!capable(CAP_SYS_ADMIN))
return -EINVAL;
 
-   if (IS_NOCACHE_VPD_TYPE(ha)) {
-   faddr = ha->flt_region_vpd << 2;
+   if (IS_NOCACHE_VPD_TYPE(ha))
+   goto skip;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   faddr = ha->flt_region_vpd << 2;
 
-   mutex_lock(&ha->optrom_mutex);
-   if (qla2x00_chip_is_down(vha)) {
-   mutex_unlock(&ha->optrom_mutex);
-   return -EAGAIN;
-   }
-   ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
-   ha->vpd_size);
+   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
+   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   mutex_lock(&ha->optrom_mutex);
+   if (qla2x00_chip_is_down(vha)) {
mutex_unlock(&ha->optrom_mutex);
+   return -EAGAIN;
}
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
+   mutex_unlock(&ha->optrom_mutex);
+skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
 
@@ -563,8 +565,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject 
*kobj,
}
 
/* 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);
+   ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
+   ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
 
/* Update flash version information for 4Gb & above. */
if (!IS_FWI2_CAPABLE(ha)) {
@@ -934,7 +936,7 @@ static struct bin_attribute sysfs_dcbx_tlv_attr = {
 static struct sysfs_entry {
char *name;
struct bin_attribute *attr;
-   int is4GBp_only;
+   int type;
 } bin_file_entries[] = {
{ "fw_dump", &sysfs_fw_dump_attr, },
{ "nvram", &sysfs_nvram_attr, },
@@ -957,11 +959,11 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
int ret;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
+   if (iter->type && !IS_FWI2_CAPABLE(vha->hw))
continue;
-   if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
+   if (iter->type == 2 && !IS_QLA25XX(vha->hw))
continue;
-   if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
+   if (iter->type == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue;
 
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
@@ -985,14 +987,14 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool 
stop_beacon)
struct qla_hw_data *ha = vha->hw;
 
for (iter = bin_file_entries; iter->name; iter++) {
-   if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha

[PATCH v4 11/14] qla2xxx: Simplification of register address used in qla_tmpl.c

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

Reduce stack space on each fwdt routine by eliminating local
variable reg.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 71 -
 1 file changed, 27 insertions(+), 44 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index 9f8a7a3d6726..de696a07532e 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -7,13 +7,9 @@
 #include "qla_def.h"
 #include "qla_tmpl.h"
 
-#define IOBASE(reg)offsetof(typeof(*reg), iobase_addr)
-
-static inline void __iomem *
-qla27xx_isp_reg(struct scsi_qla_host *vha)
-{
-   return &vha->hw->iobase->isp24;
-}
+#define ISPREG(vha)(&(vha)->hw->iobase->isp24)
+#define IOBAR(reg) offsetof(typeof(*(reg)), iobase_addr)
+#define IOBASE(vha)IOBAR(ISPREG(vha))
 
 static inline void
 qla27xx_insert16(uint16_t value, void *buf, ulong *len)
@@ -114,7 +110,7 @@ qla27xx_read_window(__iomem struct device_reg_24xx *reg,
void __iomem *window = (void __iomem *)reg + offset;
void (*readn)(void __iomem*, void *, ulong *) = 
qla27xx_read_vector(width);
 
-   qla27xx_write_reg(reg, IOBASE_ADDR, addr, buf);
+   qla27xx_write_reg(reg, IOBAR(reg), addr, buf);
while (count--) {
qla27xx_insert32(addr, buf, len);
readn(window, buf, len);
@@ -163,7 +159,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t256.base_addr);
uint offset = ent->t256.pci_offset;
ulong count = le16_to_cpu(ent->t256.reg_count);
@@ -171,7 +166,7 @@ qla27xx_fwdt_entry_t256(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd200,
"%s: rdio t1 [%lx]\n", __func__, *len);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -180,15 +175,14 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t257(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t257.base_addr);
uint offset = ent->t257.pci_offset;
ulong data = le32_to_cpu(ent->t257.write_data);
 
ql_dbg(ql_dbg_misc, vha, 0xd201,
"%s: wrio t1 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -197,7 +191,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
uint banksel = ent->t258.banksel_offset;
ulong bank = le32_to_cpu(ent->t258.bank);
ulong addr = le32_to_cpu(ent->t258.base_addr);
@@ -207,8 +200,8 @@ qla27xx_fwdt_entry_t258(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd202,
"%s: rdio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_read_window(reg, addr, offset, count, width, buf, len);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_read_window(ISPREG(vha), addr, offset, count, width, buf, len);
 
return qla27xx_next_entry(ent);
 }
@@ -217,7 +210,6 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-   struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha);
ulong addr = le32_to_cpu(ent->t259.base_addr);
uint banksel = ent->t259.banksel_offset;
ulong bank = le32_to_cpu(ent->t259.bank);
@@ -226,9 +218,9 @@ qla27xx_fwdt_entry_t259(struct scsi_qla_host *vha,
 
ql_dbg(ql_dbg_misc, vha, 0xd203,
"%s: wrio t2 [%lx]\n", __func__, *len);
-   qla27xx_write_reg(reg, IOBASE(reg), addr, buf);
-   qla27xx_write_reg(reg, banksel, bank, buf);
-   qla27xx_write_reg(reg, offset, data, buf);
+   qla27xx_write_reg(ISPREG(vha), IOBASE(vha), addr, buf);
+   qla27xx_write_reg(ISPREG(vha), banksel, bank, buf);
+   qla27xx_write_reg(ISPREG(vha), offset, data, buf);
 
return qla27xx_next_entry(ent);
 }
@@ -237,13 +229,12 @@ static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t260(struct scsi_ql

[PATCH v4 13/14] qla2xxx: Secure flash update support for ISP28XX

2019-03-12 Thread Himanshu Madhani
From: Michael Hernandez 

This patch adds support for Secure flash update with ISP28xx

Signed-off-by: Michael Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h  |  31 +++-
 drivers/scsi/qla2xxx/qla_fw.h   |   8 +
 drivers/scsi/qla2xxx/qla_gbl.h  |  22 ++-
 drivers/scsi/qla2xxx/qla_init.c |  47 -
 drivers/scsi/qla2xxx/qla_mbx.c  | 141 +++
 drivers/scsi/qla2xxx/qla_mr.c   |   7 +-
 drivers/scsi/qla2xxx/qla_nx.c   |   4 +-
 drivers/scsi/qla2xxx/qla_os.c   |  18 +-
 drivers/scsi/qla2xxx/qla_sup.c  | 387 +---
 9 files changed, 616 insertions(+), 49 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 574797ac7f92..2ec878afa18d 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -1033,6 +1033,7 @@ struct mbx_cmd_32 {
 #define MBC_GET_FIRMWARE_VERSION   8   /* Get firmware revision. */
 #define MBC_LOAD_RISC_RAM  9   /* Load RAM command. */
 #define MBC_DUMP_RISC_RAM  0xa /* Dump RAM command. */
+#define MBC_SECURE_FLASH_UPDATE0xa /* Secure Flash 
Update(28xx) */
 #define MBC_LOAD_RISC_RAM_EXTENDED 0xb /* Load RAM extended. */
 #define MBC_DUMP_RISC_RAM_EXTENDED 0xc /* Dump RAM extended. */
 #define MBC_WRITE_RAM_WORD_EXTENDED0xd /* Write RAM word extended */
@@ -3135,10 +3136,10 @@ struct rsp_que;
 struct isp_operations {
 
int (*pci_config) (struct scsi_qla_host *);
-   void (*reset_chip) (struct scsi_qla_host *);
+   int (*reset_chip)(struct scsi_qla_host *);
int (*chip_diag) (struct scsi_qla_host *);
void (*config_rings) (struct scsi_qla_host *);
-   void (*reset_adapter) (struct scsi_qla_host *);
+   int (*reset_adapter)(struct scsi_qla_host *);
int (*nvram_config) (struct scsi_qla_host *);
void (*update_fw_options) (struct scsi_qla_host *);
int (*load_risc) (struct scsi_qla_host *, uint32_t *);
@@ -3627,6 +3628,8 @@ struct qla_hw_data {
uint32_trida_fmt2:1;
uint32_tpurge_mbox:1;
uint32_tn2n_bigger:1;
+   uint32_tsecure_adapter:1;
+   uint32_tsecure_fw:1;
} flags;
 
uint16_t max_exchg;
@@ -3915,6 +3918,9 @@ struct qla_hw_data {
void*sfp_data;
dma_addr_t  sfp_data_dma;
 
+   void*flt;
+   dma_addr_t  flt_dma;
+
 #define XGMAC_DATA_SIZE4096
void*xgmac_data;
dma_addr_t  xgmac_data_dma;
@@ -4362,6 +4368,7 @@ typedef struct scsi_qla_host {
 #define N2N_LOGIN_NEEDED   30
 #define IOCB_WORK_ACTIVE   31
 #define SET_ZIO_THRESHOLD_NEEDED 32
+#define ISP_ABORT_TO_ROM   33
 
unsigned long   pci_flags;
 #define PFLG_DISCONNECTED  0   /* PCI device removed */
@@ -4549,6 +4556,24 @@ struct qla2_sgx {
}   \
 }
 
+
+#define SFUB_CHECKSUM_SIZE 4
+
+struct secure_flash_update_block {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+};
+
+struct secure_flash_update_block_pk {
+   uint32_tblock_info;
+   uint32_tsignature_lo;
+   uint32_tsignature_hi;
+   uint32_tsignature_upper[0x3e];
+   uint32_tpublic_key[0x41];
+};
+
 /*
  * Macros to help code, maintain, etc.
  */
@@ -4749,6 +4774,8 @@ struct sff_8247_a0 {
IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \
 IS_QLA28XX(_vha->hw)))
 
+#define FLASH_SEMAPHORE_REGISTER_ADDR   0x00101016
+
 #define USER_CTRL_IRQ(_ha) (ql2xuctrlirq && QLA_TGT_MODE_ENABLED() && \
(IS_QLA27XX(_ha) || IS_QLA28XX(_ha) || IS_QLA83XX(_ha)))
 
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index 9dbd0dce5a29..d53cd7875a85 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -1536,6 +1536,10 @@ struct qla_flt_region {
uint32_t end;
 };
 
+#define FLT_REGION_SIZE16
+#define FLT_MAX_REGIONS0xFF
+#define FLT_REGIONS_SIZE   (FLT_REGION_SIZE * FLT_MAX_REGIONS)
+
 /* Flash NPIV Configuration Table /
 
 struct qla_npiv_header {
@@ -1725,6 +1729,10 @@ struct access_chip_rsp_84xx {
 #define LR_DIST_FW_SHIFT   (LR_DIST_FW_POS - LR_DIST_NV_POS)
 #define LR_DIST_FW_FIELD(x)((x) << LR_DIST_FW_SHIFT & 0xf000)
 
+/* FAC semaphore defines */
+#define FAC_SEMAPHORE_UNLOCK0
+#define FAC_SEMAPHORE_LOCK  1
+
 struct nvram_81xx {
/* NVRAM header. */
uint8_t id[4];
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index d5c27ffb5f41..979f0156c99e 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drive

[PATCH v4 08/14] qla2xxx: Add support for multiple fwdump templates/segments

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch adds multipe firmware dump template and segments
support for ISP27XX/28XX.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   3 +-
 drivers/scsi/qla2xxx/qla_def.h  |   9 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 +-
 drivers/scsi/qla2xxx/qla_init.c | 408 +++-
 drivers/scsi/qla2xxx/qla_os.c   |  14 +-
 drivers/scsi/qla2xxx/qla_sup.c  |   2 +
 drivers/scsi/qla2xxx/qla_tmpl.c |  89 +
 7 files changed, 304 insertions(+), 223 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 9547d9680bb2..4c294bcd100a 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -84,8 +84,7 @@ qla24xx_fcp_prio_cfg_valid(scsi_qla_host_t *vha,
return 0;
}
 
-   if (bcode[0] != 'H' || bcode[1] != 'Q' || bcode[2] != 'O' ||
-   bcode[3] != 'S') {
+   if (memcmp(bcode, "HQOS", 4)) {
/* Invalid FCP priority data header*/
ql_dbg(ql_dbg_user, vha, 0x7052,
"Invalid FCP Priority data header. bcode=0x%x.\n",
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 533e498c5346..cf2f597fa7f4 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4030,9 +4030,11 @@ struct qla_hw_data {
uint8_t pep_version[3];
 
/* Firmware dump template */
-   void*fw_dump_template;
-   uint32_tfw_dump_template_len;
-   /* Firmware dump information. */
+   struct fwdt {
+   void *template;
+   ulong length;
+   ulong dump_size;
+   } fwdt[2];
struct qla2xxx_fw_dump *fw_dump;
uint32_tfw_dump_len;
boolfw_dumped;
@@ -4075,7 +4077,6 @@ struct qla_hw_data {
uint16_tproduct_id[4];
 
uint8_t model_number[16+1];
-#define BINZERO"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
charmodel_desc[80];
uint8_t adapter_id[16+1];
 
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index e300a701296a..a222997141d3 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -611,7 +611,7 @@ extern void qla82xx_fw_dump(scsi_qla_host_t *, int);
 extern void qla8044_fw_dump(scsi_qla_host_t *, int);
 
 extern void qla27xx_fwdump(scsi_qla_host_t *, int);
-extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
+extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *, void *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
 
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 48624d4be9a5..66f57a0e7037 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3088,12 +3088,15 @@ qla2x00_alloc_offload_mem(scsi_qla_host_t *vha)
 void
 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 {
+   int rval;
uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
eft_size, fce_size, mq_size;
struct qla_hw_data *ha = vha->hw;
struct req_que *req = ha->req_q_map[0];
struct rsp_que *rsp = ha->rsp_q_map[0];
struct qla2xxx_fw_dump *fw_dump;
+   dma_addr_t tc_dma;
+   void *tc;
 
dump_size = fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
req_q_size = rsp_q_size = 0;
@@ -3138,20 +3141,51 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
 
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
 try_eft:
+   if (ha->eft)
+   dma_free_coherent(&ha->pdev->dev,
+   EFT_SIZE, ha->eft, ha->eft_dma);
+
+   /* Allocate memory for Extended Trace Buffer. */
+   tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
+GFP_KERNEL);
+   if (!tc) {
+   ql_log(ql_log_warn, vha, 0x00c1,
+   "Unable to allocate (%d KB) for EFT.\n",
+   EFT_SIZE / 1024);
+   goto allocate;
+   }
+
+   rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
+   if (rval) {
+   ql_log(ql_log_warn, vha, 0x00c2,
+   "Unable to initialize EFT (%d).\n", rval);
+   dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
+   tc_dma);
+   }
ql_dbg(ql_dbg_init, vha, 0x00c3,
"Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
eft_

[PATCH v4 12/14] qla2xxx: Add 28xx flash primary/secondary status/image mechanism

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

Includes the following:
- correction to 27xx image status struct;
- factoring of 27xx image status validating routines to make common;
- image status generation compare that works across zero wrap;
- bsg interface to report current active images (as loaded by driver).

Signed-off-by: Joe Carnuccio 
Signed-off-by: Mike Hernandez 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_attr.c |  34 -
 drivers/scsi/qla2xxx/qla_bsg.c  |  42 +
 drivers/scsi/qla2xxx/qla_bsg.h  |  11 ++
 drivers/scsi/qla2xxx/qla_def.h  |  63 +---
 drivers/scsi/qla2xxx/qla_fw.h   |  12 ++
 drivers/scsi/qla2xxx/qla_gbl.h  |   6 +-
 drivers/scsi/qla2xxx/qla_init.c | 328 +---
 drivers/scsi/qla2xxx/qla_sup.c  |  71 +++--
 8 files changed, 470 insertions(+), 97 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 68a52173ed66..a69479956c5c 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -154,6 +154,8 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject 
*kobj,
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
+   uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (!capable(CAP_SYS_ADMIN))
return 0;
@@ -164,11 +166,21 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct 
kobject *kobj,
return -EAGAIN;
}
 
-   if (IS_NOCACHE_VPD_TYPE(ha))
-   ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram 
<< 2,
-   ha->nvram_size);
+   if (!IS_NOCACHE_VPD_TYPE(ha)) {
+   mutex_unlock(&ha->optrom_mutex);
+   goto skip;
+   }
+
+   faddr = ha->flt_region_nvram;
+   if (IS_QLA28XX(ha)) {
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_nvram_sec;
+   }
+   ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size);
+
mutex_unlock(&ha->optrom_mutex);
 
+skip:
return memory_read_from_buffer(buf, count, &off, ha->nvram,
ha->nvram_size);
 }
@@ -504,6 +516,7 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
uint32_t faddr;
+   struct active_regions active_regions = { };
 
if (unlikely(pci_channel_offline(ha->pdev)))
return -EAGAIN;
@@ -516,9 +529,16 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
faddr = ha->flt_region_vpd << 2;
 
-   if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
-   qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
-   faddr = ha->flt_region_vpd_sec << 2;
+   if (IS_QLA28XX(ha)) {
+   qla28xx_get_aux_images(vha, &active_regions);
+   if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
+   faddr = ha->flt_region_vpd_sec << 2;
+
+   ql_dbg(ql_dbg_init, vha, 0x7070,
+   "Loading %s nvram image.\n",
+   active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ?
+   "primary" : "secondary");
+   }
 
mutex_lock(&ha->optrom_mutex);
if (qla2x00_chip_is_down(vha)) {
@@ -528,6 +548,8 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject 
*kobj,
 
ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
mutex_unlock(&ha->optrom_mutex);
+
+   ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
 skip:
return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 4c294bcd100a..95b0ec3c2d40 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2389,6 +2389,45 @@ qla2x00_do_dport_diagnostics(struct bsg_job *bsg_job)
 }
 
 static int
+qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
+{
+   scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
+   struct fc_bsg_reply *bsg_reply = bsg_job->reply;
+   struct qla_hw_data *ha = vha->hw;
+   struct qla_active_regions regions = { };
+   struct active_regions active_regions = { };
+
+   qla28xx_get_aux_images(vha, &active_regions);
+   regions.global_image = active_regions.global;
+
+   if (IS_QLA28XX(ha)) {
+   qla27xx_get_active_image(vha, &active_regions);
+   regions.board_config = active_regions.aux.board_config;
+   regions.vpd_nvram = active_regions.aux.v

[PATCH v4 07/14] qla2xxx: Cleanups for NVRAM/Flash read/write path

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch does following
 - Clean up NVRAM code.
 - Optimizes reading of primary/secondary flash image validation.
 - Remove 0xff mask and make correct width in FLT structure.
 - Use endian macros to assign static fields in fwdump header.
 - Correct fdwt checksum calculation.
 - Simplify ql_dump_buffer() interface usage.
 - Add endianizers to 27xx firmware image validator.
 - fixes compiler warnings for big endian architecture.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 

qla2xxx: Fix sparse warnings in qla_tmpl.c

Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_bsg.c  |   6 +-
 drivers/scsi/qla2xxx/qla_dbg.c  |  19 ++---
 drivers/scsi/qla2xxx/qla_dbg.h  |  10 +--
 drivers/scsi/qla2xxx/qla_def.h  |   2 +-
 drivers/scsi/qla2xxx/qla_fw.h   |   4 +-
 drivers/scsi/qla2xxx/qla_gbl.h  |  10 +--
 drivers/scsi/qla2xxx/qla_gs.c   |   4 +-
 drivers/scsi/qla2xxx/qla_init.c | 143 ++-
 drivers/scsi/qla2xxx/qla_isr.c  |  12 +--
 drivers/scsi/qla2xxx/qla_mbx.c  |  16 +++-
 drivers/scsi/qla2xxx/qla_mr.c   |  39 -
 drivers/scsi/qla2xxx/qla_os.c   |   2 +-
 drivers/scsi/qla2xxx/qla_sup.c  |  41 -
 drivers/scsi/qla2xxx/qla_tmpl.c | 184 
 drivers/scsi/qla2xxx/qla_tmpl.h |  74 
 15 files changed, 292 insertions(+), 274 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 2fe194a06e67..9547d9680bb2 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -1962,7 +1962,7 @@ qlafx00_mgmt_cmd(struct bsg_job *bsg_job)
 
/* Dump the vendor information */
ql_dump_buffer(ql_dbg_user + ql_dbg_verbose , vha, 0x70cf,
-   (uint8_t *)piocb_rqst, sizeof(struct qla_mt_iocb_rqst_fx00));
+   piocb_rqst, sizeof(*piocb_rqst));
 
if (!vha->flags.online) {
ql_log(ql_log_warn, vha, 0x70d0,
@@ -2324,8 +2324,8 @@ qla2x00_get_priv_stats(struct bsg_job *bsg_job)
rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, options);
 
if (rval == QLA_SUCCESS) {
-   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e3,
-   (uint8_t *)stats, sizeof(*stats));
+   ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, vha, 0x70e5,
+   stats, sizeof(*stats));
sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
bsg_job->reply_payload.sg_cnt, stats, sizeof(*stats));
}
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 3cfd846cdb2a..94da4b9927e9 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -2520,7 +2520,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
 //
 
 static inline int
-ql_mask_match(uint32_t level)
+ql_mask_match(uint level)
 {
return (level & ql2xextended_error_logging) == level;
 }
@@ -2539,7 +2539,7 @@ ql_mask_match(uint32_t level)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2582,8 +2582,7 @@ ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2619,7 +2618,7 @@ ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
  * msg:   The message to be displayed.
  */
 void
-ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2677,8 +2676,7 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, 
const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-  const char *fmt, ...)
+ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
va_list va;
struct va_format vaf;
@@ -2718,7 +2716,7 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t 
id,
 }
 
 void
-ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
+ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
 {
int i;
struct qla_hw_data *ha = vha->hw;
@@ -2740,13 +2738,12 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, 
int32_t id)
ql_dbg(level, vha, id, "Mailbox registers:\n");
for (i = 0; i < 6; i++, mbx_reg++)
ql_dbg(level, vha, id,
-

[PATCH v4 02/14] qla2xxx: Remove FW default template

2019-03-12 Thread Himanshu Madhani
From: Joe Carnuccio 

This patch removed FW default template as there will
never be case where the default template would be invoked.

Signed-off-by: Joe Carnuccio 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_gbl.h  |   2 -
 drivers/scsi/qla2xxx/qla_init.c |  94 +---
 drivers/scsi/qla2xxx/qla_tmpl.c | 104 +---
 3 files changed, 13 insertions(+), 187 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 4eefe69ca807..0fa0342f39f8 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -613,8 +613,6 @@ extern void qla27xx_fwdump(scsi_qla_host_t *, int);
 extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
 extern int qla27xx_fwdt_template_valid(void *);
 extern ulong qla27xx_fwdt_template_size(void *);
-extern const void *qla27xx_fwdt_template_default(void);
-extern ulong qla27xx_fwdt_template_default_size(void);
 
 extern void qla2x00_dump_regs(scsi_qla_host_t *);
 extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e64d3d2d3c78..fd168c5e17d2 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -7393,7 +7393,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_dbg(ql_dbg_init, vha, 0x0162,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (risc_size - 8) * sizeof(*dcode);
ql_dbg(ql_dbg_init, vha, 0x0163,
@@ -7402,7 +7402,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!ha->fw_dump_template) {
ql_log(ql_log_warn, vha, 0x0164,
"Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto default_template;
+   goto failed;
}
 
faddr += 7;
@@ -7415,7 +7415,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
if (!qla27xx_fwdt_template_valid(dcode)) {
ql_log(ql_log_warn, vha, 0x0165,
"Failed fwdump template validate\n");
-   goto default_template;
+   goto failed;
}
 
dlen = qla27xx_fwdt_template_size(dcode);
@@ -7425,48 +7425,13 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t 
*srisc_addr,
ql_log(ql_log_warn, vha, 0x0167,
"Failed fwdump template exceeds array by %zx bytes\n",
(size_t)(dlen - risc_size * sizeof(*dcode)));
-   goto default_template;
-   }
-   ha->fw_dump_template_len = dlen;
-   return rval;
-
-default_template:
-   ql_log(ql_log_warn, vha, 0x0168, "Using default fwdump template\n");
-   if (ha->fw_dump_template)
-   vfree(ha->fw_dump_template);
-   ha->fw_dump_template = NULL;
-   ha->fw_dump_template_len = 0;
-
-   dlen = qla27xx_fwdt_template_default_size();
-   ql_dbg(ql_dbg_init, vha, 0x0169,
-   "-> template allocating %x bytes...\n", dlen);
-   ha->fw_dump_template = vmalloc(dlen);
-   if (!ha->fw_dump_template) {
-   ql_log(ql_log_warn, vha, 0x016a,
-   "Failed fwdump template allocate %x bytes.\n", risc_size);
-   goto failed_template;
-   }
-
-   dcode = ha->fw_dump_template;
-   risc_size = dlen / sizeof(*dcode);
-   memcpy(dcode, qla27xx_fwdt_template_default(), dlen);
-   for (i = 0; i < risc_size; i++)
-   dcode[i] = be32_to_cpu(dcode[i]);
-
-   if (!qla27xx_fwdt_template_valid(ha->fw_dump_template)) {
-   ql_log(ql_log_warn, vha, 0x016b,
-   "Failed fwdump template validate\n");
-   goto failed_template;
+   goto failed;
}
-
-   dlen = qla27xx_fwdt_template_size(ha->fw_dump_template);
-   ql_dbg(ql_dbg_init, vha, 0x016c,
-   "-> template size %x bytes\n", dlen);
ha->fw_dump_template_len = dlen;
return rval;
 
-failed_template:
-   ql_log(ql_log_warn, vha, 0x016d, "Failed default fwdump template\n");
+failed:
+   ql_log(ql_log_warn, vha, 0x016d, "Failed fwdump template\n");
if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fw_dump_template = NULL;
@@ -7696,7 +7661,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t 
*srisc_addr)
ql_dbg(ql_dbg_init, vha, 0x172,
"-> array size %x dwords\n", risc_size);
if (risc_size == 0 || risc_size == ~0)
-   goto default_template;
+   goto failed;
 
dlen = (

[PATCH 0/2] qla2xxx: fixes for qla2xxx

2019-03-15 Thread Himanshu Madhani
Hi Martin,

These are couple bug fixes for system crash and Target discovery failure
for qla2xxx driver.

Please apply them to 5.1/scsi-fixes branch at your earliest convenience. 

Thanks,
Himanshu 


Himanshu Madhani (1):
  qla2xxx: Fix NULL pointer crash due to stale CPUID

Quinn Tran (1):
  qla2xxx: Fix FC-AL connection target discovery

 drivers/scsi/qla2xxx/qla_init.c | 7 +++
 drivers/scsi/qla2xxx/qla_os.c   | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

-- 
2.12.0



[PATCH 1/2] qla2xxx: Fix FC-AL connection target discovery

2019-03-15 Thread Himanshu Madhani
From: Quinn Tran 

Commit 7f147f9bfd44 fixed N2N target discovery for local loop.
However, same code is used for FC-AL discovery as well. Added check
to make sure we are bypassing area and domain check only in N2N
topology for target discovery.

Fixes: 7f147f9bfd44 ("scsi: qla2xxx: Fix N2N target discovery with Local loop")
Cc: sta...@vger.kernel.org # 5.0+
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_init.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 5b395af1aa22..e64d3d2d3c78 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -4990,6 +4990,13 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
if ((domain & 0xf0) == 0xf0)
continue;
 
+   /* Bypass if not same domain and area of adapter. */
+   if (area && domain && ((area != vha->d_id.b.area) ||
+   (domain != vha->d_id.b.domain)) &&
+   (ha->current_topology == ISP_CFG_NL))
+   continue;
+
+
/* Bypass invalid local loop ID. */
if (loop_id > LAST_LOCAL_LOOP_ID)
continue;
-- 
2.12.0



[PATCH 2/2] qla2xxx: Fix NULL pointer crash due to stale CPUID

2019-03-15 Thread Himanshu Madhani
This patch fixes crash due to NULL pointer derefrence because
CPU pointer is not set and used by driver.  Instead, driver is
passes CPU as tag via ha->isp_ops->{lun_reset|target_reset}

[   30.160780] qla2xxx [:a0:00.1]-8038:9: Cable is unplugged...
[   69.984045] qla2xxx [:a0:00.0]-8009:8: DEVICE RESET ISSUED nexus=8:0:0 
cmd=b0d62f46.
[   69.992849] BUG: unable to handle kernel NULL pointer dereference at 
0040
[   70.000680] PGD 0 P4D 0
[   70.003232] Oops:  [#1] SMP PTI
[   70.006727] CPU: 2 PID: 6714 Comm: sg_reset Kdump: loaded Not tainted 
4.18.0-67.el8.x86_64 #1
[   70.015258] Hardware name: NEC Express5800/T110j [N8100-2758Y]/MX32-PH0-NJ, 
BIOS F11 02/13/2019
[   70.024016] RIP: 0010:blk_mq_rq_cpu+0x9/0x10
[   70.028315] Code: 01 58 01 00 00 48 83 c0 28 48 3d 80 02 00 00 75 ab c3 0f 
1f 44 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48
 8b 47 08 <8b> 40 40 c3 0f 1f 00 0f 1f 44 00 00 48 83 ec 10 48 c7 c6 20 6e 7c
[   70.047087] RSP: 0018:99a481487d58 EFLAGS: 00010246
[   70.052322] RAX:  RBX: c041b08b RCX: 
[   70.059466] RDX:  RSI: 8d10b6b16898 RDI: 8d10b341e400
[   70.066615] RBP: c03a6bd0 R08: 0415 R09: 00aa
[   70.073765] R10: 0001 R11: 0001 R12: 8d10b341e528
[   70.080914] R13: 8d10aadefc00 R14: 8d0f64efa998 R15: 8d0f64efa000
[   70.088083] FS:  7f90a201e540() GS:8d10b6b0() 
knlGS:
[   70.096188] CS:  0010 DS:  ES:  CR0: 80050033
[   70.101959] CR2: 0040 CR3: 000268886005 CR4: 003606e0
[   70.109127] DR0:  DR1:  DR2: 
[   70.116277] DR3:  DR6: fffe0ff0 DR7: 0400
[   70.123425] Call Trace:
[   70.125896]  __qla2xxx_eh_generic_reset+0xb1/0x220 [qla2xxx]
[   70.131572]  scsi_ioctl_reset+0x1f5/0x2a0
[   70.135600]  scsi_ioctl+0x18e/0x397
[   70.139099]  ? sd_ioctl+0x7c/0x100 [sd_mod]
[   70.143287]  blkdev_ioctl+0x32b/0x9f0
[   70.146954]  ? __check_object_size+0xa3/0x181
[   70.151323]  block_ioctl+0x39/0x40
[   70.154735]  do_vfs_ioctl+0xa4/0x630
[   70.158322]  ? syscall_trace_enter+0x1d3/0x2c0
[   70.162769]  ksys_ioctl+0x60/0x90
[   70.166104]  __x64_sys_ioctl+0x16/0x20
[   70.169859]  do_syscall_64+0x5b/0x1b0
[   70.173532]  entry_SYSCALL_64_after_hwframe+0x65/0xca
[   70.178587] RIP: 0033:0x7f90a1b3445b
[   70.182183] Code: 0f 1e fa 48 8b 05 2d aa 2c 00 64 c7 00 26 00 00 00 48 c7 
c0 ff ff ff ff c3 66 0f 1f 44 00 00 f3 0f 1e fa b8 10 00 00
 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d fd a9 2c 00 f7 d8 64 89 01 48
[   70.200956] RSP: 002b:7fffdca88b68 EFLAGS: 0246 ORIG_RAX: 
0010
[   70.208535] RAX: ffda RBX: 0003 RCX: 7f90a1b3445b
[   70.215684] RDX: 7fffdca88b84 RSI: 2284 RDI: 0003
[   70.222833] RBP: 7fffdca88ca8 R08: 7fffdca88b84 R09: 
[   70.229981] R10:  R11: 0246 R12: 7fffdca88b84
[   70.237131] R13:  R14: 55ab09b0bd28 R15: 
[   70.244284] Modules linked in: nft_chain_route_ipv4 xt_CHECKSUM 
nft_chain_nat_ipv4 ipt_MASQUERADE nf_nat_ipv4 nf_nat nf_conntrack_ipv4
 nf_defrag_ipv4 xt_conntrack nf_conntrack libcrc32c ipt_REJECT nf_reject_ipv4 
nft_counter nft_compat tun bridge stp llc nf_tables nfnetli
nk devlink sunrpc vfat fat intel_rapl intel_pmc_core x86_pkg_temp_thermal 
intel_powerclamp coretemp kvm_intel kvm wmi_bmof iTCO_wdt iTCO_
vendor_support irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel 
ipmi_ssif intel_cstate intel_uncore intel_rapl_perf ipmi_si jo
ydev pcspkr ipmi_devintf sg wmi ipmi_msghandler video acpi_power_meter acpi_pad 
mei_me i2c_i801 mei ip_tables ext4 mbcache jbd2 sr_mod cd
rom sd_mod qla2xxx ast i2c_algo_bit drm_kms_helper nvme_fc syscopyarea 
sysfillrect uas sysimgblt fb_sys_fops nvme_fabrics ttm
[   70.314805]  usb_storage nvme_core crc32c_intel scsi_transport_fc ahci drm 
libahci tg3 libata megaraid_sas pinctrl_cannonlake pinctrl_
intel
[   70.327335] CR2: 0040

Fixes: 9cf2bab630765 ("block: kill request ->cpu member")
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_os.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 677f82fdf56f..91f576d743fe 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1517,7 +1517,7 @@ __qla2xxx_eh_generic_reset(char *name, enum 
nexus_wait_type type,
goto eh_reset_failed;
}
err = 2;
-   if (do_reset(fcport, cmd->device->lun, blk_mq_rq_cpu(cmd->request) + 1)
+   if (do_reset(fcport, cmd->device->lun, 1)
!= QLA_SUCCESS) {
ql_log(ql_log_warn, vha, 0x800c,

Re: [PATCH 2/2] qla2xxx: Fix NULL pointer crash due to stale CPUID

2019-03-18 Thread Himanshu Madhani
Hi Ewan, 


On 3/18/19, 6:36 AM, "linux-scsi-ow...@vger.kernel.org on behalf of Ewan D. 
Milne"  wrote:

On Fri, 2019-03-15 at 15:04 -0700, Himanshu Madhani wrote:
> This patch fixes crash due to NULL pointer derefrence because
> CPU pointer is not set and used by driver.  Instead, driver is
> passes CPU as tag via ha->isp_ops->{lun_reset|target_reset}
> 
...
> 
> Fixes: 9cf2bab630765 ("block: kill request ->cpu member")
> Signed-off-by: Himanshu Madhani 
> ---
>  drivers/scsi/qla2xxx/qla_os.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 677f82fdf56f..91f576d743fe 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -1517,7 +1517,7 @@ __qla2xxx_eh_generic_reset(char *name, enum 
nexus_wait_type type,
>   goto eh_reset_failed;
>   }
>   err = 2;
> - if (do_reset(fcport, cmd->device->lun, blk_mq_rq_cpu(cmd->request) + 1)
> + if (do_reset(fcport, cmd->device->lun, 1)
>   != QLA_SUCCESS) {
>   ql_log(ql_log_warn, vha, 0x800c,
>   "do_reset failed for cmd=%p.\n", cmd);

Hi Himanshu-

The 3rd parameter to do_reset() may end up being passed to the HBA in the TM
IOCB in qla2x00_async_tm_cmd().  Can you explain why the CPU number was used
previously and why passing a constant here is sufficient?  Was this not 
needed
in the original implementation or is this a functional change?

-Ewan

In earlier BLK-MQ implementation 3rd field must have some meaning and so driver 
must be setting that value. 
(I could not find history on old implementation). However, with latest updates  
to BLK-MQ, 3rd parameter is
passed as tag in the driver and it's not being used in driver. 

In qla2x00_async_tm_cmd(),  3rd parameter is passed as tag to and its value is 
saved in tm_iocb->u.tmf.data  but
not used in the driver anywhere else, so passing value of 1 is safe here since 
return value from qla2x00_start_sp()
will override this value. 

Thanks,
Himanshu 






Re: [EXT] Re: [PATCH v4 09/14] qla2xxx: Update flash read/write routine

2019-03-20 Thread Himanshu Madhani


On 3/19/19, 11:26 PM, "Nathan Chancellor"  wrote:

External Email

--
On Tue, Mar 12, 2019 at 11:08:18AM -0700, Himanshu Madhani wrote:
> From: Joe Carnuccio 
> 
> This patch made following changes to flash access routines
> - updated return type for read_optrom
> - use void instead of uint32_t * for buffer parameter in read
>   and write optrom routines
> - Fix flash/nvram addressing.
> 
> Signed-off-by: Joe Carnuccio 
> Signed-off-by: Himanshu Madhani 
> ---
>  drivers/scsi/qla2xxx/qla_attr.c |  65 +++---
>  drivers/scsi/qla2xxx/qla_def.h  |   8 +-
>  drivers/scsi/qla2xxx/qla_gbl.h  |  47 ++---
>  drivers/scsi/qla2xxx/qla_init.c |  24 +--
>  drivers/scsi/qla2xxx/qla_nx.c   |  13 +-
>  drivers/scsi/qla2xxx/qla_nx2.c  |   8 +-
>  drivers/scsi/qla2xxx/qla_sup.c  | 443 
+++-
>  7 files changed, 296 insertions(+), 312 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_attr.c 
b/drivers/scsi/qla2xxx/qla_attr.c
> index 3adbb2c1a806..68a52173ed66 100644
> --- a/drivers/scsi/qla2xxx/qla_attr.c
> +++ b/drivers/scsi/qla2xxx/qla_attr.c
> @@ -223,9 +223,9 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct 
kobject *kobj,
>   }
>  
>   /* 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);
> + ha->isp_ops->write_nvram(vha, buf, ha->nvram_base, count);
> + ha->isp_ops->read_nvram(vha, ha->nvram, ha->nvram_base,
> + count);
>   mutex_unlock(&ha->optrom_mutex);
>  
>   ql_dbg(ql_dbg_user, vha, 0x7060,
> @@ -511,22 +511,24 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct 
kobject *kobj,
>   if (!capable(CAP_SYS_ADMIN))
>   return -EINVAL;
>  
> - if (IS_NOCACHE_VPD_TYPE(ha)) {
> - faddr = ha->flt_region_vpd << 2;
> + if (IS_NOCACHE_VPD_TYPE(ha))
> + goto skip;
>  
> - if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
> - qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
> - faddr = ha->flt_region_vpd_sec << 2;
> + faddr = ha->flt_region_vpd << 2;
>  
> - mutex_lock(&ha->optrom_mutex);
> - if (qla2x00_chip_is_down(vha)) {
> - mutex_unlock(&ha->optrom_mutex);
> - return -EAGAIN;
> - }
> - ha->isp_ops->read_optrom(vha, ha->vpd, faddr,
> - ha->vpd_size);
> + if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
> + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE)
> + faddr = ha->flt_region_vpd_sec << 2;
> +
> + mutex_lock(&ha->optrom_mutex);
> + if (qla2x00_chip_is_down(vha)) {
>   mutex_unlock(&ha->optrom_mutex);
> + return -EAGAIN;
>   }
> +
> + ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size);
> + mutex_unlock(&ha->optrom_mutex);
> +skip:
>   return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
>  }
>  
> @@ -563,8 +565,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct 
kobject *kobj,
>   }
>  
>   /* 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);
> + ha->isp_ops->write_nvram(vha, buf, ha->vpd_base, count);
> + ha->isp_ops->read_nvram(vha, ha->vpd, ha->vpd_base, count);
>  
>   /* Update flash version information for 4Gb & above. */
>   if (!IS_FWI2_CAPABLE(ha)) {
> @@ -934,7 +936,7 @@ static struct bin_attribute sysfs_dcbx_tlv_attr = {
>  static struct sysfs_entry {
>   char *name;
>   struct bin_attribute *attr;
> - int is4GBp_only;
> + int type;
>  } bin_file_entries[] = {
>   { "fw_dump", &sysfs_fw_dump_attr, },
>   { "nvram", &sysfs_nvram_attr, },
> @@ -957,11 +959,11 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
>   int ret;
>  
>   for (iter = bin_file_entries; iter->name; iter++) {
> - if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
> + if (iter->type && !I

<    1   2   3   4   5   6   7   8   9   10   >