diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7610515 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/qla2xxx-redhat-10.01.00.20.07.8_k_dup7.7.tar.bz2 diff --git a/.kmod-redhat-qla2xxx.metadata b/.kmod-redhat-qla2xxx.metadata new file mode 100644 index 0000000..9182411 --- /dev/null +++ b/.kmod-redhat-qla2xxx.metadata @@ -0,0 +1 @@ +13023c93d68fd814c84f9c5085e62535bc378b55 SOURCES/qla2xxx-redhat-10.01.00.20.07.8_k_dup7.7.tar.bz2 diff --git a/SOURCES/0001-scsi-scsi-qla2xxx-Add-protection-mask-module-paramet.patch b/SOURCES/0001-scsi-scsi-qla2xxx-Add-protection-mask-module-paramet.patch new file mode 100644 index 0000000..3d0bfbf --- /dev/null +++ b/SOURCES/0001-scsi-scsi-qla2xxx-Add-protection-mask-module-paramet.patch @@ -0,0 +1,94 @@ +From 54e80945f8828a3f55d548d64690713eddb0935a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:21 -0400 +Subject: [PATCH 001/124] [scsi] scsi: qla2xxx: Add protection mask module + parameters + +Message-id: <20190801155618.12650-2-hmadhani@redhat.com> +Patchwork-id: 267795 +O-Subject: [RHEL 7.8 e-stor PATCH 001/118] scsi: qla2xxx: Add protection mask module parameters +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: "Martin K. Petersen" + +Bugzilla 1729270 + +Allow user to selectively enable/disable DIF/DIX protection +capabilities mask. + +Signed-off-by: Martin K. Petersen +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 7855d2ba1172d716d96a628af7c5bafa5725ac57) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 36 ++++++++++++++++++++++++++++-------- + 1 file changed, 28 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index e0c5af693a9e..83abed102cf4 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -284,6 +284,20 @@ MODULE_PARM_DESC(qla2xuseresexchforels, + "Reserve 1/2 of emergency exchanges for ELS.\n" + " 0 (default): disabled"); + ++int ql2xprotmask; ++module_param(ql2xprotmask, int, 0644); ++MODULE_PARM_DESC(ql2xprotmask, ++ "Override DIF/DIX protection capabilities mask\n" ++ "Default is 0 which sets protection mask based on " ++ "capabilities reported by HBA firmware.\n"); ++ ++int ql2xprotguard; ++module_param(ql2xprotguard, int, 0644); ++MODULE_PARM_DESC(ql2xprotguard, "Override choice of DIX checksum\n" ++ " 0 -- Let HBA firmware decide\n" ++ " 1 -- Force T10 CRC\n" ++ " 2 -- Force IP checksum\n"); ++ + /* + * SCSI host template entry points + */ +@@ -3425,13 +3439,16 @@ skip_dpc: + "Registering for DIF/DIX type 1 and 3 protection.\n"); + if (ql2xenabledif == 1) + prot = SHOST_DIX_TYPE0_PROTECTION; +- scsi_host_set_prot(host, +- prot | SHOST_DIF_TYPE1_PROTECTION +- | SHOST_DIF_TYPE2_PROTECTION +- | SHOST_DIF_TYPE3_PROTECTION +- | SHOST_DIX_TYPE1_PROTECTION +- | SHOST_DIX_TYPE2_PROTECTION +- | SHOST_DIX_TYPE3_PROTECTION); ++ if (ql2xprotmask) ++ scsi_host_set_prot(host, ql2xprotmask); ++ else ++ scsi_host_set_prot(host, ++ prot | SHOST_DIF_TYPE1_PROTECTION ++ | SHOST_DIF_TYPE2_PROTECTION ++ | SHOST_DIF_TYPE3_PROTECTION ++ | SHOST_DIX_TYPE1_PROTECTION ++ | SHOST_DIX_TYPE2_PROTECTION ++ | SHOST_DIX_TYPE3_PROTECTION); + + guard = SHOST_DIX_GUARD_CRC; + +@@ -3439,7 +3456,10 @@ skip_dpc: + (ql2xenabledif > 1 || IS_PI_DIFB_DIX0_CAPABLE(ha))) + guard |= SHOST_DIX_GUARD_IP; + +- scsi_host_set_guard(host, guard); ++ if (ql2xprotguard) ++ scsi_host_set_guard(host, ql2xprotguard); ++ else ++ scsi_host_set_guard(host, guard); + } else + base_vha->flags.difdix_supported = 0; + } +-- +2.13.6 + diff --git a/SOURCES/0002-scsi-scsi-qla2xxx-Fix-DMA-error-when-the-DIF-sg-buff.patch b/SOURCES/0002-scsi-scsi-qla2xxx-Fix-DMA-error-when-the-DIF-sg-buff.patch new file mode 100644 index 0000000..5d57632 --- /dev/null +++ b/SOURCES/0002-scsi-scsi-qla2xxx-Fix-DMA-error-when-the-DIF-sg-buff.patch @@ -0,0 +1,806 @@ +From 1d7546da3efa9f06c8236e8a2ce6bd174dde55d1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:22 -0400 +Subject: [PATCH 002/124] [scsi] scsi: qla2xxx: Fix DMA error when the DIF sg + buffer crosses 4GB boundary + +Message-id: <20190801155618.12650-3-hmadhani@redhat.com> +Patchwork-id: 267810 +O-Subject: [RHEL 7.8 e-stor PATCH 002/118] scsi: qla2xxx: Fix DMA error when the DIF sg buffer crosses 4GB boundary +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +When SGE buffer containing DIF information crosses 4G boundary, it results +in DMA error. This patch fixes this issue by calculating SGE buffer size +and if it crosses 4G boundary, driver will split it into multiple SGE +buffers to avoid DMA error. + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 50b812755e9766fa0a1a28533f4d11a34a5b813e) +Signed-off-by: Himanshu Madhani + +[ HM: RH source complains about %llu formatting used in debug ] +[ statement for CS_DMA case, fixed patch for kernel build ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 21 ++- + drivers/scsi/qla2xxx/qla_def.h | 28 ++++ + drivers/scsi/qla2xxx/qla_gbl.h | 3 +- + drivers/scsi/qla2xxx/qla_iocb.c | 335 +++++++++++++++++++++++++++++++------- + drivers/scsi/qla2xxx/qla_isr.c | 11 ++ + drivers/scsi/qla2xxx/qla_os.c | 169 ++++++++++++++++++- + drivers/scsi/qla2xxx/qla_target.c | 2 +- + drivers/scsi/qla2xxx/qla_target.h | 2 + + 8 files changed, 503 insertions(+), 68 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 7dcd34b3a9c4..da8b16469836 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -1003,7 +1003,7 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha, bool stop_beacon) + /* Scsi_Host attributes. */ + + static ssize_t +-qla2x00_drvr_version_show(struct device *dev, ++qla2x00_driver_version_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + return scnprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str); +@@ -2060,7 +2060,21 @@ ql2xiniexchg_store(struct device *dev, struct device_attribute *attr, + return strlen(buf); + } + +-static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); ++static ssize_t ++qla2x00_dif_bundle_statistics_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; ++ ++ return scnprintf(buf, PAGE_SIZE, ++ "cross=%llu read=%llu write=%llu kalloc=%llu dma_alloc=%llu unusable=%u\n", ++ ha->dif_bundle_crossed_pages, ha->dif_bundle_reads, ++ ha->dif_bundle_writes, ha->dif_bundle_kallocs, ++ ha->dif_bundle_dma_allocs, ha->pool.unusable.count); ++} ++ ++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); + static DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL); +@@ -2113,6 +2127,8 @@ static DEVICE_ATTR(zio_threshold, 0644, + static DEVICE_ATTR_RW(qlini_mode); + static DEVICE_ATTR_RW(ql2xexchoffld); + static DEVICE_ATTR_RW(ql2xiniexchg); ++static DEVICE_ATTR(dif_bundle_statistics, 0444, ++ qla2x00_dif_bundle_statistics_show, NULL); + + + struct device_attribute *qla2x00_host_attrs[] = { +@@ -2151,6 +2167,7 @@ struct device_attribute *qla2x00_host_attrs[] = { + &dev_attr_min_link_speed, + &dev_attr_max_speed_sup, + &dev_attr_zio_threshold, ++ &dev_attr_dif_bundle_statistics, + 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 bf0faee77106..39de2d91988e 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -324,6 +324,7 @@ struct srb_cmd { + #define SRB_CRC_PROT_DMA_VALID BIT_4 /* DIF: prot DMA valid */ + #define SRB_CRC_CTX_DSD_VALID BIT_5 /* DIF: dsd_list valid */ + #define SRB_WAKEUP_ON_COMP BIT_6 ++#define SRB_DIF_BUNDL_DMA_VALID BIT_7 /* DIF: DMA list valid */ + + /* To identify if a srb is of T10-CRC type. @sp => srb_t pointer */ + #define IS_PROT_IO(sp) (sp->flags & SRB_CRC_CTX_DSD_VALID) +@@ -1902,6 +1903,13 @@ struct crc_context { + /* List of DMA context transfers */ + struct list_head dsd_list; + ++ /* List of DIF Bundling context DMA address */ ++ struct list_head ldif_dsd_list; ++ u8 no_ldif_dsd; ++ ++ struct list_head ldif_dma_hndl_list; ++ u32 dif_bundl_len; ++ u8 no_dif_bundl; + /* This structure should not exceed 512 bytes */ + }; + +@@ -4194,6 +4202,26 @@ struct qla_hw_data { + uint16_t min_link_speed; + uint16_t max_speed_sup; + ++ /* DMA pool for the DIF bundling buffers */ ++ struct dma_pool *dif_bundl_pool; ++ #define DIF_BUNDLING_DMA_POOL_SIZE 1024 ++ struct { ++ struct { ++ struct list_head head; ++ uint count; ++ } good; ++ struct { ++ struct list_head head; ++ uint count; ++ } unusable; ++ } pool; ++ ++ unsigned long long dif_bundle_crossed_pages; ++ unsigned long long dif_bundle_reads; ++ unsigned long long dif_bundle_writes; ++ unsigned long long dif_bundle_kallocs; ++ unsigned long long dif_bundle_dma_allocs; ++ + atomic_t nvme_active_aen_cnt; + uint16_t nvme_last_rptd_aen; /* Last recorded aen count */ + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 966eebe68584..1e00e93d4066 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -159,6 +159,7 @@ extern int ql2xnvmeenable; + extern int ql2xenablemsix; + extern int qla2xuseresexchforels; + extern int ql2xexlogins; ++extern int ql2xdifbundlinginternalbuffers; + + extern int qla2x00_loop_reset(scsi_qla_host_t *); + extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); +@@ -284,7 +285,7 @@ extern int qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *, srb_t *, + extern int qla24xx_walk_and_build_sglist(struct qla_hw_data *, srb_t *, + uint32_t *, uint16_t, struct qla_tc_param *); + extern int qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *, srb_t *, +- uint32_t *, uint16_t, struct qla_tc_param *); ++ uint32_t *, uint16_t, struct qla_tgt_cmd *); + extern int qla24xx_get_one_block_sg(uint32_t, struct qla2_sgx *, uint32_t *); + extern int qla24xx_configure_prot_mode(srb_t *, uint16_t *); + extern int qla24xx_build_scsi_crc_2_iocbs(srb_t *, +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 24a779db8530..b0ab5d362f64 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -1105,88 +1105,300 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, + + int + qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, +- uint32_t *dsd, uint16_t tot_dsds, struct qla_tc_param *tc) ++ uint32_t *cur_dsd, uint16_t tot_dsds, struct qla_tgt_cmd *tc) + { +- void *next_dsd; +- uint8_t avail_dsds = 0; +- uint32_t dsd_list_len; +- struct dsd_dma *dsd_ptr; ++ struct dsd_dma *dsd_ptr = NULL, *dif_dsd, *nxt_dsd; + struct scatterlist *sg, *sgl; +- int i; +- struct scsi_cmnd *cmd; +- uint32_t *cur_dsd = dsd; +- uint16_t used_dsds = tot_dsds; ++ struct crc_context *difctx = NULL; + struct scsi_qla_host *vha; ++ uint dsd_list_len; ++ uint avail_dsds = 0; ++ uint used_dsds = tot_dsds; ++ bool dif_local_dma_alloc = false; ++ bool direction_to_device = false; ++ int i; + + if (sp) { +- cmd = GET_CMD_SP(sp); ++ struct scsi_cmnd *cmd = GET_CMD_SP(sp); + sgl = scsi_prot_sglist(cmd); + vha = sp->vha; ++ difctx = sp->u.scmd.ctx; ++ direction_to_device = cmd->sc_data_direction == DMA_TO_DEVICE; ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe021, ++ "%s: scsi_cmnd: %p, crc_ctx: %p, sp: %p\n", ++ __func__, cmd, difctx, sp); + } else if (tc) { + vha = tc->vha; + sgl = tc->prot_sg; ++ difctx = tc->ctx; ++ direction_to_device = tc->dma_data_direction == DMA_TO_DEVICE; + } else { + BUG(); + return 1; + } + +- ql_dbg(ql_dbg_tgt, vha, 0xe021, +- "%s: enter\n", __func__); +- +- for_each_sg(sgl, sg, tot_dsds, i) { +- dma_addr_t sle_dma; +- +- /* Allocate additional continuation packets? */ +- if (avail_dsds == 0) { +- avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? +- QLA_DSDS_PER_IOCB : used_dsds; +- dsd_list_len = (avail_dsds + 1) * 12; +- used_dsds -= avail_dsds; +- +- /* allocate tracking DS */ +- dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); +- if (!dsd_ptr) +- return 1; +- +- /* allocate new list */ +- dsd_ptr->dsd_addr = next_dsd = +- dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, +- &dsd_ptr->dsd_list_dma); +- +- if (!next_dsd) { +- /* +- * Need to cleanup only this dsd_ptr, rest +- * will be done by sp_free_dma() +- */ +- kfree(dsd_ptr); +- return 1; ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe021, ++ "%s: enter (write=%u)\n", __func__, direction_to_device); ++ ++ /* 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); ++ ++ /* If SGE addr + len flips bits in upper 32-bits */ ++ if (MSD(sle_phys + sg->length) ^ MSD(sle_phys)) { ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe022, ++ "%s: page boundary crossing (phys=%llx len=%x)\n", ++ __func__, sle_phys, sg->length); ++ ++ if (difctx) { ++ ha->dif_bundle_crossed_pages++; ++ dif_local_dma_alloc = true; ++ } else { ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, ++ vha, 0xe022, ++ "%s: difctx pointer is NULL\n", ++ __func__); ++ } ++ break; ++ } ++ } ++ ha->dif_bundle_writes++; ++ } else { ++ ha->dif_bundle_reads++; ++ } ++ ++ if (ql2xdifbundlinginternalbuffers) ++ dif_local_dma_alloc = direction_to_device; ++ ++ if (dif_local_dma_alloc) { ++ u32 track_difbundl_buf = 0; ++ u32 ldma_sg_len = 0; ++ u8 ldma_needed = 1; ++ ++ difctx->no_dif_bundl = 0; ++ difctx->dif_bundl_len = 0; ++ ++ /* Track DSD buffers */ ++ INIT_LIST_HEAD(&difctx->ldif_dsd_list); ++ /* Track local DMA buffers */ ++ INIT_LIST_HEAD(&difctx->ldif_dma_hndl_list); ++ ++ for_each_sg(sgl, sg, tot_dsds, i) { ++ u32 sglen = sg_dma_len(sg); ++ ++ 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, ++ difctx->dif_bundl_len, ldma_needed); ++ ++ while (sglen) { ++ u32 xfrlen = 0; ++ ++ if (ldma_needed) { ++ /* ++ * Allocate list item to store ++ * the DMA buffers ++ */ ++ dsd_ptr = kzalloc(sizeof(*dsd_ptr), ++ GFP_ATOMIC); ++ if (!dsd_ptr) { ++ ql_dbg(ql_dbg_tgt, vha, 0xe024, ++ "%s: failed alloc dsd_ptr\n", ++ __func__); ++ return 1; ++ } ++ ha->dif_bundle_kallocs++; ++ ++ /* allocate dma buffer */ ++ dsd_ptr->dsd_addr = dma_pool_alloc ++ (ha->dif_bundl_pool, GFP_ATOMIC, ++ &dsd_ptr->dsd_list_dma); ++ if (!dsd_ptr->dsd_addr) { ++ ql_dbg(ql_dbg_tgt, vha, 0xe024, ++ "%s: failed alloc ->dsd_ptr\n", ++ __func__); ++ /* ++ * need to cleanup only this ++ * dsd_ptr rest will be done ++ * by sp_free_dma() ++ */ ++ kfree(dsd_ptr); ++ ha->dif_bundle_kallocs--; ++ return 1; ++ } ++ ha->dif_bundle_dma_allocs++; ++ ldma_needed = 0; ++ difctx->no_dif_bundl++; ++ list_add_tail(&dsd_ptr->list, ++ &difctx->ldif_dma_hndl_list); ++ } ++ ++ /* xfrlen is min of dma pool size and sglen */ ++ xfrlen = (sglen > ++ (DIF_BUNDLING_DMA_POOL_SIZE - ldma_sg_len)) ? ++ DIF_BUNDLING_DMA_POOL_SIZE - ldma_sg_len : ++ sglen; ++ ++ /* replace with local allocated dma buffer */ ++ sg_pcopy_to_buffer(sgl, sg_nents(sgl), ++ dsd_ptr->dsd_addr + ldma_sg_len, xfrlen, ++ difctx->dif_bundl_len); ++ difctx->dif_bundl_len += xfrlen; ++ sglen -= xfrlen; ++ ldma_sg_len += xfrlen; ++ if (ldma_sg_len == DIF_BUNDLING_DMA_POOL_SIZE || ++ sg_is_last(sg)) { ++ ldma_needed = 1; ++ ldma_sg_len = 0; ++ } + } ++ } + +- if (sp) { +- list_add_tail(&dsd_ptr->list, +- &((struct crc_context *) +- sp->u.scmd.ctx)->dsd_list); ++ track_difbundl_buf = used_dsds = difctx->no_dif_bundl; ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe025, ++ "dif_bundl_len=%x, no_dif_bundl=%x track_difbundl_buf: %x\n", ++ difctx->dif_bundl_len, difctx->no_dif_bundl, ++ track_difbundl_buf); + +- sp->flags |= SRB_CRC_CTX_DSD_VALID; +- } else { +- list_add_tail(&dsd_ptr->list, +- &(tc->ctx->dsd_list)); +- *tc->ctx_dsd_alloced = 1; ++ if (sp) ++ sp->flags |= SRB_DIF_BUNDL_DMA_VALID; ++ else ++ tc->prot_flags = DIF_BUNDL_DMA_VALID; ++ ++ list_for_each_entry_safe(dif_dsd, nxt_dsd, ++ &difctx->ldif_dma_hndl_list, list) { ++ u32 sglen = (difctx->dif_bundl_len > ++ DIF_BUNDLING_DMA_POOL_SIZE) ? ++ DIF_BUNDLING_DMA_POOL_SIZE : difctx->dif_bundl_len; ++ ++ BUG_ON(track_difbundl_buf == 0); ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, ++ 0xe024, ++ "%s: adding continuation iocb's\n", ++ __func__); ++ avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? ++ QLA_DSDS_PER_IOCB : used_dsds; ++ dsd_list_len = (avail_dsds + 1) * 12; ++ used_dsds -= avail_dsds; ++ ++ /* allocate tracking DS */ ++ dsd_ptr = kzalloc(sizeof(*dsd_ptr), GFP_ATOMIC); ++ if (!dsd_ptr) { ++ ql_dbg(ql_dbg_tgt, vha, 0xe026, ++ "%s: failed alloc dsd_ptr\n", ++ __func__); ++ return 1; ++ } ++ ha->dif_bundle_kallocs++; ++ ++ difctx->no_ldif_dsd++; ++ /* allocate new list */ ++ dsd_ptr->dsd_addr = ++ dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, ++ &dsd_ptr->dsd_list_dma); ++ if (!dsd_ptr->dsd_addr) { ++ ql_dbg(ql_dbg_tgt, vha, 0xe026, ++ "%s: failed alloc ->dsd_addr\n", ++ __func__); ++ /* ++ * need to cleanup only this dsd_ptr ++ * rest will be done by sp_free_dma() ++ */ ++ kfree(dsd_ptr); ++ ha->dif_bundle_kallocs--; ++ return 1; ++ } ++ ha->dif_bundle_dma_allocs++; ++ ++ if (sp) { ++ list_add_tail(&dsd_ptr->list, ++ &difctx->ldif_dsd_list); ++ sp->flags |= SRB_CRC_CTX_DSD_VALID; ++ } else { ++ list_add_tail(&dsd_ptr->list, ++ &difctx->ldif_dsd_list); ++ tc->ctx_dsd_alloced = 1; ++ } ++ ++ /* add new list to cmd iocb or last list */ ++ *cur_dsd++ = ++ cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); ++ *cur_dsd++ = ++ cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); ++ *cur_dsd++ = dsd_list_len; ++ cur_dsd = dsd_ptr->dsd_addr; + } +- +- /* add new list to cmd iocb or last list */ +- *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = dsd_list_len; +- cur_dsd = (uint32_t *)next_dsd; ++ *cur_dsd++ = cpu_to_le32(LSD(dif_dsd->dsd_list_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(dif_dsd->dsd_list_dma)); ++ *cur_dsd++ = cpu_to_le32(sglen); ++ avail_dsds--; ++ difctx->dif_bundl_len -= sglen; ++ track_difbundl_buf--; + } +- sle_dma = sg_dma_address(sg); +- +- *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); +- *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); +- *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); + +- avail_dsds--; ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe026, ++ "%s: no_ldif_dsd:%x, no_dif_bundl:%x\n", __func__, ++ difctx->no_ldif_dsd, difctx->no_dif_bundl); ++ } else { ++ for_each_sg(sgl, sg, tot_dsds, i) { ++ dma_addr_t sle_dma; ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? ++ QLA_DSDS_PER_IOCB : used_dsds; ++ dsd_list_len = (avail_dsds + 1) * 12; ++ used_dsds -= avail_dsds; ++ ++ /* allocate tracking DS */ ++ dsd_ptr = kzalloc(sizeof(*dsd_ptr), GFP_ATOMIC); ++ if (!dsd_ptr) { ++ ql_dbg(ql_dbg_tgt + ql_dbg_verbose, ++ vha, 0xe027, ++ "%s: failed alloc dsd_dma...\n", ++ __func__); ++ return 1; ++ } ++ ++ /* allocate new list */ ++ dsd_ptr->dsd_addr = ++ dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, ++ &dsd_ptr->dsd_list_dma); ++ if (!dsd_ptr->dsd_addr) { ++ /* need to cleanup only this dsd_ptr */ ++ /* rest will be done by sp_free_dma() */ ++ kfree(dsd_ptr); ++ return 1; ++ } ++ ++ if (sp) { ++ list_add_tail(&dsd_ptr->list, ++ &difctx->dsd_list); ++ sp->flags |= SRB_CRC_CTX_DSD_VALID; ++ } else { ++ list_add_tail(&dsd_ptr->list, ++ &difctx->dsd_list); ++ tc->ctx_dsd_alloced = 1; ++ } ++ ++ /* add new list to cmd iocb or last list */ ++ *cur_dsd++ = ++ cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); ++ *cur_dsd++ = ++ cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); ++ *cur_dsd++ = dsd_list_len; ++ cur_dsd = dsd_ptr->dsd_addr; ++ } ++ sle_dma = sg_dma_address(sg); ++ *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); ++ avail_dsds--; ++ } + } + /* Null termination */ + *cur_dsd++ = 0; +@@ -1194,7 +1406,6 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, + *cur_dsd++ = 0; + return 0; + } +- + /** + * qla24xx_build_scsi_crc_2_iocbs() - Build IOCB command utilizing Command + * Type 6 IOCB types. +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 1c90c3989cc6..d3af28eff7f6 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -2722,6 +2722,17 @@ check_scsi_status: + cp->device->vendor); + break; + ++ case CS_DMA: ++ ql_log(ql_log_info, fcport->vha, 0x3022, ++ "CS_DMA error: 0x%x-0x%x (0x%x) nexus=%ld:%d:%d portid=%06x oxid=0x%x cdb=%10phN len=0x%x rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n", ++ comp_status, scsi_status, res, vha->host_no, ++ cp->device->id, cp->device->lun, fcport->d_id.b24, ++ ox_id, cp->cmnd, scsi_bufflen(cp), rsp_info_len, ++ resid_len, fw_resid_len, sp, cp); ++ ql_dump_buffer(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe0ee, ++ pkt, sizeof(*sts24)); ++ res = DID_ERROR << 16; ++ break; + default: + res = DID_ERROR << 16; + break; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 83abed102cf4..399a9072ae02 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -298,6 +298,13 @@ MODULE_PARM_DESC(ql2xprotguard, "Override choice of DIX checksum\n" + " 1 -- Force T10 CRC\n" + " 2 -- Force IP checksum\n"); + ++int ql2xdifbundlinginternalbuffers; ++module_param(ql2xdifbundlinginternalbuffers, int, 0644); ++MODULE_PARM_DESC(ql2xdifbundlinginternalbuffers, ++ "Force using internal buffers for DIF information\n" ++ "0 (Default). Based on check.\n" ++ "1 Force using internal buffers\n"); ++ + /* + * SCSI host template entry points + */ +@@ -818,7 +825,44 @@ qla2xxx_qpair_sp_free_dma(void *ptr) + ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt; + ha->gbl_dsd_avail += ctx1->dsd_use_cnt; + mempool_free(ctx1, ha->ctx_mempool); ++ sp->flags &= ~SRB_FCP_CMND_DMA_VALID; ++ } ++ if (sp->flags & SRB_DIF_BUNDL_DMA_VALID) { ++ struct crc_context *difctx = sp->u.scmd.ctx; ++ struct dsd_dma *dif_dsd, *nxt_dsd; ++ ++ list_for_each_entry_safe(dif_dsd, nxt_dsd, ++ &difctx->ldif_dma_hndl_list, list) { ++ list_del(&dif_dsd->list); ++ dma_pool_free(ha->dif_bundl_pool, dif_dsd->dsd_addr, ++ dif_dsd->dsd_list_dma); ++ kfree(dif_dsd); ++ difctx->no_dif_bundl--; ++ } ++ ++ list_for_each_entry_safe(dif_dsd, nxt_dsd, ++ &difctx->ldif_dsd_list, list) { ++ list_del(&dif_dsd->list); ++ dma_pool_free(ha->dl_dma_pool, dif_dsd->dsd_addr, ++ dif_dsd->dsd_list_dma); ++ kfree(dif_dsd); ++ difctx->no_ldif_dsd--; ++ } ++ ++ if (difctx->no_ldif_dsd) { ++ ql_dbg(ql_dbg_tgt+ql_dbg_verbose, sp->vha, 0xe022, ++ "%s: difctx->no_ldif_dsd=%x\n", ++ __func__, difctx->no_ldif_dsd); ++ } ++ ++ if (difctx->no_dif_bundl) { ++ ql_dbg(ql_dbg_tgt+ql_dbg_verbose, sp->vha, 0xe022, ++ "%s: difctx->no_dif_bundl=%x\n", ++ __func__, difctx->no_dif_bundl); ++ } ++ sp->flags &= ~SRB_DIF_BUNDL_DMA_VALID; + } ++ + end: + CMD_SP(cmd) = NULL; + qla2xxx_rel_qpair_sp(sp->qpair, sp); +@@ -4104,9 +4148,86 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, + "Failed to allocate memory for fcp_cmnd_dma_pool.\n"); + goto fail_dl_dma_pool; + } ++ ++ if (ql2xenabledif) { ++ u64 bufsize = DIF_BUNDLING_DMA_POOL_SIZE; ++ struct dsd_dma *dsd, *nxt; ++ uint i; ++ /* Creata a DMA pool of buffers for DIF bundling */ ++ ha->dif_bundl_pool = dma_pool_create(name, ++ &ha->pdev->dev, DIF_BUNDLING_DMA_POOL_SIZE, 8, 0); ++ if (!ha->dif_bundl_pool) { ++ ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0024, ++ "%s: failed create dif_bundl_pool\n", ++ __func__); ++ goto fail_dif_bundl_dma_pool; ++ } ++ ++ INIT_LIST_HEAD(&ha->pool.good.head); ++ INIT_LIST_HEAD(&ha->pool.unusable.head); ++ ha->pool.good.count = 0; ++ ha->pool.unusable.count = 0; ++ for (i = 0; i < 128; i++) { ++ dsd = kzalloc(sizeof(*dsd), GFP_ATOMIC); ++ if (!dsd) { ++ ql_dbg_pci(ql_dbg_init, ha->pdev, ++ 0xe0ee, "%s: failed alloc dsd\n", ++ __func__); ++ return 1; ++ } ++ ha->dif_bundle_kallocs++; ++ ++ dsd->dsd_addr = dma_pool_alloc( ++ ha->dif_bundl_pool, GFP_ATOMIC, ++ &dsd->dsd_list_dma); ++ if (!dsd->dsd_addr) { ++ ql_dbg_pci(ql_dbg_init, ha->pdev, ++ 0xe0ee, ++ "%s: failed alloc ->dsd_addr\n", ++ __func__); ++ kfree(dsd); ++ ha->dif_bundle_kallocs--; ++ continue; ++ } ++ ha->dif_bundle_dma_allocs++; ++ ++ /* ++ * if DMA buffer crosses 4G boundary, ++ * put it on bad list ++ */ ++ if (MSD(dsd->dsd_list_dma) ^ ++ MSD(dsd->dsd_list_dma + bufsize)) { ++ list_add_tail(&dsd->list, ++ &ha->pool.unusable.head); ++ ha->pool.unusable.count++; ++ } else { ++ list_add_tail(&dsd->list, ++ &ha->pool.good.head); ++ ha->pool.good.count++; ++ } ++ } ++ ++ /* return the good ones back to the pool */ ++ list_for_each_entry_safe(dsd, nxt, ++ &ha->pool.good.head, list) { ++ list_del(&dsd->list); ++ dma_pool_free(ha->dif_bundl_pool, ++ dsd->dsd_addr, dsd->dsd_list_dma); ++ ha->dif_bundle_dma_allocs--; ++ kfree(dsd); ++ ha->dif_bundle_kallocs--; ++ } ++ ++ ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0024, ++ "%s: dif dma pool (good=%u unusable=%u)\n", ++ __func__, ha->pool.good.count, ++ ha->pool.unusable.count); ++ } ++ + ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0025, +- "dl_dma_pool=%p fcp_cmnd_dma_pool=%p.\n", +- ha->dl_dma_pool, ha->fcp_cmnd_dma_pool); ++ "dl_dma_pool=%p fcp_cmnd_dma_pool=%p dif_bundl_pool=%p.\n", ++ ha->dl_dma_pool, ha->fcp_cmnd_dma_pool, ++ ha->dif_bundl_pool); + } + + /* Allocate memory for SNS commands */ +@@ -4269,6 +4390,24 @@ fail_free_ms_iocb: + dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt), + ha->sns_cmd, ha->sns_cmd_dma); + fail_dma_pool: ++ if (ql2xenabledif) { ++ struct dsd_dma *dsd, *nxt; ++ ++ list_for_each_entry_safe(dsd, nxt, &ha->pool.unusable.head, ++ list) { ++ list_del(&dsd->list); ++ dma_pool_free(ha->dif_bundl_pool, dsd->dsd_addr, ++ dsd->dsd_list_dma); ++ ha->dif_bundle_dma_allocs--; ++ kfree(dsd); ++ ha->dif_bundle_kallocs--; ++ ha->pool.unusable.count--; ++ } ++ dma_pool_destroy(ha->dif_bundl_pool); ++ ha->dif_bundl_pool = NULL; ++ } ++ ++fail_dif_bundl_dma_pool: + if (IS_QLA82XX(ha) || ql2xenabledif) { + dma_pool_destroy(ha->fcp_cmnd_dma_pool); + ha->fcp_cmnd_dma_pool = NULL; +@@ -4657,6 +4796,32 @@ qla2x00_mem_free(struct qla_hw_data *ha) + if (ha->ctx_mempool) + mempool_destroy(ha->ctx_mempool); + ++ if (ql2xenabledif) { ++ struct dsd_dma *dsd, *nxt; ++ ++ list_for_each_entry_safe(dsd, nxt, &ha->pool.unusable.head, ++ list) { ++ list_del(&dsd->list); ++ dma_pool_free(ha->dif_bundl_pool, dsd->dsd_addr, ++ dsd->dsd_list_dma); ++ ha->dif_bundle_dma_allocs--; ++ kfree(dsd); ++ ha->dif_bundle_kallocs--; ++ ha->pool.unusable.count--; ++ } ++ list_for_each_entry_safe(dsd, nxt, &ha->pool.good.head, list) { ++ list_del(&dsd->list); ++ dma_pool_free(ha->dif_bundl_pool, dsd->dsd_addr, ++ dsd->dsd_list_dma); ++ ha->dif_bundle_dma_allocs--; ++ kfree(dsd); ++ ha->dif_bundle_kallocs--; ++ } ++ } ++ ++ if (ha->dif_bundl_pool) ++ dma_pool_destroy(ha->dif_bundl_pool); ++ + qlt_mem_free(ha); + + if (ha->init_cb) +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index c915a8743297..a4ab3401a90b 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -3226,7 +3226,7 @@ qlt_build_ctio_crc2_pkt(struct qla_qpair *qpair, struct qla_tgt_prm *prm) + + cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address; + if (qla24xx_walk_and_build_prot_sglist(ha, NULL, cur_dsd, +- prm->prot_seg_cnt, &tc)) ++ prm->prot_seg_cnt, cmd)) + goto crc_queuing_error; + } + return QLA_SUCCESS; +diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h +index dd7150da9a1a..c0bc02a4caf6 100644 +--- a/drivers/scsi/qla2xxx/qla_target.h ++++ b/drivers/scsi/qla2xxx/qla_target.h +@@ -937,6 +937,8 @@ struct qla_tgt_cmd { + uint64_t lba; + uint16_t a_guard, e_guard, a_app_tag, e_app_tag; + uint32_t a_ref_tag, e_ref_tag; ++#define DIF_BUNDL_DMA_VALID 1 ++ uint16_t prot_flags; + + uint64_t jiffies_at_alloc; + uint64_t jiffies_at_free; +-- +2.13.6 + diff --git a/SOURCES/0003-scsi-scsi-qla2xxx-no-need-to-check-return-value-of-d.patch b/SOURCES/0003-scsi-scsi-qla2xxx-no-need-to-check-return-value-of-d.patch new file mode 100644 index 0000000..7254843 --- /dev/null +++ b/SOURCES/0003-scsi-scsi-qla2xxx-no-need-to-check-return-value-of-d.patch @@ -0,0 +1,108 @@ +From 11694254382d164d707f40068498c35cb33c85ba Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:23 -0400 +Subject: [PATCH 003/124] [scsi] scsi: qla2xxx: no need to check return value + of debugfs_create functions + +Message-id: <20190801155618.12650-4-hmadhani@redhat.com> +Patchwork-id: 267780 +O-Subject: [RHEL 7.8 e-stor PATCH 003/118] scsi: qla2xxx: no need to check return value of debugfs_create functions +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Greg Kroah-Hartman + +Bugzilla 1729270 + +When calling debugfs functions, there is no need to ever check the return +value. The function can work or not, but the code logic should never do +something different based on this. + +Cc: qla2xxx-upstream@qlogic.com +Cc: "James E.J. Bottomley" +Cc: "Martin K. Petersen" +Cc: linux-scsi@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Martin K. Petersen +(cherry picked from commit b45a3a428f559082418b182d35fc20a49b647c75) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_dfs.c | 35 ----------------------------------- + 1 file changed, 35 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c +index efb3a3c271ab..8688372955a0 100644 +--- a/drivers/scsi/qla2xxx/qla_dfs.c ++++ b/drivers/scsi/qla2xxx/qla_dfs.c +@@ -371,11 +371,6 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) + + atomic_set(&qla2x00_dfs_root_count, 0); + qla2x00_dfs_root = debugfs_create_dir(QLA2XXX_DRIVER_NAME, NULL); +- if (!qla2x00_dfs_root) { +- ql_log(ql_log_warn, vha, 0x00f7, +- "Unable to create debugfs root directory.\n"); +- goto out; +- } + + create_dir: + if (ha->dfs_dir) +@@ -383,54 +378,24 @@ create_dir: + + mutex_init(&ha->fce_mutex); + ha->dfs_dir = debugfs_create_dir(vha->host_str, qla2x00_dfs_root); +- if (!ha->dfs_dir) { +- ql_log(ql_log_warn, vha, 0x00f8, +- "Unable to create debugfs ha directory.\n"); +- goto out; +- } + + atomic_inc(&qla2x00_dfs_root_count); + + create_nodes: + ha->dfs_fw_resource_cnt = debugfs_create_file("fw_resource_count", + S_IRUSR, ha->dfs_dir, vha, &dfs_fw_resource_cnt_ops); +- if (!ha->dfs_fw_resource_cnt) { +- ql_log(ql_log_warn, vha, 0x00fd, +- "Unable to create debugFS fw_resource_count node.\n"); +- goto out; +- } + + ha->dfs_tgt_counters = debugfs_create_file("tgt_counters", S_IRUSR, + ha->dfs_dir, vha, &dfs_tgt_counters_ops); +- if (!ha->dfs_tgt_counters) { +- ql_log(ql_log_warn, vha, 0xd301, +- "Unable to create debugFS tgt_counters node.\n"); +- goto out; +- } + + ha->tgt.dfs_tgt_port_database = debugfs_create_file("tgt_port_database", + S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_port_database_ops); +- if (!ha->tgt.dfs_tgt_port_database) { +- ql_log(ql_log_warn, vha, 0xd03f, +- "Unable to create debugFS tgt_port_database node.\n"); +- goto out; +- } + + ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha, + &dfs_fce_ops); +- if (!ha->dfs_fce) { +- ql_log(ql_log_warn, vha, 0x00f9, +- "Unable to create debugfs fce node.\n"); +- goto out; +- } + + ha->tgt.dfs_tgt_sess = debugfs_create_file("tgt_sess", + S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_sess_ops); +- if (!ha->tgt.dfs_tgt_sess) { +- ql_log(ql_log_warn, vha, 0xd040, +- "Unable to create debugFS tgt_sess node.\n"); +- goto out; +- } + + out: + return 0; +-- +2.13.6 + diff --git a/SOURCES/0004-scsi-scsi-qla2xxx-Fix-N2N-target-discovery-with-Loca.patch b/SOURCES/0004-scsi-scsi-qla2xxx-Fix-N2N-target-discovery-with-Loca.patch new file mode 100644 index 0000000..daf9a68 --- /dev/null +++ b/SOURCES/0004-scsi-scsi-qla2xxx-Fix-N2N-target-discovery-with-Loca.patch @@ -0,0 +1,48 @@ +From 8f9ae1255deec72bc9051c516d3bf45c8e16d5ec Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:24 -0400 +Subject: [PATCH 004/124] [scsi] scsi: qla2xxx: Fix N2N target discovery with + Local loop + +Message-id: <20190801155618.12650-5-hmadhani@redhat.com> +Patchwork-id: 267782 +O-Subject: [RHEL 7.8 e-stor PATCH 004/118] scsi: qla2xxx: Fix N2N target discovery with Local loop +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +This patch fixes the issue where Dell-EMC Target will fail to discover LUNs +if domain and area of port ID is not same as adapter's. + +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 7f147f9bfd44d048e22e8c65877d2b5590e6cf3d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index b72657dad815..a047c0c0500f 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4974,11 +4974,6 @@ 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)) +- continue; +- + /* Bypass invalid local loop ID. */ + if (loop_id > LAST_LOCAL_LOOP_ID) + continue; +-- +2.13.6 + diff --git a/SOURCES/0005-scsi-scsi-qla2xxx-Change-default-ZIO-threshold.patch b/SOURCES/0005-scsi-scsi-qla2xxx-Change-default-ZIO-threshold.patch new file mode 100644 index 0000000..e9b8c4c --- /dev/null +++ b/SOURCES/0005-scsi-scsi-qla2xxx-Change-default-ZIO-threshold.patch @@ -0,0 +1,44 @@ +From f5a5b4ed97406ad595a0d511f50e7273a49a9fef Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:25 -0400 +Subject: [PATCH 005/124] [scsi] scsi: qla2xxx: Change default ZIO threshold + +Message-id: <20190801155618.12650-6-hmadhani@redhat.com> +Patchwork-id: 267779 +O-Subject: [RHEL 7.8 e-stor PATCH 005/118] scsi: qla2xxx: Change default ZIO threshold. +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Change default ZIO threshold to an optimized value. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 4825034afba894cc2533e91ff411bfd5b49a632c) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 39de2d91988e..5e580b4c6ae2 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4227,7 +4227,7 @@ struct qla_hw_data { + + atomic_t zio_threshold; + uint16_t last_zio_threshold; +-#define DEFAULT_ZIO_THRESHOLD 64 ++#define DEFAULT_ZIO_THRESHOLD 5 + }; + + #define FW_ABILITY_MAX_SPEED_MASK 0xFUL +-- +2.13.6 + diff --git a/SOURCES/0006-scsi-scsi-qla2xxx-Fix-session-cleanup-hang.patch b/SOURCES/0006-scsi-scsi-qla2xxx-Fix-session-cleanup-hang.patch new file mode 100644 index 0000000..1fcc486 --- /dev/null +++ b/SOURCES/0006-scsi-scsi-qla2xxx-Fix-session-cleanup-hang.patch @@ -0,0 +1,119 @@ +From dd167cef787e435604d9553b022a8328b8c167dc Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:26 -0400 +Subject: [PATCH 006/124] [scsi] scsi: qla2xxx: Fix session cleanup hang + +Message-id: <20190801155618.12650-7-hmadhani@redhat.com> +Patchwork-id: 267790 +O-Subject: [RHEL 7.8 e-stor PATCH 006/118] scsi: qla2xxx: Fix session cleanup hang +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +On session cleanup, either an implicit LOGO or an implicit PRLO is used to +flush IOs. If the flush command hit Queue Full condition, then it is +dropped. This patch adds retry code to prevent command drop. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 80676d054e5a945f8192802b68093764fbf3c5fc) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_iocb.c | 5 ++--- + drivers/scsi/qla2xxx/qla_os.c | 17 +++++++++++++---- + 2 files changed, 15 insertions(+), 7 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index b0ab5d362f64..348d9d3bf590 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -3716,23 +3716,22 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx *logio) + int + qla2x00_start_sp(srb_t *sp) + { +- int rval; ++ int rval = QLA_SUCCESS; + scsi_qla_host_t *vha = sp->vha; + struct qla_hw_data *ha = vha->hw; + struct qla_qpair *qp = sp->qpair; + void *pkt; + unsigned long flags; + +- rval = QLA_FUNCTION_FAILED; + spin_lock_irqsave(qp->qp_lock_ptr, flags); + pkt = __qla2x00_alloc_iocbs(sp->qpair, sp); + if (!pkt) { ++ rval = EAGAIN; + ql_log(ql_log_warn, vha, 0x700c, + "qla2x00_alloc_iocbs failed.\n"); + goto done; + } + +- rval = QLA_SUCCESS; + switch (sp->type) { + case SRB_LOGIN_CMD: + IS_FWI2_CAPABLE(ha) ? +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 399a9072ae02..ee09796b9847 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5298,14 +5298,14 @@ qla2x00_do_work(struct scsi_qla_host *vha) + struct qla_work_evt *e, *tmp; + unsigned long flags; + LIST_HEAD(work); ++ int rc; + + spin_lock_irqsave(&vha->work_lock, flags); + list_splice_init(&vha->work_list, &work); + spin_unlock_irqrestore(&vha->work_lock, flags); + + list_for_each_entry_safe(e, tmp, &work, list) { +- list_del_init(&e->list); +- ++ rc = QLA_SUCCESS; + switch (e->type) { + case QLA_EVT_AEN: + fc_host_post_event(vha->host, fc_get_event_number(), +@@ -5319,7 +5319,7 @@ qla2x00_do_work(struct scsi_qla_host *vha) + e->u.logio.data); + break; + case QLA_EVT_ASYNC_LOGOUT: +- qla2x00_async_logout(vha, e->u.logio.fcport); ++ rc = qla2x00_async_logout(vha, e->u.logio.fcport); + break; + case QLA_EVT_ASYNC_LOGOUT_DONE: + qla2x00_async_logout_done(vha, e->u.logio.fcport, +@@ -5364,7 +5364,7 @@ qla2x00_do_work(struct scsi_qla_host *vha) + qla24xx_do_nack_work(vha, e); + break; + case QLA_EVT_ASYNC_PRLO: +- qla2x00_async_prlo(vha, e->u.logio.fcport); ++ rc = qla2x00_async_prlo(vha, e->u.logio.fcport); + break; + case QLA_EVT_ASYNC_PRLO_DONE: + qla2x00_async_prlo_done(vha, e->u.logio.fcport, +@@ -5397,6 +5397,15 @@ qla2x00_do_work(struct scsi_qla_host *vha) + e->u.fcport.fcport, false); + break; + } ++ ++ if (rc == EAGAIN) { ++ /* put 'work' at head of 'vha->work_list' */ ++ spin_lock_irqsave(&vha->work_lock, flags); ++ list_splice(&work, &vha->work_list); ++ spin_unlock_irqrestore(&vha->work_lock, flags); ++ break; ++ } ++ list_del_init(&e->list); + if (e->flags & QLA_EVT_FLAG_FREE) + kfree(e); + +-- +2.13.6 + diff --git a/SOURCES/0007-scsi-scsi-qla2xxx-flush-IO-on-chip-reset-or-sess-del.patch b/SOURCES/0007-scsi-scsi-qla2xxx-flush-IO-on-chip-reset-or-sess-del.patch new file mode 100644 index 0000000..452a7b5 --- /dev/null +++ b/SOURCES/0007-scsi-scsi-qla2xxx-flush-IO-on-chip-reset-or-sess-del.patch @@ -0,0 +1,56 @@ +From 236552af719bde2cc49c85a0e594389040299754 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:27 -0400 +Subject: [PATCH 007/124] [scsi] scsi: qla2xxx: flush IO on chip reset or sess + delete + +Message-id: <20190801155618.12650-8-hmadhani@redhat.com> +Patchwork-id: 267781 +O-Subject: [RHEL 7.8 e-stor PATCH 007/118] scsi: qla2xxx: flush IO on chip reset or sess delete +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +On Transmit respond in target mode, if the chip is already reset or the +session is already deleted, then advance the command to the free step. +There is no need to abort the command, because the chip has already flushed +it. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 51fd6e6351a62da87a7eb7b059d34056d73e68e5) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index a4ab3401a90b..7faa33e21543 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -3253,13 +3253,10 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type, + unsigned long flags = 0; + int res; + +- if (cmd->sess && cmd->sess->deleted) { ++ if (!qpair->fw_started || (cmd->reset_count != qpair->chip_reset) || ++ (cmd->sess && cmd->sess->deleted)) { + cmd->state = QLA_TGT_STATE_PROCESSED; +- if (cmd->sess->logout_completed) +- /* no need to terminate. FW already freed exchange. */ +- qlt_abort_cmd_on_host_reset(cmd->vha, cmd); +- else +- qlt_send_term_exchange(qpair, cmd, &cmd->atio, 0, 0); ++ qlt_abort_cmd_on_host_reset(cmd->vha, cmd); + return 0; + } + +-- +2.13.6 + diff --git a/SOURCES/0008-scsi-scsi-qla2xxx-fix-fcport-null-pointer-access.patch b/SOURCES/0008-scsi-scsi-qla2xxx-fix-fcport-null-pointer-access.patch new file mode 100644 index 0000000..eaac463 --- /dev/null +++ b/SOURCES/0008-scsi-scsi-qla2xxx-fix-fcport-null-pointer-access.patch @@ -0,0 +1,76 @@ +From 5a596997bebb5296b412c648e1c99083ab6943cc Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:28 -0400 +Subject: [PATCH 008/124] [scsi] scsi: qla2xxx: fix fcport null pointer access + +Message-id: <20190801155618.12650-9-hmadhani@redhat.com> +Patchwork-id: 267785 +O-Subject: [RHEL 7.8 e-stor PATCH 008/118] scsi: qla2xxx: fix fcport null pointer access. +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +This patch allocates DMA memory to prevent NULL pointer access for ct_sns +request while sending switch commands. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 9ecd6564d1547d64fec464fdae75c82794c94c51) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index a047c0c0500f..6f03fb7c2f94 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4683,6 +4683,16 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags) + if (!fcport) + return NULL; + ++ fcport->ct_desc.ct_sns = dma_alloc_coherent(&vha->hw->pdev->dev, ++ sizeof(struct ct_sns_pkt), &fcport->ct_desc.ct_sns_dma, ++ flags); ++ if (!fcport->ct_desc.ct_sns) { ++ ql_log(ql_log_warn, vha, 0xd049, ++ "Failed to allocate ct_sns request.\n"); ++ kfree(fcport); ++ return NULL; ++ } ++ + /* Setup fcport template structure. */ + fcport->vha = vha; + fcport->port_type = FCT_UNKNOWN; +@@ -4691,13 +4701,11 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags) + fcport->supported_classes = FC_COS_UNSPECIFIED; + fcport->fp_speed = PORT_SPEED_UNKNOWN; + +- fcport->ct_desc.ct_sns = dma_alloc_coherent(&vha->hw->pdev->dev, +- sizeof(struct ct_sns_pkt), &fcport->ct_desc.ct_sns_dma, +- flags); + fcport->disc_state = DSC_DELETED; + fcport->fw_login_state = DSC_LS_PORT_UNAVAIL; + fcport->deleted = QLA_SESS_DELETED; + fcport->login_retry = vha->hw->login_retry_count; ++ fcport->chip_reset = vha->hw->base_qpair->chip_reset; + fcport->logout_on_delete = 1; + + if (!fcport->ct_desc.ct_sns) { +@@ -4706,6 +4714,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags) + kfree(fcport); + fcport = NULL; + } ++ + INIT_WORK(&fcport->del_work, qla24xx_delete_sess_fn); + INIT_WORK(&fcport->reg_work, qla_register_fcport_fn); + INIT_LIST_HEAD(&fcport->gnl_entry); +-- +2.13.6 + diff --git a/SOURCES/0009-scsi-scsi-qla2xxx-allow-session-delete-to-finish-bef.patch b/SOURCES/0009-scsi-scsi-qla2xxx-allow-session-delete-to-finish-bef.patch new file mode 100644 index 0000000..91aab28 --- /dev/null +++ b/SOURCES/0009-scsi-scsi-qla2xxx-allow-session-delete-to-finish-bef.patch @@ -0,0 +1,47 @@ +From 11613e70fb041a40c8b0738ba81c774320142886 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:29 -0400 +Subject: [PATCH 009/124] [scsi] scsi: qla2xxx: allow session delete to finish + before create + +Message-id: <20190801155618.12650-10-hmadhani@redhat.com> +Patchwork-id: 267784 +O-Subject: [RHEL 7.8 e-stor PATCH 009/118] scsi: qla2xxx: allow session delete to finish before create. +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +This patch flushes del_work and free_work while sending NACK response for +PRLI + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 1021f0bc2f3d6ac80a33aac0059dce8fd1622235) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 7faa33e21543..116596eb7c2c 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -677,6 +677,9 @@ void qla24xx_do_nack_work(struct scsi_qla_host *vha, struct qla_work_evt *e) + + switch (e->u.nack.type) { + case SRB_NACK_PRLI: ++ t = e->u.nack.fcport; ++ flush_work(&t->del_work); ++ flush_work(&t->free_work); + mutex_lock(&vha->vha_tgt.tgt_mutex); + t = qlt_create_sess(vha, e->u.nack.fcport, 0); + mutex_unlock(&vha->vha_tgt.tgt_mutex); +-- +2.13.6 + diff --git a/SOURCES/0010-scsi-scsi-qla2xxx-Fix-SRB-allocation-flag-to-avoid-s.patch b/SOURCES/0010-scsi-scsi-qla2xxx-Fix-SRB-allocation-flag-to-avoid-s.patch new file mode 100644 index 0000000..c92987f --- /dev/null +++ b/SOURCES/0010-scsi-scsi-qla2xxx-Fix-SRB-allocation-flag-to-avoid-s.patch @@ -0,0 +1,46 @@ +From 4c2caab4947be05570508e3fd6a00d5413cde338 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:30 -0400 +Subject: [PATCH 010/124] [scsi] scsi: qla2xxx: Fix SRB allocation flag to + avoid sleeping in IRQ context + +Message-id: <20190801155618.12650-11-hmadhani@redhat.com> +Patchwork-id: 267791 +O-Subject: [RHEL 7.8 e-stor PATCH 010/118] scsi: qla2xxx: Fix SRB allocation flag to avoid sleeping in IRQ context +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch fixes SRB allocation flag from GFP_KERNEL to GFP_ATOMIC, to +prevent sleeping in IRQ context + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 97a93cea887376e13ea7d473ab349181850f4e39) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 6f03fb7c2f94..236709a59267 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1743,7 +1743,7 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) + int rval = QLA_FUNCTION_FAILED; + + sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport, +- GFP_KERNEL); ++ GFP_ATOMIC); + if (!sp) + goto done; + +-- +2.13.6 + diff --git a/SOURCES/0011-scsi-scsi-qla2xxx-Prevent-memory-leak-for-CT-req-rsp.patch b/SOURCES/0011-scsi-scsi-qla2xxx-Prevent-memory-leak-for-CT-req-rsp.patch new file mode 100644 index 0000000..0281e42 --- /dev/null +++ b/SOURCES/0011-scsi-scsi-qla2xxx-Prevent-memory-leak-for-CT-req-rsp.patch @@ -0,0 +1,62 @@ +From 87102eb5c2bcf55509bf16e0e562fd3655025152 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:31 -0400 +Subject: [PATCH 011/124] [scsi] scsi: qla2xxx: Prevent memory leak for CT + req/rsp allocation + +Message-id: <20190801155618.12650-12-hmadhani@redhat.com> +Patchwork-id: 267787 +O-Subject: [RHEL 7.8 e-stor PATCH 011/118] scsi: qla2xxx: Prevent memory leak for CT req/rsp allocation +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +This patch fixes memory leak by releasing DMA memory in case CT request and +response allocation fails. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5e85f6df77223f69e738b815558ca01e6891a173) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index f39bc6dd445a..57eada4e50ee 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -4157,7 +4157,8 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) + spin_lock_irqsave(&vha->work_lock, flags); + vha->scan.scan_flags &= ~SF_SCANNING; + spin_unlock_irqrestore(&vha->work_lock, flags); +- goto done_free_sp; ++ qla2x00_rel_sp(sp); ++ return rval; + } + sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE; + +@@ -4175,7 +4176,13 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) + spin_lock_irqsave(&vha->work_lock, flags); + vha->scan.scan_flags &= ~SF_SCANNING; + spin_unlock_irqrestore(&vha->work_lock, flags); +- goto done_free_sp; ++ dma_free_coherent(&vha->hw->pdev->dev, ++ sp->u.iocb_cmd.u.ctarg.req_allocated_size, ++ sp->u.iocb_cmd.u.ctarg.req, ++ sp->u.iocb_cmd.u.ctarg.req_dma); ++ sp->u.iocb_cmd.u.ctarg.req = NULL; ++ qla2x00_rel_sp(sp); ++ return rval; + } + sp->u.iocb_cmd.u.ctarg.rsp_size = rspsz; + +-- +2.13.6 + diff --git a/SOURCES/0012-scsi-scsi-qla2xxx-Restore-FAWWPN-of-Physical-Port-on.patch b/SOURCES/0012-scsi-scsi-qla2xxx-Restore-FAWWPN-of-Physical-Port-on.patch new file mode 100644 index 0000000..43b30c7 --- /dev/null +++ b/SOURCES/0012-scsi-scsi-qla2xxx-Restore-FAWWPN-of-Physical-Port-on.patch @@ -0,0 +1,51 @@ +From d5fb625b45bc7b96530fe7e537be19e2f02945e1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:32 -0400 +Subject: [PATCH 012/124] [scsi] scsi: qla2xxx: Restore FAWWPN of Physical Port + only for loop down + +Message-id: <20190801155618.12650-13-hmadhani@redhat.com> +Patchwork-id: 267786 +O-Subject: [RHEL 7.8 e-stor PATCH 012/118] scsi: qla2xxx: Restore FAWWPN of Physical Port only for loop down +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Sawan Chandak + +Bugzilla 1729270 + +When loop was made down explicitly due to cable pull, then for N2N toplogy, +if FAWWPN BIT is enabled by user, then it would restore some default +(garbage) value for Physical port WWPN, so this show garbage WWPN for the +port. Fix is, to restore physical port WWPN, if it is fabric +configuration. When loop is explicitly made down, and FAWWPN feature is +enabled, then driver need to restore original flashed WWPN. + +Signed-off-by: Sawan Chandak +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit dcbf8f8087ebc4d721fd55c4c2072f1a97f6ef6d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_isr.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index d3af28eff7f6..8e5467ee957d 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -833,7 +833,8 @@ skip_rio: + * Restore for Physical Port only + */ + if (!vha->vp_idx) { +- if (ha->flags.fawwpn_enabled) { ++ if (ha->flags.fawwpn_enabled && ++ (ha->current_topology == ISP_CFG_F)) { + void *wwpn = ha->init_cb->port_name; + memcpy(vha->port_name, wwpn, WWN_SIZE); + fc_host_port_name(vha->host) = +-- +2.13.6 + diff --git a/SOURCES/0013-scsi-scsi-qla2xxx-Fix-fw-options-handle-eh_bus_reset.patch b/SOURCES/0013-scsi-scsi-qla2xxx-Fix-fw-options-handle-eh_bus_reset.patch new file mode 100644 index 0000000..50d2667 --- /dev/null +++ b/SOURCES/0013-scsi-scsi-qla2xxx-Fix-fw-options-handle-eh_bus_reset.patch @@ -0,0 +1,59 @@ +From ddac3fc73a216784c28f0095b0b6cb1ac0114f52 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:33 -0400 +Subject: [PATCH 013/124] [scsi] scsi: qla2xxx: Fix fw options handle + eh_bus_reset() + +Message-id: <20190801155618.12650-14-hmadhani@redhat.com> +Patchwork-id: 267818 +O-Subject: [RHEL 7.8 e-stor PATCH 013/118] scsi: qla2xxx: Fix fw options handle eh_bus_reset() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +For eh_bus_reset, driver is supposed to reset the link. Current option to +reset the link is applicable to Loop only. This patch updates current FW +option with the one that is applicable to all topologies. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 87d6814a28d943acb969a9b415f66eaea95a882e) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_mbx.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 6c286df7fddc..17fde50ac8d1 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -2248,10 +2248,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) + mcp->out_mb = MBX_2|MBX_1|MBX_0; + } else if (IS_FWI2_CAPABLE(vha->hw)) { + mcp->mb[0] = MBC_LIP_FULL_LOGIN; +- if (N2N_TOPO(vha->hw)) +- mcp->mb[1] = BIT_4; /* re-init */ +- else +- mcp->mb[1] = BIT_6; /* LIP */ ++ mcp->mb[1] = BIT_4; + mcp->mb[2] = 0; + mcp->mb[3] = vha->hw->loop_reset_delay; + mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; +@@ -2761,7 +2758,7 @@ qla2x00_full_login_lip(scsi_qla_host_t *vha) + "Entered %s.\n", __func__); + + mcp->mb[0] = MBC_LIP_FULL_LOGIN; +- mcp->mb[1] = IS_FWI2_CAPABLE(vha->hw) ? BIT_3 : 0; ++ mcp->mb[1] = IS_FWI2_CAPABLE(vha->hw) ? BIT_4 : 0; + mcp->mb[2] = 0; + mcp->mb[3] = 0; + mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; +-- +2.13.6 + diff --git a/SOURCES/0014-scsi-scsi-qla2xxx-Move-debug-messages-before-sending.patch b/SOURCES/0014-scsi-scsi-qla2xxx-Move-debug-messages-before-sending.patch new file mode 100644 index 0000000..a7dcdaa --- /dev/null +++ b/SOURCES/0014-scsi-scsi-qla2xxx-Move-debug-messages-before-sending.patch @@ -0,0 +1,316 @@ +From cf5d8e7e964b634764d7543bc5ca8a705076780a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:34 -0400 +Subject: [PATCH 014/124] [scsi] scsi: qla2xxx: Move debug messages before + sending srb preventing panic + +Message-id: <20190801155618.12650-15-hmadhani@redhat.com> +Patchwork-id: 267788 +O-Subject: [RHEL 7.8 e-stor PATCH 014/118] scsi: qla2xxx: Move debug messages before sending srb preventing panic +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bill Kuzeja + +Bugzilla 1729270 + +When sending an srb with qla2x00_start_sp, the sp can complete and be freed +by the time we log the debug message saying we sent it. This can cause a +panic if sp gets reused quickly or when running a kernel that poisons freed +memory. + +This was partially fixed by (not every case was addressed): + +Commit 9fe278f44b4b ("scsi: qla2xxx: Move log messages before issuing +command to firmware") + +Signed-off-by: Bill Kuzeja +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit f233e8c000c6ff93481c8e867e06637c90e69a01) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 66 ++++++++++++++++++++++----------------- + drivers/scsi/qla2xxx/qla_init.c | 26 ++++++++------- + drivers/scsi/qla2xxx/qla_target.c | 8 ++--- + 3 files changed, 55 insertions(+), 45 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 57eada4e50ee..69cc858732d4 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -657,15 +657,16 @@ static int qla_async_rftid(scsi_qla_host_t *vha, port_id_t *d_id) + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; + sp->done = qla2x00_async_sns_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s - hdl=%x portid %06x.\n", ++ sp->name, sp->handle, d_id->b24); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_disc, vha, 0x2043, + "RFT_ID issue IOCB failed (%d).\n", rval); + goto done_free_sp; + } +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s - hdl=%x portid %06x.\n", +- sp->name, sp->handle, d_id->b24); + return rval; + done_free_sp: + sp->free(sp); +@@ -752,6 +753,10 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id, + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; + sp->done = qla2x00_async_sns_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s - hdl=%x portid %06x feature %x type %x.\n", ++ sp->name, sp->handle, d_id->b24, fc4feature, fc4type); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_disc, vha, 0x2047, +@@ -759,9 +764,6 @@ static int qla_async_rffid(scsi_qla_host_t *vha, port_id_t *d_id, + goto done_free_sp; + } + +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s - hdl=%x portid %06x feature %x type %x.\n", +- sp->name, sp->handle, d_id->b24, fc4feature, fc4type); + return rval; + + done_free_sp: +@@ -844,15 +846,16 @@ static int qla_async_rnnid(scsi_qla_host_t *vha, port_id_t *d_id, + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; + sp->done = qla2x00_async_sns_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s - hdl=%x portid %06x\n", ++ sp->name, sp->handle, d_id->b24); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_disc, vha, 0x204d, + "RNN_ID issue IOCB failed (%d).\n", rval); + goto done_free_sp; + } +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s - hdl=%x portid %06x\n", +- sp->name, sp->handle, d_id->b24); + + return rval; + +@@ -957,15 +960,16 @@ static int qla_async_rsnn_nn(scsi_qla_host_t *vha) + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; + sp->done = qla2x00_async_sns_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s - hdl=%x.\n", ++ sp->name, sp->handle); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_disc, vha, 0x2043, + "RFT_ID issue IOCB failed (%d).\n", rval); + goto done_free_sp; + } +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s - hdl=%x.\n", +- sp->name, sp->handle); + + return rval; + +@@ -3578,14 +3582,14 @@ int qla24xx_async_gffid(scsi_qla_host_t *vha, fc_port_t *fcport) + + sp->done = qla24xx_async_gffid_sp_done; + +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; +- + ql_dbg(ql_dbg_disc, vha, 0x2132, + "Async-%s hdl=%x %8phC.\n", sp->name, + sp->handle, fcport->port_name); + ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; ++ + return rval; + done_free_sp: + sp->free(sp); +@@ -4067,6 +4071,10 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp, + + sp->done = qla2x00_async_gpnft_gnnft_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s hdl=%x FC4Type %x.\n", sp->name, ++ sp->handle, ct_req->req.gpn_ft.port_type); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + spin_lock_irqsave(&vha->work_lock, flags); +@@ -4075,9 +4083,6 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp, + goto done_free_sp; + } + +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s hdl=%x FC4Type %x.\n", sp->name, +- sp->handle, ct_req->req.gpn_ft.port_type); + return rval; + + done_free_sp: +@@ -4219,6 +4224,10 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) + + sp->done = qla2x00_async_gpnft_gnnft_sp_done; + ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async-%s hdl=%x FC4Type %x.\n", sp->name, ++ sp->handle, ct_req->req.gpn_ft.port_type); ++ + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + spin_lock_irqsave(&vha->work_lock, flags); +@@ -4227,9 +4236,6 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) + goto done_free_sp; + } + +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async-%s hdl=%x FC4Type %x.\n", sp->name, +- sp->handle, ct_req->req.gpn_ft.port_type); + return rval; + + done_free_sp: +@@ -4350,13 +4356,14 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport) + + sp->done = qla2x00_async_gnnid_sp_done; + +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; + ql_dbg(ql_dbg_disc, vha, 0xffff, + "Async-%s - %8phC hdl=%x loopid=%x portid %06x.\n", + sp->name, fcport->port_name, + sp->handle, fcport->loop_id, fcport->d_id.b24); ++ ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; + return rval; + + done_free_sp: +@@ -4480,14 +4487,15 @@ int qla24xx_async_gfpnid(scsi_qla_host_t *vha, fc_port_t *fcport) + + sp->done = qla2x00_async_gfpnid_sp_done; + +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; +- + ql_dbg(ql_dbg_disc, vha, 0xffff, + "Async-%s - %8phC hdl=%x loopid=%x portid %06x.\n", + sp->name, fcport->port_name, + sp->handle, fcport->loop_id, fcport->d_id.b24); ++ ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; ++ + return rval; + + done_free_sp: +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 236709a59267..c6d17e65f99b 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -366,14 +366,16 @@ qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport) + qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); + + sp->done = qla2x00_async_prlo_sp_done; +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; + + ql_dbg(ql_dbg_disc, vha, 0x2070, + "Async-prlo - hdl=%x loop-id=%x portid=%02x%02x%02x.\n", + sp->handle, fcport->loop_id, fcport->d_id.b.domain, + fcport->d_id.b.area, fcport->d_id.b.al_pa); ++ ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; ++ + return rval; + + done_free_sp: +@@ -931,14 +933,14 @@ int qla24xx_async_gnl(struct scsi_qla_host *vha, fc_port_t *fcport) + + sp->done = qla24xx_async_gnl_sp_done; + +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; +- + ql_dbg(ql_dbg_disc, vha, 0x20da, + "Async-%s - OUT WWPN %8phC hndl %x\n", + sp->name, fcport->port_name, sp->handle); + ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; ++ + return rval; + + done_free_sp: +@@ -1072,6 +1074,11 @@ qla24xx_async_prli(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 @@ qla24xx_async_prli(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 116596eb7c2c..54894e235c0d 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -653,14 +653,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: +-- +2.13.6 + diff --git a/SOURCES/0015-scsi-scsi-qla2xxx-remove-redundant-null-check-on-poi.patch b/SOURCES/0015-scsi-scsi-qla2xxx-remove-redundant-null-check-on-poi.patch new file mode 100644 index 0000000..020a703 --- /dev/null +++ b/SOURCES/0015-scsi-scsi-qla2xxx-remove-redundant-null-check-on-poi.patch @@ -0,0 +1,75 @@ +From e00f15274ba0277d0d9749b1155ff241cfc60b26 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:35 -0400 +Subject: [PATCH 015/124] [scsi] scsi: qla2xxx: remove redundant null check on + pointer sess + +Message-id: <20190801155618.12650-16-hmadhani@redhat.com> +Patchwork-id: 267789 +O-Subject: [RHEL 7.8 e-stor PATCH 015/118] scsi: qla2xxx: remove redundant null check on pointer sess +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Colin Ian King + +Bugzilla 1729270 + +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 +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit bb6abdd453e123bebdf949a03df5e846ecb5866b) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 54894e235c0d..50235fd29e45 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -6317,7 +6317,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; +@@ -6343,7 +6343,6 @@ static void qlt_tmr_work(struct qla_tgt *tgt, + goto out_term2; + } else { + if (sess->deleted) { +- sess = NULL; + goto out_term2; + } + +@@ -6351,7 +6350,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; + } + } +@@ -6370,8 +6368,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.13.6 + diff --git a/SOURCES/0016-scsi-scsi-qla2xxx-Fix-LUN-discovery-if-loop-id-is-no.patch b/SOURCES/0016-scsi-scsi-qla2xxx-Fix-LUN-discovery-if-loop-id-is-no.patch new file mode 100644 index 0000000..84b67fc --- /dev/null +++ b/SOURCES/0016-scsi-scsi-qla2xxx-Fix-LUN-discovery-if-loop-id-is-no.patch @@ -0,0 +1,59 @@ +From 17242a26bc003e758edf605dc5112ef571de4d27 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:36 -0400 +Subject: [PATCH 016/124] [scsi] scsi: qla2xxx: Fix LUN discovery if loop id is + not assigned yet by firmware + +Message-id: <20190801155618.12650-17-hmadhani@redhat.com> +Patchwork-id: 267792 +O-Subject: [RHEL 7.8 e-stor PATCH 016/118] scsi: qla2xxx: Fix LUN discovery if loop id is not assigned yet by firmware +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +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: stable@vger.kernel.org #4.19 +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ec322937a7f152d68755dc8316523bf6f831b48f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 c6d17e65f99b..90eeff414931 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -646,11 +646,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.13.6 + diff --git a/SOURCES/0017-scsi-scsi-qla2xxx-Add-First-Burst-support-for-FC-NVM.patch b/SOURCES/0017-scsi-scsi-qla2xxx-Add-First-Burst-support-for-FC-NVM.patch new file mode 100644 index 0000000..f49a501 --- /dev/null +++ b/SOURCES/0017-scsi-scsi-qla2xxx-Add-First-Burst-support-for-FC-NVM.patch @@ -0,0 +1,193 @@ +From 55ebc45d7e6818b6759f7a3d7ea28099043d3020 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:37 -0400 +Subject: [PATCH 017/124] [scsi] scsi: qla2xxx: Add First Burst support for + FC-NVMe devices + +Message-id: <20190801155618.12650-18-hmadhani@redhat.com> +Patchwork-id: 267821 +O-Subject: [RHEL 7.8 e-stor PATCH 017/118] scsi: qla2xxx: Add First Burst support for FC-NVMe devices +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Darren Trapp + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 03aaa89fe46feccccf29e137131400f309431e64) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 5e580b4c6ae2..bcb7ad530240 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2377,7 +2377,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 +@@ -3973,6 +3975,7 @@ struct qla_hw_data { + uint16_t fw_subminor_version; + uint16_t fw_attributes; + uint16_t fw_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 + +@@ -4267,6 +4270,7 @@ typedef struct scsi_qla_host { + uint32_t qpairs_req_created:1; + uint32_t qpairs_rsp_created:1; + uint32_t nvme_enabled:1; ++ uint32_t nvme_first_burst:1; + } flags; + + atomic_t loop_state; +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 90eeff414931..3a79abe8e658 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1831,6 +1831,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] & 0xffff) * 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 348d9d3bf590..1acdd4cea6a3 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2461,8 +2461,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 8e5467ee957d..da7428a6efb8 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1714,6 +1714,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 17fde50ac8d1..731fa37603d5 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -1114,6 +1114,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(ql_log_info, vha, 0xd302, + "%s: FC-NVMe is Enabled (0x%x)\n", +@@ -6269,8 +6272,6 @@ int __qla24xx_parse_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, + fcport->d_id.b.rsvd_1 = 0; + + if (fcport->fc4f_nvme) { +- fcport->nvme_prli_service_param = +- pd->prli_nvme_svc_param_word_3; + fcport->port_type = FCT_NVME; + } else { + /* If not target must be initiator or unknown type. */ +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 417e1d6263da..9c31d01ddd30 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -369,17 +369,24 @@ static inline int qla2x00_start_nvme_mq(srb_t *sp) + + /* No data transfer how do we check buffer len == 0?? */ + if (fd->io_dir == NVMEFC_FCP_READ) { +- cmd_pkt->control_flags = +- cpu_to_le16(CF_READ_DATA | CF_NVME_ENABLE); ++ cmd_pkt->control_flags = CF_READ_DATA; + vha->qla_stats.input_bytes += fd->payload_length; + vha->qla_stats.input_requests++; + } else if (fd->io_dir == NVMEFC_FCP_WRITE) { +- cmd_pkt->control_flags = +- cpu_to_le16(CF_WRITE_DATA | CF_NVME_ENABLE); ++ cmd_pkt->control_flags = CF_WRITE_DATA; ++ if ((vha->flags.nvme_first_burst) && ++ (sp->fcport->nvme_prli_service_param & ++ NVME_PRLI_SP_FIRST_BURST)) { ++ if ((fd->payload_length <= ++ sp->fcport->nvme_first_burst_size) || ++ (sp->fcport->nvme_first_burst_size == 0)) ++ cmd_pkt->control_flags |= ++ CF_NVME_FIRST_BURST_ENABLE; ++ } + vha->qla_stats.output_bytes += fd->payload_length; + vha->qla_stats.output_requests++; + } else if (fd->io_dir == 0) { +- cmd_pkt->control_flags = cpu_to_le16(CF_NVME_ENABLE); ++ cmd_pkt->control_flags = 0; + } + + /* Set NPORT-ID */ +diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h +index 4941d107fb1c..da8dad5ad693 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.h ++++ b/drivers/scsi/qla2xxx/qla_nvme.h +@@ -57,7 +57,7 @@ struct cmd_nvme { + uint64_t rsvd; + + uint16_t control_flags; /* Control Flags */ +-#define CF_NVME_ENABLE BIT_9 ++#define CF_NVME_FIRST_BURST_ENABLE BIT_11 + #define CF_DIF_SEG_DESCR_ENABLE BIT_3 + #define CF_DATA_SEG_DESCR_ENABLE BIT_2 + #define CF_READ_DATA BIT_1 +-- +2.13.6 + diff --git a/SOURCES/0018-scsi-scsi-qla2xxx-Fix-unload-when-NVMe-devices-are-c.patch b/SOURCES/0018-scsi-scsi-qla2xxx-Fix-unload-when-NVMe-devices-are-c.patch new file mode 100644 index 0000000..ea8881d --- /dev/null +++ b/SOURCES/0018-scsi-scsi-qla2xxx-Fix-unload-when-NVMe-devices-are-c.patch @@ -0,0 +1,83 @@ +From 75c361cd6bc59eaca88eeebf44b73eb5fd9462e2 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:38 -0400 +Subject: [PATCH 018/124] [scsi] scsi: qla2xxx: Fix unload when NVMe devices + are configured + +Message-id: <20190801155618.12650-19-hmadhani@redhat.com> +Patchwork-id: 267794 +O-Subject: [RHEL 7.8 e-stor PATCH 018/118] scsi: qla2xxx: Fix unload when NVMe devices are configured +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +This patch fixes driver unload issue when FC-NVMe devices are configured. + +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit e476fe8af5ff2102ae622c8bf910d8f7e83eb84e) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 9c31d01ddd30..cfd5a68e6533 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -619,6 +619,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; +@@ -626,6 +627,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) { +@@ -642,23 +652,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.13.6 + diff --git a/SOURCES/0019-scsi-scsi-qla2xxx-Check-for-FW-started-flag-before-a.patch b/SOURCES/0019-scsi-scsi-qla2xxx-Check-for-FW-started-flag-before-a.patch new file mode 100644 index 0000000..16b61de --- /dev/null +++ b/SOURCES/0019-scsi-scsi-qla2xxx-Check-for-FW-started-flag-before-a.patch @@ -0,0 +1,51 @@ +From e8f9ff32faea671534f95bab7ae4ac35a1961dd5 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:39 -0400 +Subject: [PATCH 019/124] [scsi] scsi: qla2xxx: Check for FW started flag + before aborting + +Message-id: <20190801155618.12650-20-hmadhani@redhat.com> +Patchwork-id: 267796 +O-Subject: [RHEL 7.8 e-stor PATCH 019/118] scsi: qla2xxx: Check for FW started flag before aborting +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 471f8e03d74d9ea1084e7fbbba66ea2488b0c14f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 cfd5a68e6533..53496b1bafb6 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, 0xffff, ++ "%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.13.6 + diff --git a/SOURCES/0020-scsi-scsi-qla2xxx-Prevent-multiple-ADISC-commands-pe.patch b/SOURCES/0020-scsi-scsi-qla2xxx-Prevent-multiple-ADISC-commands-pe.patch new file mode 100644 index 0000000..0374442 --- /dev/null +++ b/SOURCES/0020-scsi-scsi-qla2xxx-Prevent-multiple-ADISC-commands-pe.patch @@ -0,0 +1,50 @@ +From cdbe9c4cd49b9cfb71aaea4031e9642155d5a9b9 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:40 -0400 +Subject: [PATCH 020/124] [scsi] scsi: qla2xxx: Prevent multiple ADISC commands + per session + +Message-id: <20190801155618.12650-21-hmadhani@redhat.com> +Patchwork-id: 267793 +O-Subject: [RHEL 7.8 e-stor PATCH 020/118] scsi: qla2xxx: Prevent multiple ADISC commands per session +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Add check to allow 1 discovery command per session to be sent. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 192c4e9b9322ae445fa12914941e2278c7d4829f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 3a79abe8e658..63b035882651 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -473,9 +473,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.13.6 + diff --git a/SOURCES/0021-scsi-scsi-qla2xxx-Add-support-for-setting-port-speed.patch b/SOURCES/0021-scsi-scsi-qla2xxx-Add-support-for-setting-port-speed.patch new file mode 100644 index 0000000..8fdb472 --- /dev/null +++ b/SOURCES/0021-scsi-scsi-qla2xxx-Add-support-for-setting-port-speed.patch @@ -0,0 +1,300 @@ +From 355c29e25d3d41e2be04292b08f1d26b985df25a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:41 -0400 +Subject: [PATCH 021/124] [scsi] scsi: qla2xxx: Add support for setting port + speed + +Message-id: <20190801155618.12650-22-hmadhani@redhat.com> +Patchwork-id: 267798 +O-Subject: [RHEL 7.8 e-stor PATCH 021/118] scsi: qla2xxx: Add support for setting port speed +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Anil Gurumurthy + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 4910b524ac9e61b70e35280877361b790a657d48) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 da8b16469836..037016290044 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -1633,6 +1633,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 +@@ -2129,6 +2215,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[] = { +@@ -2168,6 +2256,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 bcb7ad530240..416307fab71e 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -3705,12 +3705,14 @@ struct qla_hw_data { + #define PORT_SPEED_UNKNOWN 0xFFFF + #define PORT_SPEED_1GB 0x00 + #define PORT_SPEED_2GB 0x01 ++#define PORT_SPEED_AUTO 0x02 + #define PORT_SPEED_4GB 0x03 + #define PORT_SPEED_8GB 0x04 + #define PORT_SPEED_16GB 0x05 + #define PORT_SPEED_32GB 0x06 + #define PORT_SPEED_10GB 0x13 + uint16_t link_data_rate; /* F/W operating speed */ ++ uint16_t set_data_rate; /* Set by user */ + + uint8_t current_topology; + uint8_t prev_topology; +@@ -4239,6 +4241,10 @@ struct qla_hw_data { + #define FW_ABILITY_MAX_SPEED(ha) \ + (ha->fw_ability_mask & FW_ABILITY_MAX_SPEED_MASK) + ++#define QLA_GET_DATA_RATE 0 ++#define QLA_SET_DATA_RATE_NOLR 1 ++#define QLA_SET_DATA_RATE_LR 2 /* Set speed and initiate LR */ ++ + /* + * Qlogic scsi host structure + */ +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 1e00e93d4066..522865df61cc 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -897,5 +897,6 @@ void qlt_unknown_atio_work_fn(struct work_struct *); + void qlt_update_host_map(struct scsi_qla_host *, port_id_t); + void qlt_remove_target_resources(struct qla_hw_data *); + void qlt_set_mode(struct scsi_qla_host *); ++int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode); + + #endif /* _QLA_GBL_H */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 63b035882651..04d38d0dfb69 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3896,8 +3896,17 @@ qla24xx_config_rings(struct scsi_qla_host *vha) + WRT_REG_DWORD(®->isp24.rsp_q_in, 0); + WRT_REG_DWORD(®->isp24.rsp_q_out, 0); + } ++ + qlt_24xx_config_rings(vha); + ++ /* If the user has configured the speed, set it here */ ++ if (ha->set_data_rate) { ++ ql_dbg(ql_dbg_init, vha, 0x00fd, ++ "Speed set by user : %s Gbps \n", ++ qla2x00_get_link_speed_str(ha, ha->set_data_rate)); ++ icb->firmware_options_3 = (ha->set_data_rate << 13); ++ } ++ + /* PCI posting */ + RD_REG_DWORD(&ioreg->hccr); + } +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 731fa37603d5..3068422cd7a5 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -5252,6 +5252,66 @@ qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb) + return rval; + } + ++/* 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(*mcp)); ++ switch (ha->set_data_rate) { ++ case PORT_SPEED_AUTO: ++ case PORT_SPEED_4GB: ++ case PORT_SPEED_8GB: ++ case PORT_SPEED_16GB: ++ case PORT_SPEED_32GB: ++ val = ha->set_data_rate; ++ break; ++ default: ++ ql_log(ql_log_warn, vha, 0x1199, ++ "Unrecognized speed setting:%d. Setting Autoneg\n", ++ ha->set_data_rate); ++ val = ha->set_data_rate = PORT_SPEED_AUTO; ++ break; ++ } ++ ++ mcp->mb[0] = MBC_DATA_RATE; ++ mcp->mb[1] = mode; ++ mcp->mb[2] = val; ++ ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ mcp->in_mb |= MBX_4|MBX_3; ++ mcp->tov = MBX_TOV_SECONDS; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(vha, mcp); ++ if (rval != QLA_SUCCESS) { ++ ql_dbg(ql_dbg_mbx, vha, 0x1107, ++ "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); ++ } else { ++ if (mcp->mb[1] != 0x7) ++ ql_dbg(ql_dbg_mbx, vha, 0x1179, ++ "Speed set:0x%x\n", mcp->mb[1]); ++ ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1108, ++ "Done %s.\n", __func__); ++ } ++ ++ return rval; ++} ++ + int + qla2x00_get_data_rate(scsi_qla_host_t *vha) + { +@@ -5267,7 +5327,7 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha) + return QLA_FUNCTION_FAILED; + + mcp->mb[0] = MBC_DATA_RATE; +- mcp->mb[1] = 0; ++ mcp->mb[1] = QLA_GET_DATA_RATE; + mcp->out_mb = MBX_1|MBX_0; + mcp->in_mb = MBX_2|MBX_1|MBX_0; + if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) +-- +2.13.6 + diff --git a/SOURCES/0022-scsi-scsi-qla2xxx-Prevent-SysFS-access-when-chip-is-.patch b/SOURCES/0022-scsi-scsi-qla2xxx-Prevent-SysFS-access-when-chip-is-.patch new file mode 100644 index 0000000..705b320 --- /dev/null +++ b/SOURCES/0022-scsi-scsi-qla2xxx-Prevent-SysFS-access-when-chip-is-.patch @@ -0,0 +1,47 @@ +From 9325cac8c04c9f251771e8c55c46c34a6dd79a68 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:42 -0400 +Subject: [PATCH 022/124] [scsi] scsi: qla2xxx: Prevent SysFS access when chip + is down + +Message-id: <20190801155618.12650-23-hmadhani@redhat.com> +Patchwork-id: 267817 +O-Subject: [RHEL 7.8 e-stor PATCH 022/118] scsi: qla2xxx: Prevent SysFS access when chip is down +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit b726d99d72fd4b36ae82efb35d0073b0c9441205) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 037016290044..2e168fb19531 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.13.6 + diff --git a/SOURCES/0023-scsi-scsi-qla2xxx-Move-marker-request-behind-QPair.patch b/SOURCES/0023-scsi-scsi-qla2xxx-Move-marker-request-behind-QPair.patch new file mode 100644 index 0000000..645ca2c --- /dev/null +++ b/SOURCES/0023-scsi-scsi-qla2xxx-Move-marker-request-behind-QPair.patch @@ -0,0 +1,406 @@ +From f0679c28288d4f52ef463ae395c74349d81af824 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:43 -0400 +Subject: [PATCH 023/124] [scsi] scsi: qla2xxx: Move marker request behind + QPair + +Message-id: <20190801155618.12650-24-hmadhani@redhat.com> +Patchwork-id: 267797 +O-Subject: [RHEL 7.8 e-stor PATCH 023/118] scsi: qla2xxx: Move marker request behind QPair +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Current code hard codes 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 +queue. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 9eb9c6dc3ab06cf80d2c15cab39cbcd38816bde0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 522865df61cc..3b97724d27ec 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -269,8 +269,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, uint16_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 04d38d0dfb69..29eb7174a719 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1705,8 +1705,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); + } + +@@ -6055,11 +6055,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) { +@@ -6072,8 +6067,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; + } + +@@ -6811,8 +6806,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)) { +@@ -6832,7 +6825,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); + } + +@@ -7887,22 +7880,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; +@@ -8294,8 +8280,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->rsp_q_map[0]; + struct scsi_qla_host *vp; + unsigned long flags; + +@@ -8307,7 +8291,7 @@ qla82xx_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); + vha->flags.online = 1; + set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); + } +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 1acdd4cea6a3..ba64b3746462 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -336,7 +336,7 @@ qla2x00_start_scsi(srb_t *sp) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != ++ if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) != + QLA_SUCCESS) { + return (QLA_FUNCTION_FAILED); + } +@@ -490,8 +490,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) + /** + * qla2x00_marker() - Send a marker IOCB to the firmware. + * @vha: HA context +- * @req: request queue +- * @rsp: response queue ++ * @qpair: queue pair pointer + * @loop_id: loop ID + * @lun: LUN + * @type: marker modifier +@@ -501,18 +500,16 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) + * Returns non-zero if a failure occurred, else zero. + */ + static int +-__qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, +- struct rsp_que *rsp, uint16_t loop_id, +- uint16_t lun, uint8_t type) ++__qla2x00_marker(struct scsi_qla_host *vha, struct qla_qpair *qpair, ++ uint16_t loop_id, uint64_t lun, uint8_t type) + { + mrk_entry_t *mrk; + struct mrk_entry_24xx *mrk24 = NULL; +- ++ struct req_que *req = qpair->req; + struct qla_hw_data *ha = vha->hw; + scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); + +- req = ha->req_q_map[0]; +- mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL); ++ mrk = (mrk_entry_t *)__qla2x00_alloc_iocbs(qpair, NULL); + if (mrk == NULL) { + ql_log(ql_log_warn, base_vha, 0x3026, + "Failed to allocate Marker IOCB.\n"); +@@ -544,16 +541,15 @@ __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, + } + + int +-qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, +- struct rsp_que *rsp, uint16_t loop_id, uint16_t lun, +- uint8_t type) ++qla2x00_marker(struct scsi_qla_host *vha, struct qla_qpair *qpair, ++ uint16_t loop_id, uint64_t lun, uint8_t type) + { + int ret; + unsigned long flags = 0; + +- spin_lock_irqsave(&vha->hw->hardware_lock, flags); +- ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type); +- spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); ++ spin_lock_irqsave(qpair->qp_lock_ptr, flags); ++ ret = __qla2x00_marker(vha, qpair, loop_id, lun, type); ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + + return (ret); + } +@@ -568,11 +564,11 @@ qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, + int qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked) + { + if (ha_locked) { +- if (__qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0, ++ if (__qla2x00_marker(vha, vha->hw->base_qpair, 0, 0, + MK_SYNC_ALL) != QLA_SUCCESS) + return QLA_FUNCTION_FAILED; + } else { +- if (qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0, ++ if (qla2x00_marker(vha, vha->hw->base_qpair, 0, 0, + MK_SYNC_ALL) != QLA_SUCCESS) + return QLA_FUNCTION_FAILED; + } +@@ -1653,7 +1649,6 @@ qla24xx_start_scsi(srb_t *sp) + uint16_t req_cnt; + uint16_t tot_dsds; + struct req_que *req = NULL; +- struct rsp_que *rsp = NULL; + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct scsi_qla_host *vha = sp->vha; + struct qla_hw_data *ha = vha->hw; +@@ -1661,14 +1656,13 @@ qla24xx_start_scsi(srb_t *sp) + + /* Setup device pointers. */ + req = vha->req; +- rsp = req->rsp; + + /* So we know we haven't pci_map'ed anything yet */ + tot_dsds = 0; + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != ++ if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) != + QLA_SUCCESS) + return QLA_FUNCTION_FAILED; + vha->marker_needed = 0; +@@ -1836,7 +1830,7 @@ qla24xx_dif_start_scsi(srb_t *sp) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != ++ if (qla2x00_marker(vha, ha->base_qpair, 0, 0, MK_SYNC_ALL) != + QLA_SUCCESS) + return QLA_FUNCTION_FAILED; + vha->marker_needed = 0; +@@ -2007,7 +2001,6 @@ qla2xxx_start_scsi_mq(srb_t *sp) + uint16_t req_cnt; + uint16_t tot_dsds; + struct req_que *req = NULL; +- struct rsp_que *rsp = NULL; + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct scsi_qla_host *vha = sp->fcport->vha; + struct qla_hw_data *ha = vha->hw; +@@ -2017,7 +2010,6 @@ qla2xxx_start_scsi_mq(srb_t *sp) + spin_lock_irqsave(&qpair->qp_lock, flags); + + /* Setup qpair pointers */ +- rsp = qpair->rsp; + req = qpair->req; + + /* So we know we haven't pci_map'ed anything yet */ +@@ -2025,7 +2017,7 @@ qla2xxx_start_scsi_mq(srb_t *sp) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (__qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != ++ if (__qla2x00_marker(vha, qpair, 0, 0, MK_SYNC_ALL) != + QLA_SUCCESS) { + spin_unlock_irqrestore(&qpair->qp_lock, flags); + return QLA_FUNCTION_FAILED; +@@ -2193,7 +2185,7 @@ qla2xxx_dif_start_scsi_mq(srb_t *sp) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (__qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != ++ if (__qla2x00_marker(vha, qpair, 0, 0, MK_SYNC_ALL) != + QLA_SUCCESS) { + spin_unlock_irqrestore(&qpair->qp_lock, flags); + return QLA_FUNCTION_FAILED; +@@ -3246,8 +3238,8 @@ qla82xx_start_scsi(srb_t *sp) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (qla2x00_marker(vha, req, +- rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) { ++ if (qla2x00_marker(vha, ha->base_qpair, ++ 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) { + ql_log(ql_log_warn, vha, 0x300c, + "qla2x00_marker failed for cmd=%p.\n", cmd); + return QLA_FUNCTION_FAILED; +@@ -3930,8 +3922,8 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds) + + /* Send marker if required */ + if (vha->marker_needed != 0) { +- if (qla2x00_marker(vha, req, +- rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) ++ if (qla2x00_marker(vha, ha->base_qpair, ++ 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) + return EXT_STATUS_MAILBOX; + vha->marker_needed = 0; + } +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 3068422cd7a5..d588784c5aa5 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -1515,16 +1515,12 @@ qla2x00_abort_target(struct fc_port *fcport, unsigned int l, int tag) + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + scsi_qla_host_t *vha; +- struct req_que *req; +- struct rsp_que *rsp; + + vha = fcport->vha; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x103e, + "Entered %s.\n", __func__); + +- req = vha->hw->req_q_map[0]; +- rsp = req->rsp; + mcp->mb[0] = MBC_ABORT_TARGET; + mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0; + if (HAS_EXTENDED_IDS(vha->hw)) { +@@ -1547,7 +1543,7 @@ qla2x00_abort_target(struct fc_port *fcport, unsigned int l, int tag) + } + + /* Issue marker IOCB. */ +- rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, 0, ++ rval2 = qla2x00_marker(vha, vha->hw->base_qpair, fcport->loop_id, 0, + MK_SYNC_ID); + if (rval2 != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1040, +@@ -1567,16 +1563,12 @@ qla2x00_lun_reset(struct fc_port *fcport, unsigned int l, int tag) + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + scsi_qla_host_t *vha; +- struct req_que *req; +- struct rsp_que *rsp; + + vha = fcport->vha; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1042, + "Entered %s.\n", __func__); + +- req = vha->hw->req_q_map[0]; +- rsp = req->rsp; + mcp->mb[0] = MBC_LUN_RESET; + mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; + if (HAS_EXTENDED_IDS(vha->hw)) +@@ -1596,7 +1588,7 @@ qla2x00_lun_reset(struct fc_port *fcport, unsigned int l, int tag) + } + + /* Issue marker IOCB. */ +- rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l, ++ rval2 = qla2x00_marker(vha, vha->hw->base_qpair, fcport->loop_id, l, + MK_SYNC_ID_LUN); + if (rval2 != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1044, +@@ -3188,7 +3180,6 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, + scsi_qla_host_t *vha; + struct qla_hw_data *ha; + struct req_que *req; +- struct rsp_que *rsp; + struct qla_qpair *qpair; + + vha = fcport->vha; +@@ -3201,10 +3192,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, + if (vha->flags.qpairs_available) { + /* NPIV port */ + qpair = vha->qpair; +- rsp = qpair->rsp; + req = qpair->req; +- } else { +- rsp = req->rsp; + } + + tsk = dma_pool_zalloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); +@@ -3261,7 +3249,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, + } + + /* Issue marker IOCB. */ +- rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l, ++ rval2 = qla2x00_marker(vha, ha->base_qpair, fcport->loop_id, l, + type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID); + if (rval2 != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1099, +-- +2.13.6 + diff --git a/SOURCES/0024-scsi-scsi-qla2xxx-Fix-code-indentation-for-qla27xx_f.patch b/SOURCES/0024-scsi-scsi-qla2xxx-Fix-code-indentation-for-qla27xx_f.patch new file mode 100644 index 0000000..7e1d083 --- /dev/null +++ b/SOURCES/0024-scsi-scsi-qla2xxx-Fix-code-indentation-for-qla27xx_f.patch @@ -0,0 +1,92 @@ +From 04e5985099c9945513b6b806f34ec72dc915576d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:44 -0400 +Subject: [PATCH 024/124] [scsi] scsi: qla2xxx: Fix code indentation for + qla27xx_fwdt_entry + +Message-id: <20190801155618.12650-25-hmadhani@redhat.com> +Patchwork-id: 267811 +O-Subject: [RHEL 7.8 e-stor PATCH 024/118] scsi: qla2xxx: Fix code indentation for qla27xx_fwdt_entry +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5241f7ca62b35e582c3b94aea62a0ac42df369c7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 2342358f86c3..9923f08331d0 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.13.6 + diff --git a/SOURCES/0025-scsi-scsi-qla2xxx-Add-new-FW-dump-template-entry-typ.patch b/SOURCES/0025-scsi-scsi-qla2xxx-Add-new-FW-dump-template-entry-typ.patch new file mode 100644 index 0000000..517cce5 --- /dev/null +++ b/SOURCES/0025-scsi-scsi-qla2xxx-Add-new-FW-dump-template-entry-typ.patch @@ -0,0 +1,547 @@ +From b26fc945948771916f20ca655dab101d2638d9c1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:45 -0400 +Subject: [PATCH 025/124] [scsi] scsi: qla2xxx: Add new FW dump template entry + types + +Message-id: <20190801155618.12650-26-hmadhani@redhat.com> +Patchwork-id: 267799 +O-Subject: [RHEL 7.8 e-stor PATCH 025/118] scsi: qla2xxx: Add new FW dump template entry types +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch adds new firmware dump template entries for ISP27XX firmware +dump. + +Signed-off-by: Joe Carnuccio +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 64f61d9944839b62dea0ab6b0cafb4fb36c1f3f4) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 9923f08331d0..6a0e94da4598 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(ql_dbg_misc, vha, 0xd022, + "%s: unknown area %x\n", __func__, ent->t262.ram_area); +@@ -384,10 +395,10 @@ qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha, + } + *len += dwords * sizeof(uint32_t); + done: +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -450,10 +461,10 @@ qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha, + qla27xx_skip_entry(ent, buf); + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t264(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -478,10 +489,10 @@ qla27xx_fwdt_entry_t264(struct scsi_qla_host *vha, + qla27xx_skip_entry(ent, buf); + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t265(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -492,10 +503,10 @@ qla27xx_fwdt_entry_t265(struct scsi_qla_host *vha, + if (buf) + qla24xx_pause_risc(reg, vha->hw); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t266(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -504,10 +515,10 @@ qla27xx_fwdt_entry_t266(struct scsi_qla_host *vha, + if (buf) + qla24xx_soft_reset(vha->hw); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t267(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -517,10 +528,10 @@ qla27xx_fwdt_entry_t267(struct scsi_qla_host *vha, + "%s: dis intr [%lx]\n", __func__, *len); + qla27xx_write_reg(reg, ent->t267.pci_offset, ent->t267.data, buf); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t268(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -587,10 +598,10 @@ qla27xx_fwdt_entry_t268(struct scsi_qla_host *vha, + break; + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t269(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -604,10 +615,10 @@ qla27xx_fwdt_entry_t269(struct scsi_qla_host *vha, + if (buf) + ent->t269.scratch_size = 5 * sizeof(uint32_t); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t270(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -625,10 +636,10 @@ qla27xx_fwdt_entry_t270(struct scsi_qla_host *vha, + addr += sizeof(uint32_t); + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t271(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -642,10 +653,10 @@ qla27xx_fwdt_entry_t271(struct scsi_qla_host *vha, + qla27xx_write_reg(reg, 0xc4, data, buf); + qla27xx_write_reg(reg, 0xc0, addr, buf); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t272(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -662,10 +673,10 @@ qla27xx_fwdt_entry_t272(struct scsi_qla_host *vha, + } + *len += dwords * sizeof(uint32_t); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t273(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -685,10 +696,10 @@ qla27xx_fwdt_entry_t273(struct scsi_qla_host *vha, + addr += sizeof(uint32_t); + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -746,10 +757,10 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha, + qla27xx_skip_entry(ent, buf); + } + +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +@@ -763,7 +774,7 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha, + qla27xx_skip_entry(ent, buf); + goto done; + } +- if (offset + ent->t275.length > ent->hdr.entry_size) { ++ if (offset + ent->t275.length > ent->hdr.size) { + ql_dbg(ql_dbg_misc, vha, 0xd030, + "%s: buffer overflow\n", __func__); + qla27xx_skip_entry(ent, buf); +@@ -772,30 +783,71 @@ qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha, + + qla27xx_insertbuf(ent->t275.buffer, ent->t275.length, buf, len); + done: +- return false; ++ return qla27xx_next_entry(ent); + } + +-static int ++static struct qla27xx_fwdt_entry * ++qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha, ++ struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) ++{ ++ 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 != ent->t276.cond1 || func != ent->t276.cond2) { ++ ent = qla27xx_next_entry(ent); ++ qla27xx_skip_entry(ent, buf); ++ } ++ ++ return qla27xx_next_entry(ent); ++} ++ ++static struct qla27xx_fwdt_entry * ++qla27xx_fwdt_entry_t277(struct scsi_qla_host *vha, ++ struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) ++{ ++ struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha); ++ ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd215, ++ "%s: rdpep [%lx]\n", __func__, *len); ++ qla27xx_insert32(ent->t277.wr_cmd_data, buf, len); ++ qla27xx_write_reg(reg, ent->t277.cmd_addr, ent->t277.wr_cmd_data, buf); ++ qla27xx_read_reg(reg, ent->t277.data_addr, buf, len); ++ ++ return qla27xx_next_entry(ent); ++} ++ ++static struct qla27xx_fwdt_entry * ++qla27xx_fwdt_entry_t278(struct scsi_qla_host *vha, ++ struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) ++{ ++ struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha); ++ ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd216, ++ "%s: wrpep [%lx]\n", __func__, *len); ++ qla27xx_write_reg(reg, ent->t278.data_addr, ent->t278.wr_data, buf); ++ qla27xx_write_reg(reg, ent->t278.cmd_addr, ent->t278.wr_cmd_data, buf); ++ ++ return qla27xx_next_entry(ent); ++} ++ ++static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_other(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { + ql_dbg(ql_dbg_misc, vha, 0xd2ff, +- "%s: type %x [%lx]\n", __func__, ent->hdr.entry_type, *len); ++ "%s: type %x [%lx]\n", __func__, ent->hdr.type, *len); + qla27xx_skip_entry(ent, buf); + +- return false; ++ return qla27xx_next_entry(ent); + } + +-struct qla27xx_fwdt_entry_call { ++static struct { + uint type; +- int (*call)( +- struct scsi_qla_host *, +- struct qla27xx_fwdt_entry *, +- void *, +- ulong *); +-}; +- +-static struct qla27xx_fwdt_entry_call ql27xx_fwdt_entry_call_list[] = { ++ typeof(qla27xx_fwdt_entry_other)(*call); ++} qla27xx_fwdt_entry_call[] = { + { ENTRY_TYPE_NOP, qla27xx_fwdt_entry_t0 }, + { ENTRY_TYPE_TMP_END, qla27xx_fwdt_entry_t255 }, + { ENTRY_TYPE_RD_IOB_T1, qla27xx_fwdt_entry_t256 }, +@@ -818,13 +870,16 @@ static struct qla27xx_fwdt_entry_call ql27xx_fwdt_entry_call_list[] = { + { ENTRY_TYPE_PCICFG, qla27xx_fwdt_entry_t273 }, + { ENTRY_TYPE_GET_SHADOW, qla27xx_fwdt_entry_t274 }, + { ENTRY_TYPE_WRITE_BUF, qla27xx_fwdt_entry_t275 }, ++ { ENTRY_TYPE_CONDITIONAL, qla27xx_fwdt_entry_t276 }, ++ { ENTRY_TYPE_RDPEPREG, qla27xx_fwdt_entry_t277 }, ++ { ENTRY_TYPE_WRPEPREG, qla27xx_fwdt_entry_t278 }, + { -1, qla27xx_fwdt_entry_other } + }; + +-static inline int (*qla27xx_find_entry(uint type)) +- (struct scsi_qla_host *, struct qla27xx_fwdt_entry *, void *, ulong *) ++static inline ++typeof(qla27xx_fwdt_entry_call->call)(qla27xx_find_entry(uint type)) + { +- struct qla27xx_fwdt_entry_call *list = ql27xx_fwdt_entry_call_list; ++ typeof(*qla27xx_fwdt_entry_call) *list = qla27xx_fwdt_entry_call; + + while (list->type < type) + list++; +@@ -834,14 +889,6 @@ static inline int (*qla27xx_find_entry(uint type)) + return qla27xx_fwdt_entry_other; + } + +-static inline void * +-qla27xx_next_entry(void *p) +-{ +- struct qla27xx_fwdt_entry *ent = p; +- +- return p + ent->hdr.entry_size; +-} +- + static void + qla27xx_walk_template(struct scsi_qla_host *vha, + struct qla27xx_fwdt_template *tmp, void *buf, ulong *len) +@@ -852,18 +899,16 @@ qla27xx_walk_template(struct scsi_qla_host *vha, + ql_dbg(ql_dbg_misc, vha, 0xd01a, + "%s: entry count %lx\n", __func__, count); + while (count--) { +- if (buf && *len >= vha->hw->fw_dump_len) ++ ent = qla27xx_find_entry(ent->hdr.type)(vha, ent, buf, len); ++ if (!ent) + break; +- if (qla27xx_find_entry(ent->hdr.entry_type)(vha, ent, buf, len)) +- break; +- ent = qla27xx_next_entry(ent); + } + + if (count) + ql_dbg(ql_dbg_misc, vha, 0xd018, + "%s: entry residual count (%lx)\n", __func__, count); + +- if (ent->hdr.entry_type != ENTRY_TYPE_TMP_END) ++ if (ent) + ql_dbg(ql_dbg_misc, vha, 0xd019, + "%s: missing end entry (%lx)\n", __func__, count); + +diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h +index da0f506a8b70..f7990f2a057a 100644 +--- a/drivers/scsi/qla2xxx/qla_tmpl.h ++++ b/drivers/scsi/qla2xxx/qla_tmpl.h +@@ -54,6 +54,9 @@ struct __packed qla27xx_fwdt_template { + #define ENTRY_TYPE_PCICFG 273 + #define ENTRY_TYPE_GET_SHADOW 274 + #define ENTRY_TYPE_WRITE_BUF 275 ++#define ENTRY_TYPE_CONDITIONAL 276 ++#define ENTRY_TYPE_RDPEPREG 277 ++#define ENTRY_TYPE_WRPEPREG 278 + + #define CAPTURE_FLAG_PHYS_ONLY BIT_0 + #define CAPTURE_FLAG_PHYS_VIRT BIT_1 +@@ -62,8 +65,8 @@ struct __packed qla27xx_fwdt_template { + + struct __packed qla27xx_fwdt_entry { + struct __packed { +- uint32_t entry_type; +- uint32_t entry_size; ++ uint32_t type; ++ uint32_t size; + uint32_t reserved_1; + + uint8_t capture_flags; +@@ -199,6 +202,24 @@ struct __packed qla27xx_fwdt_entry { + uint32_t length; + uint8_t buffer[]; + } t275; ++ ++ struct __packed { ++ uint32_t cond1; ++ uint32_t cond2; ++ } t276; ++ ++ struct __packed { ++ uint32_t cmd_addr; ++ uint32_t wr_cmd_data; ++ uint32_t data_addr; ++ } t277; ++ ++ struct __packed { ++ uint32_t cmd_addr; ++ uint32_t wr_cmd_data; ++ uint32_t data_addr; ++ uint32_t wr_data; ++ } t278; + }; + }; + +@@ -206,6 +227,7 @@ struct __packed qla27xx_fwdt_entry { + #define T262_RAM_AREA_EXTERNAL_RAM 2 + #define T262_RAM_AREA_SHARED_RAM 3 + #define T262_RAM_AREA_DDR_RAM 4 ++#define T262_RAM_AREA_MISC 5 + + #define T263_QUEUE_TYPE_REQ 1 + #define T263_QUEUE_TYPE_RSP 2 +-- +2.13.6 + diff --git a/SOURCES/0026-scsi-scsi-qla2xxx-Fix-panic-in-qla_dfs_tgt_counters_.patch b/SOURCES/0026-scsi-scsi-qla2xxx-Fix-panic-in-qla_dfs_tgt_counters_.patch new file mode 100644 index 0000000..6ef1def --- /dev/null +++ b/SOURCES/0026-scsi-scsi-qla2xxx-Fix-panic-in-qla_dfs_tgt_counters_.patch @@ -0,0 +1,49 @@ +From bff74ada05ccf29f8d1a91835accc21385a9ec3a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:46 -0400 +Subject: [PATCH 026/124] [scsi] scsi: qla2xxx: Fix panic in + qla_dfs_tgt_counters_show + +Message-id: <20190801155618.12650-27-hmadhani@redhat.com> +Patchwork-id: 267803 +O-Subject: [RHEL 7.8 e-stor PATCH 026/118] scsi: qla2xxx: Fix panic in qla_dfs_tgt_counters_show +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bill Kuzeja + +Bugzilla 1729270 + +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 +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit db0f166e9a37215b15d5d732c98fa15219adccf0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 8688372955a0..2903d1e1847d 100644 +--- a/drivers/scsi/qla2xxx/qla_dfs.c ++++ b/drivers/scsi/qla2xxx/qla_dfs.c +@@ -193,6 +193,8 @@ qla_dfs_tgt_counters_show(struct seq_file *s, void *unused) + + 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; +-- +2.13.6 + diff --git a/SOURCES/0027-scsi-scsi-qla2xxx-avoid-printf-format-warning.patch b/SOURCES/0027-scsi-scsi-qla2xxx-avoid-printf-format-warning.patch new file mode 100644 index 0000000..07a66ee --- /dev/null +++ b/SOURCES/0027-scsi-scsi-qla2xxx-avoid-printf-format-warning.patch @@ -0,0 +1,77 @@ +From aa2d1f8a0a69a3019f3740d00c1701fd5a4ea030 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:47 -0400 +Subject: [PATCH 027/124] [scsi] scsi: qla2xxx: avoid printf format warning + +Message-id: <20190801155618.12650-28-hmadhani@redhat.com> +Patchwork-id: 267800 +O-Subject: [RHEL 7.8 e-stor PATCH 027/118] scsi: qla2xxx: avoid printf format warning +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Arnd Bergmann + +Bugzilla 1729270 + +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 +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 038d710fca5bb149d3af2e0b71f1284f8430a979) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 ba64b3746462..d13772869d4a 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -1139,7 +1139,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)) { +@@ -1185,7 +1185,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.13.6 + diff --git a/SOURCES/0028-scsi-scsi-qla2xxx-check-for-kstrtol-failure.patch b/SOURCES/0028-scsi-scsi-qla2xxx-check-for-kstrtol-failure.patch new file mode 100644 index 0000000..36b5d79 --- /dev/null +++ b/SOURCES/0028-scsi-scsi-qla2xxx-check-for-kstrtol-failure.patch @@ -0,0 +1,48 @@ +From 015fe41e9887851827175dac1b8bfb6dacaff964 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:48 -0400 +Subject: [PATCH 028/124] [scsi] scsi: qla2xxx: check for kstrtol() failure + +Message-id: <20190801155618.12650-29-hmadhani@redhat.com> +Patchwork-id: 267806 +O-Subject: [RHEL 7.8 e-stor PATCH 028/118] scsi: qla2xxx: check for kstrtol() failure +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Dan Carpenter + +Bugzilla 1729270 + +The error handling was unintentionally left out so it introduces a Smatch +static checker warning: + + drivers/scsi/qla2xxx/qla_attr.c:1655 qla2x00_port_speed_store() + error: uninitialized symbol 'type'. + +Fixes: a7b9ca7fc87a ("scsi: qla2xxx: Add support for setting port speed") +Signed-off-by: Dan Carpenter +Signed-off-by: Martin K. Petersen +(cherry picked from commit b8870ec63676aba1d823f0b36c5f7e9929e57d23) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 2e168fb19531..bc60835e7a3f 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -1653,6 +1653,8 @@ qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr, + } + + rval = kstrtol(buf, 10, &type); ++ if (rval) ++ return rval; + speed = type; + if (type == 40 || type == 80 || type == 160 || + type == 320) { +-- +2.13.6 + diff --git a/SOURCES/0029-scsi-scsi-qla2xxx-Add-fw_attr-and-port_no-SysFS-node.patch b/SOURCES/0029-scsi-scsi-qla2xxx-Add-fw_attr-and-port_no-SysFS-node.patch new file mode 100644 index 0000000..5f67d56 --- /dev/null +++ b/SOURCES/0029-scsi-scsi-qla2xxx-Add-fw_attr-and-port_no-SysFS-node.patch @@ -0,0 +1,88 @@ +From 7a2438e4d6e2262d5c61a447ca1e053e85efeaf8 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:49 -0400 +Subject: [PATCH 029/124] [scsi] scsi: qla2xxx: Add fw_attr and port_no SysFS + node + +Message-id: <20190801155618.12650-30-hmadhani@redhat.com> +Patchwork-id: 267801 +O-Subject: [RHEL 7.8 e-stor PATCH 029/118] scsi: qla2xxx: Add fw_attr and port_no SysFS node +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch adds new sysfs node to display firmware attributes and port +number. + +Signed-off-by: Joe Carnuccio +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit df617ffbbc5ecb64334548546d4b0cc4ff0527c0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 bc60835e7a3f..99c32349291c 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -2165,6 +2165,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); +@@ -2222,6 +2248,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[] = { +@@ -2262,6 +2290,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.13.6 + diff --git a/SOURCES/0030-scsi-scsi-qla2xxx-Remove-FW-default-template.patch b/SOURCES/0030-scsi-scsi-qla2xxx-Remove-FW-default-template.patch new file mode 100644 index 0000000..4efddf3 --- /dev/null +++ b/SOURCES/0030-scsi-scsi-qla2xxx-Remove-FW-default-template.patch @@ -0,0 +1,331 @@ +From 8ad749d26ba00eaa30c27d4890851620516eb510 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:50 -0400 +Subject: [PATCH 030/124] [scsi] scsi: qla2xxx: Remove FW default template + +Message-id: <20190801155618.12650-31-hmadhani@redhat.com> +Patchwork-id: 267802 +O-Subject: [RHEL 7.8 e-stor PATCH 030/118] scsi: qla2xxx: Remove FW default template +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch removes 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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2ff6ae85d5eea54640f10db869302759d5376948) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 3b97724d27ec..aede9e5a31f7 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -612,8 +612,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 29eb7174a719..934799598702 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -7401,7 +7401,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, +@@ -7410,7 +7410,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; +@@ -7423,7 +7423,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); +@@ -7433,48 +7433,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; +@@ -7704,7 +7669,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 = (risc_size - 8) * sizeof(*fwcode); + ql_dbg(ql_dbg_init, vha, 0x0173, +@@ -7713,7 +7678,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + if (!ha->fw_dump_template) { + ql_log(ql_log_warn, vha, 0x0174, + "Failed fwdump template allocate %x bytes.\n", risc_size); +- goto default_template; ++ goto failed; + } + + fwcode += 7; +@@ -7725,7 +7690,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + if (!qla27xx_fwdt_template_valid(dcode)) { + ql_log(ql_log_warn, vha, 0x0175, + "Failed fwdump template validate\n"); +- goto default_template; ++ goto failed; + } + + dlen = qla27xx_fwdt_template_size(dcode); +@@ -7735,48 +7700,13 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + ql_log(ql_log_warn, vha, 0x0177, + "Failed fwdump template exceeds array by %zx bytes\n", + (size_t)(dlen - risc_size * sizeof(*fwcode))); +- goto default_template; +- } +- ha->fw_dump_template_len = dlen; +- return rval; +- +-default_template: +- ql_log(ql_log_warn, vha, 0x0178, "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, 0x0179, +- "-> template allocating %x bytes...\n", dlen); +- ha->fw_dump_template = vmalloc(dlen); +- if (!ha->fw_dump_template) { +- ql_log(ql_log_warn, vha, 0x017a, +- "Failed fwdump template allocate %x bytes.\n", risc_size); +- goto failed_template; +- } +- +- dcode = ha->fw_dump_template; +- risc_size = dlen / sizeof(*fwcode); +- fwcode = qla27xx_fwdt_template_default(); +- for (i = 0; i < risc_size; i++) +- dcode[i] = be32_to_cpu(fwcode[i]); +- +- if (!qla27xx_fwdt_template_valid(ha->fw_dump_template)) { +- ql_log(ql_log_warn, vha, 0x017b, +- "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, 0x017c, +- "-> template size %x bytes\n", dlen); + ha->fw_dump_template_len = dlen; + return rval; + +-failed_template: +- ql_log(ql_log_warn, vha, 0x017d, "Failed default fwdump template\n"); ++failed: ++ ql_log(ql_log_warn, vha, 0x017d, "Failed fwdump template\n"); + if (ha->fw_dump_template) + vfree(ha->fw_dump_template); + ha->fw_dump_template = NULL; +diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c +index 6a0e94da4598..8e1a825aed39 100644 +--- a/drivers/scsi/qla2xxx/qla_tmpl.c ++++ b/drivers/scsi/qla2xxx/qla_tmpl.c +@@ -7,97 +7,7 @@ + #include "qla_def.h" + #include "qla_tmpl.h" + +-/* note default template is in big endian */ +-static const uint32_t ql27xx_fwdt_default_template[] = { +- 0x63000000, 0xa4000000, 0x7c050000, 0x00000000, +- 0x30000000, 0x01000000, 0x00000000, 0xc0406eb4, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x00000000, 0x00000000, 0x00000000, +- 0x00000000, 0x04010000, 0x14000000, 0x00000000, +- 0x02000000, 0x44000000, 0x09010000, 0x10000000, +- 0x00000000, 0x02000000, 0x01010000, 0x1c000000, +- 0x00000000, 0x02000000, 0x00600000, 0x00000000, +- 0xc0000000, 0x01010000, 0x1c000000, 0x00000000, +- 0x02000000, 0x00600000, 0x00000000, 0xcc000000, +- 0x01010000, 0x1c000000, 0x00000000, 0x02000000, +- 0x10600000, 0x00000000, 0xd4000000, 0x01010000, +- 0x1c000000, 0x00000000, 0x02000000, 0x700f0000, +- 0x00000060, 0xf0000000, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x00700000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x10700000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x40700000, 0x041000c0, +- 0x01010000, 0x1c000000, 0x00000000, 0x02000000, +- 0x007c0000, 0x01000000, 0xc0000000, 0x00010000, +- 0x18000000, 0x00000000, 0x02000000, 0x007c0000, +- 0x040300c4, 0x00010000, 0x18000000, 0x00000000, +- 0x02000000, 0x007c0000, 0x040100c0, 0x01010000, +- 0x1c000000, 0x00000000, 0x02000000, 0x007c0000, +- 0x00000000, 0xc0000000, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x007c0000, 0x04200000, +- 0x0b010000, 0x18000000, 0x00000000, 0x02000000, +- 0x0c000000, 0x00000000, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000000b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000010b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000020b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000030b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000040b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000050b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000060b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000070b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000080b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x000090b0, 0x02010000, 0x20000000, +- 0x00000000, 0x02000000, 0x700f0000, 0x040100fc, +- 0xf0000000, 0x0000a0b0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x0a000000, 0x040100c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x0a000000, 0x04200080, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x00be0000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x10be0000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x20be0000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x30be0000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x00b00000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x10b00000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x20b00000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x30b00000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x00300000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x10300000, 0x041000c0, 0x00010000, 0x18000000, +- 0x00000000, 0x02000000, 0x20300000, 0x041000c0, +- 0x00010000, 0x18000000, 0x00000000, 0x02000000, +- 0x30300000, 0x041000c0, 0x0a010000, 0x10000000, +- 0x00000000, 0x02000000, 0x06010000, 0x1c000000, +- 0x00000000, 0x02000000, 0x01000000, 0x00000200, +- 0xff230200, 0x06010000, 0x1c000000, 0x00000000, +- 0x02000000, 0x02000000, 0x00001000, 0x00000000, +- 0x07010000, 0x18000000, 0x00000000, 0x02000000, +- 0x00000000, 0x01000000, 0x07010000, 0x18000000, +- 0x00000000, 0x02000000, 0x00000000, 0x02000000, +- 0x07010000, 0x18000000, 0x00000000, 0x02000000, +- 0x00000000, 0x03000000, 0x0d010000, 0x14000000, +- 0x00000000, 0x02000000, 0x00000000, 0xff000000, +- 0x10000000, 0x00000000, 0x00000080, +-}; ++#define IOBASE(reg) offsetof(typeof(*reg), iobase_addr) + + static inline void __iomem * + qla27xx_isp_reg(struct scsi_qla_host *vha) +@@ -1032,18 +942,6 @@ qla27xx_fwdt_template_size(void *p) + return tmp->template_size; + } + +-ulong +-qla27xx_fwdt_template_default_size(void) +-{ +- return sizeof(ql27xx_fwdt_default_template); +-} +- +-const void * +-qla27xx_fwdt_template_default(void) +-{ +- return ql27xx_fwdt_default_template; +-} +- + int + qla27xx_fwdt_template_valid(void *p) + { +-- +2.13.6 + diff --git a/SOURCES/0031-scsi-scsi-qla2xxx-Fix-routine-qla27xx_dump_-mpi-ram.patch b/SOURCES/0031-scsi-scsi-qla2xxx-Fix-routine-qla27xx_dump_-mpi-ram.patch new file mode 100644 index 0000000..9a03a85 --- /dev/null +++ b/SOURCES/0031-scsi-scsi-qla2xxx-Fix-routine-qla27xx_dump_-mpi-ram.patch @@ -0,0 +1,271 @@ +From 47f61786dc2bbf5f0c95248ac91e7855e5a89272 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:51 -0400 +Subject: [PATCH 031/124] [scsi] scsi: qla2xxx: Fix routine + qla27xx_dump_{mpi|ram}() + +Message-id: <20190801155618.12650-32-hmadhani@redhat.com> +Patchwork-id: 267804 +O-Subject: [RHEL 7.8 e-stor PATCH 031/118] scsi: qla2xxx: Fix routine qla27xx_dump_{mpi|ram}() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch fixes qla27xx_dump_{mpi|ram} api for ISP27XX. + +Signed-off-by: Joe Carnuccio +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 24ef8f7eb5d03480e09ce28f0bb905398a0d57c8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 5e5ab360fc44..fa4d8fe9c41d 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -112,30 +112,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 = 6000000; ++ 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))); + +@@ -146,76 +141,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 = 6000000; 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(dump[idx]); +- } else { +- rval = QLA_FUNCTION_FAILED; ++ if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ /* no interrupt, timed out*/ ++ return rval; ++ } ++ if (rval) { ++ /* error completion status */ ++ return rval; ++ } ++ for (j = 0; j < dwords; j++) { ++ ram[i + j] = IS_QLA27XX(ha) ? ++ chunk[j] : swab32(chunk[j]); + } + } + +- *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL; +- return rval; ++ *nxt = ram + i; ++ return QLA_SUCCESS; + } + + int + qla24xx_dump_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; ++ int rval = QLA_FUNCTION_FAILED; + 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 = 6000000; + +- rval = QLA_SUCCESS; +- mb0 = 0; +- +- WRT_REG_WORD(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); + clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); + +- 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; ++ for (i = 0; i < ram_dwords; i += dwords, addr += dwords) { ++ if (i + dwords > ram_dwords) ++ dwords = ram_dwords - i; + ++ WRT_REG_WORD(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); + 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))); + +@@ -224,45 +218,47 @@ qla24xx_dump_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 = 6000000; timer; timer--) { +- /* Check for pending interrupts. */ ++ while (timer--) { ++ udelay(5); + 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); +- +- mb0 = RD_REG_WORD(®->mailbox0); +- +- WRT_REG_DWORD(®->hccr, +- HCCRX_CLR_RISC_INT); +- RD_REG_DWORD(®->hccr); +- break; +- } ++ /* Check for pending interrupts. */ ++ if (!(stat & HSRX_RISC_INT)) ++ continue; + +- /* Clear this intr; it wasn't a mailbox intr */ ++ stat &= 0xff; ++ if (stat != 0x1 && stat != 0x2 && ++ stat != 0x10 && stat != 0x11) { + 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(dump[idx]); +- } else { +- rval = QLA_FUNCTION_FAILED; ++ if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ /* no interrupt, timed out*/ ++ return rval; ++ } ++ if (rval) { ++ /* error completion status */ ++ return rval; ++ } ++ for (j = 0; j < dwords; j++) { ++ ram[i + j] = IS_QLA27XX(ha) ? ++ chunk[j] : swab32(chunk[j]); + } + } + +- *nxt = rval == QLA_SUCCESS ? &ram[cnt]: NULL; +- return rval; ++ *nxt = ram + i; ++ return QLA_SUCCESS; + } + + static int +-- +2.13.6 + diff --git a/SOURCES/0032-scsi-scsi-qla2xxx-Add-Device-ID-for-ISP28XX.patch b/SOURCES/0032-scsi-scsi-qla2xxx-Add-Device-ID-for-ISP28XX.patch new file mode 100644 index 0000000..699fea3 --- /dev/null +++ b/SOURCES/0032-scsi-scsi-qla2xxx-Add-Device-ID-for-ISP28XX.patch @@ -0,0 +1,1531 @@ +From 2cca28ac6617c2b416640d4ad5a07b80d8df886a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:52 -0400 +Subject: [PATCH 032/124] [scsi] scsi: qla2xxx: Add Device ID for ISP28XX + +Message-id: <20190801155618.12650-33-hmadhani@redhat.com> +Patchwork-id: 267805 +O-Subject: [RHEL 7.8 e-stor PATCH 032/118] scsi: qla2xxx: Add Device ID for ISP28XX +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit ecc89f25e225fabfffc709dbc43c928bc276cade) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 | 60 ++++++++++++++++++-------- + drivers/scsi/qla2xxx/qla_dfs.c | 2 +- + 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, 269 insertions(+), 144 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 99c32349291c..ec76b33b9a95 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); +@@ -992,7 +992,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, +@@ -1337,7 +1338,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", +@@ -1384,7 +1386,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", +@@ -1597,7 +1599,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", +@@ -1611,7 +1613,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 scnprintf(buf, PAGE_SIZE, "%s\n", +@@ -1629,7 +1631,7 @@ qla2x00_max_speed_sup_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, "%s\n", +@@ -1646,7 +1648,7 @@ qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr, + int mode = QLA_SET_DATA_RATE_LR; + struct qla_hw_data *ha = vha->hw; + +- if (!IS_QLA27XX(vha->hw)) { ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) { + ql_log(ql_log_warn, vha, 0x70d8, + "Speed setting not supported \n"); + return -EINVAL; +@@ -2172,7 +2174,7 @@ qla2x00_fw_attr_show(struct device *dev, + 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, "%llx\n", +@@ -2358,6 +2360,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) + case PORT_SPEED_32GB: + speed = FC_PORTSPEED_32GBIT; + break; ++ case PORT_SPEED_64GB: ++ speed = FC_PORTSPEED_64GBIT; ++ break; + } + fc_host_speed(shost) = speed; + } +@@ -3037,6 +3042,9 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha) + else if (IS_QLA27XX(ha)) + speed = FC_PORTSPEED_32GBIT | FC_PORTSPEED_16GBIT | + FC_PORTSPEED_8GBIT; ++ else if (IS_QLA28XX(ha)) ++ speed = FC_PORTSPEED_64GBIT | FC_PORTSPEED_32GBIT | ++ FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT; + else + speed = FC_PORTSPEED_1GBIT; + fc_host_supported_speeds(vha->host) = speed; +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index 45566a2a3f01..fec996cdd4a0 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1386,7 +1386,8 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha, + start == (ha->flt_region_fw * 4)) + valid = 1; + else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || +- IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) ++ IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) + valid = 1; + if (!valid) { + ql_log(ql_log_warn, vha, 0x7058, +@@ -2109,7 +2110,7 @@ qla27xx_get_flash_upd_cap(struct fc_bsg_job *bsg_job) + struct qla_hw_data *ha = vha->hw; + struct qla_flash_update_caps cap; + +- if (!(IS_QLA27XX(ha))) ++ if (!(IS_QLA27XX(ha)) && !IS_QLA28XX(ha)) + return -EPERM; + + memset(&cap, 0, sizeof(cap)); +@@ -2140,7 +2141,7 @@ qla27xx_set_flash_upd_cap(struct fc_bsg_job *bsg_job) + uint64_t online_fw_attr = 0; + struct qla_flash_update_caps cap; + +- if (!(IS_QLA27XX(ha))) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return -EPERM; + + memset(&cap, 0, sizeof(cap)); +@@ -2186,7 +2187,7 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job) + uint8_t domain, area, al_pa, state; + int rval; + +- if (!(IS_QLA27XX(ha))) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return -EPERM; + + memset(&bbcr, 0, sizeof(bbcr)); +@@ -2296,7 +2297,8 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job) + int rval; + struct qla_dport_diag *dd; + +- if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw)) ++ if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw) && ++ !IS_QLA28XX(vha->hw)) + return -EPERM; + + dd = kmalloc(sizeof(*dd), GFP_KERNEL); +diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c +index fa4d8fe9c41d..dd443940a019 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -177,7 +177,8 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, + return rval; + } + for (j = 0; j < dwords; j++) { +- ram[i + j] = IS_QLA27XX(ha) ? ++ ram[i + j] = ++ (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ? + chunk[j] : swab32(chunk[j]); + } + } +@@ -252,7 +253,8 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, + return rval; + } + for (j = 0; j < dwords; j++) { +- ram[i + j] = IS_QLA27XX(ha) ? ++ ram[i + j] = ++ (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ? + chunk[j] : swab32(chunk[j]); + } + } +@@ -666,7 +668,8 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) + struct qla2xxx_mq_chain *mq = ptr; + device_reg_t *reg; + +- if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) + return ptr; + + mq = ptr; +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 416307fab71e..d0862e76a279 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -1213,6 +1213,7 @@ struct mbx_cmd_32 { + #define QLA27XX_IMG_STATUS_VER_MAJOR 0x01 + #define QLA27XX_IMG_STATUS_VER_MINOR 0x00 + #define QLA27XX_IMG_STATUS_SIGN 0xFACEFADE ++#define QLA28XX_IMG_STATUS_SIGN 0xFACEFADF + #define QLA27XX_PRIMARY_IMAGE 1 + #define QLA27XX_SECONDARY_IMAGE 2 + +@@ -2682,6 +2683,7 @@ struct ct_fdmiv2_hba_attributes { + #define FDMI_PORT_SPEED_8GB 0x10 + #define FDMI_PORT_SPEED_16GB 0x20 + #define FDMI_PORT_SPEED_32GB 0x40 ++#define FDMI_PORT_SPEED_64GB 0x80 + #define FDMI_PORT_SPEED_UNKNOWN 0x8000 + + #define FC_CLASS_2 0x04 +@@ -3377,7 +3379,8 @@ struct qla_tc_param { + #define QLA_MQ_SIZE 32 + #define QLA_MAX_QUEUES 256 + #define ISP_QUE_REG(ha, id) \ +- ((ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ? \ ++ ((ha->mqenable || IS_QLA83XX(ha) || \ ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) ? \ + ((void __iomem *)ha->mqiobase + (QLA_QUE_PAGE * id)) :\ + ((void __iomem *)ha->iobase)) + #define QLA_REQ_QUE_ID(tag) \ +@@ -3710,6 +3713,7 @@ struct qla_hw_data { + #define PORT_SPEED_8GB 0x04 + #define PORT_SPEED_16GB 0x05 + #define PORT_SPEED_32GB 0x06 ++#define PORT_SPEED_64GB 0x07 + #define PORT_SPEED_10GB 0x13 + uint16_t link_data_rate; /* F/W operating speed */ + uint16_t set_data_rate; /* Set by user */ +@@ -3736,6 +3740,11 @@ struct qla_hw_data { + #define PCI_DEVICE_ID_QLOGIC_ISP2071 0x2071 + #define PCI_DEVICE_ID_QLOGIC_ISP2271 0x2271 + #define PCI_DEVICE_ID_QLOGIC_ISP2261 0x2261 ++#define PCI_DEVICE_ID_QLOGIC_ISP2061 0x2061 ++#define PCI_DEVICE_ID_QLOGIC_ISP2081 0x2081 ++#define PCI_DEVICE_ID_QLOGIC_ISP2089 0x2089 ++#define PCI_DEVICE_ID_QLOGIC_ISP2281 0x2281 ++#define PCI_DEVICE_ID_QLOGIC_ISP2289 0x2289 + + uint32_t isp_type; + #define DT_ISP2100 BIT_0 +@@ -3760,7 +3769,12 @@ struct qla_hw_data { + #define DT_ISP2071 BIT_19 + #define DT_ISP2271 BIT_20 + #define DT_ISP2261 BIT_21 +-#define DT_ISP_LAST (DT_ISP2261 << 1) ++#define DT_ISP2061 BIT_22 ++#define DT_ISP2081 BIT_23 ++#define DT_ISP2089 BIT_24 ++#define DT_ISP2281 BIT_25 ++#define DT_ISP2289 BIT_26 ++#define DT_ISP_LAST (DT_ISP2289 << 1) + + uint32_t device_type; + #define DT_T10_PI BIT_25 +@@ -3795,6 +3809,8 @@ struct qla_hw_data { + #define IS_QLA2071(ha) (DT_MASK(ha) & DT_ISP2071) + #define IS_QLA2271(ha) (DT_MASK(ha) & DT_ISP2271) + #define IS_QLA2261(ha) (DT_MASK(ha) & DT_ISP2261) ++#define IS_QLA2081(ha) (DT_MASK(ha) & DT_ISP2081) ++#define IS_QLA2281(ha) (DT_MASK(ha) & DT_ISP2281) + + #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ + IS_QLA6312(ha) || IS_QLA6322(ha)) +@@ -3804,6 +3820,7 @@ struct qla_hw_data { + #define IS_QLA83XX(ha) (IS_QLA2031(ha) || IS_QLA8031(ha)) + #define IS_QLA84XX(ha) (IS_QLA8432(ha)) + #define IS_QLA27XX(ha) (IS_QLA2071(ha) || IS_QLA2271(ha) || IS_QLA2261(ha)) ++#define IS_QLA28XX(ha) (IS_QLA2081(ha) || IS_QLA2281(ha)) + #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ + IS_QLA84XX(ha)) + #define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \ +@@ -3812,14 +3829,15 @@ struct qla_hw_data { + #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ + IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ + IS_QLA82XX(ha) || IS_QLA83XX(ha) || \ +- IS_QLA8044(ha) || IS_QLA27XX(ha)) ++ IS_QLA8044(ha) || IS_QLA27XX(ha) || \ ++ IS_QLA28XX(ha)) + #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha) || \ +- IS_QLA27XX(ha)) ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + #define IS_NOPOLLING_TYPE(ha) (IS_QLA81XX(ha) && (ha)->flags.msix_enabled) + #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha) || \ +- IS_QLA27XX(ha)) ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + #define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha) || \ +- IS_QLA27XX(ha)) ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) + + #define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI) +@@ -3830,28 +3848,34 @@ struct qla_hw_data { + #define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) + #define IS_CT6_SUPPORTED(ha) ((ha)->device_type & DT_CT6_SUPPORTED) + #define IS_MQUE_CAPABLE(ha) ((ha)->mqenable || IS_QLA83XX(ha) || \ +- IS_QLA27XX(ha)) +-#define IS_BIDI_CAPABLE(ha) ((IS_QLA25XX(ha) || IS_QLA2031(ha))) ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++#define IS_BIDI_CAPABLE(ha) \ ++ (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + /* Bit 21 of fw_attributes decides the MCTP capabilities */ + #define IS_MCTP_CAPABLE(ha) (IS_QLA2031(ha) && \ + ((ha)->fw_attributes_ext[0] & BIT_0)) + #define IS_PI_UNINIT_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) + #define IS_PI_IPGUARD_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) + #define IS_PI_DIFB_DIX0_CAPABLE(ha) (0) +-#define IS_PI_SPLIT_DET_CAPABLE_HBA(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++#define IS_PI_SPLIT_DET_CAPABLE_HBA(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha) || \ ++ IS_QLA28XX(ha)) + #define IS_PI_SPLIT_DET_CAPABLE(ha) (IS_PI_SPLIT_DET_CAPABLE_HBA(ha) && \ + (((ha)->fw_attributes_h << 16 | (ha)->fw_attributes) & BIT_22)) +-#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha) || \ ++ IS_QLA28XX(ha)) + #define IS_TGT_MODE_CAPABLE(ha) (ha->tgt.atio_q_length) +-#define IS_SHADOW_REG_CAPABLE(ha) (IS_QLA27XX(ha)) +-#define IS_DPORT_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) +-#define IS_FAWWN_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++#define IS_SHADOW_REG_CAPABLE(ha) (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++#define IS_DPORT_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha) || \ ++ IS_QLA28XX(ha)) ++#define IS_FAWWN_CAPABLE(ha) (IS_QLA83XX(ha) || IS_QLA27XX(ha) || \ ++ IS_QLA28XX(ha)) + #define IS_EXCHG_OFFLD_CAPABLE(ha) \ +- (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + #define IS_EXLOGIN_OFFLD_CAPABLE(ha) \ +- (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || \ ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + #define USE_ASYNC_SCAN(ha) (IS_QLA25XX(ha) || IS_QLA81XX(ha) ||\ +- IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + + /* HBA serial number */ + uint8_t serial0; +@@ -4600,6 +4624,7 @@ struct qla2_sgx { + #define OPTROM_SIZE_81XX 0x400000 + #define OPTROM_SIZE_82XX 0x800000 + #define OPTROM_SIZE_83XX 0x1000000 ++#define OPTROM_SIZE_28XX 0x2000000 + + #define OPTROM_BURST_SIZE 0x1000 + #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) +@@ -4696,7 +4721,8 @@ struct sff_8247_a0 { + #define AUTO_DETECT_SFP_SUPPORT(_vha)\ + (ql2xautodetectsfp && !_vha->vp_idx && \ + (IS_QLA25XX(_vha->hw) || IS_QLA81XX(_vha->hw) ||\ +- IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw))) ++ IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \ ++ IS_QLA28XX(_vha->hw))) + + #define SAVE_TOPO(_ha) { \ + if (_ha->current_topology) \ +diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c +index 2903d1e1847d..4dd857da215a 100644 +--- a/drivers/scsi/qla2xxx/qla_dfs.c ++++ b/drivers/scsi/qla2xxx/qla_dfs.c +@@ -363,7 +363,7 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) + struct qla_hw_data *ha = vha->hw; + + if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto out; + if (!ha->fce) + goto out; +diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h +index 50c1e6c62e31..f7ff1d01a315 100644 +--- a/drivers/scsi/qla2xxx/qla_fw.h ++++ b/drivers/scsi/qla2xxx/qla_fw.h +@@ -2005,6 +2005,8 @@ struct ex_init_cb_81xx { + + #define FARX_ACCESS_FLASH_CONF_81XX 0x7FFD0000 + #define FARX_ACCESS_FLASH_DATA_81XX 0x7F800000 ++#define FARX_ACCESS_FLASH_CONF_28XX 0x7FFD0000 ++#define FARX_ACCESS_FLASH_DATA_28XX 0x7F7D0000 + + /* FCP priority config defines *************************************/ + /* operations */ +@@ -2079,6 +2081,7 @@ struct qla_fcp_prio_cfg { + #define FA_NPIV_CONF1_ADDR_81 0xD2000 + + /* 83XX Flash locations -- occupies second 8MB region. */ +-#define FA_FLASH_LAYOUT_ADDR_83 0xFC400 ++#define FA_FLASH_LAYOUT_ADDR_83 (0x3F1000/4) ++#define FA_FLASH_LAYOUT_ADDR_28 (0x11000/4) + + #endif +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 69cc858732d4..70b832105f86 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -1794,7 +1794,7 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) + if (IS_CNA_CAPABLE(ha)) + eiter->a.sup_speed = cpu_to_be32( + FDMI_PORT_SPEED_10GB); +- else if (IS_QLA27XX(ha)) ++ else if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + eiter->a.sup_speed = cpu_to_be32( + FDMI_PORT_SPEED_32GB| + FDMI_PORT_SPEED_16GB| +@@ -2373,7 +2373,7 @@ qla2x00_fdmiv2_rpa(scsi_qla_host_t *vha) + if (IS_CNA_CAPABLE(ha)) + eiter->a.sup_speed = cpu_to_be32( + FDMI_PORT_SPEED_10GB); +- else if (IS_QLA27XX(ha)) ++ else if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + eiter->a.sup_speed = cpu_to_be32( + FDMI_PORT_SPEED_32GB| + FDMI_PORT_SPEED_16GB| +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 934799598702..a2bf199b35d9 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3018,7 +3018,7 @@ qla2x00_alloc_offload_mem(scsi_qla_host_t *vha) + if (IS_FWI2_CAPABLE(ha)) { + /* Allocate memory for Fibre Channel Event Buffer. */ + if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto try_eft; + + if (ha->fce) +@@ -3106,7 +3106,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) + mem_size = (ha->fw_memory_size - 0x11000 + 1) * + sizeof(uint16_t); + } else if (IS_FWI2_CAPABLE(ha)) { +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + fixed_size = offsetof(struct qla83xx_fw_dump, ext_mem); + else if (IS_QLA81XX(ha)) + fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); +@@ -3118,7 +3118,8 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) + mem_size = (ha->fw_memory_size - 0x100000 + 1) * + sizeof(uint32_t); + if (ha->mqenable) { +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && ++ !IS_QLA28XX(ha)) + mq_size = sizeof(struct qla2xxx_mq_chain); + /* + * Allocate maximum buffer size for all queues. +@@ -3133,7 +3134,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) + mq_size += ha->tgt.atio_q_length * sizeof(request_t); + /* Allocate memory for Fibre Channel Event Buffer. */ + if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto try_eft; + + fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE; +@@ -3143,7 +3144,7 @@ try_eft: + eft_size = EFT_SIZE; + } + +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (!ha->fw_dump_template) { + ql_log(ql_log_warn, vha, 0x00ba, + "Failed missing fwdump template\n"); +@@ -3186,7 +3187,7 @@ allocate: + "Allocated (%d KB) for firmware dump.\n", + dump_size / 1024); + +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + return; + + ha->fw_dump->signature[0] = 'Q'; +@@ -3496,7 +3497,8 @@ qla2x00_setup_chip(scsi_qla_host_t *vha) + if (rval == QLA_SUCCESS) { + qla24xx_detect_sfp(vha); + +- if ((IS_QLA83XX(ha) || IS_QLA27XX(ha)) && ++ if ((IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) && + (ha->zio_mode == QLA_ZIO_MODE_6)) + qla27xx_set_zio_threshold(vha, + ha->last_zio_threshold); +@@ -3568,7 +3570,7 @@ enable_82xx_npiv: + spin_unlock_irqrestore(&ha->hardware_lock, flags); + } + +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + ha->flags.fac_supported = 1; + else if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) { + uint32_t size; +@@ -3583,7 +3585,8 @@ enable_82xx_npiv: + ha->fw_major_version, ha->fw_minor_version, + ha->fw_subminor_version); + +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + ha->flags.fac_supported = 0; + rval = QLA_SUCCESS; + } +@@ -3752,7 +3755,7 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha) + + /* Move PUREX, ABTS RX & RIDA to ATIOQ */ + if (ql2xmvasynctoatio && +- (IS_QLA83XX(ha) || IS_QLA27XX(ha))) { ++ (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha))) { + if (qla_tgt_mode_enabled(vha) || + qla_dual_mode_enabled(vha)) + ha->fw_options[2] |= BIT_11; +@@ -3760,7 +3763,8 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha) + ha->fw_options[2] &= ~BIT_11; + } + +- if (IS_QLA25XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA25XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + /* + * Tell FW to track each exchange to prevent + * driver from using stale exchange. +@@ -3857,7 +3861,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha) + if (IS_SHADOW_REG_CAPABLE(ha)) + icb->firmware_options_2 |= cpu_to_le32(BIT_30|BIT_29); + +- if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + icb->qos = cpu_to_le16(QLA_DEFAULT_QUE_QOS); + icb->rid = cpu_to_le16(rid); + if (ha->flags.msix_enabled) { +@@ -7219,6 +7224,7 @@ uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) + uint32_t *wptr; + uint32_t cnt, chksum, size; + struct qla_hw_data *ha = vha->hw; ++ uint32_t signature; + + valid_pri_image = valid_sec_image = 1; + ha->active_image = 0; +@@ -7232,7 +7238,9 @@ uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) + qla24xx_read_flash_data(vha, (uint32_t *)(&pri_image_status), + ha->flt_region_img_status_pri, size); + +- if (pri_image_status.signature != QLA27XX_IMG_STATUS_SIGN) { ++ signature = le32_to_cpu(pri_image_status.signature); ++ if (signature != QLA27XX_IMG_STATUS_SIGN && ++ signature != QLA28XX_IMG_STATUS_SIGN) { + ql_dbg(ql_dbg_init, vha, 0x018b, + "Primary image signature (0x%x) not valid\n", + pri_image_status.signature); +@@ -7262,7 +7270,9 @@ check_sec_image: + qla24xx_read_flash_data(vha, (uint32_t *)(&sec_image_status), + ha->flt_region_img_status_sec, size); + +- if (sec_image_status.signature != QLA27XX_IMG_STATUS_SIGN) { ++ signature = le32_to_cpu(sec_image_status.signature); ++ if (signature != QLA27XX_IMG_STATUS_SIGN && ++ signature != QLA28XX_IMG_STATUS_SIGN) { + ql_dbg(ql_dbg_init, vha, 0x018d, + "Secondary image signature(0x%x) not valid\n", + sec_image_status.signature); +@@ -7322,7 +7332,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + dcode = (uint32_t *)req->ring; + *srisc_addr = 0; + +- if (IS_QLA27XX(ha) && ++ if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) + faddr = ha->flt_region_fw_sec; + +@@ -7386,7 +7396,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + segments--; + } + +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return rval; + + if (ha->fw_dump_template) +@@ -7654,7 +7664,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + segments--; + } + +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return rval; + + if (ha->fw_dump_template) +@@ -8159,7 +8169,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + ha->login_retry_count = ql2xloginretrycount; + + /* if not running MSI-X we need handshaking on interrupts */ +- if (!vha->hw->flags.msix_enabled && (IS_QLA83XX(ha) || IS_QLA27XX(ha))) ++ if (!vha->hw->flags.msix_enabled && ++ (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha))) + icb->firmware_options_2 |= cpu_to_le32(BIT_22); + + /* Enable ZIO. */ +@@ -8192,7 +8203,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + /* N2N: driver will initiate Login instead of FW */ + icb->firmware_options_3 |= BIT_8; + +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + icb->firmware_options_3 |= BIT_8; + ql_dbg(ql_log_info, vha, 0x0075, + "Enabling direct connection.\n"); +@@ -8614,7 +8625,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, + qpair->msix->in_use = 1; + list_add_tail(&qpair->qp_list_elem, &vha->qp_list); + qpair->pdev = ha->pdev; +- if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) + qpair->reqq_start_iocbs = qla_83xx_start_iocbs; + + mutex_unlock(&ha->mq_lock); +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index d13772869d4a..ec06bdc606f7 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -467,7 +467,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) + req->ring_ptr++; + + /* Set chip new ring index. */ +- if (ha->mqenable || IS_QLA27XX(ha)) { ++ if (ha->mqenable || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + WRT_REG_DWORD(req->req_q_in, req->ring_index); + } else if (IS_QLA83XX(ha)) { + WRT_REG_DWORD(req->req_q_in, req->ring_index); +@@ -2367,7 +2367,8 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp) + if (req->cnt < req_cnt + 2) { + if (qpair->use_shadow_reg) + cnt = *req->out_ptr; +- else if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ else if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) + cnt = RD_REG_DWORD(®->isp25mq.req_q_out); + else if (IS_P3P_TYPE(ha)) + cnt = RD_REG_DWORD(®->isp82.req_q_out); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index da7428a6efb8..fc1d11c492cb 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -707,7 +707,8 @@ skip_rio: + break; + + case MBA_SYSTEM_ERR: /* System Error */ +- mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ? ++ mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) ? + RD_REG_WORD(®24->mailbox7) : 0; + ql_log(ql_log_warn, vha, 0x5003, + "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " +@@ -3011,7 +3012,8 @@ process_err: + qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE); + break; + case ABTS_RECV_24XX: +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + /* ensure that the ATIO queue is empty */ + qlt_handle_abts_recv(vha, rsp, + (response_t *)pkt); +@@ -3084,7 +3086,7 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha) + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; + + if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return; + + rval = QLA_SUCCESS; +@@ -3535,7 +3537,7 @@ msix_register_fail: + } + + /* Enable MSI-X vector for response queue update for queue 0 */ +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (ha->msixbase && ha->mqiobase && + (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 || + ql2xmqsupport)) +@@ -3566,7 +3568,7 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) + /* If possible, enable MSI-X. */ + if (ql2xenablemsix == 0 || (!IS_QLA2432(ha) && !IS_QLA2532(ha) && + !IS_QLA8432(ha) && !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && +- !IS_QLAFX00(ha) && !IS_QLA27XX(ha))) ++ !IS_QLAFX00(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha))) + goto skip_msi; + + if (ql2xenablemsix == 2) +@@ -3605,7 +3607,7 @@ skip_msix: + + if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && + !IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto skip_msi; + + ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI); +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index d588784c5aa5..90efc3e102cb 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -656,7 +656,7 @@ static inline uint16_t qla25xx_set_sfp_lr_dist(struct qla_hw_data *ha) + { + uint16_t mb4 = BIT_0; + +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mb4 |= ha->long_range_distance << LR_DIST_FW_POS; + + return mb4; +@@ -666,7 +666,7 @@ static inline uint16_t qla25xx_set_nvr_lr_dist(struct qla_hw_data *ha) + { + uint16_t mb4 = BIT_0; + +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + struct nvram_81xx *nv = ha->nvram; + + mb4 |= LR_DIST_FW_FIELD(nv->enhanced_features); +@@ -711,7 +711,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + mcp->mb[4] = 0; + ha->flags.using_lr_setting = 0; + if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || +- IS_QLA27XX(ha)) { ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (ql2xautodetectsfp) { + if (ha->flags.detected_lr_sfp) { + mcp->mb[4] |= +@@ -730,10 +730,10 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + } + } + +- if (ql2xnvmeenable && IS_QLA27XX(ha)) ++ if (ql2xnvmeenable && (IS_QLA27XX(ha) || IS_QLA28XX(ha))) + mcp->mb[4] |= NVME_ENABLE_FLAG; + +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + struct nvram_81xx *nv = ha->nvram; + /* set minimum speed if specified in nvram */ + if (nv->min_link_speed >= 2 && +@@ -777,7 +777,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + "fw_ability_mask=%x.\n", ha->fw_ability_mask); + ql_dbg(ql_dbg_mbx, vha, 0x1027, + "exchanges=%x.\n", mcp->mb[1]); +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + ha->max_speed_sup = mcp->mb[2] & BIT_0; + ql_dbg(ql_dbg_mbx, vha, 0x119b, + "Maximum speed supported=%s.\n", +@@ -1055,7 +1056,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) + mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; + if (IS_FWI2_CAPABLE(ha)) + mcp->in_mb |= MBX_17|MBX_16|MBX_15; +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->in_mb |= + MBX_25|MBX_24|MBX_23|MBX_22|MBX_21|MBX_20|MBX_19|MBX_18| + MBX_14|MBX_13|MBX_11|MBX_10|MBX_9|MBX_8; +@@ -1124,7 +1125,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) + } + } + +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + ha->mpi_version[0] = mcp->mb[10] & 0xff; + ha->mpi_version[1] = mcp->mb[11] >> 8; + ha->mpi_version[2] = mcp->mb[11] & 0xff; +@@ -1640,7 +1641,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, + mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; + if (IS_FWI2_CAPABLE(vha->hw)) + mcp->in_mb |= MBX_19|MBX_18|MBX_17|MBX_16; +- if (IS_QLA27XX(vha->hw)) ++ if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw)) + mcp->in_mb |= MBX_15; + mcp->tov = MBX_TOV_SECONDS; + mcp->flags = 0; +@@ -1694,7 +1695,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, + } + } + +- if (IS_QLA27XX(vha->hw)) ++ if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw)) + vha->bbcr = mcp->mb[15]; + } + +@@ -1810,7 +1811,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) + } + /* 1 and 2 should normally be captured. */ + mcp->in_mb = MBX_2|MBX_1|MBX_0; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + /* mb3 is additional info about the installed SFP. */ + mcp->in_mb |= MBX_3; + mcp->buf_size = size; +@@ -1824,7 +1825,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) + "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n", + rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]); + } else { +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (mcp->mb[2] == 6 || mcp->mb[3] == 2) + ql_dbg(ql_dbg_mbx, vha, 0x119d, + "Invalid SFP/Validation Failed\n"); +@@ -2078,7 +2079,7 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) + /*EMPTY*/ + ql_dbg(ql_dbg_mbx, vha, 0x1055, "Failed=%x.\n", rval); + } else { +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (mcp->mb[2] == 6 || mcp->mb[3] == 2) + ql_dbg(ql_dbg_mbx, vha, 0x119e, + "Invalid SFP/Validation Failed\n"); +@@ -2861,7 +2862,8 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha) + mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; + mcp->out_mb = MBX_0; + mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; +- if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw) || IS_QLA27XX(vha->hw)) ++ if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->in_mb |= MBX_12; + mcp->tov = MBX_TOV_SECONDS; + mcp->flags = 0; +@@ -2886,7 +2888,8 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha) + ha->orig_fw_iocb_count = mcp->mb[10]; + if (ha->flags.npiv_supported) + ha->max_npiv_vports = mcp->mb[11]; +- if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) + ha->fw_max_fcf_count = mcp->mb[12]; + } + +@@ -3325,7 +3328,7 @@ qla2x00_write_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t data) + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA25XX(vha->hw) && !IS_QLA2031(vha->hw) && +- !IS_QLA27XX(vha->hw)) ++ !IS_QLA27XX(vha->hw) && !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1182, +@@ -3364,7 +3367,7 @@ qla2x00_read_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t *data) + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA25XX(vha->hw) && !IS_QLA2031(vha->hw) && +- !IS_QLA27XX(vha->hw)) ++ !IS_QLA27XX(vha->hw) && !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1185, +@@ -3633,7 +3636,8 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, + "Entered %s.\n", __func__); + + if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) && +- !IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw)) ++ !IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw) && ++ !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + if (unlikely(pci_channel_offline(vha->hw->pdev))) +@@ -4320,7 +4324,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) + mcp->mb[12] = req->qos; + mcp->mb[11] = req->vp_idx; + mcp->mb[13] = req->rid; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->mb[15] = 0; + + mcp->mb[4] = req->id; +@@ -4334,9 +4338,10 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) + mcp->flags = MBX_DMA_OUT; + mcp->tov = MBX_TOV_SECONDS * 2; + +- if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) + mcp->in_mb |= MBX_1; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + mcp->out_mb |= MBX_15; + /* debug q create issue in SR-IOV */ + mcp->in_mb |= MBX_9 | MBX_8 | MBX_7; +@@ -4345,7 +4350,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) + spin_lock_irqsave(&ha->hardware_lock, flags); + if (!(req->options & BIT_0)) { + WRT_REG_DWORD(req->req_q_in, 0); +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + WRT_REG_DWORD(req->req_q_out, 0); + } + spin_unlock_irqrestore(&ha->hardware_lock, flags); +@@ -4389,7 +4394,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) + mcp->mb[5] = rsp->length; + mcp->mb[14] = rsp->msix->entry; + mcp->mb[13] = rsp->rid; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->mb[15] = 0; + + mcp->mb[4] = rsp->id; +@@ -4406,7 +4411,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) + if (IS_QLA81XX(ha)) { + mcp->out_mb |= MBX_12|MBX_11|MBX_10; + mcp->in_mb |= MBX_1; +- } else if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ } else if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10; + mcp->in_mb |= MBX_1; + /* debug q create issue in SR-IOV */ +@@ -4416,7 +4421,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) + spin_lock_irqsave(&ha->hardware_lock, flags); + if (!(rsp->options & BIT_0)) { + WRT_REG_DWORD(rsp->rsp_q_out, 0); +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + WRT_REG_DWORD(rsp->rsp_q_in, 0); + } + +@@ -4474,7 +4479,7 @@ qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size) + "Entered %s.\n", __func__); + + if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) && +- !IS_QLA27XX(vha->hw)) ++ !IS_QLA27XX(vha->hw) && !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; +@@ -4506,7 +4511,7 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable) + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) && +- !IS_QLA27XX(vha->hw)) ++ !IS_QLA27XX(vha->hw) && !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10df, +@@ -4541,7 +4546,7 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) && +- !IS_QLA27XX(vha->hw)) ++ !IS_QLA27XX(vha->hw) && !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2, +@@ -5280,7 +5285,7 @@ qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode) + + mcp->out_mb = MBX_2|MBX_1|MBX_0; + mcp->in_mb = MBX_2|MBX_1|MBX_0; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->in_mb |= MBX_4|MBX_3; + mcp->tov = MBX_TOV_SECONDS; + mcp->flags = 0; +@@ -5318,7 +5323,7 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha) + mcp->mb[1] = QLA_GET_DATA_RATE; + mcp->out_mb = MBX_1|MBX_0; + mcp->in_mb = MBX_2|MBX_1|MBX_0; +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->in_mb |= MBX_3; + mcp->tov = MBX_TOV_SECONDS; + mcp->flags = 0; +@@ -5348,7 +5353,7 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb) + "Entered %s.\n", __func__); + + if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA8044(ha) && +- !IS_QLA27XX(ha)) ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return QLA_FUNCTION_FAILED; + mcp->mb[0] = MBC_GET_PORT_CONFIG; + mcp->out_mb = MBX_0; +@@ -5844,7 +5849,7 @@ qla83xx_wr_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data) + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1130, +@@ -5919,7 +5924,7 @@ qla83xx_rd_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t *data) + struct qla_hw_data *ha = vha->hw; + unsigned long retry_max_time = jiffies + (2 * HZ); + +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx, vha, 0x114b, "Entered %s.\n", __func__); +@@ -5969,7 +5974,7 @@ qla83xx_restart_nic_firmware(scsi_qla_host_t *vha) + mbx_cmd_t *mcp = &mc; + struct qla_hw_data *ha = vha->hw; + +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx, vha, 0x1143, "Entered %s.\n", __func__); +@@ -6103,7 +6108,8 @@ qla26xx_dport_diagnostics(scsi_qla_host_t *vha, + mbx_cmd_t *mcp = &mc; + dma_addr_t dd_dma; + +- if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw)) ++ if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw) && ++ !IS_QLA28XX(vha->hw)) + return QLA_FUNCTION_FAILED; + + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x119f, +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index ee09796b9847..95d3ff062320 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -429,7 +429,7 @@ static void qla_init_base_qpair(struct scsi_qla_host *vha, struct req_que *req, + qla_cpu_update(rsp->qpair, raw_smp_processor_id()); + ha->base_qpair->pdev = ha->pdev; + +- if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) + ha->base_qpair->reqq_start_iocbs = qla_83xx_start_iocbs; + } + +@@ -2827,6 +2827,24 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) + ha->device_type |= DT_T10_PI; + ha->fw_srisc_address = RISC_START_ADDRESS_2400; + break; ++ case PCI_DEVICE_ID_QLOGIC_ISP2081: ++ case PCI_DEVICE_ID_QLOGIC_ISP2089: ++ ha->isp_type |= DT_ISP2081; ++ ha->device_type |= DT_ZIO_SUPPORTED; ++ ha->device_type |= DT_FWI2; ++ ha->device_type |= DT_IIDMA; ++ ha->device_type |= DT_T10_PI; ++ ha->fw_srisc_address = RISC_START_ADDRESS_2400; ++ break; ++ case PCI_DEVICE_ID_QLOGIC_ISP2281: ++ case PCI_DEVICE_ID_QLOGIC_ISP2289: ++ ha->isp_type |= DT_ISP2281; ++ ha->device_type |= DT_ZIO_SUPPORTED; ++ ha->device_type |= DT_FWI2; ++ ha->device_type |= DT_IIDMA; ++ ha->device_type |= DT_T10_PI; ++ ha->fw_srisc_address = RISC_START_ADDRESS_2400; ++ break; + } + + if (IS_QLA82XX(ha)) +@@ -2834,7 +2852,8 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) + else { + /* Get adapter physical port no from interrupt pin register. */ + pci_read_config_byte(ha->pdev, PCI_INTERRUPT_PIN, &ha->port_no); +- if (IS_QLA27XX(ha)) ++ if (IS_QLA25XX(ha) || IS_QLA2031(ha) || ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + ha->port_no--; + else + ha->port_no = !(ha->port_no & 1); +@@ -2931,7 +2950,11 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8044 || + pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2071 || + pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2271 || +- pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2261) { ++ pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2261 || ++ pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2081 || ++ pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2281 || ++ pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2089 || ++ pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2289) { + bars = pci_select_bars(pdev, IORESOURCE_MEM); + mem_only = 1; + ql_dbg_pci(ql_dbg_init, pdev, 0x0007, +@@ -2980,7 +3003,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + + /* Set EEH reset type to fundamental if required by hba */ + if (IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha) || +- IS_QLA83XX(ha) || IS_QLA27XX(ha)) ++ IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + pdev->needs_freset = 1; + + ha->prev_topology = 0; +@@ -3159,6 +3182,23 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX; + ha->nvram_conf_off = ~0; + ha->nvram_data_off = ~0; ++ } else if (IS_QLA28XX(ha)) { ++ ha->portnum = PCI_FUNC(ha->pdev->devfn); ++ ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400; ++ ha->mbx_count = MAILBOX_REGISTER_COUNT; ++ req_length = REQUEST_ENTRY_CNT_24XX; ++ rsp_length = RESPONSE_ENTRY_CNT_2300; ++ ha->tgt.atio_q_length = ATIO_ENTRY_CNT_24XX; ++ ha->max_loop_id = SNS_LAST_LOOP_ID_2300; ++ ha->init_cb_size = sizeof(struct mid_init_cb_81xx); ++ ha->gid_list_info_size = 8; ++ ha->optrom_size = OPTROM_SIZE_28XX; ++ ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; ++ ha->isp_ops = &qla27xx_isp_ops; ++ ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_28XX; ++ ha->flash_data_off = FARX_ACCESS_FLASH_DATA_28XX; ++ ha->nvram_conf_off = ~0; ++ ha->nvram_data_off = ~0; + } + + ql_dbg_pci(ql_dbg_init, pdev, 0x001e, +@@ -3324,7 +3364,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + req->req_q_out = &ha->iobase->isp24.req_q_out; + rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; + rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; +- if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; + req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; + rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; +@@ -3659,7 +3700,8 @@ qla2x00_shutdown(struct pci_dev *pdev) + if (ha->eft) + qla2x00_disable_eft_trace(vha); + +- if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + if (ha->flags.fw_started) + qla2x00_abort_isp_cleanup(vha); + } else { +@@ -3765,7 +3807,8 @@ qla2x00_unmap_iobases(struct qla_hw_data *ha) + if (ha->mqiobase) + iounmap(ha->mqiobase); + +- if ((IS_QLA83XX(ha) || IS_QLA27XX(ha)) && ha->msixbase) ++ if ((IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) && ++ ha->msixbase) + iounmap(ha->msixbase); + } + } +@@ -3818,7 +3861,8 @@ qla2x00_remove_one(struct pci_dev *pdev) + + ha->flags.host_shutting_down = 1; + +- if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + if (ha->flags.fw_started) + qla2x00_abort_isp_cleanup(base_vha); + } else if (!IS_QLAFX00(ha)) { +@@ -4308,7 +4352,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, + ha->npiv_info = NULL; + + /* Get consistent memory allocated for EX-INIT-CB. */ +- if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) { ++ if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, + &ha->ex_init_cb_dma); + if (!ha->ex_init_cb) +@@ -6784,7 +6829,7 @@ qla2x00_timer(scsi_qla_host_t *vha) + if (!vha->vp_idx && + (atomic_read(&ha->zio_threshold) != ha->last_zio_threshold) && + (ha->zio_mode == QLA_ZIO_MODE_6) && +- (IS_QLA83XX(ha) || IS_QLA27XX(ha))) { ++ (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha))) { + ql_log(ql_log_info, vha, 0x3002, + "Sched: Set ZIO exchange threshold to %d.\n", + ha->last_zio_threshold); +@@ -6830,7 +6875,6 @@ qla2x00_timer(scsi_qla_host_t *vha) + + /* Firmware interface routines. */ + +-#define FW_BLOBS 11 + #define FW_ISP21XX 0 + #define FW_ISP22XX 1 + #define FW_ISP2300 2 +@@ -6842,6 +6886,7 @@ qla2x00_timer(scsi_qla_host_t *vha) + #define FW_ISP2031 8 + #define FW_ISP8031 9 + #define FW_ISP27XX 10 ++#define FW_ISP28XX 11 + + #define FW_FILE_ISP21XX "ql2100_fw.bin" + #define FW_FILE_ISP22XX "ql2200_fw.bin" +@@ -6854,11 +6899,12 @@ qla2x00_timer(scsi_qla_host_t *vha) + #define FW_FILE_ISP2031 "ql2600_fw.bin" + #define FW_FILE_ISP8031 "ql8300_fw.bin" + #define FW_FILE_ISP27XX "ql2700_fw.bin" ++#define FW_FILE_ISP28XX "ql2800_fw.bin" + + + static DEFINE_MUTEX(qla_fw_lock); + +-static struct fw_blob qla_fw_blobs[FW_BLOBS] = { ++static struct fw_blob qla_fw_blobs[] = { + { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, + { .name = FW_FILE_ISP22XX, .segs = { 0x1000, 0 }, }, + { .name = FW_FILE_ISP2300, .segs = { 0x800, 0 }, }, +@@ -6870,6 +6916,8 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { + { .name = FW_FILE_ISP2031, }, + { .name = FW_FILE_ISP8031, }, + { .name = FW_FILE_ISP27XX, }, ++ { .name = FW_FILE_ISP28XX, }, ++ { .name = NULL, }, + }; + + struct fw_blob * +@@ -6900,10 +6948,15 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) + blob = &qla_fw_blobs[FW_ISP8031]; + } else if (IS_QLA27XX(ha)) { + blob = &qla_fw_blobs[FW_ISP27XX]; ++ } else if (IS_QLA28XX(ha)) { ++ blob = &qla_fw_blobs[FW_ISP28XX]; + } else { + return NULL; + } + ++ if (!blob->name) ++ return NULL; ++ + mutex_lock(&qla_fw_lock); + if (blob->fw) + goto out; +@@ -6913,7 +6966,6 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) + "Failed to load firmware image (%s).\n", blob->name); + blob->fw = NULL; + blob = NULL; +- goto out; + } + + out: +@@ -6924,11 +6976,11 @@ out: + static void + qla2x00_release_firmware(void) + { +- int idx; ++ struct fw_blob *blob; + + mutex_lock(&qla_fw_lock); +- for (idx = 0; idx < FW_BLOBS; idx++) +- release_firmware(qla_fw_blobs[idx].fw); ++ for (blob = qla_fw_blobs; blob->name; blob++) ++ release_firmware(blob->fw); + mutex_unlock(&qla_fw_lock); + } + +@@ -7250,6 +7302,11 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2071) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2271) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2261) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2061) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2081) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2281) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2089) }, ++ { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2289) }, + { 0 }, + }; + MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index d78d2bdfd652..9ce542dccdb8 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -571,6 +571,9 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) + } else if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { + *start = FA_FLASH_LAYOUT_ADDR_83; + goto end; ++ } else if (IS_QLA28XX(ha)) { ++ *start = FA_FLASH_LAYOUT_ADDR_28; ++ goto end; + } + /* Begin with first PCI expansion ROM header. */ + buf = (uint8_t *)req->ring; +@@ -753,13 +756,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + ha->flt_region_vpd = start; + break; + case FLT_REG_VPD_2: +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + break; + if (ha->port_no == 2) + ha->flt_region_vpd = start; + break; + case FLT_REG_VPD_3: +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + break; + if (ha->port_no == 3) + ha->flt_region_vpd = start; +@@ -777,13 +780,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + ha->flt_region_nvram = start; + break; + case FLT_REG_NVRAM_2: +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + break; + if (ha->port_no == 2) + ha->flt_region_nvram = start; + break; + case FLT_REG_NVRAM_3: +- if (!IS_QLA27XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + break; + if (ha->port_no == 3) + ha->flt_region_nvram = start; +@@ -847,35 +850,35 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + ha->flt_region_nvram = start; + break; + case FLT_REG_IMG_PRI_27XX: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_img_status_pri = start; + break; + case FLT_REG_IMG_SEC_27XX: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_img_status_sec = start; + break; + case FLT_REG_FW_SEC_27XX: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_fw_sec = start; + break; + case FLT_REG_BOOTLOAD_SEC_27XX: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_boot_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_0: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_vpd_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_1: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_vpd_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_2: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_vpd_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_3: +- if (IS_QLA27XX(ha)) ++ if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_vpd_sec = start; + break; + } +@@ -1045,7 +1048,8 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha) + struct qla_hw_data *ha = vha->hw; + + if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && +- !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && !IS_QLA27XX(ha)) ++ !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + return QLA_SUCCESS; + + ret = qla2xxx_find_flt_start(vha, &flt_addr); +@@ -1248,7 +1252,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + + /* Prepare burst-capable write on supported ISPs. */ + if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || +- IS_QLA27XX(ha)) && ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + !(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) { + optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, + &optrom_dma, GFP_KERNEL); +@@ -1728,7 +1732,7 @@ qla83xx_select_led_port(struct qla_hw_data *ha) + { + uint32_t led_select_value = 0; + +- if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto out; + + if (ha->port_no == 0) +@@ -1749,13 +1753,14 @@ qla83xx_beacon_blink(struct scsi_qla_host *vha) + uint16_t orig_led_cfg[6]; + uint32_t led_10_value, led_43_value; + +- if (!IS_QLA83XX(ha) && !IS_QLA81XX(ha) && !IS_QLA27XX(ha)) ++ if (!IS_QLA83XX(ha) && !IS_QLA81XX(ha) && !IS_QLA27XX(ha) && ++ !IS_QLA28XX(ha)) + return; + + if (!ha->beacon_blink_led) + return; + +- if (IS_QLA27XX(ha)) { ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + qla2x00_write_ram_word(vha, 0x1003, 0x40000230); + qla2x00_write_ram_word(vha, 0x1004, 0x40000230); + } else if (IS_QLA2031(ha)) { +@@ -1845,7 +1850,7 @@ qla24xx_beacon_on(struct scsi_qla_host *vha) + return QLA_FUNCTION_FAILED; + } + +- if (IS_QLA2031(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA2031(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + goto skip_gpio; + + spin_lock_irqsave(&ha->hardware_lock, flags); +@@ -1885,7 +1890,7 @@ qla24xx_beacon_off(struct scsi_qla_host *vha) + + ha->beacon_blink_led = 0; + +- if (IS_QLA2031(ha) || IS_QLA27XX(ha)) ++ if (IS_QLA2031(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) + goto set_fw_options; + + if (IS_QLA8031(ha) || IS_QLA81XX(ha)) +@@ -2620,7 +2625,7 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + struct qla_hw_data *ha = vha->hw; + + if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || +- IS_QLA27XX(ha)) ++ IS_QLA27XX(ha) || IS_QLA28XX(ha)) + goto try_fast; + if (offset & 0xfff) + goto slow_read; +@@ -3042,7 +3047,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + + dcode = mbuf; + pcihdr = ha->flt_region_boot << 2; +- if (IS_QLA27XX(ha) && ++ if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) + pcihdr = ha->flt_region_boot_sec << 2; + +@@ -3119,7 +3124,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + dcode = mbuf; + faddr = ha->flt_region_fw; +- if (IS_QLA27XX(ha) && ++ if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) + faddr = ha->flt_region_fw_sec; + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 50235fd29e45..11e8a25973d8 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -6911,7 +6911,7 @@ qlt_24xx_config_rings(struct scsi_qla_host *vha) + RD_REG_DWORD(ISP_ATIO_Q_OUT(vha)); + + if (ha->flags.msix_enabled) { +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (IS_QLA2071(ha)) { + /* 4 ports Baker: Enable Interrupt Handshake */ + icb->msix_atio = 0; +@@ -6926,7 +6926,7 @@ qlt_24xx_config_rings(struct scsi_qla_host *vha) + } + } else { + /* INTx|MSI */ +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + icb->msix_atio = 0; + icb->firmware_options_2 |= BIT_26; + ql_dbg(ql_dbg_init, vha, 0xf072, +@@ -7175,7 +7175,8 @@ qlt_probe_one_stage1(struct scsi_qla_host *base_vha, struct qla_hw_data *ha) + if (!QLA_TGT_MODE_ENABLED()) + return; + +- if ((ql2xenablemsix == 0) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) { ++ if ((ql2xenablemsix == 0) || IS_QLA83XX(ha) || IS_QLA27XX(ha) || ++ IS_QLA28XX(ha)) { + ISP_ATIO_Q_IN(base_vha) = &ha->mqiobase->isp25mq.atio_q_in; + ISP_ATIO_Q_OUT(base_vha) = &ha->mqiobase->isp25mq.atio_q_out; + } else { +-- +2.13.6 + diff --git a/SOURCES/0033-scsi-scsi-qla2xxx-Add-Serdes-support-for-ISP28XX.patch b/SOURCES/0033-scsi-scsi-qla2xxx-Add-Serdes-support-for-ISP28XX.patch new file mode 100644 index 0000000..1ba477f --- /dev/null +++ b/SOURCES/0033-scsi-scsi-qla2xxx-Add-Serdes-support-for-ISP28XX.patch @@ -0,0 +1,385 @@ +From 762cc7b1d46c24e176b416306b03ebb2cf1893d5 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:53 -0400 +Subject: [PATCH 033/124] [scsi] scsi: qla2xxx: Add Serdes support for ISP28XX + +Message-id: <20190801155618.12650-34-hmadhani@redhat.com> +Patchwork-id: 267807 +O-Subject: [RHEL 7.8 e-stor PATCH 033/118] scsi: qla2xxx: Add Serdes support for ISP28XX +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2a3192a3f3bc4fe1b077c55fffb6d8afe3213d57) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 ec76b33b9a95..4dd5dd9767ed 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -1379,6 +1379,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) + { +@@ -2221,6 +2236,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, +@@ -2273,6 +2289,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, +@@ -2329,16 +2346,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; +@@ -2363,7 +2379,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; + } + +@@ -2371,7 +2391,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; +@@ -2390,7 +2410,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; + } + +@@ -2452,13 +2476,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 d0862e76a279..2c1fe64d2454 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4030,6 +4030,7 @@ struct qla_hw_data { + uint8_t fw_seriallink_options[4]; + uint16_t fw_seriallink_options24[4]; + ++ uint8_t serdes_version[3]; + uint8_t mpi_version[3]; + uint32_t mpi_capabilities; + uint8_t phy_version[3]; +@@ -4041,7 +4042,8 @@ struct qla_hw_data { + /* Firmware dump information. */ + struct qla2xxx_fw_dump *fw_dump; + uint32_t fw_dump_len; +- int fw_dumped; ++ bool fw_dumped; ++ bool fw_dump_mpi; + unsigned long fw_dump_cap_flags; + #define RISC_PAUSE_CMPL 0 + #define DMA_SHUTDOWN_CMPL 1 +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 70b832105f86..adf853ead5b4 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -2783,6 +2783,31 @@ qla24xx_prep_ct_fm_req(struct ct_sns_pkt *p, uint16_t cmd, + return &p->p.req; + } + ++static uint16_t ++qla2x00_port_speed_capability(uint16_t speed) ++{ ++ switch (speed) { ++ case BIT_15: ++ return PORT_SPEED_1GB; ++ case BIT_14: ++ return PORT_SPEED_2GB; ++ case BIT_13: ++ return PORT_SPEED_4GB; ++ case BIT_12: ++ return PORT_SPEED_10GB; ++ case BIT_11: ++ return PORT_SPEED_8GB; ++ case BIT_10: ++ return PORT_SPEED_16GB; ++ case BIT_8: ++ return PORT_SPEED_32GB; ++ case BIT_7: ++ return PORT_SPEED_64GB; ++ default: ++ return PORT_SPEED_UNKNOWN; ++ } ++} ++ + /** + * qla2x00_gpsc() - FCS Get Port Speed Capabilities (GPSC) query. + * @vha: HA context +@@ -2855,31 +2880,8 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) + } + rval = QLA_FUNCTION_FAILED; + } else { +- /* Save port-speed */ +- switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) { +- case BIT_15: +- list[i].fp_speed = PORT_SPEED_1GB; +- break; +- case BIT_14: +- list[i].fp_speed = PORT_SPEED_2GB; +- break; +- case BIT_13: +- list[i].fp_speed = PORT_SPEED_4GB; +- break; +- case BIT_12: +- list[i].fp_speed = PORT_SPEED_10GB; +- break; +- case BIT_11: +- list[i].fp_speed = PORT_SPEED_8GB; +- break; +- case BIT_10: +- list[i].fp_speed = PORT_SPEED_16GB; +- break; +- case BIT_8: +- list[i].fp_speed = PORT_SPEED_32GB; +- break; +- } +- ++ list->fp_speed = qla2x00_port_speed_capability( ++ be16_to_cpu(ct_rsp->rsp.gpsc.speed)); + ql_dbg(ql_dbg_disc, vha, 0x205b, + "GPSC ext entry - fpn " + "%8phN speeds=%04x speed=%04x.\n", +@@ -3048,29 +3050,8 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + goto done; + } + } else { +- switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) { +- case BIT_15: +- fcport->fp_speed = PORT_SPEED_1GB; +- break; +- case BIT_14: +- fcport->fp_speed = PORT_SPEED_2GB; +- break; +- case BIT_13: +- fcport->fp_speed = PORT_SPEED_4GB; +- break; +- case BIT_12: +- fcport->fp_speed = PORT_SPEED_10GB; +- break; +- case BIT_11: +- fcport->fp_speed = PORT_SPEED_8GB; +- break; +- case BIT_10: +- fcport->fp_speed = PORT_SPEED_16GB; +- break; +- case BIT_8: +- fcport->fp_speed = PORT_SPEED_32GB; +- break; +- } ++ fcport->fp_speed = qla2x00_port_speed_capability( ++ be16_to_cpu(ct_rsp->rsp.gpsc.speed)); + + ql_dbg(ql_dbg_disc, vha, 0x2054, + "Async-%s OUT WWPN %8phC speeds=%04x speed=%04x.\n", +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index fc1d11c492cb..18631ea250c0 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -713,7 +713,9 @@ skip_rio: + ql_log(ql_log_warn, vha, 0x5003, + "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " + "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx); +- ++ ha->fw_dump_mpi = ++ (IS_QLA27XX(ha) || IS_QLA28XX(ha)) && ++ RD_REG_WORD(®24->mailbox7) & BIT_8; + ha->isp_ops->fw_dump(vha, 1); + ha->flags.fw_init_done = 0; + QLA_FW_STOPPED(ha); +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 90efc3e102cb..b64b7b9be08b 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -634,14 +634,15 @@ qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr, + mcp->out_mb |= MBX_4; + } + +- mcp->in_mb = MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; + mcp->tov = MBX_TOV_SECONDS; + mcp->flags = 0; + rval = qla2x00_mailbox_command(vha, mcp); + + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1023, +- "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); ++ "Failed=%x mb[0]=%x mb[1]=%x.\n", ++ rval, mcp->mb[0], mcp->mb[1]); + } else { + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1024, + "Done %s.\n", __func__); +@@ -1059,7 +1060,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + mcp->in_mb |= + MBX_25|MBX_24|MBX_23|MBX_22|MBX_21|MBX_20|MBX_19|MBX_18| +- MBX_14|MBX_13|MBX_11|MBX_10|MBX_9|MBX_8; ++ MBX_14|MBX_13|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7; + + mcp->flags = 0; + mcp->tov = MBX_TOV_SECONDS; +@@ -1126,6 +1127,9 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) + } + + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ ha->serdes_version[0] = mcp->mb[7] & 0xff; ++ ha->serdes_version[1] = mcp->mb[8] >> 8; ++ ha->serdes_version[2] = mcp->mb[8] & 0xff; + ha->mpi_version[0] = mcp->mb[10] & 0xff; + ha->mpi_version[1] = mcp->mb[11] >> 8; + ha->mpi_version[2] = mcp->mb[11] & 0xff; +@@ -3750,7 +3754,7 @@ qla2x00_get_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, + rval = qla2x00_mailbox_command(vha, mcp); + + /* Return mailbox statuses. */ +- if (mb != NULL) { ++ if (mb) { + mb[0] = mcp->mb[0]; + mb[1] = mcp->mb[1]; + mb[3] = mcp->mb[3]; +@@ -3785,7 +3789,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, + mcp->mb[0] = MBC_PORT_PARAMS; + mcp->mb[1] = loop_id; + mcp->mb[2] = BIT_0; +- mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); ++ mcp->mb[3] = port_speed & 0x3F; + mcp->mb[9] = vha->vp_idx; + mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; + mcp->in_mb = MBX_3|MBX_1|MBX_0; +@@ -3794,7 +3798,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, + rval = qla2x00_mailbox_command(vha, mcp); + + /* Return mailbox statuses. */ +- if (mb != NULL) { ++ if (mb) { + mb[0] = mcp->mb[0]; + mb[1] = mcp->mb[1]; + mb[3] = mcp->mb[3]; +@@ -4825,10 +4829,10 @@ qla2x00_read_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint8_t *sfp, + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x10e9, + "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); +- if (mcp->mb[0] == MBS_COMMAND_ERROR && +- mcp->mb[1] == 0x22) ++ if (mcp->mb[0] == MBS_COMMAND_ERROR && mcp->mb[1] == 0x22) { + /* sfp is not there */ + rval = QLA_INTERFACE_ERROR; ++ } + } else { + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ea, + "Done %s.\n", __func__); +@@ -5168,13 +5172,14 @@ qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) + mcp->mb[3] = MSW(data); + mcp->mb[8] = MSW(risc_addr); + mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0; +- mcp->in_mb = MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; + mcp->tov = 30; + mcp->flags = 0; + rval = qla2x00_mailbox_command(vha, mcp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1101, +- "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); ++ "Failed=%x mb[0]=%x mb[1]=%x.\n", ++ rval, mcp->mb[0], mcp->mb[1]); + } else { + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1102, + "Done %s.\n", __func__); +-- +2.13.6 + diff --git a/SOURCES/0034-scsi-scsi-qla2xxx-Correctly-report-max-min-supported.patch b/SOURCES/0034-scsi-scsi-qla2xxx-Correctly-report-max-min-supported.patch new file mode 100644 index 0000000..09e259c --- /dev/null +++ b/SOURCES/0034-scsi-scsi-qla2xxx-Correctly-report-max-min-supported.patch @@ -0,0 +1,321 @@ +From fa4b63b7b3b4b775ec0915db64984f82bbce9cd7 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:54 -0400 +Subject: [PATCH 034/124] [scsi] scsi: qla2xxx: Correctly report max/min + supported speeds + +Message-id: <20190801155618.12650-35-hmadhani@redhat.com> +Patchwork-id: 267809 +O-Subject: [RHEL 7.8 e-stor PATCH 034/118] scsi: qla2xxx: Correctly report max/min supported speeds +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 72a92df2109bf62094c25436ded2be0283d9aa24) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 4dd5dd9767ed..4b3cd62a5c5b 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -1622,8 +1622,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; +@@ -1632,16 +1632,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; +@@ -1650,7 +1651,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 +@@ -2254,8 +2257,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); +@@ -2304,8 +2309,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, +@@ -3034,7 +3039,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); +@@ -3045,28 +3050,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_QLA25XX(ha)) +- speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | +- FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; ++ speeds = FC_PORTSPEED_10GBIT; ++ else if (IS_QLA28XX(ha) || IS_QLA27XX(ha)) { ++ if (ha->max_supported_speed == 2) { ++ if (ha->min_supported_speed <= 6) ++ speeds |= FC_PORTSPEED_64GBIT; ++ } ++ if (ha->max_supported_speed == 2 || ++ ha->max_supported_speed == 1) { ++ if (ha->min_supported_speed <= 5) ++ speeds |= FC_PORTSPEED_32GBIT; ++ } ++ if (ha->max_supported_speed == 2 || ++ ha->max_supported_speed == 1 || ++ ha->max_supported_speed == 0) { ++ if (ha->min_supported_speed <= 4) ++ speeds |= FC_PORTSPEED_16GBIT; ++ } ++ if (ha->max_supported_speed == 1 || ++ ha->max_supported_speed == 0) { ++ if (ha->min_supported_speed <= 3) ++ speeds |= FC_PORTSPEED_8GBIT; ++ } ++ if (ha->max_supported_speed == 0) { ++ if (ha->min_supported_speed <= 2) ++ speeds |= FC_PORTSPEED_4GBIT; ++ } ++ } else if (IS_QLA2031(ha)) ++ speeds = FC_PORTSPEED_16GBIT|FC_PORTSPEED_8GBIT| ++ FC_PORTSPEED_4GBIT; ++ else if (IS_QLA25XX(ha) || IS_QLAFX00(ha)) ++ speeds = FC_PORTSPEED_8GBIT|FC_PORTSPEED_4GBIT| ++ FC_PORTSPEED_2GBIT|FC_PORTSPEED_1GBIT; + else if (IS_QLA24XX_TYPE(ha)) +- speed = FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT | +- FC_PORTSPEED_1GBIT; ++ speeds = FC_PORTSPEED_4GBIT|FC_PORTSPEED_2GBIT| ++ FC_PORTSPEED_1GBIT; + else if (IS_QLA23XX(ha)) +- speed = FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; +- else if (IS_QLAFX00(ha)) +- speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | +- FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; +- else if (IS_QLA27XX(ha)) +- speed = FC_PORTSPEED_32GBIT | FC_PORTSPEED_16GBIT | +- FC_PORTSPEED_8GBIT; +- else if (IS_QLA28XX(ha)) +- speed = FC_PORTSPEED_64GBIT | FC_PORTSPEED_32GBIT | +- FC_PORTSPEED_16GBIT | FC_PORTSPEED_8GBIT; ++ speeds = FC_PORTSPEED_2GBIT|FC_PORTSPEED_1GBIT; + else +- speed = FC_PORTSPEED_1GBIT; +- fc_host_supported_speeds(vha->host) = speed; ++ speeds = FC_PORTSPEED_1GBIT; ++ ++ fc_host_supported_speeds(vha->host) = speeds; + } +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 2c1fe64d2454..1730931cd6b2 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4230,8 +4230,8 @@ struct qla_hw_data { + struct qlt_hw_data tgt; + int allow_cna_fw_dump; + uint32_t fw_ability_mask; +- uint16_t min_link_speed; +- uint16_t max_speed_sup; ++ uint16_t min_supported_speed; ++ uint16_t max_supported_speed; + + /* DMA pool for the DIF bundling buffers */ + struct dma_pool *dif_bundl_pool; +@@ -4462,7 +4462,7 @@ typedef struct scsi_qla_host { + int fcport_count; + wait_queue_head_t fcport_waitQ; + wait_queue_head_t vref_waitq; +- uint8_t min_link_speed_feat; ++ uint8_t min_supported_speed; + uint8_t n2n_node_name[WWN_SIZE]; + uint8_t n2n_port_name[WWN_SIZE]; + uint16_t n2n_id; +@@ -4740,4 +4740,5 @@ struct sff_8247_a0 { + #include "qla_gbl.h" + #include "qla_dbg.h" + #include "qla_inline.h" ++ + #endif +diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h +index f7ff1d01a315..62b37775a7b8 100644 +--- a/drivers/scsi/qla2xxx/qla_fw.h ++++ b/drivers/scsi/qla2xxx/qla_fw.h +@@ -1757,7 +1757,7 @@ struct nvram_81xx { + uint16_t reserved_6_3[14]; + + /* Offset 192. */ +- uint8_t min_link_speed; ++ uint8_t min_supported_speed; + uint8_t reserved_7_0; + uint16_t reserved_7[31]; + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index b64b7b9be08b..509fc2d78614 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -737,13 +737,14 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + struct nvram_81xx *nv = ha->nvram; + /* set minimum speed if specified in nvram */ +- if (nv->min_link_speed >= 2 && +- nv->min_link_speed <= 5) { ++ if (nv->min_supported_speed >= 2 && ++ nv->min_supported_speed <= 5) { + mcp->mb[4] |= BIT_4; +- mcp->mb[11] = nv->min_link_speed; ++ mcp->mb[11] |= nv->min_supported_speed & 0xF; + mcp->out_mb |= MBX_11; + mcp->in_mb |= BIT_5; +- vha->min_link_speed_feat = nv->min_link_speed; ++ vha->min_supported_speed = ++ nv->min_supported_speed; + } + } + +@@ -771,35 +772,39 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1026, + "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); +- } else { +- if (IS_FWI2_CAPABLE(ha)) { +- ha->fw_ability_mask = mcp->mb[3] << 16 | mcp->mb[2]; +- ql_dbg(ql_dbg_mbx, vha, 0x119a, +- "fw_ability_mask=%x.\n", ha->fw_ability_mask); +- ql_dbg(ql_dbg_mbx, vha, 0x1027, +- "exchanges=%x.\n", mcp->mb[1]); +- if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || +- IS_QLA28XX(ha)) { +- ha->max_speed_sup = mcp->mb[2] & BIT_0; +- ql_dbg(ql_dbg_mbx, vha, 0x119b, +- "Maximum speed supported=%s.\n", +- ha->max_speed_sup ? "32Gps" : "16Gps"); +- if (vha->min_link_speed_feat) { +- ha->min_link_speed = mcp->mb[5]; +- ql_dbg(ql_dbg_mbx, vha, 0x119c, +- "Minimum speed set=%s.\n", +- mcp->mb[5] == 5 ? "32Gps" : +- mcp->mb[5] == 4 ? "16Gps" : +- mcp->mb[5] == 3 ? "8Gps" : +- mcp->mb[5] == 2 ? "4Gps" : +- "unknown"); +- } +- } ++ return rval; ++ } ++ ++ if (!IS_FWI2_CAPABLE(ha)) ++ goto done; ++ ++ ha->fw_ability_mask = mcp->mb[3] << 16 | mcp->mb[2]; ++ ql_dbg(ql_dbg_mbx, vha, 0x119a, ++ "fw_ability_mask=%x.\n", ha->fw_ability_mask); ++ ql_dbg(ql_dbg_mbx, vha, 0x1027, "exchanges=%x.\n", mcp->mb[1]); ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ ha->max_supported_speed = mcp->mb[2] & (BIT_0|BIT_1); ++ ql_dbg(ql_dbg_mbx, vha, 0x119b, "max_supported_speed=%s.\n", ++ ha->max_supported_speed == 0 ? "16Gps" : ++ ha->max_supported_speed == 1 ? "32Gps" : ++ ha->max_supported_speed == 2 ? "64Gps" : "unknown"); ++ if (vha->min_supported_speed) { ++ ha->min_supported_speed = mcp->mb[5] & ++ (BIT_0 | BIT_1 | BIT_2); ++ ql_dbg(ql_dbg_mbx, vha, 0x119c, ++ "min_supported_speed=%s.\n", ++ 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" : "unknown"); + } +- ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1028, +- "Done.\n"); + } + ++done: ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1028, ++ "Done %s.\n", __func__); ++ + return rval; + } + +-- +2.13.6 + diff --git a/SOURCES/0035-scsi-scsi-qla2xxx-Cleanups-for-NVRAM-Flash-read-writ.patch b/SOURCES/0035-scsi-scsi-qla2xxx-Cleanups-for-NVRAM-Flash-read-writ.patch new file mode 100644 index 0000000..0feff0e --- /dev/null +++ b/SOURCES/0035-scsi-scsi-qla2xxx-Cleanups-for-NVRAM-Flash-read-writ.patch @@ -0,0 +1,1557 @@ +From e34881c9163c6a10a0ec45af51df9e862fd5a7b0 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:55 -0400 +Subject: [PATCH 035/124] [scsi] scsi: qla2xxx: Cleanups for NVRAM/Flash + read/write path + +Message-id: <20190801155618.12650-36-hmadhani@redhat.com> +Patchwork-id: 267808 +O-Subject: [RHEL 7.8 e-stor PATCH 035/118] scsi: qla2xxx: Cleanups for NVRAM/Flash read/write path +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit f8f97b0c5b7f7c801d80ac78165edf25fff1f5e0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 fec996cdd4a0..f7cfb36e635e 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1919,7 +1919,7 @@ qlafx00_mgmt_cmd(struct fc_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, +@@ -2269,8 +2269,8 @@ qla2x00_get_priv_stats(struct fc_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 dd443940a019..ae202fa427c5 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -2521,7 +2521,7 @@ qla83xx_fw_dump_failed: + /****************************************************************************/ + + static inline int +-ql_mask_match(uint32_t level) ++ql_mask_match(uint level) + { + return (level & ql2xextended_error_logging) == level; + } +@@ -2540,7 +2540,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; +@@ -2583,8 +2583,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; +@@ -2620,7 +2619,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; +@@ -2678,8 +2677,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; +@@ -2719,7 +2717,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; +@@ -2741,13 +2739,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(mbx_reg)); + } + + + void +-ql_dump_buffer(uint32_t level, scsi_qla_host_t *vha, int32_t id, +- uint8_t *buf, uint size) ++ql_dump_buffer(uint level, scsi_qla_host_t *vha, uint id, void *buf, uint size) + { + uint cnt; + +diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h +index 8877aa97d829..bb01b680ce9f 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.h ++++ b/drivers/scsi/qla2xxx/qla_dbg.h +@@ -318,20 +318,20 @@ struct qla2xxx_fw_dump { + * as compared to other log levels. + */ + +-extern int ql_errlev; ++extern uint ql_errlev; + + void __attribute__((format (printf, 4, 5))) +-ql_dbg(uint32_t, scsi_qla_host_t *vha, int32_t, const char *fmt, ...); ++ql_dbg(uint, scsi_qla_host_t *vha, uint, const char *fmt, ...); + void __attribute__((format (printf, 4, 5))) +-ql_dbg_pci(uint32_t, struct pci_dev *pdev, int32_t, const char *fmt, ...); ++ql_dbg_pci(uint, struct pci_dev *pdev, uint, const char *fmt, ...); + void __attribute__((format (printf, 4, 5))) + ql_dbg_qp(uint32_t, struct qla_qpair *, int32_t, const char *fmt, ...); + + + void __attribute__((format (printf, 4, 5))) +-ql_log(uint32_t, scsi_qla_host_t *vha, int32_t, const char *fmt, ...); ++ql_log(uint, scsi_qla_host_t *vha, uint, const char *fmt, ...); + void __attribute__((format (printf, 4, 5))) +-ql_log_pci(uint32_t, struct pci_dev *pdev, int32_t, const char *fmt, ...); ++ql_log_pci(uint, struct pci_dev *pdev, uint, const char *fmt, ...); + + void __attribute__((format (printf, 4, 5))) + ql_log_qp(uint32_t, struct qla_qpair *, int32_t, const char *fmt, ...); +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 1730931cd6b2..15b146db7f71 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4472,7 +4472,7 @@ typedef struct scsi_qla_host { + + struct qla27xx_image_status { + uint8_t image_status_mask; +- uint16_t generation_number; ++ uint16_t generation; + uint8_t reserved[3]; + uint8_t ver_minor; + uint8_t ver_major; +diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h +index 62b37775a7b8..b9b1aaaff906 100644 +--- a/drivers/scsi/qla2xxx/qla_fw.h ++++ b/drivers/scsi/qla2xxx/qla_fw.h +@@ -1516,7 +1516,9 @@ struct qla_flt_header { + #define FLT_REG_VPD_SEC_27XX_3 0xDA + + struct qla_flt_region { +- uint32_t code; ++ uint16_t code; ++ uint8_t attribute; ++ uint8_t reserved; + uint32_t size; + uint32_t start; + uint32_t end; +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index aede9e5a31f7..3e4424ecd6ec 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -118,6 +118,7 @@ int qla_post_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport); + void qla_do_iidma_work(struct scsi_qla_host *vha, fc_port_t *fcport); + int qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *); + void qla_rscn_replay(fc_port_t *fcport); ++extern bool qla24xx_risc_firmware_invalid(uint32_t *); + + /* + * Global Data in qla_os.c source file. +@@ -613,14 +614,9 @@ 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 void qla2x00_dump_regs(scsi_qla_host_t *); +-extern void qla2x00_dump_buffer(uint8_t *, uint32_t); +-extern void qla2x00_dump_buffer_zipped(uint8_t *, uint32_t); +-extern void ql_dump_regs(uint32_t, scsi_qla_host_t *, int32_t); +-extern void ql_dump_buffer(uint32_t, scsi_qla_host_t *, int32_t, +- uint8_t *, uint32_t); + extern void qla2xxx_dump_post_process(scsi_qla_host_t *, int); +- ++extern void ql_dump_regs(uint, scsi_qla_host_t *, uint); ++extern void ql_dump_buffer(uint, scsi_qla_host_t *, uint, void *, uint); + /* + * Global Function Prototypes in qla_gs.c source file. + */ +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index adf853ead5b4..4864850d0844 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -152,8 +152,8 @@ qla2x00_chk_ms_status(scsi_qla_host_t *vha, ms_iocb_entry_t *ms_pkt, + vha->d_id.b.area, vha->d_id.b.al_pa, + comp_status, ct_rsp->header.response); + ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, +- 0x2078, (uint8_t *)&ct_rsp->header, +- sizeof(struct ct_rsp_hdr)); ++ 0x2078, ct_rsp, ++ offsetof(typeof(*ct_rsp), rsp)); + rval = QLA_INVALID_COMMAND; + } else + rval = QLA_SUCCESS; +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index a2bf199b35d9..05c8a6befa4b 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3648,8 +3648,7 @@ qla2x00_update_fw_options(scsi_qla_host_t *vha) + ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0115, + "Serial link options.\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0109, +- (uint8_t *)&ha->fw_seriallink_options, +- sizeof(ha->fw_seriallink_options)); ++ ha->fw_seriallink_options, sizeof(ha->fw_seriallink_options)); + + ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING; + if (ha->fw_seriallink_options[3] & BIT_2) { +@@ -4376,7 +4375,7 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) + rval = QLA_SUCCESS; + + /* Determine NVRAM starting address. */ +- ha->nvram_size = sizeof(nvram_t); ++ ha->nvram_size = sizeof(*nv); + ha->nvram_base = 0; + if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) + if ((RD_REG_WORD(®->ctrl_status) >> 14) == 1) +@@ -4390,7 +4389,7 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) + ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x010f, + "Contents of NVRAM.\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0110, +- (uint8_t *)nv, ha->nvram_size); ++ nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ + if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || +@@ -4962,8 +4961,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha) + ql_dbg(ql_dbg_disc, vha, 0x2011, + "Entries in ID list (%d).\n", entries); + ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075, +- (uint8_t *)ha->gid_list, +- entries * sizeof(struct gid_list_info)); ++ ha->gid_list, entries * sizeof(*ha->gid_list)); + + if (entries == 0) { + spin_lock_irqsave(&vha->work_lock, flags); +@@ -6981,7 +6979,7 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + ha->vpd_base = FA_NVRAM_VPD1_ADDR; + } + +- ha->nvram_size = sizeof(struct nvram_24xx); ++ ha->nvram_size = sizeof(*nv); + ha->vpd_size = FA_NVRAM_VPD_SIZE; + + /* Get VPD data into cache */ +@@ -6999,7 +6997,7 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x006a, + "Contents of NVRAM\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010d, +- (uint8_t *)nv, ha->nvram_size); ++ nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ + if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' +@@ -7009,6 +7007,7 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + ql_log(ql_log_warn, vha, 0x006b, + "Inconsistent NVRAM detected: checksum=0x%x id=%c " + "version=0x%x.\n", chksum, nv->id[0], nv->nvram_version); ++ ql_dump_buffer(ql_dbg_init, vha, 0x006b, nv, 32); + ql_log(ql_log_warn, vha, 0x006c, + "Falling back to functioning (yet invalid -- WWPN) " + "defaults.\n"); +@@ -7220,18 +7219,16 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) + { + struct qla27xx_image_status pri_image_status, sec_image_status; +- uint8_t valid_pri_image, valid_sec_image; ++ bool valid_pri_image = true, valid_sec_image = true; + uint32_t *wptr; +- uint32_t cnt, chksum, size; ++ uint chksum, cnt, size = sizeof(pri_image_status) / sizeof(*wptr); + struct qla_hw_data *ha = vha->hw; + uint32_t signature; + +- valid_pri_image = valid_sec_image = 1; + ha->active_image = 0; +- size = sizeof(struct qla27xx_image_status) / sizeof(uint32_t); + + if (!ha->flt_region_img_status_pri) { +- valid_pri_image = 0; ++ valid_pri_image = false; + goto check_sec_image; + } + +@@ -7242,9 +7239,9 @@ uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) + if (signature != QLA27XX_IMG_STATUS_SIGN && + signature != QLA28XX_IMG_STATUS_SIGN) { + ql_dbg(ql_dbg_init, vha, 0x018b, +- "Primary image signature (0x%x) not valid\n", +- pri_image_status.signature); +- valid_pri_image = 0; ++ "Primary image signature (%#x) not valid\n", ++ le32_to_cpu(pri_image_status.signature)); ++ valid_pri_image = false; + goto check_sec_image; + } + +@@ -7256,14 +7253,13 @@ uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) + + if (chksum) { + ql_dbg(ql_dbg_init, vha, 0x018c, +- "Checksum validation failed for primary image (0x%x)\n", +- chksum); +- valid_pri_image = 0; ++ "Primary image checksum failed (%#x)\n", chksum); ++ valid_pri_image = false; + } + + check_sec_image: + if (!ha->flt_region_img_status_sec) { +- valid_sec_image = 0; ++ valid_sec_image = false; + goto check_valid_image; + } + +@@ -7274,9 +7270,9 @@ check_sec_image: + if (signature != QLA27XX_IMG_STATUS_SIGN && + signature != QLA28XX_IMG_STATUS_SIGN) { + ql_dbg(ql_dbg_init, vha, 0x018d, +- "Secondary image signature(0x%x) not valid\n", +- sec_image_status.signature); +- valid_sec_image = 0; ++ "Secondary image signature (%#x) not valid\n", ++ le32_to_cpu(sec_image_status.signature)); ++ valid_sec_image = false; + goto check_valid_image; + } + +@@ -7286,19 +7282,20 @@ check_sec_image: + chksum += le32_to_cpu(*wptr); + if (chksum) { + ql_dbg(ql_dbg_init, vha, 0x018e, +- "Checksum validation failed for secondary image (0x%x)\n", +- chksum); +- valid_sec_image = 0; ++ "Secondary image checksum failed (%#x)\n", chksum); ++ valid_sec_image = false; + } + + check_valid_image: +- if (valid_pri_image && (pri_image_status.image_status_mask & 0x1)) ++ if (valid_pri_image && (pri_image_status.image_status_mask & 1)) + ha->active_image = QLA27XX_PRIMARY_IMAGE; +- if (valid_sec_image && (sec_image_status.image_status_mask & 0x1)) { ++ ++ if (valid_sec_image && (sec_image_status.image_status_mask & 1)) { + if (!ha->active_image || +- pri_image_status.generation_number < +- sec_image_status.generation_number) ++ le16_to_cpu(pri_image_status.generation) < ++ le16_to_cpu(sec_image_status.generation)) { + ha->active_image = QLA27XX_SECONDARY_IMAGE; ++ } + } + + ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x018f, "%s image\n", +@@ -7310,6 +7307,13 @@ check_valid_image: + return ha->active_image; + } + ++bool qla24xx_risc_firmware_invalid(uint32_t *dword) ++{ ++ return ++ !(dword[4] | dword[5] | dword[6] | dword[7]) || ++ !(~dword[4] | ~dword[5] | ~dword[6] | ~dword[7]); ++} ++ + static int + qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + uint32_t faddr) +@@ -7326,24 +7330,9 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + ql_dbg(ql_dbg_init, vha, 0x008b, + "FW: Loading firmware from flash (%x).\n", faddr); + +- rval = QLA_SUCCESS; +- +- segments = FA_RISC_CODE_SEGMENTS; +- dcode = (uint32_t *)req->ring; +- *srisc_addr = 0; +- +- if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && +- qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) +- faddr = ha->flt_region_fw_sec; +- +- /* Validate firmware image by checking version. */ +- qla24xx_read_flash_data(vha, dcode, faddr + 4, 4); +- for (i = 0; i < 4; i++) +- dcode[i] = be32_to_cpu(dcode[i]); +- if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff && +- dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) || +- (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 && +- dcode[3] == 0)) { ++ dcode = (void *)req->ring; ++ qla24xx_read_flash_data(vha, dcode, faddr, 8); ++ if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_fatal, vha, 0x008c, + "Unable to verify the integrity of flash firmware " + "image.\n"); +@@ -7568,7 +7557,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + uint32_t risc_size; + uint32_t i; + struct fw_blob *blob; +- const uint32_t *fwcode; ++ uint32_t *fwcode; + uint32_t fwclen; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = ha->req_q_map[0]; +@@ -7585,19 +7574,9 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + return QLA_FUNCTION_FAILED; + } + +- ql_dbg(ql_dbg_init, vha, 0x0092, +- "FW: Loading via request-firmware.\n"); +- +- rval = QLA_SUCCESS; +- +- segments = FA_RISC_CODE_SEGMENTS; +- dcode = (uint32_t *)req->ring; +- *srisc_addr = 0; +- fwcode = (uint32_t *)blob->fw->data; +- fwclen = 0; +- +- /* Validate firmware image by checking version. */ +- if (blob->fw->size < 8 * sizeof(uint32_t)) { ++ fwcode = (void *)blob->fw->data; ++ dcode = fwcode; ++ if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_fatal, vha, 0x0093, + "Unable to verify integrity of firmware image (%Zd).\n", + blob->fw->size); +@@ -7754,28 +7733,43 @@ qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) + if (ql2xfwloadbin == 2) + goto try_blob_fw; + +- /* +- * FW Load priority: ++ /* FW Load priority: + * 1) Firmware residing in flash. + * 2) Firmware via request-firmware interface (.bin file). +- * 3) Golden-Firmware residing in flash -- limited operation. ++ * 3) Golden-Firmware residing in flash -- (limited operation). + */ ++ ++ if (!IS_QLA27XX(ha) || !IS_QLA28XX(ha)) ++ goto try_primary_fw; ++ ++ if (qla27xx_find_valid_image(vha) != QLA27XX_SECONDARY_IMAGE) ++ goto try_primary_fw; ++ ++ ql_dbg(ql_dbg_init, vha, 0x008b, ++ "Loading secondary firmware image.\n"); ++ rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw_sec); ++ if (!rval) ++ return rval; ++ ++try_primary_fw: ++ ql_dbg(ql_dbg_init, vha, 0x008b, ++ "Loading primary firmware image.\n"); + rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw); +- if (rval == QLA_SUCCESS) ++ if (!rval) + return rval; + + try_blob_fw: + rval = qla24xx_load_risc_blob(vha, srisc_addr); +- if (rval == QLA_SUCCESS || !ha->flt_region_gold_fw) ++ if (!rval || !ha->flt_region_gold_fw) + return rval; + + ql_log(ql_log_info, vha, 0x0099, + "Attempting to fallback to golden firmware.\n"); + rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_gold_fw); +- if (rval != QLA_SUCCESS) ++ if (rval) + return rval; + +- ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n"); ++ ql_log(ql_log_info, vha, 0x009a, "Need firmware flash update.\n"); + ha->flags.running_gold_fw = 1; + return rval; + } +@@ -7950,7 +7944,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + nv = ha->nvram; + + /* Determine NVRAM starting address. */ +- ha->nvram_size = sizeof(struct nvram_81xx); ++ ha->nvram_size = sizeof(*nv); + ha->vpd_size = FA_NVRAM_VPD_SIZE; + if (IS_P3P_TYPE(ha) || IS_QLA8031(ha)) + ha->vpd_size = FA_VPD_SIZE_82XX; +@@ -7970,7 +7964,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0111, + "Contents of NVRAM:\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0112, +- (uint8_t *)nv, ha->nvram_size); ++ nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ + if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' +@@ -7981,6 +7975,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + "Inconsistent NVRAM detected: checksum=0x%x id=%c " + "version=0x%x.\n", chksum, nv->id[0], + le16_to_cpu(nv->nvram_version)); ++ ql_dump_buffer(ql_dbg_init, vha, 0x0073, nv, 32); + ql_log(ql_log_info, vha, 0x0074, + "Falling back to functioning (yet invalid -- WWPN) " + "defaults.\n"); +@@ -8203,12 +8198,6 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + /* N2N: driver will initiate Login instead of FW */ + icb->firmware_options_3 |= BIT_8; + +- if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { +- icb->firmware_options_3 |= BIT_8; +- ql_dbg(ql_log_info, vha, 0x0075, +- "Enabling direct connection.\n"); +- } +- + if (rval) { + ql_log(ql_log_warn, vha, 0x0076, + "NVRAM configuration failed.\n"); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 18631ea250c0..779753d0238a 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1374,7 +1374,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, + le16_to_cpu(mbx->status_flags)); + + ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5029, +- (uint8_t *)mbx, sizeof(*mbx)); ++ mbx, sizeof(*mbx)); + + goto logio_done; + } +@@ -1516,7 +1516,7 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req, + bsg_job->reply->reply_payload_rcv_len = 0; + } + ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035, +- (uint8_t *)pkt, sizeof(*pkt)); ++ pkt, sizeof(*pkt)); + } else { + res = DID_OK << 16; + bsg_job->reply->reply_payload_rcv_len = +@@ -1658,7 +1658,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, + memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); + } + ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056, +- (uint8_t *)pkt, sizeof(*pkt)); ++ pkt, sizeof(*pkt)); + } + else { + res = DID_OK << 16; +@@ -1702,7 +1702,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req, + fcport->d_id.b.area, fcport->d_id.b.al_pa, + logio->entry_status); + ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x504d, +- (uint8_t *)logio, sizeof(*logio)); ++ logio, sizeof(*logio)); + + goto logio_done; + } +@@ -1848,8 +1848,8 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk) + } + + if (iocb->u.tmf.data != QLA_SUCCESS) +- ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5055, +- (uint8_t *)sts, sizeof(*sts)); ++ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, sp->vha, 0x5055, ++ sts, sizeof(*sts)); + + sp->done(sp, 0); + } +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 509fc2d78614..4fa8b2b08768 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -1831,8 +1831,18 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) + if (rval != QLA_SUCCESS) { + /*EMPTY*/ + ql_dbg(ql_dbg_mbx, vha, 0x104d, +- "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n", ++ "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x.\n", + rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]); ++ if (ha->init_cb) { ++ ql_dbg(ql_dbg_mbx, vha, 0x104d, "init_cb:\n"); ++ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, ++ 0x0104d, ha->init_cb, sizeof(*ha->init_cb)); ++ } ++ if (ha->ex_init_cb && ha->ex_init_cb->ex_version) { ++ ql_dbg(ql_dbg_mbx, vha, 0x104d, "ex_init_cb:\n"); ++ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, ++ 0x0104d, ha->ex_init_cb, sizeof(*ha->ex_init_cb)); ++ } + } else { + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { + if (mcp->mb[2] == 6 || mcp->mb[3] == 2) +@@ -4245,7 +4255,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) + ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111c, + "Dump of Verify Request.\n"); + ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111e, +- (uint8_t *)mn, sizeof(*mn)); ++ mn, sizeof(*mn)); + + rval = qla2x00_issue_iocb_timeout(vha, mn, mn_dma, 0, 120); + if (rval != QLA_SUCCESS) { +@@ -4257,7 +4267,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) + ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1110, + "Dump of Verify Response.\n"); + ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1118, +- (uint8_t *)mn, sizeof(*mn)); ++ mn, sizeof(*mn)); + + status[0] = le16_to_cpu(mn->p.rsp.comp_status); + status[1] = status[0] == CS_VCS_CHIP_FAILURE ? +diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c +index 045b00ecc24c..527d255999cd 100644 +--- a/drivers/scsi/qla2xxx/qla_mr.c ++++ b/drivers/scsi/qla2xxx/qla_mr.c +@@ -1136,8 +1136,8 @@ qlafx00_find_all_targets(scsi_qla_host_t *vha, + + ql_dbg(ql_dbg_disc + ql_dbg_init, vha, 0x2088, + "Listing Target bit map...\n"); +- ql_dump_buffer(ql_dbg_disc + ql_dbg_init, vha, +- 0x2089, (uint8_t *)ha->gid_list, 32); ++ ql_dump_buffer(ql_dbg_disc + ql_dbg_init, vha, 0x2089, ++ ha->gid_list, 32); + + /* Allocate temporary rmtport for any new rmtports discovered. */ + new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL); +@@ -1913,8 +1913,7 @@ qlafx00_fx_disc(scsi_qla_host_t *vha, fc_port_t *fcport, uint16_t fx_type) + phost_info->domainname, + phost_info->hostdriver); + ql_dump_buffer(ql_dbg_init + ql_dbg_disc, vha, 0x014d, +- (uint8_t *)phost_info, +- sizeof(struct host_system_info)); ++ phost_info, sizeof(*phost_info)); + } + } + +@@ -1968,7 +1967,7 @@ qlafx00_fx_disc(scsi_qla_host_t *vha, fc_port_t *fcport, uint16_t fx_type) + vha->d_id.b.al_pa = pinfo->port_id[2]; + qlafx00_update_host_attr(vha, pinfo); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0141, +- (uint8_t *)pinfo, 16); ++ pinfo, 16); + } else if (fx_type == FXDISC_GET_TGT_NODE_INFO) { + struct qlafx00_tgt_node_info *pinfo = + (struct qlafx00_tgt_node_info *) fdisc->u.fxiocb.rsp_addr; +@@ -1976,12 +1975,12 @@ qlafx00_fx_disc(scsi_qla_host_t *vha, fc_port_t *fcport, uint16_t fx_type) + memcpy(fcport->port_name, pinfo->tgt_node_wwpn, WWN_SIZE); + fcport->port_type = FCT_TARGET; + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0144, +- (uint8_t *)pinfo, 16); ++ pinfo, 16); + } else if (fx_type == FXDISC_GET_TGT_NODE_LIST) { + struct qlafx00_tgt_node_info *pinfo = + (struct qlafx00_tgt_node_info *) fdisc->u.fxiocb.rsp_addr; + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0146, +- (uint8_t *)pinfo, 16); ++ pinfo, 16); + memcpy(vha->hw->gid_list, pinfo, QLAFX00_TGT_NODE_LIST_SIZE); + } else if (fx_type == FXDISC_ABORT_IOCTL) + fdisc->u.fxiocb.result = +@@ -2248,18 +2247,16 @@ qlafx00_ioctl_iosb_entry(scsi_qla_host_t *vha, struct req_que *req, + fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + + sizeof(struct fc_bsg_reply); + +- memcpy(fw_sts_ptr, (uint8_t *)&fstatus, +- sizeof(struct qla_mt_iocb_rsp_fx00)); ++ memcpy(fw_sts_ptr, &fstatus, sizeof(fstatus)); + bsg_job->reply_len = sizeof(struct fc_bsg_reply) + + sizeof(struct qla_mt_iocb_rsp_fx00) + sizeof(uint8_t); + + ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, +- sp->fcport->vha, 0x5080, +- (uint8_t *)pkt, sizeof(struct ioctl_iocb_entry_fx00)); ++ sp->vha, 0x5080, pkt, sizeof(*pkt)); + + ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, +- sp->fcport->vha, 0x5074, +- (uint8_t *)fw_sts_ptr, sizeof(struct qla_mt_iocb_rsp_fx00)); ++ sp->vha, 0x5074, ++ fw_sts_ptr, sizeof(fstatus)); + + res = bsg_job->reply->result = DID_OK << 16; + bsg_job->reply->reply_payload_rcv_len = +@@ -2599,7 +2596,7 @@ qlafx00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) + + /* Move sense data. */ + ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x304e, +- (uint8_t *)pkt, sizeof(sts_cont_entry_t)); ++ pkt, sizeof(*pkt)); + memcpy(sense_ptr, pkt->data, sense_sz); + ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x304a, + sense_ptr, sense_sz); +@@ -3059,13 +3056,13 @@ qlafx00_build_scsi_iocbs(srb_t *sp, struct cmd_type_7_fx00 *cmd_pkt, + if (avail_dsds == 0 && cont == 1) { + cont = 0; + memcpy_toio((void __iomem *)cont_pkt, &lcont_pkt, +- REQUEST_ENTRY_SIZE); ++ sizeof(lcont_pkt)); + } + + } + if (avail_dsds != 0 && cont == 1) { + memcpy_toio((void __iomem *)cont_pkt, &lcont_pkt, +- REQUEST_ENTRY_SIZE); ++ sizeof(lcont_pkt)); + } + } + +@@ -3186,9 +3183,9 @@ qlafx00_start_scsi(srb_t *sp) + lcmd_pkt.entry_status = (uint8_t) rsp->id; + + ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302e, +- (uint8_t *)cmd->cmnd, cmd->cmd_len); ++ cmd->cmnd, cmd->cmd_len); + ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x3032, +- (uint8_t *)&lcmd_pkt, REQUEST_ENTRY_SIZE); ++ &lcmd_pkt, sizeof(lcmd_pkt)); + + memcpy_toio((void __iomem *)cmd_pkt, &lcmd_pkt, REQUEST_ENTRY_SIZE); + wmb(); +@@ -3467,10 +3464,8 @@ qlafx00_fxdisc_iocb(srb_t *sp, struct fxdisc_entry_fx00 *pfxiocb) + } + + ql_dump_buffer(ql_dbg_user + ql_dbg_verbose, +- sp->vha, 0x3047, +- (uint8_t *)&fx_iocb, sizeof(struct fxdisc_entry_fx00)); ++ sp->vha, 0x3047, &fx_iocb, sizeof(fx_iocb)); + +- memcpy_toio((void __iomem *)pfxiocb, &fx_iocb, +- sizeof(struct fxdisc_entry_fx00)); ++ memcpy_toio((void __iomem *)pfxiocb, &fx_iocb, sizeof(fx_iocb)); + wmb(); + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 95d3ff062320..8c567a82752b 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -41,7 +41,7 @@ static struct kmem_cache *ctx_cachep; + /* + * error level for logging + */ +-int ql_errlev = ql_log_all; ++uint ql_errlev = ql_log_all; + + static int ql2xenableclass2; + module_param(ql2xenableclass2, int, S_IRUGO|S_IRUSR); +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index 9ce542dccdb8..a062cecb3980 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -619,7 +619,7 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) + ql_log(ql_log_fatal, vha, 0x0045, + "Inconsistent FLTL detected: checksum=0x%x.\n", chksum); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010e, +- buf, sizeof(struct qla_flt_location)); ++ fltl, sizeof(*fltl)); + return QLA_FUNCTION_FAILED; + } + +@@ -721,12 +721,12 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + /* Store addresses as DWORD offsets. */ + start = le32_to_cpu(region->start) >> 2; + ql_dbg(ql_dbg_init, vha, 0x0049, +- "FLT[%02x]: start=0x%x " +- "end=0x%x size=0x%x.\n", le32_to_cpu(region->code) & 0xff, ++ "FLT[%#x]: start=%#x end=%#x size=%#x.\n", ++ le16_to_cpu(region->code), + start, le32_to_cpu(region->end) >> 2, + le32_to_cpu(region->size)); + +- switch (le32_to_cpu(region->code) & 0xff) { ++ switch (le16_to_cpu(region->code)) { + case FLT_REG_FCOE_FW: + if (!IS_QLA8031(ha)) + break; +@@ -941,7 +941,7 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) + " checksum=0x%x id=%c version0x%x.\n", chksum, + fdt->sig[0], le16_to_cpu(fdt->version)); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0113, +- (uint8_t *)fdt, sizeof(*fdt)); ++ fdt, sizeof(*fdt)); + goto no_flash_data; + } + +@@ -2879,7 +2879,7 @@ qla2x00_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + "Dumping fw " + "ver from flash:.\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010b, +- (uint8_t *)dbyte, 8); ++ dbyte, 8); + + if ((dcode[0] == 0xffff && dcode[1] == 0xffff && + dcode[2] == 0xffff && dcode[3] == 0xffff) || +@@ -3128,24 +3128,16 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) + faddr = ha->flt_region_fw_sec; + +- qla24xx_read_flash_data(vha, dcode, faddr + 4, 4); +- for (i = 0; i < 4; i++) +- dcode[i] = be32_to_cpu(dcode[i]); +- +- if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff && +- dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) || +- (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 && +- dcode[3] == 0)) { ++ qla24xx_read_flash_data(vha, dcode, faddr, 8); ++ if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_warn, vha, 0x005f, + "Unrecognized fw revision at %x.\n", + ha->flt_region_fw * 4); + } else { +- ha->fw_revision[0] = dcode[0]; +- ha->fw_revision[1] = dcode[1]; +- ha->fw_revision[2] = dcode[2]; +- ha->fw_revision[3] = dcode[3]; ++ for (i = 0; i < 4; i++) ++ ha->fw_revision[i] = be32_to_cpu(dcode[4+i]); + ql_dbg(ql_dbg_init, vha, 0x0060, +- "Firmware revision %d.%d.%d (%x).\n", ++ "Firmware revision (flash) %d.%d.%d (%x).\n", + ha->fw_revision[0], ha->fw_revision[1], + ha->fw_revision[2], ha->fw_revision[3]); + } +@@ -3158,19 +3150,16 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + + memset(ha->gold_fw_version, 0, sizeof(ha->gold_fw_version)); + dcode = mbuf; +- ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, +- ha->flt_region_gold_fw << 2, 32); +- +- if (dcode[4] == 0xFFFFFFFF && dcode[5] == 0xFFFFFFFF && +- dcode[6] == 0xFFFFFFFF && dcode[7] == 0xFFFFFFFF) { ++ qla24xx_read_flash_data(vha, dcode, ha->flt_region_gold_fw, 8); ++ if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_warn, vha, 0x0056, + "Unrecognized golden fw at 0x%x.\n", + ha->flt_region_gold_fw * 4); + return ret; + } + +- for (i = 4; i < 8; i++) +- ha->gold_fw_version[i-4] = be32_to_cpu(dcode[i]); ++ for (i = 0; i < 4; i++) ++ ha->gold_fw_version[i] = be32_to_cpu(dcode[4+i]); + + return ret; + } +diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c +index 8e1a825aed39..aab4aed88138 100644 +--- a/drivers/scsi/qla2xxx/qla_tmpl.c ++++ b/drivers/scsi/qla2xxx/qla_tmpl.c +@@ -134,7 +134,7 @@ qla27xx_skip_entry(struct qla27xx_fwdt_entry *ent, void *buf) + static inline struct qla27xx_fwdt_entry * + qla27xx_next_entry(struct qla27xx_fwdt_entry *ent) + { +- return (void *)ent + ent->hdr.size; ++ return (void *)ent + le32_to_cpu(ent->hdr.size); + } + + static struct qla27xx_fwdt_entry * +@@ -165,11 +165,14 @@ 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); ++ uint width = ent->t256.reg_width; + + ql_dbg(ql_dbg_misc, vha, 0xd200, + "%s: rdio t1 [%lx]\n", __func__, *len); +- qla27xx_read_window(reg, ent->t256.base_addr, ent->t256.pci_offset, +- ent->t256.reg_count, ent->t256.reg_width, buf, len); ++ qla27xx_read_window(reg, addr, offset, count, width, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -179,11 +182,14 @@ 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_ADDR, ent->t257.base_addr, buf); +- qla27xx_write_reg(reg, ent->t257.pci_offset, ent->t257.write_data, buf); ++ qla27xx_write_reg(reg, IOBASE(reg), addr, buf); ++ qla27xx_write_reg(reg, offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -193,12 +199,17 @@ 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); ++ uint offset = ent->t258.pci_offset; ++ uint count = le16_to_cpu(ent->t258.reg_count); ++ uint width = ent->t258.reg_width; + + ql_dbg(ql_dbg_misc, vha, 0xd202, + "%s: rdio t2 [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, ent->t258.banksel_offset, ent->t258.bank, buf); +- qla27xx_read_window(reg, ent->t258.base_addr, ent->t258.pci_offset, +- ent->t258.reg_count, ent->t258.reg_width, buf, len); ++ qla27xx_write_reg(reg, banksel, bank, buf); ++ qla27xx_read_window(reg, addr, offset, count, width, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -208,12 +219,17 @@ 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); ++ uint offset = ent->t259.pci_offset; ++ ulong data = le32_to_cpu(ent->t259.write_data); + + ql_dbg(ql_dbg_misc, vha, 0xd203, + "%s: wrio t2 [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, IOBASE_ADDR, ent->t259.base_addr, buf); +- 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); ++ qla27xx_write_reg(reg, IOBASE(reg), addr, buf); ++ qla27xx_write_reg(reg, banksel, bank, buf); ++ qla27xx_write_reg(reg, offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -223,11 +239,12 @@ qla27xx_fwdt_entry_t260(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 offset = ent->t260.pci_offset; + + ql_dbg(ql_dbg_misc, vha, 0xd204, + "%s: rdpci [%lx]\n", __func__, *len); +- qla27xx_insert32(ent->t260.pci_offset, buf, len); +- qla27xx_read_reg(reg, ent->t260.pci_offset, buf, len); ++ qla27xx_insert32(offset, buf, len); ++ qla27xx_read_reg(reg, offset, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -237,10 +254,12 @@ qla27xx_fwdt_entry_t261(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 offset = ent->t261.pci_offset; ++ ulong data = le32_to_cpu(ent->t261.write_data); + + ql_dbg(ql_dbg_misc, vha, 0xd205, + "%s: wrpci [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, ent->t261.pci_offset, ent->t261.write_data, buf); ++ qla27xx_write_reg(reg, offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -249,51 +268,50 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t262(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { ++ uint area = ent->t262.ram_area; ++ ulong start = le32_to_cpu(ent->t262.start_addr); ++ ulong end = le32_to_cpu(ent->t262.end_addr); + ulong dwords; +- ulong start; +- ulong end; + + ql_dbg(ql_dbg_misc, vha, 0xd206, + "%s: rdram(%x) [%lx]\n", __func__, ent->t262.ram_area, *len); +- start = ent->t262.start_addr; +- end = ent->t262.end_addr; + +- if (ent->t262.ram_area == T262_RAM_AREA_CRITICAL_RAM) { ++ if (area == T262_RAM_AREA_CRITICAL_RAM) { + ; +- } else if (ent->t262.ram_area == T262_RAM_AREA_EXTERNAL_RAM) { ++ } else if (area == T262_RAM_AREA_EXTERNAL_RAM) { + end = vha->hw->fw_memory_size; + if (buf) +- ent->t262.end_addr = end; +- } else if (ent->t262.ram_area == T262_RAM_AREA_SHARED_RAM) { ++ ent->t262.end_addr = cpu_to_le32(end); ++ } else if (area == T262_RAM_AREA_SHARED_RAM) { + start = vha->hw->fw_shared_ram_start; + end = vha->hw->fw_shared_ram_end; + if (buf) { +- ent->t262.start_addr = start; +- ent->t262.end_addr = end; ++ ent->t262.start_addr = cpu_to_le32(start); ++ ent->t262.end_addr = cpu_to_le32(end); + } +- } else if (ent->t262.ram_area == T262_RAM_AREA_DDR_RAM) { ++ } else if (area == T262_RAM_AREA_DDR_RAM) { + start = vha->hw->fw_ddr_ram_start; + end = vha->hw->fw_ddr_ram_end; + if (buf) { +- ent->t262.start_addr = start; +- ent->t262.end_addr = end; ++ ent->t262.start_addr = cpu_to_le32(start); ++ ent->t262.end_addr = cpu_to_le32(end); + } +- } else if (ent->t262.ram_area == T262_RAM_AREA_MISC) { ++ } else if (area == T262_RAM_AREA_MISC) { + if (buf) { +- ent->t262.start_addr = start; +- ent->t262.end_addr = end; ++ ent->t262.start_addr = cpu_to_le32(start); ++ ent->t262.end_addr = cpu_to_le32(end); + } + } else { + ql_dbg(ql_dbg_misc, vha, 0xd022, +- "%s: unknown area %x\n", __func__, ent->t262.ram_area); ++ "%s: unknown area %x\n", __func__, area); + qla27xx_skip_entry(ent, buf); + goto done; + } + + if (end <= start || start == 0 || end == 0) { + ql_dbg(ql_dbg_misc, vha, 0xd023, +- "%s: unusable range (start=%x end=%x)\n", __func__, +- ent->t262.end_addr, ent->t262.start_addr); ++ "%s: unusable range (start=%lx end=%lx)\n", ++ __func__, start, end); + qla27xx_skip_entry(ent, buf); + goto done; + } +@@ -312,13 +330,14 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { ++ uint type = ent->t263.queue_type; + uint count = 0; + uint i; + uint length; + +- ql_dbg(ql_dbg_misc, vha, 0xd207, +- "%s: getq(%x) [%lx]\n", __func__, ent->t263.queue_type, *len); +- if (ent->t263.queue_type == T263_QUEUE_TYPE_REQ) { ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd207, ++ "%s: getq(%x) [%lx]\n", __func__, type, *len); ++ if (type == T263_QUEUE_TYPE_REQ) { + for (i = 0; i < vha->hw->max_req_queues; i++) { + struct req_que *req = vha->hw->req_q_map[i]; + +@@ -332,7 +351,7 @@ qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha, + count++; + } + } +- } else if (ent->t263.queue_type == T263_QUEUE_TYPE_RSP) { ++ } else if (type == T263_QUEUE_TYPE_RSP) { + for (i = 0; i < vha->hw->max_rsp_queues; i++) { + struct rsp_que *rsp = vha->hw->rsp_q_map[i]; + +@@ -360,7 +379,7 @@ qla27xx_fwdt_entry_t263(struct scsi_qla_host *vha, + } + } else { + ql_dbg(ql_dbg_misc, vha, 0xd026, +- "%s: unknown queue %x\n", __func__, ent->t263.queue_type); ++ "%s: unknown queue %x\n", __func__, type); + qla27xx_skip_entry(ent, buf); + } + +@@ -433,10 +452,12 @@ qla27xx_fwdt_entry_t267(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 offset = ent->t267.pci_offset; ++ ulong data = le32_to_cpu(ent->t267.data); + + ql_dbg(ql_dbg_misc, vha, 0xd20b, + "%s: dis intr [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, ent->t267.pci_offset, ent->t267.data, buf); ++ qla27xx_write_reg(reg, offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -533,8 +554,8 @@ qla27xx_fwdt_entry_t270(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 dwords = ent->t270.count; +- ulong addr = ent->t270.addr; ++ ulong addr = le32_to_cpu(ent->t270.addr); ++ ulong dwords = le32_to_cpu(ent->t270.count); + + ql_dbg(ql_dbg_misc, vha, 0xd20e, + "%s: rdremreg [%lx]\n", __func__, *len); +@@ -554,8 +575,8 @@ qla27xx_fwdt_entry_t271(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 = ent->t271.addr; +- ulong data = ent->t271.data; ++ ulong addr = le32_to_cpu(ent->t271.addr); ++ ulong data = le32_to_cpu(ent->t271.data); + + ql_dbg(ql_dbg_misc, vha, 0xd20f, + "%s: wrremreg [%lx]\n", __func__, *len); +@@ -570,8 +591,8 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t272(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +- ulong dwords = ent->t272.count; +- ulong start = ent->t272.addr; ++ ulong dwords = le32_to_cpu(ent->t272.count); ++ ulong start = le32_to_cpu(ent->t272.addr); + + ql_dbg(ql_dbg_misc, vha, 0xd210, + "%s: rdremram [%lx]\n", __func__, *len); +@@ -590,8 +611,8 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t273(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +- ulong dwords = ent->t273.count; +- ulong addr = ent->t273.addr; ++ ulong dwords = le32_to_cpu(ent->t273.count); ++ ulong addr = le32_to_cpu(ent->t273.addr); + uint32_t value; + + ql_dbg(ql_dbg_misc, vha, 0xd211, +@@ -613,12 +634,13 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { ++ ulong type = ent->t274.queue_type; + uint count = 0; + uint i; + +- ql_dbg(ql_dbg_misc, vha, 0xd212, +- "%s: getqsh(%x) [%lx]\n", __func__, ent->t274.queue_type, *len); +- if (ent->t274.queue_type == T274_QUEUE_TYPE_REQ_SHAD) { ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd212, ++ "%s: getqsh(%lx) [%lx]\n", __func__, type, *len); ++ if (type == T274_QUEUE_TYPE_REQ_SHAD) { + for (i = 0; i < vha->hw->max_req_queues; i++) { + struct req_que *req = vha->hw->req_q_map[i]; + +@@ -630,7 +652,7 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha, + count++; + } + } +- } else if (ent->t274.queue_type == T274_QUEUE_TYPE_RSP_SHAD) { ++ } else if (type == T274_QUEUE_TYPE_RSP_SHAD) { + for (i = 0; i < vha->hw->max_rsp_queues; i++) { + struct rsp_que *rsp = vha->hw->rsp_q_map[i]; + +@@ -656,7 +678,7 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha, + } + } else { + ql_dbg(ql_dbg_misc, vha, 0xd02f, +- "%s: unknown queue %x\n", __func__, ent->t274.queue_type); ++ "%s: unknown queue %lx\n", __func__, type); + qla27xx_skip_entry(ent, buf); + } + +@@ -675,23 +697,26 @@ 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); ++ void *buffer = ent->t275.buffer; + +- ql_dbg(ql_dbg_misc, vha, 0xd213, +- "%s: buffer(%x) [%lx]\n", __func__, ent->t275.length, *len); +- if (!ent->t275.length) { ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd213, ++ "%s: buffer(%lx) [%lx]\n", __func__, length, *len); ++ if (!length) { + ql_dbg(ql_dbg_misc, vha, 0xd020, + "%s: buffer zero length\n", __func__); + qla27xx_skip_entry(ent, buf); + goto done; + } +- if (offset + ent->t275.length > ent->hdr.size) { ++ if (offset + length > size) { + ql_dbg(ql_dbg_misc, vha, 0xd030, + "%s: buffer overflow\n", __func__); + qla27xx_skip_entry(ent, buf); + goto done; + } + +- qla27xx_insertbuf(ent->t275.buffer, ent->t275.length, buf, len); ++ qla27xx_insertbuf(buffer, length, buf, len); + done: + return qla27xx_next_entry(ent); + } +@@ -700,13 +725,15 @@ 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 != ent->t276.cond1 || func != ent->t276.cond2) { ++ if (type != cond1 || func != cond2) { + ent = qla27xx_next_entry(ent); + qla27xx_skip_entry(ent, buf); + } +@@ -719,12 +746,15 @@ qla27xx_fwdt_entry_t277(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 cmd_addr = le32_to_cpu(ent->t277.cmd_addr); ++ ulong wr_cmd_data = le32_to_cpu(ent->t277.wr_cmd_data); ++ ulong data_addr = le32_to_cpu(ent->t277.data_addr); + + ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd215, + "%s: rdpep [%lx]\n", __func__, *len); +- qla27xx_insert32(ent->t277.wr_cmd_data, buf, len); +- qla27xx_write_reg(reg, ent->t277.cmd_addr, ent->t277.wr_cmd_data, buf); +- qla27xx_read_reg(reg, ent->t277.data_addr, buf, len); ++ qla27xx_insert32(wr_cmd_data, buf, len); ++ qla27xx_write_reg(reg, cmd_addr, wr_cmd_data, buf); ++ qla27xx_read_reg(reg, data_addr, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -734,11 +764,15 @@ qla27xx_fwdt_entry_t278(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 cmd_addr = le32_to_cpu(ent->t278.cmd_addr); ++ ulong wr_cmd_data = le32_to_cpu(ent->t278.wr_cmd_data); ++ ulong data_addr = le32_to_cpu(ent->t278.data_addr); ++ ulong wr_data = le32_to_cpu(ent->t278.wr_data); + + ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd216, + "%s: wrpep [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, ent->t278.data_addr, ent->t278.wr_data, buf); +- qla27xx_write_reg(reg, ent->t278.cmd_addr, ent->t278.wr_cmd_data, buf); ++ qla27xx_write_reg(reg, data_addr, wr_data, buf); ++ qla27xx_write_reg(reg, cmd_addr, wr_cmd_data, buf); + + return qla27xx_next_entry(ent); + } +@@ -747,8 +781,10 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_other(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { ++ ulong type = le32_to_cpu(ent->hdr.type); ++ + ql_dbg(ql_dbg_misc, vha, 0xd2ff, +- "%s: type %x [%lx]\n", __func__, ent->hdr.type, *len); ++ "%s: other %lx [%lx]\n", __func__, type, *len); + qla27xx_skip_entry(ent, buf); + + return qla27xx_next_entry(ent); +@@ -803,13 +839,16 @@ static void + qla27xx_walk_template(struct scsi_qla_host *vha, + struct qla27xx_fwdt_template *tmp, void *buf, ulong *len) + { +- struct qla27xx_fwdt_entry *ent = (void *)tmp + tmp->entry_offset; +- ulong count = tmp->entry_count; ++ struct qla27xx_fwdt_entry *ent = (void *)tmp + ++ le32_to_cpu(tmp->entry_offset); ++ ulong count = le32_to_cpu(tmp->entry_count); ++ ulong type = 0; + + ql_dbg(ql_dbg_misc, vha, 0xd01a, + "%s: entry count %lx\n", __func__, count); + while (count--) { +- ent = qla27xx_find_entry(ent->hdr.type)(vha, ent, buf, len); ++ type = le32_to_cpu(ent->hdr.type); ++ ent = qla27xx_find_entry(type)(vha, ent, buf, len); + if (!ent) + break; + } +@@ -879,13 +918,13 @@ ql27xx_edit_template(struct scsi_qla_host *vha, + static inline uint32_t + qla27xx_template_checksum(void *p, ulong size) + { +- uint32_t *buf = p; ++ __le32 *buf = p; + uint64_t sum = 0; + + size /= sizeof(*buf); + +- while (size--) +- sum += *buf++; ++ for ( ; size--; buf++) ++ sum += le32_to_cpu(*buf); + + sum = (sum & 0xffffffff) + (sum >> 32); + +@@ -901,7 +940,7 @@ qla27xx_verify_template_checksum(struct qla27xx_fwdt_template *tmp) + static inline int + qla27xx_verify_template_header(struct qla27xx_fwdt_template *tmp) + { +- return tmp->template_type == TEMPLATE_TYPE_FWDUMP; ++ return le32_to_cpu(tmp->template_type) == TEMPLATE_TYPE_FWDUMP; + } + + static void +@@ -949,7 +988,8 @@ qla27xx_fwdt_template_valid(void *p) + + if (!qla27xx_verify_template_header(tmp)) { + ql_log(ql_log_warn, NULL, 0xd01c, +- "%s: template type %x\n", __func__, tmp->template_type); ++ "%s: template type %x\n", __func__, ++ le32_to_cpu(tmp->template_type)); + return false; + } + +diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h +index f7990f2a057a..036194234430 100644 +--- a/drivers/scsi/qla2xxx/qla_tmpl.h ++++ b/drivers/scsi/qla2xxx/qla_tmpl.h +@@ -11,12 +11,12 @@ + #define IOBASE_ADDR offsetof(struct device_reg_24xx, iobase_addr) + + struct __packed qla27xx_fwdt_template { +- uint32_t template_type; +- uint32_t entry_offset; ++ __le32 template_type; ++ __le32 entry_offset; + uint32_t template_size; + uint32_t reserved_1; + +- uint32_t entry_count; ++ __le32 entry_count; + uint32_t template_version; + uint32_t capture_timestamp; + uint32_t template_checksum; +@@ -65,8 +65,8 @@ struct __packed qla27xx_fwdt_template { + + struct __packed qla27xx_fwdt_entry { + struct __packed { +- uint32_t type; +- uint32_t size; ++ __le32 type; ++ __le32 size; + uint32_t reserved_1; + + uint8_t capture_flags; +@@ -81,36 +81,36 @@ struct __packed qla27xx_fwdt_entry { + } t255; + + struct __packed { +- uint32_t base_addr; ++ __le32 base_addr; + uint8_t reg_width; +- uint16_t reg_count; ++ __le16 reg_count; + uint8_t pci_offset; + } t256; + + struct __packed { +- uint32_t base_addr; +- uint32_t write_data; ++ __le32 base_addr; ++ __le32 write_data; + uint8_t pci_offset; + uint8_t reserved[3]; + } t257; + + struct __packed { +- uint32_t base_addr; ++ __le32 base_addr; + uint8_t reg_width; +- uint16_t reg_count; ++ __le16 reg_count; + uint8_t pci_offset; + uint8_t banksel_offset; + uint8_t reserved[3]; +- uint32_t bank; ++ __le32 bank; + } t258; + + struct __packed { +- uint32_t base_addr; +- uint32_t write_data; ++ __le32 base_addr; ++ __le32 write_data; + uint8_t reserved[2]; + uint8_t pci_offset; + uint8_t banksel_offset; +- uint32_t bank; ++ __le32 bank; + } t259; + + struct __packed { +@@ -121,14 +121,14 @@ struct __packed qla27xx_fwdt_entry { + struct __packed { + uint8_t pci_offset; + uint8_t reserved[3]; +- uint32_t write_data; ++ __le32 write_data; + } t261; + + struct __packed { + uint8_t ram_area; + uint8_t reserved[3]; +- uint32_t start_addr; +- uint32_t end_addr; ++ __le32 start_addr; ++ __le32 end_addr; + } t262; + + struct __packed { +@@ -158,7 +158,7 @@ struct __packed qla27xx_fwdt_entry { + struct __packed { + uint8_t pci_offset; + uint8_t reserved[3]; +- uint32_t data; ++ __le32 data; + } t267; + + struct __packed { +@@ -173,23 +173,23 @@ struct __packed qla27xx_fwdt_entry { + } t269; + + struct __packed { +- uint32_t addr; +- uint32_t count; ++ __le32 addr; ++ __le32 count; + } t270; + + struct __packed { +- uint32_t addr; +- uint32_t data; ++ __le32 addr; ++ __le32 data; + } t271; + + struct __packed { +- uint32_t addr; +- uint32_t count; ++ __le32 addr; ++ __le32 count; + } t272; + + struct __packed { +- uint32_t addr; +- uint32_t count; ++ __le32 addr; ++ __le32 count; + } t273; + + struct __packed { +@@ -199,26 +199,26 @@ struct __packed qla27xx_fwdt_entry { + } t274; + + struct __packed { +- uint32_t length; ++ __le32 length; + uint8_t buffer[]; + } t275; + + struct __packed { +- uint32_t cond1; +- uint32_t cond2; ++ __le32 cond1; ++ __le32 cond2; + } t276; + + struct __packed { +- uint32_t cmd_addr; +- uint32_t wr_cmd_data; +- uint32_t data_addr; ++ __le32 cmd_addr; ++ __le32 wr_cmd_data; ++ __le32 data_addr; + } t277; + + struct __packed { +- uint32_t cmd_addr; +- uint32_t wr_cmd_data; +- uint32_t data_addr; +- uint32_t wr_data; ++ __le32 cmd_addr; ++ __le32 wr_cmd_data; ++ __le32 data_addr; ++ __le32 wr_data; + } t278; + }; + }; +-- +2.13.6 + diff --git a/SOURCES/0036-scsi-scsi-qla2xxx-Add-support-for-multiple-fwdump-te.patch b/SOURCES/0036-scsi-scsi-qla2xxx-Add-support-for-multiple-fwdump-te.patch new file mode 100644 index 0000000..8bf8c8d --- /dev/null +++ b/SOURCES/0036-scsi-scsi-qla2xxx-Add-support-for-multiple-fwdump-te.patch @@ -0,0 +1,874 @@ +From f42a165a0f0fd533b8bdd3adf94ee567bb669765 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:56 -0400 +Subject: [PATCH 036/124] [scsi] scsi: qla2xxx: Add support for multiple fwdump + templates/segments + +Message-id: <20190801155618.12650-37-hmadhani@redhat.com> +Patchwork-id: 267812 +O-Subject: [RHEL 7.8 e-stor PATCH 036/118] scsi: qla2xxx: Add support for multiple fwdump templates/segments +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch adds multipe firmware dump template and segments support for +ISP27XX/28XX. + +Signed-off-by: Joe Carnuccio +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a28d9e4ef99729d7e4db31d2dfeaf00755be4ab7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 | 15 +- + drivers/scsi/qla2xxx/qla_sup.c | 2 + + drivers/scsi/qla2xxx/qla_tmpl.c | 89 +++++---- + 7 files changed, 304 insertions(+), 224 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index f7cfb36e635e..b6eb4c6677bf 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -80,8 +80,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 15b146db7f71..ed5283e50b32 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4037,9 +4037,11 @@ struct qla_hw_data { + uint8_t pep_version[3]; + + /* Firmware dump template */ +- void *fw_dump_template; +- uint32_t fw_dump_template_len; +- /* Firmware dump information. */ ++ struct fwdt { ++ void *template; ++ ulong length; ++ ulong dump_size; ++ } fwdt[2]; + struct qla2xxx_fw_dump *fw_dump; + uint32_t fw_dump_len; + bool fw_dumped; +@@ -4082,7 +4084,6 @@ struct qla_hw_data { + uint16_t product_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" + char model_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 3e4424ecd6ec..fcb85c15c703 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -610,7 +610,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 05c8a6befa4b..9fa3c3322809 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3089,12 +3089,15 @@ eft_err: + 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; +@@ -3139,20 +3142,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_size = EFT_SIZE; + } + + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { +- if (!ha->fw_dump_template) { +- ql_log(ql_log_warn, vha, 0x00ba, +- "Failed missing fwdump template\n"); +- return; ++ struct fwdt *fwdt = ha->fwdt; ++ uint j; ++ ++ for (j = 0; j < 2; j++, fwdt++) { ++ if (!fwdt->template) { ++ ql_log(ql_log_warn, vha, 0x00ba, ++ "-> fwdt%u no template\n", j); ++ continue; ++ } ++ ql_dbg(ql_dbg_init, vha, 0x00fa, ++ "-> fwdt%u calculating fwdump size...\n", j); ++ fwdt->dump_size = qla27xx_fwdt_calculate_dump_size( ++ vha, fwdt->template); ++ ql_dbg(ql_dbg_init, vha, 0x00fa, ++ "-> fwdt%u calculated fwdump size = %#lx bytes\n", ++ j, fwdt->dump_size); ++ dump_size += fwdt->dump_size; + } +- dump_size = qla27xx_fwdt_calculate_dump_size(vha); +- ql_dbg(ql_dbg_init, vha, 0x00fa, +- "-> allocating fwdump (%x bytes)...\n", dump_size); + goto allocate; + } + +@@ -4284,11 +4318,14 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len, + { + char *st, *en; + uint16_t index; ++ uint64_t zero[2] = { 0 }; + struct qla_hw_data *ha = vha->hw; + int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && + !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha); + +- if (memcmp(model, BINZERO, len) != 0) { ++ if (len > sizeof(zero)) ++ len = sizeof(zero); ++ if (memcmp(model, &zero, len) != 0) { + strncpy(ha->model_number, model, len); + st = en = ha->model_number; + en += len - 1; +@@ -4392,8 +4429,8 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) + nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ +- if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || +- nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) { ++ if (chksum || memcmp("ISP ", nv->id, sizeof(nv->id)) || ++ nv->nvram_version < 1) { + /* Reset NVRAM data. */ + ql_log(ql_log_warn, vha, 0x0064, + "Inconsistent NVRAM " +@@ -7000,9 +7037,8 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ +- if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' +- || nv->id[3] != ' ' || +- nv->nvram_version < cpu_to_le16(ICB_VERSION)) { ++ if (chksum || memcmp("ISP ", nv->id, sizeof(nv->id)) || ++ le16_to_cpu(nv->nvram_version) < ICB_VERSION) { + /* Reset NVRAM data. */ + ql_log(ql_log_warn, vha, 0x006b, + "Inconsistent NVRAM detected: checksum=0x%x id=%c " +@@ -7318,14 +7354,16 @@ static int + qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + uint32_t faddr) + { +- int rval = QLA_SUCCESS; +- int segments, fragment; +- uint32_t *dcode, dlen; +- uint32_t risc_addr; +- uint32_t risc_size; +- uint32_t i; ++ int rval; ++ uint templates, segments, fragment; ++ ulong i; ++ uint j; ++ ulong dlen; ++ uint32_t *dcode; ++ uint32_t risc_addr, risc_size, risc_attr = 0; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = ha->req_q_map[0]; ++ struct fwdt *fwdt = ha->fwdt; + + ql_dbg(ql_dbg_init, vha, 0x008b, + "FW: Loading firmware from flash (%x).\n", faddr); +@@ -7343,34 +7381,36 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + return QLA_FUNCTION_FAILED; + } + +- while (segments && rval == QLA_SUCCESS) { +- /* Read segment's load information. */ +- qla24xx_read_flash_data(vha, dcode, faddr, 4); +- ++ dcode = (void *)req->ring; ++ *srisc_addr = 0; ++ segments = FA_RISC_CODE_SEGMENTS; ++ for (j = 0; j < segments; j++) { ++ ql_dbg(ql_dbg_init, vha, 0x008d, ++ "-> Loading segment %u...\n", j); ++ qla24xx_read_flash_data(vha, dcode, faddr, 10); + risc_addr = be32_to_cpu(dcode[2]); +- *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr; + risc_size = be32_to_cpu(dcode[3]); ++ if (!*srisc_addr) { ++ *srisc_addr = risc_addr; ++ risc_attr = be32_to_cpu(dcode[9]); ++ } + +- fragment = 0; +- while (risc_size > 0 && rval == QLA_SUCCESS) { +- dlen = (uint32_t)(ha->fw_transfer_size >> 2); ++ dlen = ha->fw_transfer_size >> 2; ++ for (fragment = 0; risc_size; fragment++) { + if (dlen > risc_size) + dlen = risc_size; + + ql_dbg(ql_dbg_init, vha, 0x008e, +- "Loading risc segment@ risc addr %x " +- "number of dwords 0x%x offset 0x%x.\n", +- risc_addr, dlen, faddr); +- ++ "-> Loading fragment %u: %#x <- %#x (%#lx dwords)...\n", ++ fragment, risc_addr, faddr, dlen); + qla24xx_read_flash_data(vha, dcode, faddr, dlen); + for (i = 0; i < dlen; i++) + dcode[i] = swab32(dcode[i]); + +- rval = qla2x00_load_ram(vha, req->dma, risc_addr, +- dlen); ++ rval = qla2x00_load_ram(vha, req->dma, risc_addr, dlen); + if (rval) { + ql_log(ql_log_fatal, vha, 0x008f, +- "Failed to load segment %d of firmware.\n", ++ "-> Failed load firmware fragment %u.\n", + fragment); + return QLA_FUNCTION_FAILED; + } +@@ -7378,72 +7418,83 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + faddr += dlen; + risc_addr += dlen; + risc_size -= dlen; +- fragment++; + } +- +- /* Next segment. */ +- segments--; + } + + if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- return rval; ++ return QLA_SUCCESS; + +- if (ha->fw_dump_template) +- vfree(ha->fw_dump_template); +- ha->fw_dump_template = NULL; +- ha->fw_dump_template_len = 0; +- +- ql_dbg(ql_dbg_init, vha, 0x0161, +- "Loading fwdump template from %x\n", faddr); +- qla24xx_read_flash_data(vha, dcode, faddr, 7); +- risc_size = be32_to_cpu(dcode[2]); +- ql_dbg(ql_dbg_init, vha, 0x0162, +- "-> array size %x dwords\n", risc_size); +- if (risc_size == 0 || risc_size == ~0) +- goto failed; ++ templates = (risc_attr & BIT_9) ? 2 : 1; ++ ql_dbg(ql_dbg_init, vha, 0x0160, "-> templates = %u\n", templates); ++ for (j = 0; j < templates; j++, fwdt++) { ++ if (fwdt->template) ++ vfree(fwdt->template); ++ fwdt->template = NULL; ++ fwdt->length = 0; ++ ++ qla24xx_read_flash_data(vha, dcode, faddr, 7); ++ risc_size = be32_to_cpu(dcode[2]); ++ ql_dbg(ql_dbg_init, vha, 0x0161, ++ "-> fwdt%u template array at %#x (%#x dwords)\n", ++ j, faddr, risc_size); ++ if (!risc_size || !~risc_size) { ++ ql_dbg(ql_dbg_init, vha, 0x0162, ++ "-> fwdt%u failed to read array\n", j); ++ goto failed; ++ } + +- dlen = (risc_size - 8) * sizeof(*dcode); +- ql_dbg(ql_dbg_init, vha, 0x0163, +- "-> template allocating %x bytes...\n", dlen); +- ha->fw_dump_template = vmalloc(dlen); +- if (!ha->fw_dump_template) { +- ql_log(ql_log_warn, vha, 0x0164, +- "Failed fwdump template allocate %x bytes.\n", risc_size); +- goto failed; +- } ++ /* skip header and ignore checksum */ ++ faddr += 7; ++ risc_size -= 8; ++ ++ ql_dbg(ql_dbg_init, vha, 0x0163, ++ "-> fwdt%u template allocate template %#x words...\n", ++ j, risc_size); ++ fwdt->template = vmalloc(risc_size * sizeof(*dcode)); ++ if (!fwdt->template) { ++ ql_log(ql_log_warn, vha, 0x0164, ++ "-> fwdt%u failed allocate template.\n", j); ++ goto failed; ++ } + +- faddr += 7; +- risc_size -= 8; +- dcode = ha->fw_dump_template; +- qla24xx_read_flash_data(vha, dcode, faddr, risc_size); +- for (i = 0; i < risc_size; i++) +- dcode[i] = le32_to_cpu(dcode[i]); ++ dcode = fwdt->template; ++ qla24xx_read_flash_data(vha, dcode, faddr, risc_size); ++ for (i = 0; i < risc_size; i++) ++ dcode[i] = le32_to_cpu(dcode[i]); + +- if (!qla27xx_fwdt_template_valid(dcode)) { +- ql_log(ql_log_warn, vha, 0x0165, +- "Failed fwdump template validate\n"); +- goto failed; +- } ++ if (!qla27xx_fwdt_template_valid(dcode)) { ++ ql_log(ql_log_warn, vha, 0x0165, ++ "-> fwdt%u failed template validate\n", j); ++ goto failed; ++ } + +- dlen = qla27xx_fwdt_template_size(dcode); +- ql_dbg(ql_dbg_init, vha, 0x0166, +- "-> template size %x bytes\n", dlen); +- if (dlen > risc_size * sizeof(*dcode)) { +- ql_log(ql_log_warn, vha, 0x0167, +- "Failed fwdump template exceeds array by %zx bytes\n", +- (size_t)(dlen - risc_size * sizeof(*dcode))); +- goto failed; ++ dlen = qla27xx_fwdt_template_size(dcode); ++ ql_dbg(ql_dbg_init, vha, 0x0166, ++ "-> fwdt%u template size %#lx bytes (%#lx words)\n", ++ j, dlen, dlen / sizeof(*dcode)); ++ if (dlen > risc_size * sizeof(*dcode)) { ++ ql_log(ql_log_warn, vha, 0x0167, ++ "-> fwdt%u template exceeds array (%-lu bytes)\n", ++ j, dlen - risc_size * sizeof(*dcode)); ++ goto failed; ++ } ++ ++ fwdt->length = dlen; ++ ql_dbg(ql_dbg_init, vha, 0x0168, ++ "-> fwdt%u loaded template ok\n", j); ++ ++ faddr += risc_size + 1; + } +- ha->fw_dump_template_len = dlen; +- return rval; ++ ++ return QLA_SUCCESS; + + 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; +- ha->fw_dump_template_len = 0; +- return rval; ++ if (fwdt->template) ++ vfree(fwdt->template); ++ fwdt->template = NULL; ++ fwdt->length = 0; ++ ++ return QLA_SUCCESS; + } + + #define QLA_FW_URL "http://ldriver.qlogic.com/firmware/" +@@ -7551,31 +7602,31 @@ static int + qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + { + int rval; +- int segments, fragment; +- uint32_t *dcode, dlen; +- uint32_t risc_addr; +- uint32_t risc_size; +- uint32_t i; ++ uint templates, segments, fragment; ++ uint32_t *dcode; ++ ulong dlen; ++ uint32_t risc_addr, risc_size, risc_attr = 0; ++ ulong i; ++ uint j; + struct fw_blob *blob; + uint32_t *fwcode; +- uint32_t fwclen; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = ha->req_q_map[0]; ++ struct fwdt *fwdt = ha->fwdt; ++ ++ ql_dbg(ql_dbg_init, vha, 0x0090, ++ "-> FW: Loading via request-firmware.\n"); + +- /* Load firmware blob. */ + blob = qla2x00_request_firmware(vha); + if (!blob) { +- ql_log(ql_log_warn, vha, 0x0090, +- "Firmware image unavailable.\n"); +- ql_log(ql_log_warn, vha, 0x0091, +- "Firmware images can be retrieved from: " +- QLA_FW_URL ".\n"); ++ ql_log(ql_log_warn, vha, 0x0092, ++ "-> Firmware file not found.\n"); + + return QLA_FUNCTION_FAILED; + } + + fwcode = (void *)blob->fw->data; +- dcode = fwcode; ++ dcode = fwcode + 4; + if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_fatal, vha, 0x0093, + "Unable to verify integrity of firmware image (%Zd).\n", +@@ -7597,38 +7648,39 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + return QLA_FUNCTION_FAILED; + } + +- while (segments && rval == QLA_SUCCESS) { ++ dcode = (void *)req->ring; ++ *srisc_addr = 0; ++ segments = FA_RISC_CODE_SEGMENTS; ++ for (j = 0; j < segments; j++) { ++ ql_dbg(ql_dbg_init, vha, 0x0096, ++ "-> Loading segment %u...\n", j); + risc_addr = be32_to_cpu(fwcode[2]); +- *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr; + risc_size = be32_to_cpu(fwcode[3]); + +- /* Validate firmware image size. */ +- fwclen += risc_size * sizeof(uint32_t); +- if (blob->fw->size < fwclen) { +- ql_log(ql_log_fatal, vha, 0x0096, +- "Unable to verify integrity of firmware image " +- "(%Zd).\n", blob->fw->size); +- return QLA_FUNCTION_FAILED; ++ if (!*srisc_addr) { ++ *srisc_addr = risc_addr; ++ risc_attr = be32_to_cpu(fwcode[9]); + } + +- fragment = 0; +- while (risc_size > 0 && rval == QLA_SUCCESS) { ++ dlen = ha->fw_transfer_size >> 2; ++ for (fragment = 0; risc_size; fragment++) { + dlen = (uint32_t)(ha->fw_transfer_size >> 2); + if (dlen > risc_size) + dlen = risc_size; + + ql_dbg(ql_dbg_init, vha, 0x0097, +- "Loading risc segment@ risc addr %x " +- "number of dwords 0x%x.\n", risc_addr, dlen); ++ "-> Loading fragment %u: %#x <- %#x (%#lx words)...\n", ++ fragment, risc_addr, ++ (uint32_t)(fwcode - (typeof(fwcode))blob->fw->data), ++ dlen); + + for (i = 0; i < dlen; i++) + dcode[i] = swab32(fwcode[i]); + +- rval = qla2x00_load_ram(vha, req->dma, risc_addr, +- dlen); ++ rval = qla2x00_load_ram(vha, req->dma, risc_addr, dlen); + if (rval) { + ql_log(ql_log_fatal, vha, 0x0098, +- "Failed to load segment %d of firmware.\n", ++ "-> Failed load firmware fragment %u.\n", + fragment); + return QLA_FUNCTION_FAILED; + } +@@ -7636,71 +7688,82 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + fwcode += dlen; + risc_addr += dlen; + risc_size -= dlen; +- fragment++; + } +- +- /* Next segment. */ +- segments--; + } + + if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- return rval; ++ return QLA_SUCCESS; + +- if (ha->fw_dump_template) +- vfree(ha->fw_dump_template); +- ha->fw_dump_template = NULL; +- ha->fw_dump_template_len = 0; +- +- ql_dbg(ql_dbg_init, vha, 0x171, +- "Loading fwdump template from %lx\n", +- (void *)fwcode - (void *)blob->fw->data); +- risc_size = be32_to_cpu(fwcode[2]); +- ql_dbg(ql_dbg_init, vha, 0x172, +- "-> array size %x dwords\n", risc_size); +- if (risc_size == 0 || risc_size == ~0) +- goto failed; ++ templates = (risc_attr & BIT_9) ? 2 : 1; ++ ql_dbg(ql_dbg_init, vha, 0x0170, "-> templates = %u\n", templates); ++ for (j = 0; j < templates; j++, fwdt++) { ++ if (fwdt->template) ++ vfree(fwdt->template); ++ fwdt->template = NULL; ++ fwdt->length = 0; ++ ++ risc_size = be32_to_cpu(fwcode[2]); ++ ql_dbg(ql_dbg_init, vha, 0x0171, ++ "-> fwdt%u template array at %#x (%#x dwords)\n", ++ j, (uint32_t)((void *)fwcode - (void *)blob->fw->data), ++ risc_size); ++ if (!risc_size || !~risc_size) { ++ ql_dbg(ql_dbg_init, vha, 0x0172, ++ "-> fwdt%u failed to read array\n", j); ++ goto failed; ++ } + +- dlen = (risc_size - 8) * sizeof(*fwcode); +- ql_dbg(ql_dbg_init, vha, 0x0173, +- "-> template allocating %x bytes...\n", dlen); +- ha->fw_dump_template = vmalloc(dlen); +- if (!ha->fw_dump_template) { +- ql_log(ql_log_warn, vha, 0x0174, +- "Failed fwdump template allocate %x bytes.\n", risc_size); +- goto failed; +- } ++ /* skip header and ignore checksum */ ++ fwcode += 7; ++ risc_size -= 8; ++ ++ ql_dbg(ql_dbg_init, vha, 0x0173, ++ "-> fwdt%u template allocate template %#x words...\n", ++ j, risc_size); ++ fwdt->template = vmalloc(risc_size * sizeof(*dcode)); ++ if (!fwdt->template) { ++ ql_log(ql_log_warn, vha, 0x0174, ++ "-> fwdt%u failed allocate template.\n", j); ++ goto failed; ++ } + +- fwcode += 7; +- risc_size -= 8; +- dcode = ha->fw_dump_template; +- for (i = 0; i < risc_size; i++) +- dcode[i] = le32_to_cpu(fwcode[i]); ++ dcode = fwdt->template; ++ for (i = 0; i < risc_size; i++) ++ dcode[i] = le32_to_cpu(fwcode[i]); + +- if (!qla27xx_fwdt_template_valid(dcode)) { +- ql_log(ql_log_warn, vha, 0x0175, +- "Failed fwdump template validate\n"); +- goto failed; +- } ++ if (!qla27xx_fwdt_template_valid(dcode)) { ++ ql_log(ql_log_warn, vha, 0x0175, ++ "-> fwdt%u failed template validate\n", j); ++ goto failed; ++ } + +- dlen = qla27xx_fwdt_template_size(dcode); +- ql_dbg(ql_dbg_init, vha, 0x0176, +- "-> template size %x bytes\n", dlen); +- if (dlen > risc_size * sizeof(*fwcode)) { +- ql_log(ql_log_warn, vha, 0x0177, +- "Failed fwdump template exceeds array by %zx bytes\n", +- (size_t)(dlen - risc_size * sizeof(*fwcode))); +- goto failed; ++ dlen = qla27xx_fwdt_template_size(dcode); ++ ql_dbg(ql_dbg_init, vha, 0x0176, ++ "-> fwdt%u template size %#lx bytes (%#lx words)\n", ++ j, dlen, dlen / sizeof(*dcode)); ++ if (dlen > risc_size * sizeof(*dcode)) { ++ ql_log(ql_log_warn, vha, 0x0177, ++ "-> fwdt%u template exceeds array (%-lu bytes)\n", ++ j, dlen - risc_size * sizeof(*dcode)); ++ goto failed; ++ } ++ ++ fwdt->length = dlen; ++ ql_dbg(ql_dbg_init, vha, 0x0178, ++ "-> fwdt%u loaded template ok\n", j); ++ ++ fwcode += risc_size + 1; + } +- ha->fw_dump_template_len = dlen; +- return rval; ++ ++ return QLA_SUCCESS; + + failed: +- ql_log(ql_log_warn, vha, 0x017d, "Failed fwdump template\n"); +- if (ha->fw_dump_template) +- vfree(ha->fw_dump_template); +- ha->fw_dump_template = NULL; +- ha->fw_dump_template_len = 0; +- return rval; ++ if (fwdt->template) ++ vfree(fwdt->template); ++ fwdt->template = NULL; ++ fwdt->length = 0; ++ ++ return QLA_SUCCESS; + } + + int +@@ -7967,9 +8030,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + nv, ha->nvram_size); + + /* Bad NVRAM data, set defaults parameters. */ +- if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' +- || nv->id[3] != ' ' || +- nv->nvram_version < cpu_to_le16(ICB_VERSION)) { ++ if (chksum || memcmp("ISP ", nv->id, sizeof(nv->id)) || ++ le16_to_cpu(nv->nvram_version) < ICB_VERSION) { + /* Reset NVRAM data. */ + ql_log(ql_log_info, vha, 0x0073, + "Inconsistent NVRAM detected: checksum=0x%x id=%c " +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 8c567a82752b..354977d41097 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4734,6 +4734,9 @@ qla2x00_free_exchoffld_buffer(struct qla_hw_data *ha) + static void + qla2x00_free_fw_dump(struct qla_hw_data *ha) + { ++ struct fwdt *fwdt = ha->fwdt; ++ uint j; ++ + if (ha->fce) + dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, + ha->fce_dma); +@@ -4745,9 +4748,6 @@ qla2x00_free_fw_dump(struct qla_hw_data *ha) + if (ha->fw_dump) + vfree(ha->fw_dump); + +- if (ha->fw_dump_template) +- vfree(ha->fw_dump_template); +- + ha->fce = NULL; + ha->fce_dma = 0; + ha->eft = NULL; +@@ -4757,8 +4757,13 @@ qla2x00_free_fw_dump(struct qla_hw_data *ha) + ha->fw_dump_reading = 0; + ha->fw_dump = NULL; + ha->fw_dump_len = 0; +- ha->fw_dump_template = NULL; +- ha->fw_dump_template_len = 0; ++ ++ for (j = 0; j < 2; j++, fwdt++) { ++ if (fwdt->template) ++ vfree(fwdt->template); ++ fwdt->template = NULL; ++ fwdt->length = 0; ++ } + } + + /* +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index a062cecb3980..5c0c62f1f010 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -2633,6 +2633,8 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + goto slow_read; + + try_fast: ++ if (offset & 0xff) ++ goto slow_read; + optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, + &optrom_dma, GFP_KERNEL); + if (!optrom) { +diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c +index aab4aed88138..97525263b457 100644 +--- a/drivers/scsi/qla2xxx/qla_tmpl.c ++++ b/drivers/scsi/qla2xxx/qla_tmpl.c +@@ -38,7 +38,6 @@ qla27xx_insert32(uint32_t value, void *buf, ulong *len) + static inline void + qla27xx_insertbuf(void *mem, ulong size, void *buf, ulong *len) + { +- + if (buf && mem && size) { + buf += *len; + memcpy(buf, mem, size); +@@ -855,23 +854,11 @@ qla27xx_walk_template(struct scsi_qla_host *vha, + + if (count) + ql_dbg(ql_dbg_misc, vha, 0xd018, +- "%s: entry residual count (%lx)\n", __func__, count); ++ "%s: entry count residual=+%lu\n", __func__, count); + + if (ent) + ql_dbg(ql_dbg_misc, vha, 0xd019, +- "%s: missing end entry (%lx)\n", __func__, count); +- +- if (buf && *len != vha->hw->fw_dump_len) +- ql_dbg(ql_dbg_misc, vha, 0xd01b, +- "%s: length=%#lx residual=%+ld\n", +- __func__, *len, vha->hw->fw_dump_len - *len); +- +- if (buf) { +- ql_log(ql_log_warn, vha, 0xd015, +- "Firmware dump saved to temp buffer (%lu/%p)\n", +- vha->host_no, vha->hw->fw_dump); +- qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP); +- } ++ "%s: missing end entry\n", __func__); + } + + static void +@@ -894,8 +881,8 @@ qla27xx_driver_info(struct qla27xx_fwdt_template *tmp) + } + + static void +-qla27xx_firmware_info(struct qla27xx_fwdt_template *tmp, +- struct scsi_qla_host *vha) ++qla27xx_firmware_info(struct scsi_qla_host *vha, ++ struct qla27xx_fwdt_template *tmp) + { + tmp->firmware_version[0] = vha->hw->fw_major_version; + tmp->firmware_version[1] = vha->hw->fw_minor_version; +@@ -912,7 +899,7 @@ ql27xx_edit_template(struct scsi_qla_host *vha, + { + qla27xx_time_stamp(tmp); + qla27xx_driver_info(tmp); +- qla27xx_firmware_info(tmp, vha); ++ qla27xx_firmware_info(vha, tmp); + } + + static inline uint32_t +@@ -943,26 +930,26 @@ qla27xx_verify_template_header(struct qla27xx_fwdt_template *tmp) + return le32_to_cpu(tmp->template_type) == TEMPLATE_TYPE_FWDUMP; + } + +-static void +-qla27xx_execute_fwdt_template(struct scsi_qla_host *vha) ++static ulong ++qla27xx_execute_fwdt_template(struct scsi_qla_host *vha, ++ struct qla27xx_fwdt_template *tmp, void *buf) + { +- struct qla27xx_fwdt_template *tmp = vha->hw->fw_dump_template; +- ulong len; ++ ulong len = 0; + + if (qla27xx_fwdt_template_valid(tmp)) { + len = tmp->template_size; +- tmp = memcpy(vha->hw->fw_dump, tmp, len); ++ tmp = memcpy(buf, tmp, len); + ql27xx_edit_template(vha, tmp); +- qla27xx_walk_template(vha, tmp, tmp, &len); +- vha->hw->fw_dump_len = len; +- vha->hw->fw_dumped = 1; ++ qla27xx_walk_template(vha, tmp, buf, &len); + } ++ ++ return len; + } + + ulong +-qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *vha) ++qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *vha, void *p) + { +- struct qla27xx_fwdt_template *tmp = vha->hw->fw_dump_template; ++ struct qla27xx_fwdt_template *tmp = p; + ulong len = 0; + + if (qla27xx_fwdt_template_valid(tmp)) { +@@ -1012,17 +999,41 @@ qla27xx_fwdump(scsi_qla_host_t *vha, int hardware_locked) + spin_lock_irqsave(&vha->hw->hardware_lock, flags); + #endif + +- if (!vha->hw->fw_dump) +- ql_log(ql_log_warn, vha, 0xd01e, "fwdump buffer missing.\n"); +- else if (!vha->hw->fw_dump_template) +- ql_log(ql_log_warn, vha, 0xd01f, "fwdump template missing.\n"); +- else if (vha->hw->fw_dumped) +- ql_log(ql_log_warn, vha, 0xd300, +- "Firmware has been previously dumped (%p)," +- " -- ignoring request\n", vha->hw->fw_dump); +- else { +- QLA_FW_STOPPED(vha->hw); +- qla27xx_execute_fwdt_template(vha); ++ if (!vha->hw->fw_dump) { ++ ql_log(ql_log_warn, vha, 0xd01e, "-> fwdump no buffer\n"); ++ } else if (vha->hw->fw_dumped) { ++ ql_log(ql_log_warn, vha, 0xd01f, ++ "-> Firmware already dumped (%p) -- ignoring request\n", ++ vha->hw->fw_dump); ++ } else { ++ struct fwdt *fwdt = vha->hw->fwdt; ++ uint j; ++ ulong len; ++ void *buf = vha->hw->fw_dump; ++ ++ for (j = 0; j < 2; j++, fwdt++, buf += len) { ++ ql_log(ql_log_warn, vha, 0xd011, ++ "-> fwdt%u running...\n", j); ++ if (!fwdt->template) { ++ ql_log(ql_log_warn, vha, 0xd012, ++ "-> fwdt%u no template\n", j); ++ break; ++ } ++ len = qla27xx_execute_fwdt_template(vha, ++ fwdt->template, buf); ++ if (len != fwdt->dump_size) { ++ ql_log(ql_log_warn, vha, 0xd013, ++ "-> fwdt%u fwdump residual=%+ld\n", ++ j, fwdt->dump_size - len); ++ } ++ } ++ vha->hw->fw_dump_len = buf - (void *)vha->hw->fw_dump; ++ vha->hw->fw_dumped = 1; ++ ++ ql_log(ql_log_warn, vha, 0xd015, ++ "-> Firmware dump saved to buffer (%lu/%p) <%lx>\n", ++ vha->host_no, vha->hw->fw_dump, vha->hw->fw_dump_cap_flags); ++ qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP); + } + + #ifndef __CHECKER__ +-- +2.13.6 + diff --git a/SOURCES/0037-scsi-scsi-qla2xxx-Update-flash-read-write-routine.patch b/SOURCES/0037-scsi-scsi-qla2xxx-Update-flash-read-write-routine.patch new file mode 100644 index 0000000..da5eb60 --- /dev/null +++ b/SOURCES/0037-scsi-scsi-qla2xxx-Update-flash-read-write-routine.patch @@ -0,0 +1,1341 @@ +From f489fc7e6dc6a1092ab9a85fce340174c6a9c1fb Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:57 -0400 +Subject: [PATCH 037/124] [scsi] scsi: qla2xxx: Update flash read/write routine + +Message-id: <20190801155618.12650-38-hmadhani@redhat.com> +Patchwork-id: 267814 +O-Subject: [RHEL 7.8 e-stor PATCH 037/118] scsi: qla2xxx: Update flash read/write routine +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +This patch makes following changes to flash access routines: + +- update 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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 3695310e37b4e571d40593cbe59188b0006a2274) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 4b3cd62a5c5b..02443efda34c 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)) { +@@ -935,7 +937,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, }, +@@ -958,11 +960,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, +@@ -986,14 +988,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)) ++ if (iter->type && !IS_FWI2_CAPABLE(ha)) + continue; +- if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha)) ++ if (iter->type == 2 && !IS_QLA25XX(ha)) + continue; +- if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) ++ if (iter->type == 3 && !(IS_CNA_CAPABLE(ha))) + continue; +- if (iter->is4GBp_only == 0x27 && +- (!IS_QLA27XX(vha->hw) || !IS_QLA28XX(ha))) ++ if (iter->type == 0x27 && ++ (!IS_QLA27XX(ha) || !IS_QLA28XX(ha))) + continue; + + sysfs_remove_bin_file(&host->shost_gendev.kobj, +@@ -1361,19 +1363,20 @@ qla24xx_84xx_fw_version_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + int rval = QLA_SUCCESS; +- uint16_t status[2] = {0, 0}; ++ uint16_t status[2] = { 0 }; + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); + struct qla_hw_data *ha = vha->hw; + + if (!IS_QLA84XX(ha)) + return scnprintf(buf, PAGE_SIZE, "\n"); + +- if (ha->cs84xx->op_fw_version == 0) ++ if (!ha->cs84xx->op_fw_version) { + rval = qla84xx_verify_chip(vha, status); + +- if ((rval == QLA_SUCCESS) && (status[0] == 0)) +- return scnprintf(buf, PAGE_SIZE, "%u\n", +- (uint32_t)ha->cs84xx->op_fw_version); ++ if (!rval && !status[0]) ++ return scnprintf(buf, PAGE_SIZE, "%u\n", ++ (uint32_t)ha->cs84xx->op_fw_version); ++ } + + return scnprintf(buf, PAGE_SIZE, "\n"); + } +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index ed5283e50b32..19bf9fb9b19c 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -3171,9 +3171,9 @@ struct isp_operations { + void *(*prep_ms_fdmi_iocb) (struct scsi_qla_host *, uint32_t, + uint32_t); + +- uint8_t *(*read_nvram) (struct scsi_qla_host *, uint8_t *, ++ uint8_t *(*read_nvram)(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +- int (*write_nvram) (struct scsi_qla_host *, uint8_t *, uint32_t, ++ int (*write_nvram)(struct scsi_qla_host *, void *, uint32_t, + uint32_t); + + void (*fw_dump) (struct scsi_qla_host *, int); +@@ -3182,9 +3182,9 @@ struct isp_operations { + int (*beacon_off) (struct scsi_qla_host *); + void (*beacon_blink) (struct scsi_qla_host *); + +- uint8_t * (*read_optrom) (struct scsi_qla_host *, uint8_t *, ++ void *(*read_optrom)(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +- int (*write_optrom) (struct scsi_qla_host *, uint8_t *, uint32_t, ++ int (*write_optrom)(struct scsi_qla_host *, void *, uint32_t, + uint32_t); + + int (*get_flash_version) (struct scsi_qla_host *, void *); +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index fcb85c15c703..b0422ce94f20 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -542,19 +542,20 @@ fc_port_t *qla2x00_find_fcport_by_nportid(scsi_qla_host_t *, port_id_t *, u8); + */ + extern void qla2x00_release_nvram_protection(scsi_qla_host_t *); + extern uint32_t *qla24xx_read_flash_data(scsi_qla_host_t *, uint32_t *, +- uint32_t, uint32_t); +-extern uint8_t *qla2x00_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); +-extern uint8_t *qla24xx_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); +-extern int qla2x00_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); +-extern int qla24xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); +-extern uint8_t *qla25xx_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); +-extern int qla25xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, +- uint32_t); ++ uint32_t, uint32_t); ++extern uint8_t *qla2x00_read_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++extern uint8_t *qla24xx_read_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++extern int qla2x00_write_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++extern int qla24xx_write_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++extern uint8_t *qla25xx_read_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++extern int qla25xx_write_nvram_data(scsi_qla_host_t *, void *, uint32_t, ++ uint32_t); ++ + extern int qla2x00_is_a_vp_did(scsi_qla_host_t *, uint32_t); + bool qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *, uint32_t); + bool qla2x00_check_reg16_for_disconnect(scsi_qla_host_t *, uint16_t); +@@ -574,18 +575,18 @@ extern int qla83xx_restart_nic_firmware(scsi_qla_host_t *); + extern int qla83xx_access_control(scsi_qla_host_t *, uint16_t, uint32_t, + uint32_t, uint16_t *); + +-extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern void *qla2x00_read_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern int qla2x00_write_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern int qla2x00_write_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern uint8_t *qla24xx_read_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern void *qla24xx_read_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern int qla24xx_write_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern int qla24xx_write_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern uint8_t *qla25xx_read_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern void *qla25xx_read_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern uint8_t *qla8044_read_optrom_data(struct scsi_qla_host *, +- uint8_t *, uint32_t, uint32_t); ++extern void *qla8044_read_optrom_data(struct scsi_qla_host *, ++ void *, uint32_t, uint32_t); + extern void qla8044_watchdog(struct scsi_qla_host *vha); + + extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *); +@@ -765,9 +766,9 @@ extern int qla82xx_start_firmware(scsi_qla_host_t *); + + /* Firmware and flash related functions */ + extern int qla82xx_load_risc(scsi_qla_host_t *, uint32_t *); +-extern uint8_t *qla82xx_read_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern void *qla82xx_read_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); +-extern int qla82xx_write_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern int qla82xx_write_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); + + /* Mailbox related functions */ +@@ -863,7 +864,7 @@ extern void qla8044_clear_drv_active(struct qla_hw_data *); + void qla8044_get_minidump(struct scsi_qla_host *vha); + int qla8044_collect_md_data(struct scsi_qla_host *vha); + extern int qla8044_md_get_template(scsi_qla_host_t *); +-extern int qla8044_write_optrom_data(struct scsi_qla_host *, uint8_t *, ++extern int qla8044_write_optrom_data(struct scsi_qla_host *, void *, + uint32_t, uint32_t); + extern irqreturn_t qla8044_intr_handler(int, void *); + extern void qla82xx_mbx_completion(scsi_qla_host_t *, uint16_t); +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9fa3c3322809..27482aa84adf 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4433,9 +4433,8 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) + nv->nvram_version < 1) { + /* Reset NVRAM data. */ + ql_log(ql_log_warn, vha, 0x0064, +- "Inconsistent NVRAM " +- "detected: checksum=0x%x id=%c version=0x%x.\n", +- chksum, nv->id[0], nv->nvram_version); ++ "Inconsistent NVRAM detected: checksum=%#x id=%.4s version=%#x.\n", ++ chksum, nv->id, nv->nvram_version); + ql_log(ql_log_warn, vha, 0x0065, + "Falling back to " + "functioning (yet invalid -- WWPN) defaults.\n"); +@@ -7021,13 +7020,12 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + + /* Get VPD data into cache */ + ha->vpd = ha->nvram + VPD_OFFSET; +- ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ++ ha->isp_ops->read_nvram(vha, ha->vpd, + ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4); + + /* Get NVRAM data into cache and calculate checksum. */ + dptr = (uint32_t *)nv; +- ha->isp_ops->read_nvram(vha, (uint8_t *)dptr, ha->nvram_base, +- ha->nvram_size); ++ ha->isp_ops->read_nvram(vha, dptr, ha->nvram_base, ha->nvram_size); + for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++, dptr++) + chksum += le32_to_cpu(*dptr); + +@@ -7041,9 +7039,9 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + le16_to_cpu(nv->nvram_version) < ICB_VERSION) { + /* Reset NVRAM data. */ + ql_log(ql_log_warn, vha, 0x006b, +- "Inconsistent NVRAM detected: checksum=0x%x id=%c " +- "version=0x%x.\n", chksum, nv->id[0], nv->nvram_version); +- ql_dump_buffer(ql_dbg_init, vha, 0x006b, nv, 32); ++ "Inconsistent NVRAM checksum=%#x id=%.4s version=%#x.\n", ++ chksum, nv->id, nv->nvram_version); ++ ql_dump_buffer(ql_dbg_init, vha, 0x006b, nv, sizeof(*nv)); + ql_log(ql_log_warn, vha, 0x006c, + "Falling back to functioning (yet invalid -- WWPN) " + "defaults.\n"); +@@ -7432,6 +7430,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + fwdt->template = NULL; + fwdt->length = 0; + ++ dcode = (void *)req->ring; + qla24xx_read_flash_data(vha, dcode, faddr, 7); + risc_size = be32_to_cpu(dcode[2]); + ql_dbg(ql_dbg_init, vha, 0x0161, +@@ -8034,10 +8033,9 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + le16_to_cpu(nv->nvram_version) < ICB_VERSION) { + /* Reset NVRAM data. */ + ql_log(ql_log_info, vha, 0x0073, +- "Inconsistent NVRAM detected: checksum=0x%x id=%c " +- "version=0x%x.\n", chksum, nv->id[0], +- le16_to_cpu(nv->nvram_version)); +- ql_dump_buffer(ql_dbg_init, vha, 0x0073, nv, 32); ++ "Inconsistent NVRAM checksum=%#x id=%.4s version=%#x.\n", ++ chksum, nv->id, le16_to_cpu(nv->nvram_version)); ++ ql_dump_buffer(ql_dbg_init, vha, 0x0073, nv, sizeof(*nv)); + ql_log(ql_log_info, vha, 0x0074, + "Falling back to functioning (yet invalid -- WWPN) " + "defaults.\n"); +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 868bfb56d972..ff624c06824e 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -2653,8 +2653,8 @@ done: + /* + * Address and length are byte address + */ +-uint8_t * +-qla82xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++void * ++qla82xx_read_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + scsi_block_requests(vha->host); +@@ -2762,15 +2762,14 @@ write_done: + } + + int +-qla82xx_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++qla82xx_write_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + int rval; + + /* Suspend HBA. */ + scsi_block_requests(vha->host); +- rval = qla82xx_write_flash_data(vha, (uint32_t *)buf, offset, +- length >> 2); ++ rval = qla82xx_write_flash_data(vha, buf, offset, length >> 2); + scsi_unblock_requests(vha->host); + + /* Convert return ISP82xx to generic */ +@@ -3694,8 +3693,8 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + /* Wait for pending cmds (physical and virtual) to complete */ +- if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, +- WAIT_HOST)) { ++ if (!qla2x00_eh_wait_for_pending_commands(vha, 0, 0, ++ WAIT_HOST) == QLA_SUCCESS) { + ql_dbg(ql_dbg_init, vha, 0x00b3, + "Done wait for " + "pending commands.\n"); +diff --git a/drivers/scsi/qla2xxx/qla_nx2.c b/drivers/scsi/qla2xxx/qla_nx2.c +index 56f72b44a965..412d589fe550 100644 +--- a/drivers/scsi/qla2xxx/qla_nx2.c ++++ b/drivers/scsi/qla2xxx/qla_nx2.c +@@ -542,12 +542,12 @@ exit_lock_error: + /* + * Address and length are byte address + */ +-uint8_t * +-qla8044_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++void * ++qla8044_read_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + scsi_block_requests(vha->host); +- if (qla8044_read_flash_data(vha, (uint8_t *)buf, offset, length / 4) ++ if (qla8044_read_flash_data(vha, buf, offset, length / 4) + != QLA_SUCCESS) { + ql_log(ql_log_warn, vha, 0xb08d, + "%s: Failed to read from flash\n", +@@ -3780,7 +3780,7 @@ qla8044_write_flash_dword_mode(scsi_qla_host_t *vha, uint32_t *dwptr, + } + + int +-qla8044_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++qla8044_write_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + int rval = QLA_FUNCTION_FAILED, i, burst_iter_count; +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index 5c0c62f1f010..8a275cf2d4fc 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -429,66 +429,64 @@ qla2x00_set_nvram_protection(struct qla_hw_data *ha, int stat) + static inline uint32_t + flash_conf_addr(struct qla_hw_data *ha, uint32_t faddr) + { +- return ha->flash_conf_off | faddr; ++ return ha->flash_conf_off + faddr; + } + + static inline uint32_t + flash_data_addr(struct qla_hw_data *ha, uint32_t faddr) + { +- return ha->flash_data_off | faddr; ++ return ha->flash_data_off + faddr; + } + + static inline uint32_t + nvram_conf_addr(struct qla_hw_data *ha, uint32_t naddr) + { +- return ha->nvram_conf_off | naddr; ++ return ha->nvram_conf_off + naddr; + } + + static inline uint32_t + nvram_data_addr(struct qla_hw_data *ha, uint32_t naddr) + { +- return ha->nvram_data_off | naddr; ++ return ha->nvram_data_off + naddr; + } + +-static uint32_t +-qla24xx_read_flash_dword(struct qla_hw_data *ha, uint32_t addr) ++static int ++qla24xx_read_flash_dword(struct qla_hw_data *ha, uint32_t addr, uint32_t *data) + { +- int rval; +- uint32_t cnt, data; + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; ++ ulong cnt = 30000; + + WRT_REG_DWORD(®->flash_addr, addr & ~FARX_DATA_FLAG); +- /* Wait for READ cycle to complete. */ +- rval = QLA_SUCCESS; +- for (cnt = 3000; +- (RD_REG_DWORD(®->flash_addr) & FARX_DATA_FLAG) == 0 && +- rval == QLA_SUCCESS; cnt--) { +- if (cnt) +- udelay(10); +- else +- rval = QLA_FUNCTION_TIMEOUT; ++ ++ while (cnt--) { ++ if (RD_REG_DWORD(®->flash_addr) & FARX_DATA_FLAG) { ++ *data = RD_REG_DWORD(®->flash_data); ++ return QLA_SUCCESS; ++ } ++ udelay(10); + cond_resched(); + } + +- /* TODO: What happens if we time out? */ +- data = 0xDEADDEAD; +- if (rval == QLA_SUCCESS) +- data = RD_REG_DWORD(®->flash_data); +- +- return data; ++ ql_log(ql_log_warn, pci_get_drvdata(ha->pdev), 0x7090, ++ "Flash read dword at %x timeout.\n", addr); ++ *data = 0xDEADDEAD; ++ return QLA_FUNCTION_TIMEOUT; + } + + uint32_t * + qla24xx_read_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + uint32_t dwords) + { +- uint32_t i; ++ ulong i; + struct qla_hw_data *ha = vha->hw; + + /* Dword reads to flash. */ +- for (i = 0; i < dwords; i++, faddr++) +- dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, +- flash_data_addr(ha, faddr))); ++ faddr = flash_data_addr(ha, faddr); ++ for (i = 0; i < dwords; i++, faddr++, dwptr++) { ++ if (qla24xx_read_flash_dword(ha, faddr, dwptr)) ++ break; ++ cpu_to_le32s(dwptr); ++ } + + return dwptr; + } +@@ -496,35 +494,37 @@ qla24xx_read_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + static int + qla24xx_write_flash_dword(struct qla_hw_data *ha, uint32_t addr, uint32_t data) + { +- int rval; +- uint32_t cnt; + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; ++ ulong cnt = 500000; + + WRT_REG_DWORD(®->flash_data, data); +- RD_REG_DWORD(®->flash_data); /* PCI Posting. */ + WRT_REG_DWORD(®->flash_addr, addr | FARX_DATA_FLAG); +- /* Wait for Write cycle to complete. */ +- rval = QLA_SUCCESS; +- for (cnt = 500000; (RD_REG_DWORD(®->flash_addr) & FARX_DATA_FLAG) && +- rval == QLA_SUCCESS; cnt--) { +- if (cnt) +- udelay(10); +- else +- rval = QLA_FUNCTION_TIMEOUT; ++ ++ while (cnt--) { ++ if (!(RD_REG_DWORD(®->flash_addr) & FARX_DATA_FLAG)) ++ return QLA_SUCCESS; ++ udelay(10); + cond_resched(); + } +- return rval; ++ ++ ql_log(ql_log_warn, pci_get_drvdata(ha->pdev), 0x7090, ++ "Flash write dword at %x timeout.\n", addr); ++ return QLA_FUNCTION_TIMEOUT; + } + + static void + qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, + uint8_t *flash_id) + { +- uint32_t ids; ++ uint32_t faddr, ids = 0; + +- ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x03ab)); +- *man_id = LSB(ids); +- *flash_id = MSB(ids); ++ *man_id = *flash_id = 0; ++ ++ faddr = flash_conf_addr(ha, 0x03ab); ++ if (!qla24xx_read_flash_dword(ha, faddr, &ids)) { ++ *man_id = LSB(ids); ++ *flash_id = MSB(ids); ++ } + + /* Check if man_id and flash_id are valid. */ + if (ids != 0xDEADDEAD && (*man_id == 0 || *flash_id == 0)) { +@@ -534,9 +534,11 @@ qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, + * Example: ATMEL 0x00 01 45 1F + * Extract MFG and Dev ID from last two bytes. + */ +- ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x009f)); +- *man_id = LSB(ids); +- *flash_id = MSB(ids); ++ faddr = flash_conf_addr(ha, 0x009f); ++ if (!qla24xx_read_flash_dword(ha, faddr, &ids)) { ++ *man_id = LSB(ids); ++ *flash_id = MSB(ids); ++ } + } + } + +@@ -545,12 +547,12 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) + { + const char *loc, *locations[] = { "DEF", "PCI" }; + uint32_t pcihdr, pcids; +- uint32_t *dcode; +- uint8_t *buf, *bcode, last_image; + uint16_t cnt, chksum, *wptr; +- struct qla_flt_location *fltl; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = ha->req_q_map[0]; ++ struct qla_flt_location *fltl = (void *)req->ring; ++ uint32_t *dcode = (void *)req->ring; ++ uint8_t *buf = (void *)req->ring, *bcode, last_image; + + /* + * FLT-location structure resides after the last PCI region. +@@ -575,11 +577,9 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) + *start = FA_FLASH_LAYOUT_ADDR_28; + goto end; + } ++ + /* Begin with first PCI expansion ROM header. */ +- buf = (uint8_t *)req->ring; +- dcode = (uint32_t *)req->ring; + pcihdr = 0; +- last_image = 1; + do { + /* Verify PCI expansion ROM header. */ + qla24xx_read_flash_data(vha, dcode, pcihdr >> 2, 0x20); +@@ -604,15 +604,12 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) + } while (!last_image); + + /* Now verify FLT-location structure. */ +- fltl = (struct qla_flt_location *)req->ring; +- qla24xx_read_flash_data(vha, dcode, pcihdr >> 2, +- sizeof(struct qla_flt_location) >> 2); +- if (fltl->sig[0] != 'Q' || fltl->sig[1] != 'F' || +- fltl->sig[2] != 'L' || fltl->sig[3] != 'T') ++ qla24xx_read_flash_data(vha, dcode, pcihdr >> 2, sizeof(*fltl) >> 2); ++ if (memcmp(fltl->sig, "QFLT", 4)) + goto end; + +- wptr = (uint16_t *)req->ring; +- cnt = sizeof(struct qla_flt_location) >> 1; ++ wptr = (void *)req->ring; ++ cnt = sizeof(*fltl) / sizeof(*wptr); + for (chksum = 0; cnt--; wptr++) + chksum += le16_to_cpu(*wptr); + if (chksum) { +@@ -915,22 +912,19 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) + #define FLASH_BLK_SIZE_32K 0x8000 + #define FLASH_BLK_SIZE_64K 0x10000 + const char *loc, *locations[] = { "MID", "FDT" }; ++ struct qla_hw_data *ha = vha->hw; ++ struct req_que *req = ha->req_q_map[0]; + uint16_t cnt, chksum; +- uint16_t *wptr; +- struct qla_fdt_layout *fdt; ++ uint16_t *wptr = (void *)req->ring; ++ struct qla_fdt_layout *fdt = (void *)req->ring; + uint8_t man_id, flash_id; + uint16_t mid = 0, fid = 0; +- struct qla_hw_data *ha = vha->hw; +- struct req_que *req = ha->req_q_map[0]; + +- wptr = (uint16_t *)req->ring; +- fdt = (struct qla_fdt_layout *)req->ring; +- ha->isp_ops->read_optrom(vha, (uint8_t *)req->ring, +- ha->flt_region_fdt << 2, OPTROM_BURST_SIZE); +- if (*wptr == cpu_to_le16(0xffff)) ++ qla24xx_read_flash_data(vha, (void *)fdt, ha->flt_region_fdt, ++ OPTROM_BURST_DWORDS); ++ if (le16_to_cpu(*wptr) == 0xffff) + goto no_flash_data; +- if (fdt->sig[0] != 'Q' || fdt->sig[1] != 'L' || fdt->sig[2] != 'I' || +- fdt->sig[3] != 'D') ++ if (memcmp(fdt->sig, "QLID", 4)) + goto no_flash_data; + + for (cnt = 0, chksum = 0; cnt < sizeof(*fdt) >> 1; cnt++, wptr++) +@@ -1022,8 +1016,7 @@ qla2xxx_get_idc_param(scsi_qla_host_t *vha) + return; + + wptr = (uint32_t *)req->ring; +- ha->isp_ops->read_optrom(vha, (uint8_t *)req->ring, +- QLA82XX_IDC_PARAM_ADDR , 8); ++ ha->isp_ops->read_optrom(vha, req->ring, QLA82XX_IDC_PARAM_ADDR, 8); + + if (*wptr == cpu_to_le32(0xffffffff)) { + ha->fcoe_dev_init_timeout = QLA82XX_ROM_DEV_INIT_TIMEOUT; +@@ -1085,8 +1078,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) + if (IS_QLA8044(ha)) + return; + +- ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, +- ha->flt_region_npiv_conf << 2, sizeof(struct qla_npiv_header)); ++ ha->isp_ops->read_optrom(vha, &hdr, ha->flt_region_npiv_conf << 2, ++ sizeof(struct qla_npiv_header)); + if (hdr.version == cpu_to_le16(0xffff)) + return; + if (hdr.version != cpu_to_le16(1)) { +@@ -1105,8 +1098,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) + return; + } + +- ha->isp_ops->read_optrom(vha, (uint8_t *)data, +- ha->flt_region_npiv_conf << 2, NPIV_CONFIG_SIZE); ++ ha->isp_ops->read_optrom(vha, data, ha->flt_region_npiv_conf << 2, ++ NPIV_CONFIG_SIZE); + + cnt = (sizeof(hdr) + le16_to_cpu(hdr.entries) * sizeof(*entry)) >> 1; + for (wptr = data, chksum = 0; cnt--; wptr++) +@@ -1143,10 +1136,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) + vid.node_name = wwn_to_u64(entry->node_name); + + ql_dbg(ql_dbg_user, vha, 0x7093, +- "NPIV[%02x]: wwpn=%llx " +- "wwnn=%llx vf_id=0x%x Q_qos=0x%x F_qos=0x%x.\n", cnt, +- (unsigned long long)vid.port_name, +- (unsigned long long)vid.node_name, ++ "NPIV[%02x]: wwpn=%llx wwnn=%llx vf_id=%#x Q_qos=%#x F_qos=%#x.\n", ++ cnt, vid.port_name, vid.node_name, + le16_to_cpu(entry->vf_id), + entry->q_qos, entry->f_qos); + +@@ -1154,10 +1145,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) + vport = fc_vport_create(vha->host, 0, &vid); + if (!vport) + ql_log(ql_log_warn, vha, 0x7094, +- "NPIV-Config Failed to create vport [%02x]: " +- "wwpn=%llx wwnn=%llx.\n", cnt, +- (unsigned long long)vid.port_name, +- (unsigned long long)vid.node_name); ++ "NPIV-Config Failed to create vport [%02x]: wwpn=%llx wwnn=%llx.\n", ++ cnt, vid.port_name, vid.node_name); + } + } + done: +@@ -1192,9 +1181,10 @@ done: + static int + qla24xx_protect_flash(scsi_qla_host_t *vha) + { +- uint32_t cnt; + struct qla_hw_data *ha = vha->hw; + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; ++ ulong cnt = 300; ++ uint32_t faddr, dword; + + if (ha->flags.fac_supported) + return qla81xx_fac_do_write_enable(vha, 0); +@@ -1203,11 +1193,14 @@ qla24xx_protect_flash(scsi_qla_host_t *vha) + goto skip_wrt_protect; + + /* Enable flash write-protection and wait for completion. */ +- qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), +- ha->fdt_wrt_disable); +- for (cnt = 300; cnt && +- qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x005)) & BIT_0; +- cnt--) { ++ faddr = flash_conf_addr(ha, 0x101); ++ qla24xx_write_flash_dword(ha, faddr, ha->fdt_wrt_disable); ++ faddr = flash_conf_addr(ha, 0x5); ++ while (cnt--) { ++ if (!qla24xx_read_flash_dword(ha, faddr, &dword)) { ++ if (!(dword & BIT_0)) ++ break; ++ } + udelay(10); + } + +@@ -1215,7 +1208,6 @@ skip_wrt_protect: + /* Disable flash write. */ + WRT_REG_DWORD(®->ctrl_status, + RD_REG_DWORD(®->ctrl_status) & ~CSRX_FLASH_ENABLE); +- RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ + + return QLA_SUCCESS; + } +@@ -1243,107 +1235,103 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + uint32_t dwords) + { + int ret; +- uint32_t liter; +- uint32_t sec_mask, rest_addr; +- uint32_t fdata; ++ ulong liter; ++ ulong dburst = OPTROM_BURST_DWORDS; /* burst size in dwords */ ++ uint32_t sec_mask, rest_addr, fdata; + dma_addr_t optrom_dma; + void *optrom = NULL; + struct qla_hw_data *ha = vha->hw; + +- /* Prepare burst-capable write on supported ISPs. */ +- if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || +- IS_QLA27XX(ha) || IS_QLA28XX(ha)) && +- !(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) { +- optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, +- &optrom_dma, GFP_KERNEL); +- if (!optrom) { +- ql_log(ql_log_warn, vha, 0x7095, +- "Unable to allocate " +- "memory for optrom burst write (%x KB).\n", +- OPTROM_BURST_SIZE / 1024); +- } +- } ++ if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ goto next; + +- rest_addr = (ha->fdt_block_size >> 2) - 1; +- sec_mask = ~rest_addr; ++ /* Allocate dma buffer for burst write */ ++ optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, ++ &optrom_dma, GFP_KERNEL); ++ if (!optrom) { ++ ql_log(ql_log_warn, vha, 0x7095, ++ "Failed allocate burst (%x bytes)\n", OPTROM_BURST_SIZE); ++ } + ++next: ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Unprotect flash...\n"); + ret = qla24xx_unprotect_flash(vha); +- if (ret != QLA_SUCCESS) { ++ if (ret) { + ql_log(ql_log_warn, vha, 0x7096, +- "Unable to unprotect flash for update.\n"); ++ "Failed to unprotect flash.\n"); + goto done; + } + ++ rest_addr = (ha->fdt_block_size >> 2) - 1; ++ sec_mask = ~rest_addr; + for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { + fdata = (faddr & sec_mask) << 2; + + /* Are we at the beginning of a sector? */ +- if ((faddr & rest_addr) == 0) { +- /* Do sector unprotect. */ +- if (ha->fdt_unprotect_sec_cmd) +- qla24xx_write_flash_dword(ha, +- ha->fdt_unprotect_sec_cmd, +- (fdata & 0xff00) | ((fdata << 16) & +- 0xff0000) | ((fdata >> 16) & 0xff)); ++ if (!(faddr & rest_addr)) { ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Erase sector %#x...\n", faddr); ++ + ret = qla24xx_erase_sector(vha, fdata); +- if (ret != QLA_SUCCESS) { ++ if (ret) { + ql_dbg(ql_dbg_user, vha, 0x7007, +- "Unable to erase erase sector: address=%x.\n", +- faddr); ++ "Failed to erase sector %x.\n", faddr); + break; + } + } + +- /* Go with burst-write. */ +- if (optrom && (liter + OPTROM_BURST_DWORDS) <= dwords) { +- /* Copy data to DMA'ble buffer. */ +- memcpy(optrom, dwptr, OPTROM_BURST_SIZE); ++ if (optrom) { ++ /* If smaller than a burst remaining */ ++ if (dwords - liter < dburst) ++ dburst = dwords - liter; ++ ++ /* Copy to dma buffer */ ++ memcpy(optrom, dwptr, dburst << 2); + ++ /* Burst write */ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Write burst (%#lx dwords)...\n", dburst); + ret = qla2x00_load_ram(vha, optrom_dma, +- flash_data_addr(ha, faddr), +- OPTROM_BURST_DWORDS); +- if (ret != QLA_SUCCESS) { +- ql_log(ql_log_warn, vha, 0x7097, +- "Unable to burst-write optrom segment " +- "(%x/%x/%llx).\n", ret, +- flash_data_addr(ha, faddr), +- (unsigned long long)optrom_dma); +- ql_log(ql_log_warn, vha, 0x7098, +- "Reverting to slow-write.\n"); +- +- dma_free_coherent(&ha->pdev->dev, +- OPTROM_BURST_SIZE, optrom, optrom_dma); +- optrom = NULL; +- } else { +- liter += OPTROM_BURST_DWORDS - 1; +- faddr += OPTROM_BURST_DWORDS - 1; +- dwptr += OPTROM_BURST_DWORDS - 1; ++ flash_data_addr(ha, faddr), dburst); ++ if (!ret) { ++ liter += dburst - 1; ++ faddr += dburst - 1; ++ dwptr += dburst - 1; + continue; + } ++ ++ ql_log(ql_log_warn, vha, 0x7097, ++ "Failed burst-write at %x (%p/%#llx)....\n", ++ flash_data_addr(ha, faddr), optrom, ++ (u64)optrom_dma); ++ ++ dma_free_coherent(&ha->pdev->dev, ++ OPTROM_BURST_SIZE, optrom, optrom_dma); ++ optrom = NULL; ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ break; ++ ql_log(ql_log_warn, vha, 0x7098, ++ "Reverting to slow write...\n"); + } + ++ /* Slow write */ + ret = qla24xx_write_flash_dword(ha, + flash_data_addr(ha, faddr), cpu_to_le32(*dwptr)); +- if (ret != QLA_SUCCESS) { ++ if (ret) { + ql_dbg(ql_dbg_user, vha, 0x7006, +- "Unable to program flash address=%x data=%x.\n", +- faddr, *dwptr); ++ "Failed slopw write %x (%x)\n", faddr, *dwptr); + break; + } +- +- /* Do sector protect. */ +- if (ha->fdt_unprotect_sec_cmd && +- ((faddr & rest_addr) == rest_addr)) +- qla24xx_write_flash_dword(ha, +- ha->fdt_protect_sec_cmd, +- (fdata & 0xff00) | ((fdata << 16) & +- 0xff0000) | ((fdata >> 16) & 0xff)); + } + ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Protect flash...\n"); + ret = qla24xx_protect_flash(vha); +- if (ret != QLA_SUCCESS) ++ if (ret) + ql_log(ql_log_warn, vha, 0x7099, +- "Unable to protect flash after update.\n"); ++ "Failed to protect flash\n"); + done: + if (optrom) + dma_free_coherent(&ha->pdev->dev, +@@ -1353,7 +1341,7 @@ done: + } + + uint8_t * +-qla2x00_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla2x00_read_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { + uint32_t i; +@@ -1372,27 +1360,30 @@ qla2x00_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, + } + + uint8_t * +-qla24xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla24xx_read_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { +- uint32_t i; +- uint32_t *dwptr; + struct qla_hw_data *ha = vha->hw; ++ uint32_t *dwptr = buf; ++ uint32_t i; + + if (IS_P3P_TYPE(ha)) + return buf; + + /* Dword reads to flash. */ +- dwptr = (uint32_t *)buf; +- for (i = 0; i < bytes >> 2; i++, naddr++) +- dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, +- nvram_data_addr(ha, naddr))); ++ naddr = nvram_data_addr(ha, naddr); ++ bytes >>= 2; ++ for (i = 0; i < bytes; i++, naddr++, dwptr++) { ++ if (qla24xx_read_flash_dword(ha, naddr, dwptr)) ++ break; ++ cpu_to_le32s(dwptr); ++ } + + return buf; + } + + int +-qla2x00_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla2x00_write_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { + int ret, stat; +@@ -1426,14 +1417,14 @@ qla2x00_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, + } + + int +-qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla24xx_write_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { +- int ret; +- uint32_t i; +- uint32_t *dwptr; + struct qla_hw_data *ha = vha->hw; + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; ++ uint32_t *dwptr = buf; ++ uint32_t i; ++ int ret; + + ret = QLA_SUCCESS; + +@@ -1450,11 +1441,10 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, + qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0); + + /* Dword writes to flash. */ +- dwptr = (uint32_t *)buf; +- for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) { +- ret = qla24xx_write_flash_dword(ha, +- nvram_data_addr(ha, naddr), cpu_to_le32(*dwptr)); +- if (ret != QLA_SUCCESS) { ++ naddr = nvram_data_addr(ha, naddr); ++ bytes >>= 2; ++ for (i = 0; i < bytes; i++, naddr++, dwptr++) { ++ if (qla24xx_write_flash_dword(ha, naddr, cpu_to_le32(*dwptr))) { + ql_dbg(ql_dbg_user, vha, 0x709a, + "Unable to program nvram address=%x data=%x.\n", + naddr, *dwptr); +@@ -1474,31 +1464,34 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, + } + + uint8_t * +-qla25xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla25xx_read_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { +- uint32_t i; +- uint32_t *dwptr; + struct qla_hw_data *ha = vha->hw; ++ uint32_t *dwptr = buf; ++ uint32_t i; + + /* Dword reads to flash. */ +- dwptr = (uint32_t *)buf; +- for (i = 0; i < bytes >> 2; i++, naddr++) +- dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, +- flash_data_addr(ha, ha->flt_region_vpd_nvram | naddr))); ++ naddr = flash_data_addr(ha, ha->flt_region_vpd_nvram | naddr); ++ bytes >>= 2; ++ for (i = 0; i < bytes; i++, naddr++, dwptr++) { ++ if (qla24xx_read_flash_dword(ha, naddr, dwptr)) ++ break; ++ ++ cpu_to_le32s(dwptr); ++ } + + return buf; + } + ++#define RMW_BUFFER_SIZE (64 * 1024) + int +-qla25xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, ++qla25xx_write_nvram_data(scsi_qla_host_t *vha, void *buf, uint32_t naddr, + uint32_t bytes) + { + struct qla_hw_data *ha = vha->hw; +-#define RMW_BUFFER_SIZE (64 * 1024) +- uint8_t *dbuf; ++ uint8_t *dbuf = vmalloc(RMW_BUFFER_SIZE); + +- dbuf = vmalloc(RMW_BUFFER_SIZE); + if (!dbuf) + return QLA_MEMORY_ALLOC_FAILED; + ha->isp_ops->read_optrom(vha, dbuf, ha->flt_region_vpd_nvram << 2, +@@ -2319,8 +2312,8 @@ qla2x00_resume_hba(struct scsi_qla_host *vha) + scsi_unblock_requests(vha->host); + } + +-uint8_t * +-qla2x00_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++void * ++qla2x00_read_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + uint32_t addr, midpoint; +@@ -2354,12 +2347,12 @@ qla2x00_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + } + + int +-qla2x00_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++qla2x00_write_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + + int rval; +- uint8_t man_id, flash_id, sec_number, data; ++ uint8_t man_id, flash_id, sec_number, *data; + uint16_t wd; + uint32_t addr, liter, sec_mask, rest_addr; + struct qla_hw_data *ha = vha->hw; +@@ -2488,7 +2481,7 @@ update_flash: + + for (addr = offset, liter = 0; liter < length; liter++, + addr++) { +- data = buf[liter]; ++ data = buf + liter; + /* Are we at the beginning of a sector? */ + if ((addr & rest_addr) == 0) { + if (IS_QLA2322(ha) || IS_QLA6322(ha)) { +@@ -2556,7 +2549,7 @@ update_flash: + } + } + +- if (qla2x00_program_flash_address(ha, addr, data, ++ if (qla2x00_program_flash_address(ha, addr, *data, + man_id, flash_id)) { + rval = QLA_FUNCTION_FAILED; + break; +@@ -2572,8 +2565,8 @@ update_flash: + return rval; + } + +-uint8_t * +-qla24xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++void * ++qla24xx_read_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + struct qla_hw_data *ha = vha->hw; +@@ -2583,7 +2576,7 @@ qla24xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); + + /* Go with read. */ +- qla24xx_read_flash_data(vha, (uint32_t *)buf, offset >> 2, length >> 2); ++ qla24xx_read_flash_data(vha, (void *)buf, offset >> 2, length >> 2); + + /* Resume HBA. */ + clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); +@@ -2593,7 +2586,7 @@ qla24xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + } + + int +-qla24xx_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++qla24xx_write_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + int rval; +@@ -2604,7 +2597,7 @@ qla24xx_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); + + /* Go with write. */ +- rval = qla24xx_write_flash_data(vha, (uint32_t *)buf, offset >> 2, ++ rval = qla24xx_write_flash_data(vha, buf, offset >> 2, + length >> 2); + + clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); +@@ -2613,8 +2606,8 @@ qla24xx_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, + return rval; + } + +-uint8_t * +-qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ++void * ++qla25xx_read_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) + { + int rval; +@@ -2881,7 +2874,7 @@ qla2x00_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + "Dumping fw " + "ver from flash:.\n"); + ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010b, +- dbyte, 8); ++ dbyte, 32); + + if ((dcode[0] == 0xffff && dcode[1] == 0xffff && + dcode[2] == 0xffff && dcode[3] == 0xffff) || +@@ -2912,8 +2905,8 @@ qla82xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + { + int ret = QLA_SUCCESS; + uint32_t pcihdr, pcids; +- uint32_t *dcode; +- uint8_t *bcode; ++ uint32_t *dcode = mbuf; ++ uint8_t *bcode = mbuf; + uint8_t code_type, last_image; + struct qla_hw_data *ha = vha->hw; + +@@ -2925,17 +2918,14 @@ qla82xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision)); + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + +- dcode = mbuf; +- + /* Begin with first PCI expansion ROM header. */ + pcihdr = ha->flt_region_boot << 2; + last_image = 1; + do { + /* Verify PCI expansion ROM header. */ +- ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, pcihdr, +- 0x20 * 4); ++ ha->isp_ops->read_optrom(vha, dcode, pcihdr, 0x20 * 4); + bcode = mbuf + (pcihdr % 4); +- if (bcode[0x0] != 0x55 || bcode[0x1] != 0xaa) { ++ if (memcmp(bcode, "\x55\xaa", 2)) { + /* No signature */ + ql_log(ql_log_fatal, vha, 0x0154, + "No matching ROM signature.\n"); +@@ -2946,13 +2936,11 @@ qla82xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + /* Locate PCI data structure. */ + pcids = pcihdr + ((bcode[0x19] << 8) | bcode[0x18]); + +- ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, pcids, +- 0x20 * 4); ++ ha->isp_ops->read_optrom(vha, dcode, pcids, 0x20 * 4); + bcode = mbuf + (pcihdr % 4); + + /* Validate signature of PCI data structure. */ +- if (bcode[0x0] != 'P' || bcode[0x1] != 'C' || +- bcode[0x2] != 'I' || bcode[0x3] != 'R') { ++ if (memcmp(bcode, "PCIR", 4)) { + /* Incorrect header. */ + ql_log(ql_log_fatal, vha, 0x0155, + "PCI data struct not found pcir_adr=%x.\n", pcids); +@@ -3003,8 +2991,7 @@ qla82xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + /* Read firmware image information. */ + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + dcode = mbuf; +- ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, ha->flt_region_fw << 2, +- 0x20); ++ ha->isp_ops->read_optrom(vha, dcode, ha->flt_region_fw << 2, 0x20); + bcode = mbuf + (pcihdr % 4); + + /* Validate signature of PCI data structure. */ +@@ -3026,16 +3013,14 @@ int + qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + { + int ret = QLA_SUCCESS; +- uint32_t pcihdr, pcids; +- uint32_t *dcode; +- uint8_t *bcode; ++ uint32_t pcihdr = 0, pcids = 0; ++ uint32_t *dcode = mbuf; ++ uint8_t *bcode = mbuf; + uint8_t code_type, last_image; + int i; + struct qla_hw_data *ha = vha->hw; + uint32_t faddr = 0; + +- pcihdr = pcids = 0; +- + if (IS_P3P_TYPE(ha)) + return ret; + +@@ -3047,18 +3032,16 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision)); + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + +- dcode = mbuf; + pcihdr = ha->flt_region_boot << 2; + if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) + pcihdr = ha->flt_region_boot_sec << 2; + +- last_image = 1; + do { + /* Verify PCI expansion ROM header. */ + qla24xx_read_flash_data(vha, dcode, pcihdr >> 2, 0x20); + bcode = mbuf + (pcihdr % 4); +- if (bcode[0x0] != 0x55 || bcode[0x1] != 0xaa) { ++ if (memcmp(bcode, "\x55\xaa", 2)) { + /* No signature */ + ql_log(ql_log_fatal, vha, 0x0059, + "No matching ROM signature.\n"); +@@ -3073,11 +3056,11 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + bcode = mbuf + (pcihdr % 4); + + /* Validate signature of PCI data structure. */ +- if (bcode[0x0] != 'P' || bcode[0x1] != 'C' || +- bcode[0x2] != 'I' || bcode[0x3] != 'R') { ++ if (memcmp(bcode, "PCIR", 4)) { + /* Incorrect header. */ + ql_log(ql_log_fatal, vha, 0x005a, + "PCI data struct not found pcir_adr=%x.\n", pcids); ++ ql_dump_buffer(ql_dbg_init, vha, 0x0059, dcode, 32); + ret = QLA_FUNCTION_FAILED; + break; + } +@@ -3124,7 +3107,6 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + + /* Read firmware image information. */ + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); +- dcode = mbuf; + faddr = ha->flt_region_fw; + if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && + qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) +@@ -3135,11 +3117,12 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + ql_log(ql_log_warn, vha, 0x005f, + "Unrecognized fw revision at %x.\n", + ha->flt_region_fw * 4); ++ ql_dump_buffer(ql_dbg_init, vha, 0x005f, dcode, 32); + } else { + for (i = 0; i < 4; i++) + ha->fw_revision[i] = be32_to_cpu(dcode[4+i]); + ql_dbg(ql_dbg_init, vha, 0x0060, +- "Firmware revision (flash) %d.%d.%d (%x).\n", ++ "Firmware revision (flash) %u.%u.%u (%x).\n", + ha->fw_revision[0], ha->fw_revision[1], + ha->fw_revision[2], ha->fw_revision[3]); + } +@@ -3151,12 +3134,12 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + } + + memset(ha->gold_fw_version, 0, sizeof(ha->gold_fw_version)); +- dcode = mbuf; +- qla24xx_read_flash_data(vha, dcode, ha->flt_region_gold_fw, 8); ++ faddr = ha->flt_region_gold_fw; ++ qla24xx_read_flash_data(vha, (void *)dcode, ha->flt_region_gold_fw, 8); + if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_warn, vha, 0x0056, +- "Unrecognized golden fw at 0x%x.\n", +- ha->flt_region_gold_fw * 4); ++ "Unrecognized golden fw at %#x.\n", faddr); ++ ql_dump_buffer(ql_dbg_init, vha, 0x0056, dcode, 32); + return ret; + } + +@@ -3233,7 +3216,7 @@ qla24xx_read_fcp_prio_cfg(scsi_qla_host_t *vha) + fcp_prio_addr = ha->flt_region_fcp_prio; + + /* first read the fcp priority data header from flash */ +- ha->isp_ops->read_optrom(vha, (uint8_t *)ha->fcp_prio_cfg, ++ ha->isp_ops->read_optrom(vha, ha->fcp_prio_cfg, + fcp_prio_addr << 2, FCP_PRIO_CFG_HDR_SIZE); + + if (!qla24xx_fcp_prio_cfg_valid(vha, ha->fcp_prio_cfg, 0)) +@@ -3244,7 +3227,7 @@ qla24xx_read_fcp_prio_cfg(scsi_qla_host_t *vha) + len = ha->fcp_prio_cfg->num_entries * FCP_PRIO_CFG_ENTRY_SIZE; + max_len = FCP_PRIO_CFG_SIZE - FCP_PRIO_CFG_HDR_SIZE; + +- ha->isp_ops->read_optrom(vha, (uint8_t *)&ha->fcp_prio_cfg->entry[0], ++ ha->isp_ops->read_optrom(vha, &ha->fcp_prio_cfg->entry[0], + fcp_prio_addr << 2, (len < max_len ? len : max_len)); + + /* revalidate the entire FCP priority config data, including entries */ +-- +2.13.6 + diff --git a/SOURCES/0038-scsi-scsi-qla2xxx-Correction-and-improvement-to-fwdt.patch b/SOURCES/0038-scsi-scsi-qla2xxx-Correction-and-improvement-to-fwdt.patch new file mode 100644 index 0000000..fbfe0dd --- /dev/null +++ b/SOURCES/0038-scsi-scsi-qla2xxx-Correction-and-improvement-to-fwdt.patch @@ -0,0 +1,136 @@ +From 521a49b3f4e78aa417e2df40d24dfbc467e0e0ee Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:58 -0400 +Subject: [PATCH 038/124] [scsi] scsi: qla2xxx: Correction and improvement to + fwdt processing + +Message-id: <20190801155618.12650-39-hmadhani@redhat.com> +Patchwork-id: 267813 +O-Subject: [RHEL 7.8 e-stor PATCH 038/118] scsi: qla2xxx: Correction and improvement to fwdt processing +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2ff0167151f50f38c103c2e8e08e542cd8727441) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 97525263b457..122ed68add12 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 036194234430..723b9d537c62 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.13.6 + diff --git a/SOURCES/0039-scsi-scsi-qla2xxx-Simplification-of-register-address.patch b/SOURCES/0039-scsi-scsi-qla2xxx-Simplification-of-register-address.patch new file mode 100644 index 0000000..c27a984 --- /dev/null +++ b/SOURCES/0039-scsi-scsi-qla2xxx-Simplification-of-register-address.patch @@ -0,0 +1,275 @@ +From 79f1419f0a58fc8dadeeb876b504347a6e16106f Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:54:59 -0400 +Subject: [PATCH 039/124] [scsi] scsi: qla2xxx: Simplification of register + address used in qla_tmpl.c + +Message-id: <20190801155618.12650-40-hmadhani@redhat.com> +Patchwork-id: 267816 +O-Subject: [RHEL 7.8 e-stor PATCH 039/118] scsi: qla2xxx: Simplification of register address used in qla_tmpl.c +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +Reduce stack space on each fwdt routine by eliminating local variable reg. + +Signed-off-by: Joe Carnuccio +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ce0366df542a214be62bb3250e688f7c6d644ad7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 122ed68add12..aae8c05eb032 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_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +- struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha); + uint offset = ent->t260.pci_offset; + + ql_dbg(ql_dbg_misc, vha, 0xd204, + "%s: rdpci [%lx]\n", __func__, *len); + qla27xx_insert32(offset, buf, len); +- qla27xx_read_reg(reg, offset, buf, len); ++ qla27xx_read_reg(ISPREG(vha), offset, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -252,13 +243,12 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t261(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 offset = ent->t261.pci_offset; + ulong data = le32_to_cpu(ent->t261.write_data); + + ql_dbg(ql_dbg_misc, vha, 0xd205, + "%s: wrpci [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, offset, data, buf); ++ qla27xx_write_reg(ISPREG(vha), offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -424,12 +414,10 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t265(struct scsi_qla_host *vha, + struct qla27xx_fwdt_entry *ent, void *buf, ulong *len) + { +- struct device_reg_24xx __iomem *reg = qla27xx_isp_reg(vha); +- +- ql_dbg(ql_dbg_misc, vha, 0xd209, ++ ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd209, + "%s: pause risc [%lx]\n", __func__, *len); + if (buf) +- qla24xx_pause_risc(reg, vha->hw); ++ qla24xx_pause_risc(ISPREG(vha), vha->hw); + + return qla27xx_next_entry(ent); + } +@@ -450,13 +438,12 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t267(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 offset = ent->t267.pci_offset; + ulong data = le32_to_cpu(ent->t267.data); + + ql_dbg(ql_dbg_misc, vha, 0xd20b, + "%s: dis intr [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, offset, data, buf); ++ qla27xx_write_reg(ISPREG(vha), offset, data, buf); + + return qla27xx_next_entry(ent); + } +@@ -552,17 +539,16 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t270(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->t270.addr); + ulong dwords = le32_to_cpu(ent->t270.count); + + ql_dbg(ql_dbg_misc, vha, 0xd20e, + "%s: rdremreg [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, IOBASE_ADDR, 0x40, buf); ++ qla27xx_write_reg(ISPREG(vha), IOBASE_ADDR, 0x40, buf); + while (dwords--) { +- qla27xx_write_reg(reg, 0xc0, addr|0x80000000, buf); ++ qla27xx_write_reg(ISPREG(vha), 0xc0, addr|0x80000000, buf); + qla27xx_insert32(addr, buf, len); +- qla27xx_read_reg(reg, 0xc4, buf, len); ++ qla27xx_read_reg(ISPREG(vha), 0xc4, buf, len); + addr += sizeof(uint32_t); + } + +@@ -573,15 +559,14 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t271(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->t271.addr); + ulong data = le32_to_cpu(ent->t271.data); + + ql_dbg(ql_dbg_misc, vha, 0xd20f, + "%s: wrremreg [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, IOBASE_ADDR, 0x40, buf); +- qla27xx_write_reg(reg, 0xc4, data, buf); +- qla27xx_write_reg(reg, 0xc0, addr, buf); ++ qla27xx_write_reg(ISPREG(vha), IOBASE(vha), 0x40, buf); ++ qla27xx_write_reg(ISPREG(vha), 0xc4, data, buf); ++ qla27xx_write_reg(ISPREG(vha), 0xc0, addr, buf); + + return qla27xx_next_entry(ent); + } +@@ -749,7 +734,6 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t277(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 cmd_addr = le32_to_cpu(ent->t277.cmd_addr); + ulong wr_cmd_data = le32_to_cpu(ent->t277.wr_cmd_data); + ulong data_addr = le32_to_cpu(ent->t277.data_addr); +@@ -757,8 +741,8 @@ qla27xx_fwdt_entry_t277(struct scsi_qla_host *vha, + ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd215, + "%s: rdpep [%lx]\n", __func__, *len); + qla27xx_insert32(wr_cmd_data, buf, len); +- qla27xx_write_reg(reg, cmd_addr, wr_cmd_data, buf); +- qla27xx_read_reg(reg, data_addr, buf, len); ++ qla27xx_write_reg(ISPREG(vha), cmd_addr, wr_cmd_data, buf); ++ qla27xx_read_reg(ISPREG(vha), data_addr, buf, len); + + return qla27xx_next_entry(ent); + } +@@ -767,7 +751,6 @@ static struct qla27xx_fwdt_entry * + qla27xx_fwdt_entry_t278(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 cmd_addr = le32_to_cpu(ent->t278.cmd_addr); + ulong wr_cmd_data = le32_to_cpu(ent->t278.wr_cmd_data); + ulong data_addr = le32_to_cpu(ent->t278.data_addr); +@@ -775,8 +758,8 @@ qla27xx_fwdt_entry_t278(struct scsi_qla_host *vha, + + ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd216, + "%s: wrpep [%lx]\n", __func__, *len); +- qla27xx_write_reg(reg, data_addr, wr_data, buf); +- qla27xx_write_reg(reg, cmd_addr, wr_cmd_data, buf); ++ qla27xx_write_reg(ISPREG(vha), data_addr, wr_data, buf); ++ qla27xx_write_reg(ISPREG(vha), cmd_addr, wr_cmd_data, buf); + + return qla27xx_next_entry(ent); + } +-- +2.13.6 + diff --git a/SOURCES/0040-scsi-scsi-qla2xxx-Add-28xx-flash-primary-secondary-s.patch b/SOURCES/0040-scsi-scsi-qla2xxx-Add-28xx-flash-primary-secondary-s.patch new file mode 100644 index 0000000..f376230 --- /dev/null +++ b/SOURCES/0040-scsi-scsi-qla2xxx-Add-28xx-flash-primary-secondary-s.patch @@ -0,0 +1,880 @@ +From 3b78010182fc2c8f459048c0dee5be51e267422f Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:00 -0400 +Subject: [PATCH 040/124] [scsi] scsi: qla2xxx: Add 28xx flash + primary/secondary status/image mechanism + +Message-id: <20190801155618.12650-41-hmadhani@redhat.com> +Patchwork-id: 267815 +O-Subject: [RHEL 7.8 e-stor PATCH 040/118] scsi: qla2xxx: Add 28xx flash primary/secondary status/image mechanism +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Joe Carnuccio + +Bugzilla 1729270 + +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 +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5fa8774c7f38c79f38b672c1a0db0c049da477d6) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 | 62 +++++--- + 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, 469 insertions(+), 97 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 02443efda34c..14c19df8cb93 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 b6eb4c6677bf..d7537675568b 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -2331,6 +2331,45 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job) + } + + static int ++qla2x00_get_flash_image_status(struct fc_bsg_job *bsg_job) ++{ ++ struct Scsi_Host *host = bsg_job->shost; ++ struct fc_bsg_reply *bsg_reply = bsg_job->reply; ++ scsi_qla_host_t *vha = shost_priv(host); ++ 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.vpd_nvram; ++ regions.npiv_config_0_1 = active_regions.aux.npiv_config_0_1; ++ regions.npiv_config_2_3 = active_regions.aux.npiv_config_2_3; ++ } ++ ++ ql_dbg(ql_dbg_user, vha, 0x70e1, ++ "%s(%lu): FW=%u BCFG=%u VPDNVR=%u NPIV01=%u NPIV02=%u\n", ++ __func__, vha->host_no, regions.global_image, ++ regions.board_config, regions.vpd_nvram, ++ regions.npiv_config_0_1, regions.npiv_config_2_3); ++ ++ sg_copy_from_buffer(bsg_job->reply_payload.sg_list, ++ bsg_job->reply_payload.sg_cnt, ®ions, sizeof(regions)); ++ ++ bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = EXT_STATUS_OK; ++ bsg_reply->reply_payload_rcv_len = sizeof(regions); ++ bsg_reply->result = DID_OK << 16; ++ bsg_job->reply_len = sizeof(struct fc_bsg_reply); ++ bsg_job->job_done(bsg_job); ++ ++ return 0; ++} ++ ++static int + qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) + { + switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) { +@@ -2401,6 +2440,9 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) + case QL_VND_DPORT_DIAGNOSTICS: + return qla2x00_do_dport_diagnostics(bsg_job); + ++ case QL_VND_SS_GET_FLASH_IMAGE_STATUS: ++ return qla2x00_get_flash_image_status(bsg_job); ++ + default: + return -ENOSYS; + } +diff --git a/drivers/scsi/qla2xxx/qla_bsg.h b/drivers/scsi/qla2xxx/qla_bsg.h +index d97dfd521356..7594fad7b5b5 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.h ++++ b/drivers/scsi/qla2xxx/qla_bsg.h +@@ -31,6 +31,7 @@ + #define QL_VND_GET_PRIV_STATS 0x18 + #define QL_VND_DPORT_DIAGNOSTICS 0x19 + #define QL_VND_GET_PRIV_STATS_EX 0x1A ++#define QL_VND_SS_GET_FLASH_IMAGE_STATUS 0x1E + + /* BSG Vendor specific subcode returns */ + #define EXT_STATUS_OK 0 +@@ -279,4 +280,14 @@ struct qla_dport_diag { + #define QLA_DPORT_RESULT 0x0 + #define QLA_DPORT_START 0x2 + ++/* active images in flash */ ++struct qla_active_regions { ++ uint8_t global_image; ++ uint8_t board_config; ++ uint8_t vpd_nvram; ++ uint8_t npiv_config_0_1; ++ uint8_t npiv_config_2_3; ++ uint8_t reserved[32]; ++} __packed; ++ + #endif +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 19bf9fb9b19c..be2699dc5b56 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -1214,6 +1214,9 @@ struct mbx_cmd_32 { + #define QLA27XX_IMG_STATUS_VER_MINOR 0x00 + #define QLA27XX_IMG_STATUS_SIGN 0xFACEFADE + #define QLA28XX_IMG_STATUS_SIGN 0xFACEFADF ++#define QLA28XX_IMG_STATUS_SIGN 0xFACEFADF ++#define QLA28XX_AUX_IMG_STATUS_SIGN 0xFACEFAED ++#define QLA27XX_DEFAULT_IMAGE 0 + #define QLA27XX_PRIMARY_IMAGE 1 + #define QLA27XX_SECONDARY_IMAGE 2 + +@@ -4123,22 +4126,28 @@ struct qla_hw_data { + uint32_t fdt_protect_sec_cmd; + uint32_t fdt_wrt_sts_reg_cmd; + +- uint32_t flt_region_flt; +- uint32_t flt_region_fdt; +- uint32_t flt_region_boot; +- uint32_t flt_region_boot_sec; +- uint32_t flt_region_fw; +- uint32_t flt_region_fw_sec; +- uint32_t flt_region_vpd_nvram; +- uint32_t flt_region_vpd; +- uint32_t flt_region_vpd_sec; +- uint32_t flt_region_nvram; +- uint32_t flt_region_npiv_conf; +- uint32_t flt_region_gold_fw; +- uint32_t flt_region_fcp_prio; +- uint32_t flt_region_bootload; +- uint32_t flt_region_img_status_pri; +- uint32_t flt_region_img_status_sec; ++ struct { ++ uint32_t flt_region_flt; ++ uint32_t flt_region_fdt; ++ uint32_t flt_region_boot; ++ uint32_t flt_region_boot_sec; ++ uint32_t flt_region_fw; ++ uint32_t flt_region_fw_sec; ++ uint32_t flt_region_vpd_nvram; ++ uint32_t flt_region_vpd_nvram_sec; ++ uint32_t flt_region_vpd; ++ uint32_t flt_region_vpd_sec; ++ uint32_t flt_region_nvram; ++ uint32_t flt_region_nvram_sec; ++ uint32_t flt_region_npiv_conf; ++ uint32_t flt_region_gold_fw; ++ uint32_t flt_region_fcp_prio; ++ uint32_t flt_region_bootload; ++ uint32_t flt_region_img_status_pri; ++ uint32_t flt_region_img_status_sec; ++ uint32_t flt_region_aux_img_status_pri; ++ uint32_t flt_region_aux_img_status_sec; ++ }; + uint8_t active_image; + + /* Needed for BEACON */ +@@ -4262,6 +4271,16 @@ struct qla_hw_data { + #define DEFAULT_ZIO_THRESHOLD 5 + }; + ++struct active_regions { ++ uint8_t global; ++ struct { ++ uint8_t board_config; ++ uint8_t vpd_nvram; ++ uint8_t npiv_config_0_1; ++ uint8_t npiv_config_2_3; ++ } aux; ++}; ++ + #define FW_ABILITY_MAX_SPEED_MASK 0xFUL + #define FW_ABILITY_MAX_SPEED_16G 0x0 + #define FW_ABILITY_MAX_SPEED_32G 0x1 +@@ -4474,13 +4493,20 @@ typedef struct scsi_qla_host { + struct qla27xx_image_status { + uint8_t image_status_mask; + uint16_t generation; +- uint8_t reserved[3]; +- uint8_t ver_minor; + uint8_t ver_major; ++ uint8_t ver_minor; ++ uint8_t bitmap; /* 28xx only */ ++ uint8_t reserved[2]; + uint32_t checksum; + uint32_t signature; + } __packed; + ++/* 28xx aux image status bimap values */ ++#define QLA28XX_AUX_IMG_BOARD_CONFIG BIT_0 ++#define QLA28XX_AUX_IMG_VPD_NVRAM BIT_1 ++#define QLA28XX_AUX_IMG_NPIV_CONFIG_0_1 BIT_2 ++#define QLA28XX_AUX_IMG_NPIV_CONFIG_2_3 BIT_3 ++ + #define SET_VP_IDX 1 + #define SET_AL_PA 2 + #define RESET_VP_IDX 3 +diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h +index b9b1aaaff906..9dbd0dce5a29 100644 +--- a/drivers/scsi/qla2xxx/qla_fw.h ++++ b/drivers/scsi/qla2xxx/qla_fw.h +@@ -1515,6 +1515,18 @@ struct qla_flt_header { + #define FLT_REG_VPD_SEC_27XX_2 0xD8 + #define FLT_REG_VPD_SEC_27XX_3 0xDA + ++/* 28xx */ ++#define FLT_REG_AUX_IMG_PRI_28XX 0x125 ++#define FLT_REG_AUX_IMG_SEC_28XX 0x126 ++#define FLT_REG_VPD_SEC_28XX_0 0x10C ++#define FLT_REG_VPD_SEC_28XX_1 0x10E ++#define FLT_REG_VPD_SEC_28XX_2 0x110 ++#define FLT_REG_VPD_SEC_28XX_3 0x112 ++#define FLT_REG_NVRAM_SEC_28XX_0 0x10D ++#define FLT_REG_NVRAM_SEC_28XX_1 0x10F ++#define FLT_REG_NVRAM_SEC_28XX_2 0x111 ++#define FLT_REG_NVRAM_SEC_28XX_3 0x113 ++ + struct qla_flt_region { + uint16_t code; + uint8_t attribute; +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index b0422ce94f20..d20801e01008 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -93,7 +93,6 @@ extern int qla2xxx_mctp_dump(scsi_qla_host_t *); + extern int + qla2x00_alloc_outstanding_cmds(struct qla_hw_data *, struct req_que *); + extern int qla2x00_init_rings(scsi_qla_host_t *); +-extern uint8_t qla27xx_find_valid_image(struct scsi_qla_host *); + extern struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *, + int, int, bool); + extern int qla2xxx_delete_qpair(struct scsi_qla_host *, struct qla_qpair *); +@@ -108,6 +107,11 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *, fc_port_t *); + int qla24xx_detect_sfp(scsi_qla_host_t *vha); + int qla24xx_post_gpdb_work(struct scsi_qla_host *, fc_port_t *, u8); + ++extern void qla28xx_get_aux_images(struct scsi_qla_host *, ++ struct active_regions *); ++extern void qla27xx_get_active_image(struct scsi_qla_host *, ++ struct active_regions *); ++ + void qla2x00_async_prlo_done(struct scsi_qla_host *, fc_port_t *, + uint16_t *); + extern int qla2x00_post_async_prlo_work(struct scsi_qla_host *, fc_port_t *, +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 27482aa84adf..4307556b933b 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -7250,95 +7250,281 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + return (rval); + } + +-uint8_t qla27xx_find_valid_image(struct scsi_qla_host *vha) ++static void ++qla27xx_print_image(struct scsi_qla_host *vha, char *name, ++ struct qla27xx_image_status *image_status) ++{ ++ ql_dbg(ql_dbg_init, vha, 0x018b, ++ "%s %s: mask=%#02x gen=%#04x ver=%u.%u map=%#01x sum=%#08x sig=%#08x\n", ++ name, "status", ++ image_status->image_status_mask, ++ le16_to_cpu(image_status->generation), ++ image_status->ver_major, ++ image_status->ver_minor, ++ image_status->bitmap, ++ le32_to_cpu(image_status->checksum), ++ le32_to_cpu(image_status->signature)); ++} ++ ++static bool ++qla28xx_check_aux_image_status_signature( ++ struct qla27xx_image_status *image_status) ++{ ++ ulong signature = le32_to_cpu(image_status->signature); ++ ++ return signature != QLA28XX_AUX_IMG_STATUS_SIGN; ++} ++ ++static bool ++qla27xx_check_image_status_signature(struct qla27xx_image_status *image_status) ++{ ++ ulong signature = le32_to_cpu(image_status->signature); ++ ++ return ++ signature != QLA27XX_IMG_STATUS_SIGN && ++ signature != QLA28XX_IMG_STATUS_SIGN; ++} ++ ++static ulong ++qla27xx_image_status_checksum(struct qla27xx_image_status *image_status) ++{ ++ uint32_t *p = (void *)image_status; ++ uint n = sizeof(*image_status) / sizeof(*p); ++ uint32_t sum = 0; ++ ++ for ( ; n--; p++) ++ sum += le32_to_cpup(p); ++ ++ return sum; ++} ++ ++static inline uint ++qla28xx_component_bitmask(struct qla27xx_image_status *aux, uint bitmask) ++{ ++ return aux->bitmap & bitmask ? ++ QLA27XX_SECONDARY_IMAGE : QLA27XX_PRIMARY_IMAGE; ++} ++ ++static void ++qla28xx_component_status( ++ struct active_regions *active_regions, struct qla27xx_image_status *aux) ++{ ++ active_regions->aux.board_config = ++ qla28xx_component_bitmask(aux, QLA28XX_AUX_IMG_BOARD_CONFIG); ++ ++ active_regions->aux.vpd_nvram = ++ qla28xx_component_bitmask(aux, QLA28XX_AUX_IMG_VPD_NVRAM); ++ ++ active_regions->aux.npiv_config_0_1 = ++ qla28xx_component_bitmask(aux, QLA28XX_AUX_IMG_NPIV_CONFIG_0_1); ++ ++ active_regions->aux.npiv_config_2_3 = ++ qla28xx_component_bitmask(aux, QLA28XX_AUX_IMG_NPIV_CONFIG_2_3); ++} ++ ++static int ++qla27xx_compare_image_generation( ++ struct qla27xx_image_status *pri_image_status, ++ struct qla27xx_image_status *sec_image_status) ++{ ++ /* calculate generation delta as uint16 (this accounts for wrap) */ ++ int16_t delta = ++ le16_to_cpu(pri_image_status->generation) - ++ le16_to_cpu(sec_image_status->generation); ++ ++ ql_dbg(ql_dbg_init, NULL, 0x0180, "generation delta = %d\n", delta); ++ ++ return delta; ++} ++ ++void ++qla28xx_get_aux_images( ++ struct scsi_qla_host *vha, struct active_regions *active_regions) + { +- struct qla27xx_image_status pri_image_status, sec_image_status; +- bool valid_pri_image = true, valid_sec_image = true; +- uint32_t *wptr; +- uint chksum, cnt, size = sizeof(pri_image_status) / sizeof(*wptr); + struct qla_hw_data *ha = vha->hw; +- uint32_t signature; ++ struct qla27xx_image_status pri_aux_image_status, sec_aux_image_status; ++ bool valid_pri_image = false, valid_sec_image = false; ++ bool active_pri_image = false, active_sec_image = false; ++ ++ if (!ha->flt_region_aux_img_status_pri) { ++ ql_dbg(ql_dbg_init, vha, 0x018a, "Primary aux image not addressed\n"); ++ goto check_sec_image; ++ } ++ ++ qla24xx_read_flash_data(vha, (void *)&pri_aux_image_status, ++ ha->flt_region_aux_img_status_pri, ++ sizeof(pri_aux_image_status) >> 2); ++ qla27xx_print_image(vha, "Primary aux image", &pri_aux_image_status); ++ ++ if (qla28xx_check_aux_image_status_signature(&pri_aux_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018b, ++ "Primary aux image signature (%#x) not valid\n", ++ le32_to_cpu(pri_aux_image_status.signature)); ++ goto check_sec_image; ++ } ++ ++ if (qla27xx_image_status_checksum(&pri_aux_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018c, ++ "Primary aux image checksum failed\n"); ++ goto check_sec_image; ++ } ++ ++ valid_pri_image = true; ++ ++ if (pri_aux_image_status.image_status_mask & 1) { ++ ql_dbg(ql_dbg_init, vha, 0x018d, ++ "Primary aux image is active\n"); ++ active_pri_image = true; ++ } ++ ++check_sec_image: ++ if (!ha->flt_region_aux_img_status_sec) { ++ ql_dbg(ql_dbg_init, vha, 0x018a, ++ "Secondary aux image not addressed\n"); ++ goto check_valid_image; ++ } ++ ++ qla24xx_read_flash_data(vha, (void *)&sec_aux_image_status, ++ ha->flt_region_aux_img_status_sec, ++ sizeof(sec_aux_image_status) >> 2); ++ qla27xx_print_image(vha, "Secondary aux image", &sec_aux_image_status); ++ ++ if (qla28xx_check_aux_image_status_signature(&sec_aux_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018b, ++ "Secondary aux image signature (%#x) not valid\n", ++ le32_to_cpu(sec_aux_image_status.signature)); ++ goto check_valid_image; ++ } ++ ++ if (qla27xx_image_status_checksum(&sec_aux_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018c, ++ "Secondary aux image checksum failed\n"); ++ goto check_valid_image; ++ } + +- ha->active_image = 0; ++ valid_sec_image = true; ++ ++ if (sec_aux_image_status.image_status_mask & 1) { ++ ql_dbg(ql_dbg_init, vha, 0x018d, ++ "Secondary aux image is active\n"); ++ active_sec_image = true; ++ } ++ ++check_valid_image: ++ if (valid_pri_image && active_pri_image && ++ valid_sec_image && active_sec_image) { ++ if (qla27xx_compare_image_generation(&pri_aux_image_status, ++ &sec_aux_image_status) >= 0) { ++ qla28xx_component_status(active_regions, ++ &pri_aux_image_status); ++ } else { ++ qla28xx_component_status(active_regions, ++ &sec_aux_image_status); ++ } ++ } else if (valid_pri_image && active_pri_image) { ++ qla28xx_component_status(active_regions, &pri_aux_image_status); ++ } else if (valid_sec_image && active_sec_image) { ++ qla28xx_component_status(active_regions, &sec_aux_image_status); ++ } ++ ++ ql_dbg(ql_dbg_init, vha, 0x018f, ++ "aux images active: BCFG=%u VPD/NVR=%u NPIV0/1=%u NPIV2/3=%u\n", ++ active_regions->aux.board_config, ++ active_regions->aux.vpd_nvram, ++ active_regions->aux.npiv_config_0_1, ++ active_regions->aux.npiv_config_2_3); ++} ++ ++void ++qla27xx_get_active_image(struct scsi_qla_host *vha, ++ struct active_regions *active_regions) ++{ ++ struct qla_hw_data *ha = vha->hw; ++ struct qla27xx_image_status pri_image_status, sec_image_status; ++ bool valid_pri_image = false, valid_sec_image = false; ++ bool active_pri_image = false, active_sec_image = false; + + if (!ha->flt_region_img_status_pri) { +- valid_pri_image = false; ++ ql_dbg(ql_dbg_init, vha, 0x018a, "Primary image not addressed\n"); + goto check_sec_image; + } + +- qla24xx_read_flash_data(vha, (uint32_t *)(&pri_image_status), +- ha->flt_region_img_status_pri, size); ++ qla24xx_read_flash_data(vha, (void *)(&pri_image_status), ++ ha->flt_region_img_status_pri, sizeof(pri_image_status) >> 2); ++ qla27xx_print_image(vha, "Primary image", &pri_image_status); + +- signature = le32_to_cpu(pri_image_status.signature); +- if (signature != QLA27XX_IMG_STATUS_SIGN && +- signature != QLA28XX_IMG_STATUS_SIGN) { ++ if (qla27xx_check_image_status_signature(&pri_image_status)) { + ql_dbg(ql_dbg_init, vha, 0x018b, + "Primary image signature (%#x) not valid\n", + le32_to_cpu(pri_image_status.signature)); +- valid_pri_image = false; + goto check_sec_image; + } + +- wptr = (uint32_t *)(&pri_image_status); +- cnt = size; ++ if (qla27xx_image_status_checksum(&pri_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018c, ++ "Primary image checksum failed\n"); ++ goto check_sec_image; ++ } + +- for (chksum = 0; cnt--; wptr++) +- chksum += le32_to_cpu(*wptr); ++ valid_pri_image = true; + +- if (chksum) { +- ql_dbg(ql_dbg_init, vha, 0x018c, +- "Primary image checksum failed (%#x)\n", chksum); +- valid_pri_image = false; ++ if (pri_image_status.image_status_mask & 1) { ++ ql_dbg(ql_dbg_init, vha, 0x018d, ++ "Primary image is active\n"); ++ active_pri_image = true; + } + + check_sec_image: + if (!ha->flt_region_img_status_sec) { +- valid_sec_image = false; ++ ql_dbg(ql_dbg_init, vha, 0x018a, "Secondary image not addressed\n"); + goto check_valid_image; + } + + qla24xx_read_flash_data(vha, (uint32_t *)(&sec_image_status), +- ha->flt_region_img_status_sec, size); ++ ha->flt_region_img_status_sec, sizeof(sec_image_status) >> 2); ++ qla27xx_print_image(vha, "Secondary image", &sec_image_status); + +- signature = le32_to_cpu(sec_image_status.signature); +- if (signature != QLA27XX_IMG_STATUS_SIGN && +- signature != QLA28XX_IMG_STATUS_SIGN) { +- ql_dbg(ql_dbg_init, vha, 0x018d, ++ if (qla27xx_check_image_status_signature(&sec_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018b, + "Secondary image signature (%#x) not valid\n", + le32_to_cpu(sec_image_status.signature)); +- valid_sec_image = false; + goto check_valid_image; + } + +- wptr = (uint32_t *)(&sec_image_status); +- cnt = size; +- for (chksum = 0; cnt--; wptr++) +- chksum += le32_to_cpu(*wptr); +- if (chksum) { +- ql_dbg(ql_dbg_init, vha, 0x018e, +- "Secondary image checksum failed (%#x)\n", chksum); +- valid_sec_image = false; ++ if (qla27xx_image_status_checksum(&sec_image_status)) { ++ ql_dbg(ql_dbg_init, vha, 0x018c, ++ "Secondary image checksum failed\n"); ++ goto check_valid_image; ++ } ++ ++ valid_sec_image = true; ++ ++ if (sec_image_status.image_status_mask & 1) { ++ ql_dbg(ql_dbg_init, vha, 0x018d, ++ "Secondary image is active\n"); ++ active_sec_image = true; + } + + check_valid_image: +- if (valid_pri_image && (pri_image_status.image_status_mask & 1)) +- ha->active_image = QLA27XX_PRIMARY_IMAGE; ++ if (valid_pri_image && active_pri_image) ++ active_regions->global = QLA27XX_PRIMARY_IMAGE; + +- if (valid_sec_image && (sec_image_status.image_status_mask & 1)) { +- if (!ha->active_image || +- le16_to_cpu(pri_image_status.generation) < +- le16_to_cpu(sec_image_status.generation)) { +- ha->active_image = QLA27XX_SECONDARY_IMAGE; ++ if (valid_sec_image && active_sec_image) { ++ if (!active_regions->global || ++ qla27xx_compare_image_generation( ++ &pri_image_status, &sec_image_status) < 0) { ++ active_regions->global = QLA27XX_SECONDARY_IMAGE; + } + } + +- ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x018f, "%s image\n", +- ha->active_image == 0 ? "default bootld and fw" : +- ha->active_image == 1 ? "primary" : +- ha->active_image == 2 ? "secondary" : +- "Invalid"); +- +- return ha->active_image; ++ ql_dbg(ql_dbg_init, vha, 0x018f, "active image %s (%u)\n", ++ active_regions->global == QLA27XX_DEFAULT_IMAGE ? ++ "default (boot/fw)" : ++ active_regions->global == QLA27XX_PRIMARY_IMAGE ? ++ "primary" : ++ active_regions->global == QLA27XX_SECONDARY_IMAGE ? ++ "secondary" : "invalid", ++ active_regions->global); + } + + bool qla24xx_risc_firmware_invalid(uint32_t *dword) +@@ -7728,7 +7914,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + + dcode = fwdt->template; + for (i = 0; i < risc_size; i++) +- dcode[i] = le32_to_cpu(fwcode[i]); ++ dcode[i] = fwcode[i]; + + if (!qla27xx_fwdt_template_valid(dcode)) { + ql_log(ql_log_warn, vha, 0x0175, +@@ -7791,6 +7977,7 @@ qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) + { + int rval; + struct qla_hw_data *ha = vha->hw; ++ struct active_regions active_regions = { }; + + if (ql2xfwloadbin == 2) + goto try_blob_fw; +@@ -7801,10 +7988,12 @@ qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) + * 3) Golden-Firmware residing in flash -- (limited operation). + */ + +- if (!IS_QLA27XX(ha) || !IS_QLA28XX(ha)) ++ if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + goto try_primary_fw; + +- if (qla27xx_find_valid_image(vha) != QLA27XX_SECONDARY_IMAGE) ++ qla27xx_get_active_image(vha, &active_regions); ++ ++ if (active_regions.global != QLA27XX_SECONDARY_IMAGE) + goto try_primary_fw; + + ql_dbg(ql_dbg_init, vha, 0x008b, +@@ -8000,6 +8189,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + uint32_t chksum; + uint16_t cnt; + struct qla_hw_data *ha = vha->hw; ++ uint32_t faddr; ++ struct active_regions active_regions = { }; + + rval = QLA_SUCCESS; + icb = (struct init_cb_81xx *)ha->init_cb; +@@ -8011,14 +8202,35 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + if (IS_P3P_TYPE(ha) || IS_QLA8031(ha)) + ha->vpd_size = FA_VPD_SIZE_82XX; + ++ if (IS_QLA28XX(ha)) ++ qla28xx_get_aux_images(vha, &active_regions); ++ + /* Get VPD data into cache */ + ha->vpd = ha->nvram + VPD_OFFSET; +- ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2, +- ha->vpd_size); ++ ++ faddr = ha->flt_region_vpd; ++ if (IS_QLA28XX(ha)) { ++ if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE) ++ faddr = ha->flt_region_vpd_sec; ++ ql_dbg(ql_dbg_init, vha, 0x0110, ++ "Loading %s nvram image.\n", ++ active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ? ++ "primary" : "secondary"); ++ } ++ qla24xx_read_flash_data(vha, ha->vpd, faddr, ha->vpd_size >> 2); + + /* Get NVRAM data into cache and calculate checksum. */ +- ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2, +- ha->nvram_size); ++ faddr = ha->flt_region_nvram; ++ if (IS_QLA28XX(ha)) { ++ if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE) ++ faddr = ha->flt_region_nvram_sec; ++ } ++ ql_dbg(ql_dbg_init, vha, 0x0110, ++ "Loading %s nvram image.\n", ++ active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ? ++ "primary" : "secondary"); ++ qla24xx_read_flash_data(vha, ha->nvram, faddr, ha->nvram_size >> 2); ++ + dptr = (uint32_t *)nv; + for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++, dptr++) + chksum += le32_to_cpu(*dptr); +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index 8a275cf2d4fc..8191f3599f79 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -862,21 +862,59 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) + ha->flt_region_boot_sec = start; + break; ++ case FLT_REG_AUX_IMG_PRI_28XX: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ ha->flt_region_aux_img_status_pri = start; ++ break; ++ case FLT_REG_AUX_IMG_SEC_28XX: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ ha->flt_region_aux_img_status_sec = start; ++ break; ++ case FLT_REG_NVRAM_SEC_28XX_0: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 0) ++ ha->flt_region_nvram_sec = start; ++ break; ++ case FLT_REG_NVRAM_SEC_28XX_1: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 1) ++ ha->flt_region_nvram_sec = start; ++ break; ++ case FLT_REG_NVRAM_SEC_28XX_2: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 2) ++ ha->flt_region_nvram_sec = start; ++ break; ++ case FLT_REG_NVRAM_SEC_28XX_3: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 3) ++ ha->flt_region_nvram_sec = start; ++ break; + case FLT_REG_VPD_SEC_27XX_0: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- ha->flt_region_vpd_sec = start; ++ case FLT_REG_VPD_SEC_28XX_0: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ ha->flt_region_vpd_nvram_sec = start; ++ if (ha->port_no == 0) ++ ha->flt_region_vpd_sec = start; ++ } + break; + case FLT_REG_VPD_SEC_27XX_1: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- ha->flt_region_vpd_sec = start; ++ case FLT_REG_VPD_SEC_28XX_1: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 1) ++ ha->flt_region_vpd_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_2: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- ha->flt_region_vpd_sec = start; ++ case FLT_REG_VPD_SEC_28XX_2: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 2) ++ ha->flt_region_vpd_sec = start; + break; + case FLT_REG_VPD_SEC_27XX_3: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- ha->flt_region_vpd_sec = start; ++ case FLT_REG_VPD_SEC_28XX_3: ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (ha->port_no == 3) ++ ha->flt_region_vpd_sec = start; + break; + } + } +@@ -3020,6 +3058,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + int i; + struct qla_hw_data *ha = vha->hw; + uint32_t faddr = 0; ++ struct active_regions active_regions = { }; + + if (IS_P3P_TYPE(ha)) + return ret; +@@ -3033,9 +3072,12 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + + pcihdr = ha->flt_region_boot << 2; +- if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && +- qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) +- pcihdr = ha->flt_region_boot_sec << 2; ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ qla27xx_get_active_image(vha, &active_regions); ++ if (active_regions.global == QLA27XX_SECONDARY_IMAGE) { ++ pcihdr = ha->flt_region_boot_sec << 2; ++ } ++ } + + do { + /* Verify PCI expansion ROM header. */ +@@ -3108,9 +3150,10 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + /* Read firmware image information. */ + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + faddr = ha->flt_region_fw; +- if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) && +- qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) +- faddr = ha->flt_region_fw_sec; ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ if (active_regions.global == QLA27XX_SECONDARY_IMAGE) ++ faddr = ha->flt_region_fw_sec; ++ } + + qla24xx_read_flash_data(vha, dcode, faddr, 8); + if (qla24xx_risc_firmware_invalid(dcode)) { +-- +2.13.6 + diff --git a/SOURCES/0041-scsi-scsi-qla2xxx-Secure-flash-update-support-for-IS.patch b/SOURCES/0041-scsi-scsi-qla2xxx-Secure-flash-update-support-for-IS.patch new file mode 100644 index 0000000..1e01b89 --- /dev/null +++ b/SOURCES/0041-scsi-scsi-qla2xxx-Secure-flash-update-support-for-IS.patch @@ -0,0 +1,1076 @@ +From 9131c473f0875bb592df04c7c5c7a3373c65465d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:01 -0400 +Subject: [PATCH 041/124] [scsi] scsi: qla2xxx: Secure flash update support for + ISP28XX + +Message-id: <20190801155618.12650-42-hmadhani@redhat.com> +Patchwork-id: 267827 +O-Subject: [RHEL 7.8 e-stor PATCH 041/118] scsi: qla2xxx: Secure flash update support for ISP28XX +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Michael Hernandez + +Bugzilla 1729270 + +This patch adds support for Secure flash update with ISP28xx. + +Signed-off-by: Michael Hernandez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 3f006ac342c033c795aa0ec2d0dde63975e2144b) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 be2699dc5b56..ead433fe0ff4 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -1043,6 +1043,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_UPDATE 0xa /* 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_EXTENDED 0xd /* Write RAM word extended */ +@@ -3145,10 +3146,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 *); +@@ -3634,6 +3635,8 @@ struct qla_hw_data { + uint32_t rida_fmt2:1; + uint32_t purge_mbox:1; + uint32_t n2n_bigger:1; ++ uint32_t secure_adapter:1; ++ uint32_t secure_fw:1; + } flags; + + uint16_t max_exchg; +@@ -3922,6 +3925,9 @@ struct qla_hw_data { + void *sfp_data; + dma_addr_t sfp_data_dma; + ++ void *flt; ++ dma_addr_t flt_dma; ++ + #define XGMAC_DATA_SIZE 4096 + void *xgmac_data; + dma_addr_t xgmac_data_dma; +@@ -4368,6 +4374,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 */ +@@ -4553,6 +4560,24 @@ struct qla2_sgx { + } \ + } + ++ ++#define SFUB_CHECKSUM_SIZE 4 ++ ++struct secure_flash_update_block { ++ uint32_t block_info; ++ uint32_t signature_lo; ++ uint32_t signature_hi; ++ uint32_t signature_upper[0x3e]; ++}; ++ ++struct secure_flash_update_block_pk { ++ uint32_t block_info; ++ uint32_t signature_lo; ++ uint32_t signature_hi; ++ uint32_t signature_upper[0x3e]; ++ uint32_t public_key[0x41]; ++}; ++ + /* + * Macros to help code, maintain, etc. + */ +@@ -4753,6 +4778,8 @@ struct sff_8247_a0 { + IS_QLA83XX(_vha->hw) || IS_QLA27XX(_vha->hw) || \ + IS_QLA28XX(_vha->hw))) + ++#define FLASH_SEMAPHORE_REGISTER_ADDR 0x00101016 ++ + #define SAVE_TOPO(_ha) { \ + if (_ha->current_topology) \ + _ha->prev_topology = _ha->current_topology; \ +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_SIZE 16 ++#define FLT_MAX_REGIONS 0xFF ++#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_UNLOCK 0 ++#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 d20801e01008..e271e24fce23 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -18,14 +18,14 @@ extern int qla2100_pci_config(struct scsi_qla_host *); + extern int qla2300_pci_config(struct scsi_qla_host *); + extern int qla24xx_pci_config(scsi_qla_host_t *); + extern int qla25xx_pci_config(scsi_qla_host_t *); +-extern void qla2x00_reset_chip(struct scsi_qla_host *); +-extern void qla24xx_reset_chip(struct scsi_qla_host *); ++extern int qla2x00_reset_chip(struct scsi_qla_host *); ++extern int qla24xx_reset_chip(struct scsi_qla_host *); + extern int qla2x00_chip_diag(struct scsi_qla_host *); + extern int qla24xx_chip_diag(struct scsi_qla_host *); + extern void qla2x00_config_rings(struct scsi_qla_host *); + extern void qla24xx_config_rings(struct scsi_qla_host *); +-extern void qla2x00_reset_adapter(struct scsi_qla_host *); +-extern void qla24xx_reset_adapter(struct scsi_qla_host *); ++extern int qla2x00_reset_adapter(struct scsi_qla_host *); ++extern int qla24xx_reset_adapter(struct scsi_qla_host *); + extern int qla2x00_nvram_config(struct scsi_qla_host *); + extern int qla24xx_nvram_config(struct scsi_qla_host *); + extern int qla81xx_nvram_config(struct scsi_qla_host *); +@@ -470,6 +470,8 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *, int); + extern int + qla81xx_fac_erase_sector(scsi_qla_host_t *, uint32_t, uint32_t); + ++extern int qla81xx_fac_semaphore_access(scsi_qla_host_t *, int); ++ + extern int + qla2x00_get_xgmac_stats(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t *); + +@@ -515,6 +517,14 @@ extern int qla27xx_get_zio_threshold(scsi_qla_host_t *, uint16_t *); + extern int qla27xx_set_zio_threshold(scsi_qla_host_t *, uint16_t); + int qla24xx_res_count_wait(struct scsi_qla_host *, uint16_t *, int); + ++extern int qla28xx_secure_flash_update(scsi_qla_host_t *, uint16_t, uint16_t, ++ uint32_t, dma_addr_t, uint32_t); ++ ++extern int qla2xxx_read_remote_register(scsi_qla_host_t *, uint32_t, ++ uint32_t *); ++extern int qla2xxx_write_remote_register(scsi_qla_host_t *, uint32_t, ++ uint32_t); ++ + /* + * Global Function Prototypes in qla_isr.c source file. + */ +@@ -720,7 +730,7 @@ extern void qla24xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); + /* qlafx00 related functions */ + extern int qlafx00_pci_config(struct scsi_qla_host *); + extern int qlafx00_initialize_adapter(struct scsi_qla_host *); +-extern void qlafx00_soft_reset(scsi_qla_host_t *); ++extern int qlafx00_soft_reset(scsi_qla_host_t *); + extern int qlafx00_chip_diag(scsi_qla_host_t *); + extern void qlafx00_config_rings(struct scsi_qla_host *); + extern char *qlafx00_pci_info_str(struct scsi_qla_host *, char *); +@@ -763,7 +773,7 @@ extern int qla82xx_pci_region_offset(struct pci_dev *, int); + extern int qla82xx_iospace_config(struct qla_hw_data *); + + /* Initialization related functions */ +-extern void qla82xx_reset_chip(struct scsi_qla_host *); ++extern int qla82xx_reset_chip(struct scsi_qla_host *); + extern void qla82xx_config_rings(struct scsi_qla_host *); + extern void qla82xx_watchdog(scsi_qla_host_t *); + extern int qla82xx_start_firmware(scsi_qla_host_t *); +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 4307556b933b..d4199cd560e2 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -2102,6 +2102,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha) + int rval; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = ha->req_q_map[0]; ++ struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; + + memset(&vha->qla_stats, 0, sizeof(vha->qla_stats)); + memset(&vha->fc_host_stat, 0, sizeof(vha->fc_host_stat)); +@@ -2136,6 +2137,15 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha) + + ha->isp_ops->reset_chip(vha); + ++ /* Check for secure flash support */ ++ if (IS_QLA28XX(ha)) { ++ if (RD_REG_DWORD(®->mailbox12) & BIT_0) { ++ ql_log(ql_log_info, vha, 0xffff, "Adapter is Secure\n"); ++ ha->flags.secure_adapter = 1; ++ } ++ } ++ ++ + rval = qla2xxx_get_flash_info(vha); + if (rval) { + ql_log(ql_log_fatal, vha, 0x004f, +@@ -2452,7 +2462,7 @@ qla2x00_isp_firmware(scsi_qla_host_t *vha) + * + * Returns 0 on success. + */ +-void ++int + qla2x00_reset_chip(scsi_qla_host_t *vha) + { + unsigned long flags = 0; +@@ -2460,9 +2470,10 @@ qla2x00_reset_chip(scsi_qla_host_t *vha) + struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; + uint32_t cnt; + uint16_t cmd; ++ int rval = QLA_FUNCTION_FAILED; + + if (unlikely(pci_channel_offline(ha->pdev))) +- return; ++ return rval; + + ha->isp_ops->disable_intrs(ha); + +@@ -2588,6 +2599,8 @@ qla2x00_reset_chip(scsi_qla_host_t *vha) + } + + spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return QLA_SUCCESS; + } + + /** +@@ -2828,14 +2841,15 @@ acquired: + * + * Returns 0 on success. + */ +-void ++int + qla24xx_reset_chip(scsi_qla_host_t *vha) + { + struct qla_hw_data *ha = vha->hw; ++ int rval = QLA_FUNCTION_FAILED; + + if (pci_channel_offline(ha->pdev) && + ha->flags.pci_channel_io_perm_failure) { +- return; ++ return rval; + } + + ha->isp_ops->disable_intrs(ha); +@@ -2843,7 +2857,9 @@ qla24xx_reset_chip(scsi_qla_host_t *vha) + qla25xx_manipulate_risc_semaphore(vha); + + /* Perform RISC reset. */ +- qla24xx_reset_risc(vha); ++ rval = qla24xx_reset_risc(vha); ++ ++ return rval; + } + + /** +@@ -6685,6 +6701,14 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) + if (vha->flags.online) { + qla2x00_abort_isp_cleanup(vha); + ++ if (test_and_clear_bit(ISP_ABORT_TO_ROM, &vha->dpc_flags)) { ++ ha->flags.chip_reset_done = 1; ++ vha->flags.online = 1; ++ status = 0; ++ clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags); ++ return status; ++ } ++ + if (IS_QLA8031(ha)) { + ql_dbg(ql_dbg_p3p, vha, 0xb05c, + "Clearing fcoe driver presence.\n"); +@@ -6925,7 +6949,7 @@ qla25xx_init_queues(struct qla_hw_data *ha) + * Input: + * ha = adapter block pointer. + */ +-void ++int + qla2x00_reset_adapter(scsi_qla_host_t *vha) + { + unsigned long flags = 0; +@@ -6941,17 +6965,20 @@ qla2x00_reset_adapter(scsi_qla_host_t *vha) + WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); + RD_REG_WORD(®->hccr); /* PCI Posting. */ + spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return QLA_SUCCESS; + } + +-void ++int + qla24xx_reset_adapter(scsi_qla_host_t *vha) + { + unsigned long flags = 0; + struct qla_hw_data *ha = vha->hw; + struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; ++ int rval = QLA_SUCCESS; + + if (IS_P3P_TYPE(ha)) +- return; ++ return rval; + + vha->flags.online = 0; + ha->isp_ops->disable_intrs(ha); +@@ -6965,6 +6992,8 @@ qla24xx_reset_adapter(scsi_qla_host_t *vha) + + if (IS_NOPOLLING_TYPE(ha)) + ha->isp_ops->enable_intrs(ha); ++ ++ return rval; + } + + /* On sparc systems, obtain port and node WWN from firmware +@@ -8202,7 +8231,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + if (IS_P3P_TYPE(ha) || IS_QLA8031(ha)) + ha->vpd_size = FA_VPD_SIZE_82XX; + +- if (IS_QLA28XX(ha)) ++ if (IS_QLA28XX(ha) || IS_QLA27XX(ha)) + qla28xx_get_aux_images(vha, &active_regions); + + /* Get VPD data into cache */ +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 4fa8b2b08768..2b2678e1b043 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -1145,6 +1145,13 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) + ha->fw_shared_ram_end = (mcp->mb[21] << 16) | mcp->mb[20]; + ha->fw_ddr_ram_start = (mcp->mb[23] << 16) | mcp->mb[22]; + ha->fw_ddr_ram_end = (mcp->mb[25] << 16) | mcp->mb[24]; ++ if (IS_QLA28XX(ha)) { ++ if (mcp->mb[16] & BIT_10) { ++ ql_log(ql_log_info, vha, 0xffff, ++ "FW support secure flash updates\n"); ++ ha->flags.secure_fw = 1; ++ } ++ } + } + + failed: +@@ -4596,6 +4603,42 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) + } + + int ++qla81xx_fac_semaphore_access(scsi_qla_host_t *vha, int lock) ++{ ++ int rval = QLA_SUCCESS; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ struct qla_hw_data *ha = vha->hw; ++ ++ if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ return rval; ++ ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2, ++ "Entered %s.\n", __func__); ++ ++ mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; ++ mcp->mb[1] = (lock ? FAC_OPT_CMD_LOCK_SEMAPHORE : ++ FAC_OPT_CMD_UNLOCK_SEMAPHORE); ++ mcp->out_mb = MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = MBX_TOV_SECONDS; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(vha, mcp); ++ ++ if (rval != QLA_SUCCESS) { ++ ql_dbg(ql_dbg_mbx, vha, 0x10e3, ++ "Failed=%x mb[0]=%x mb[1]=%x mb[2]=%x.\n", ++ rval, mcp->mb[0], mcp->mb[1], mcp->mb[2]); ++ } else { ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e4, ++ "Done %s.\n", __func__); ++ } ++ ++ return rval; ++} ++ ++int + qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha) + { + int rval = 0; +@@ -6534,3 +6577,101 @@ int qla24xx_res_count_wait(struct scsi_qla_host *vha, + done: + return rval; + } ++ ++int qla28xx_secure_flash_update(scsi_qla_host_t *vha, uint16_t opts, ++ uint16_t region, uint32_t len, dma_addr_t sfub_dma_addr, ++ uint32_t sfub_len) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ mcp->mb[0] = MBC_SECURE_FLASH_UPDATE; ++ mcp->mb[1] = opts; ++ mcp->mb[2] = region; ++ mcp->mb[3] = MSW(len); ++ mcp->mb[4] = LSW(len); ++ mcp->mb[5] = MSW(sfub_dma_addr); ++ mcp->mb[6] = LSW(sfub_dma_addr); ++ mcp->mb[7] = MSW(MSD(sfub_dma_addr)); ++ mcp->mb[8] = LSW(MSD(sfub_dma_addr)); ++ mcp->mb[9] = sfub_len; ++ mcp->out_mb = ++ MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ mcp->tov = MBX_TOV_SECONDS; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(vha, mcp); ++ ++ if (rval != QLA_SUCCESS) { ++ ql_dbg(ql_dbg_mbx, vha, 0xffff, "%s(%ld): failed rval 0x%x, %x %x %x", ++ __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1], ++ mcp->mb[2]); ++ } ++ ++ return rval; ++} ++ ++int qla2xxx_write_remote_register(scsi_qla_host_t *vha, uint32_t addr, ++ uint32_t data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e8, ++ "Entered %s.\n", __func__); ++ ++ mcp->mb[0] = MBC_WRITE_REMOTE_REG; ++ mcp->mb[1] = LSW(addr); ++ mcp->mb[2] = MSW(addr); ++ mcp->mb[3] = LSW(data); ++ mcp->mb[4] = MSW(data); ++ mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = MBX_TOV_SECONDS; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(vha, mcp); ++ ++ if (rval != QLA_SUCCESS) { ++ ql_dbg(ql_dbg_mbx, vha, 0x10e9, ++ "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); ++ } else { ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ea, ++ "Done %s.\n", __func__); ++ } ++ ++ return rval; ++} ++ ++int qla2xxx_read_remote_register(scsi_qla_host_t *vha, uint32_t addr, ++ uint32_t *data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e8, ++ "Entered %s.\n", __func__); ++ ++ mcp->mb[0] = MBC_READ_REMOTE_REG; ++ mcp->mb[1] = LSW(addr); ++ mcp->mb[2] = MSW(addr); ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = MBX_TOV_SECONDS; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(vha, mcp); ++ ++ *data = (uint32_t)((((uint32_t)mcp->mb[4]) << 16) | mcp->mb[3]); ++ ++ if (rval != QLA_SUCCESS) { ++ ql_dbg(ql_dbg_mbx, vha, 0x10e9, ++ "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); ++ } else { ++ ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ea, ++ "Done %s.\n", __func__); ++ } ++ ++ return rval; ++} +diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c +index 527d255999cd..a3464a76e0b4 100644 +--- a/drivers/scsi/qla2xxx/qla_mr.c ++++ b/drivers/scsi/qla2xxx/qla_mr.c +@@ -627,17 +627,20 @@ qlafx00_soc_cpu_reset(scsi_qla_host_t *vha) + * + * Returns 0 on success. + */ +-void ++int + qlafx00_soft_reset(scsi_qla_host_t *vha) + { + struct qla_hw_data *ha = vha->hw; ++ int rval = QLA_FUNCTION_FAILED; + + if (unlikely(pci_channel_offline(ha->pdev) && + ha->flags.pci_channel_io_perm_failure)) +- return; ++ return rval; + + ha->isp_ops->disable_intrs(ha); + qlafx00_soc_cpu_reset(vha); ++ ++ return QLA_SUCCESS; + } + + /** +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index ff624c06824e..687c4cb49ecb 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -1752,11 +1752,13 @@ qla82xx_pci_config(scsi_qla_host_t *vha) + * + * Returns 0 on success. + */ +-void ++int + qla82xx_reset_chip(scsi_qla_host_t *vha) + { + struct qla_hw_data *ha = vha->hw; + ha->isp_ops->disable_intrs(ha); ++ ++ return QLA_SUCCESS; + } + + void qla82xx_config_rings(struct scsi_qla_host *vha) +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 354977d41097..f5933550586d 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -41,7 +41,7 @@ static struct kmem_cache *ctx_cachep; + /* + * error level for logging + */ +-uint ql_errlev = ql_log_all; ++uint ql_errlev = 0x8001; + + static int ql2xenableclass2; + module_param(ql2xenableclass2, int, S_IRUGO|S_IRUSR); +@@ -4395,8 +4395,20 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, + goto fail_sfp_data; + } + ++ ha->flt = dma_alloc_coherent(&ha->pdev->dev, ++ sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE, &ha->flt_dma, ++ GFP_KERNEL); ++ if (!ha->flt) { ++ ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b, ++ "Unable to allocate memory for FLT.\n"); ++ goto fail_flt_buffer; ++ } ++ + return 0; + ++fail_flt_buffer: ++ dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ++ ha->sfp_data, ha->sfp_data_dma); + fail_sfp_data: + kfree(ha->loop_id_map); + fail_loop_id_map: +@@ -4805,6 +4817,10 @@ qla2x00_mem_free(struct qla_hw_data *ha) + dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ha->sfp_data, + ha->sfp_data_dma); + ++ if (ha->flt) ++ dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ++ ha->flt, ha->flt_dma); ++ + if (ha->ms_iocb) + dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); + +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index 8191f3599f79..ec14d10bff4c 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -634,7 +634,7 @@ end: + static void + qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + { +- const char *loc, *locations[] = { "DEF", "FLT" }; ++ const char *locations[] = { "DEF", "FLT" }, *loc = locations[1]; + const uint32_t def_fw[] = + { FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR_81 }; + const uint32_t def_boot[] = +@@ -664,20 +664,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + const uint32_t fcp_prio_cfg1[] = + { FA_FCP_PRIO1_ADDR, FA_FCP_PRIO1_ADDR_25, + 0 }; +- uint32_t def; +- uint16_t *wptr; +- uint16_t cnt, chksum; +- uint32_t start; +- struct qla_flt_header *flt; +- struct qla_flt_region *region; +- struct qla_hw_data *ha = vha->hw; +- struct req_que *req = ha->req_q_map[0]; + +- def = 0; +- if (IS_QLA25XX(ha)) +- def = 1; +- else if (IS_QLA81XX(ha)) +- def = 2; ++ struct qla_hw_data *ha = vha->hw; ++ uint32_t def = IS_QLA81XX(ha) ? 2 : IS_QLA25XX(ha) ? 1 : 0; ++ struct qla_flt_header *flt = (void *)ha->flt; ++ struct qla_flt_region *region = (void *)&flt[1]; ++ uint16_t *wptr, cnt, chksum; ++ uint32_t start; + + /* Assign FCP prio region since older adapters may not have FLT, or + FCP prio region in it's FLT. +@@ -686,12 +679,11 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + fcp_prio_cfg0[def] : fcp_prio_cfg1[def]; + + ha->flt_region_flt = flt_addr; +- wptr = (uint16_t *)req->ring; +- flt = (struct qla_flt_header *)req->ring; +- region = (struct qla_flt_region *)&flt[1]; +- ha->isp_ops->read_optrom(vha, (uint8_t *)req->ring, +- flt_addr << 2, OPTROM_BURST_SIZE); +- if (*wptr == cpu_to_le16(0xffff)) ++ wptr = (uint16_t *)ha->flt; ++ qla24xx_read_flash_data(vha, (void *)flt, flt_addr, ++ (sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE) >> 2); ++ ++ if (le16_to_cpu(*wptr) == 0xffff) + goto no_flash_data; + if (flt->version != cpu_to_le16(1)) { + ql_log(ql_log_warn, vha, 0x0047, +@@ -701,7 +693,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + goto no_flash_data; + } + +- cnt = (sizeof(struct qla_flt_header) + le16_to_cpu(flt->length)) >> 1; ++ cnt = (sizeof(*flt) + le16_to_cpu(flt->length)) / sizeof(*wptr); + for (chksum = 0; cnt--; wptr++) + chksum += le16_to_cpu(*wptr); + if (chksum) { +@@ -712,16 +704,18 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + goto no_flash_data; + } + +- loc = locations[1]; +- cnt = le16_to_cpu(flt->length) / sizeof(struct qla_flt_region); ++ cnt = le16_to_cpu(flt->length) / sizeof(*region); + for ( ; cnt; cnt--, region++) { + /* Store addresses as DWORD offsets. */ + start = le32_to_cpu(region->start) >> 2; + ql_dbg(ql_dbg_init, vha, 0x0049, + "FLT[%#x]: start=%#x end=%#x size=%#x.\n", +- le16_to_cpu(region->code), +- start, le32_to_cpu(region->end) >> 2, +- le32_to_cpu(region->size)); ++ le16_to_cpu(region->code), start, ++ le32_to_cpu(region->end) >> 2, ++ le32_to_cpu(region->size) >> 2); ++ if (region->attribute) ++ ql_log(ql_dbg_init, vha, 0xffff, ++ "Region %x is secure\n", region->code); + + switch (le16_to_cpu(region->code)) { + case FLT_REG_FCOE_FW: +@@ -2623,6 +2617,338 @@ qla24xx_read_optrom_data(struct scsi_qla_host *vha, void *buf, + return buf; + } + ++static int ++qla28xx_extract_sfub_and_verify(struct scsi_qla_host *vha, uint32_t *buf, ++ uint32_t len, uint32_t buf_size_without_sfub, uint8_t *sfub_buf) ++{ ++ uint32_t *p, check_sum = 0; ++ int i; ++ ++ p = buf + buf_size_without_sfub; ++ ++ /* Extract SFUB from end of file */ ++ memcpy(sfub_buf, (uint8_t *)p, ++ sizeof(struct secure_flash_update_block)); ++ ++ for (i = 0; i < (sizeof(struct secure_flash_update_block) >> 2); i++) ++ check_sum += p[i]; ++ ++ check_sum = (~check_sum) + 1; ++ ++ if (check_sum != p[i]) { ++ ql_log(ql_log_warn, vha, 0x7097, ++ "SFUB checksum failed, 0x%x, 0x%x\n", ++ check_sum, p[i]); ++ return QLA_COMMAND_ERROR; ++ } ++ ++ return QLA_SUCCESS; ++} ++ ++static int ++qla28xx_get_flash_region(struct scsi_qla_host *vha, uint32_t start, ++ struct qla_flt_region *region) ++{ ++ struct qla_hw_data *ha = vha->hw; ++ struct qla_flt_header *flt; ++ struct qla_flt_region *flt_reg; ++ uint16_t cnt; ++ int rval = QLA_FUNCTION_FAILED; ++ ++ if (!ha->flt) ++ return QLA_FUNCTION_FAILED; ++ ++ flt = (struct qla_flt_header *)ha->flt; ++ flt_reg = (struct qla_flt_region *)&flt[1]; ++ cnt = le16_to_cpu(flt->length) / sizeof(struct qla_flt_region); ++ ++ for (; cnt; cnt--, flt_reg++) { ++ if (flt_reg->start == start) { ++ memcpy((uint8_t *)region, flt_reg, ++ sizeof(struct qla_flt_region)); ++ rval = QLA_SUCCESS; ++ break; ++ } ++ } ++ ++ return rval; ++} ++ ++static int ++qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, ++ uint32_t dwords) ++{ ++ struct qla_hw_data *ha = vha->hw; ++ ulong liter; ++ ulong dburst = OPTROM_BURST_DWORDS; /* burst size in dwords */ ++ uint32_t sec_mask, rest_addr, fdata; ++ void *optrom = NULL; ++ dma_addr_t optrom_dma; ++ int rval; ++ struct secure_flash_update_block *sfub; ++ dma_addr_t sfub_dma; ++ uint32_t offset = faddr << 2; ++ uint32_t buf_size_without_sfub = 0; ++ struct qla_flt_region region; ++ bool reset_to_rom = false; ++ uint32_t risc_size, risc_attr = 0; ++ uint32_t *fw_array = NULL; ++ ++ /* Retrieve region info - must be a start address passed in */ ++ rval = qla28xx_get_flash_region(vha, offset, ®ion); ++ ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Invalid address %x - not a region start address\n", ++ offset); ++ goto done; ++ } ++ ++ /* Allocate dma buffer for burst write */ ++ optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, ++ &optrom_dma, GFP_KERNEL); ++ if (!optrom) { ++ ql_log(ql_log_warn, vha, 0x7095, ++ "Failed allocate burst (%x bytes)\n", OPTROM_BURST_SIZE); ++ rval = QLA_COMMAND_ERROR; ++ goto done; ++ } ++ ++ /* ++ * If adapter supports secure flash and region is secure ++ * extract secure flash update block (SFUB) and verify ++ */ ++ if (ha->flags.secure_adapter && region.attribute) { ++ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Region %x is secure\n", region.code); ++ ++ if (region.code == FLT_REG_FW || ++ region.code == FLT_REG_FW_SEC_27XX) { ++ fw_array = dwptr; ++ ++ /* 1st fw array */ ++ risc_size = be32_to_cpu(fw_array[3]); ++ risc_attr = be32_to_cpu(fw_array[9]); ++ ++ buf_size_without_sfub = risc_size; ++ fw_array += risc_size; ++ ++ /* 2nd fw array */ ++ risc_size = be32_to_cpu(fw_array[3]); ++ ++ buf_size_without_sfub += risc_size; ++ fw_array += risc_size; ++ ++ /* 1st dump template */ ++ risc_size = be32_to_cpu(fw_array[2]); ++ ++ /* skip header and ignore checksum */ ++ buf_size_without_sfub += risc_size; ++ fw_array += risc_size; ++ ++ if (risc_attr & BIT_9) { ++ /* 2nd dump template */ ++ risc_size = be32_to_cpu(fw_array[2]); ++ ++ /* skip header and ignore checksum */ ++ buf_size_without_sfub += risc_size; ++ fw_array += risc_size; ++ } ++ } else { ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Secure region %x not supported\n", ++ region.code); ++ rval = QLA_COMMAND_ERROR; ++ goto done; ++ } ++ ++ sfub = dma_alloc_coherent(&ha->pdev->dev, ++ sizeof(struct secure_flash_update_block), &sfub_dma, ++ GFP_KERNEL); ++ if (!sfub) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Unable to allocate memory for SFUB\n"); ++ rval = QLA_COMMAND_ERROR; ++ goto done; ++ } ++ ++ rval = qla28xx_extract_sfub_and_verify(vha, dwptr, dwords, ++ buf_size_without_sfub, (uint8_t *)sfub); ++ ++ if (rval != QLA_SUCCESS) ++ goto done; ++ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "SFUB extract and verify successful\n"); ++ } ++ ++ rest_addr = (ha->fdt_block_size >> 2) - 1; ++ sec_mask = ~rest_addr; ++ ++ /* Lock semaphore */ ++ rval = qla81xx_fac_semaphore_access(vha, FAC_SEMAPHORE_LOCK); ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Unable to lock flash semaphore."); ++ goto done; ++ } ++ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Unprotect flash...\n"); ++ rval = qla24xx_unprotect_flash(vha); ++ if (rval) { ++ qla81xx_fac_semaphore_access(vha, FAC_SEMAPHORE_UNLOCK); ++ ql_log(ql_log_warn, vha, 0x7096, "Failed unprotect flash\n"); ++ goto done; ++ } ++ ++ for (liter = 0; liter < dwords; liter++, faddr++) { ++ fdata = (faddr & sec_mask) << 2; ++ ++ /* If start of sector */ ++ if (!(faddr & rest_addr)) { ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Erase sector %#x...\n", faddr); ++ rval = qla24xx_erase_sector(vha, fdata); ++ if (rval) { ++ ql_dbg(ql_dbg_user, vha, 0x7007, ++ "Failed erase sector %#x\n", faddr); ++ goto write_protect; ++ } ++ } ++ } ++ ++ if (ha->flags.secure_adapter) { ++ /* ++ * If adapter supports secure flash but FW doesn't, ++ * disable write protect, release semaphore and reset ++ * chip to execute ROM code in order to update region securely ++ */ ++ if (!ha->flags.secure_fw) { ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Disable Write and Release Semaphore."); ++ rval = qla24xx_protect_flash(vha); ++ if (rval != QLA_SUCCESS) { ++ qla81xx_fac_semaphore_access(vha, ++ FAC_SEMAPHORE_UNLOCK); ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Unable to protect flash."); ++ goto done; ++ } ++ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Reset chip to ROM."); ++ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); ++ set_bit(ISP_ABORT_TO_ROM, &vha->dpc_flags); ++ qla2xxx_wake_dpc(vha); ++ rval = qla2x00_wait_for_chip_reset(vha); ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Unable to reset to ROM code."); ++ goto done; ++ } ++ reset_to_rom = true; ++ ha->flags.fac_supported = 0; ++ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Lock Semaphore"); ++ rval = qla2xxx_write_remote_register(vha, ++ FLASH_SEMAPHORE_REGISTER_ADDR, 0x00020002); ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Unable to lock flash semaphore."); ++ goto done; ++ } ++ ++ /* Unprotect flash */ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Enable Write."); ++ rval = qla2x00_write_ram_word(vha, 0x7ffd0101, 0); ++ if (rval) { ++ ql_log(ql_log_warn, vha, 0x7096, ++ "Failed unprotect flash\n"); ++ goto done; ++ } ++ } ++ ++ /* If region is secure, send Secure Flash MB Cmd */ ++ if (region.attribute && buf_size_without_sfub) { ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, ++ "Sending Secure Flash MB Cmd\n"); ++ rval = qla28xx_secure_flash_update(vha, 0, region.code, ++ buf_size_without_sfub, sfub_dma, ++ sizeof(struct secure_flash_update_block)); ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Secure Flash MB Cmd failed %x.", rval); ++ goto write_protect; ++ } ++ } ++ ++ } ++ ++ /* re-init flash offset */ ++ faddr = offset >> 2; ++ ++ for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { ++ fdata = (faddr & sec_mask) << 2; ++ ++ /* If smaller than a burst remaining */ ++ if (dwords - liter < dburst) ++ dburst = dwords - liter; ++ ++ /* Copy to dma buffer */ ++ memcpy(optrom, dwptr, dburst << 2); ++ ++ /* Burst write */ ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Write burst (%#lx dwords)...\n", dburst); ++ rval = qla2x00_load_ram(vha, optrom_dma, ++ flash_data_addr(ha, faddr), dburst); ++ if (rval != QLA_SUCCESS) { ++ ql_log(ql_log_warn, vha, 0x7097, ++ "Failed burst write at %x (%p/%#llx)...\n", ++ flash_data_addr(ha, faddr), optrom, ++ (u64)optrom_dma); ++ break; ++ } ++ ++ liter += dburst - 1; ++ faddr += dburst - 1; ++ dwptr += dburst - 1; ++ continue; ++ } ++ ++write_protect: ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, 0x7095, ++ "Protect flash...\n"); ++ rval = qla24xx_protect_flash(vha); ++ if (rval) { ++ qla81xx_fac_semaphore_access(vha, FAC_SEMAPHORE_UNLOCK); ++ ql_log(ql_log_warn, vha, 0x7099, ++ "Failed protect flash\n"); ++ } ++ ++ if (reset_to_rom == true) { ++ /* Schedule DPC to restart the RISC */ ++ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); ++ qla2xxx_wake_dpc(vha); ++ ++ rval = qla2x00_wait_for_hba_online(vha); ++ if (rval != QLA_SUCCESS) ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Adapter did not come out of reset\n"); ++ } ++ ++done: ++ if (optrom) ++ dma_free_coherent(&ha->pdev->dev, ++ OPTROM_BURST_SIZE, optrom, optrom_dma); ++ ++ return rval; ++} ++ + int + qla24xx_write_optrom_data(struct scsi_qla_host *vha, void *buf, + uint32_t offset, uint32_t length) +@@ -2635,8 +2961,12 @@ qla24xx_write_optrom_data(struct scsi_qla_host *vha, void *buf, + set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); + + /* Go with write. */ +- rval = qla24xx_write_flash_data(vha, buf, offset >> 2, +- length >> 2); ++ if (IS_QLA28XX(ha)) ++ rval = qla28xx_write_flash_data(vha, (uint32_t *)buf, ++ offset >> 2, length >> 2); ++ else ++ rval = qla24xx_write_flash_data(vha, (uint32_t *)buf, ++ offset >> 2, length >> 2); + + clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); + scsi_unblock_requests(vha->host); +@@ -3151,6 +3481,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf) + memset(ha->fw_revision, 0, sizeof(ha->fw_revision)); + faddr = ha->flt_region_fw; + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ qla27xx_get_active_image(vha, &active_regions); + if (active_regions.global == QLA27XX_SECONDARY_IMAGE) + faddr = ha->flt_region_fw_sec; + } +-- +2.13.6 + diff --git a/SOURCES/0042-scsi-scsi-qla2xxx-Fix-a-small-typo-in-qla_bsg.c.patch b/SOURCES/0042-scsi-scsi-qla2xxx-Fix-a-small-typo-in-qla_bsg.c.patch new file mode 100644 index 0000000..d6a816f --- /dev/null +++ b/SOURCES/0042-scsi-scsi-qla2xxx-Fix-a-small-typo-in-qla_bsg.c.patch @@ -0,0 +1,43 @@ +From f579d5ed5267b955f45fa439f1dc77a935fd44df Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:02 -0400 +Subject: [PATCH 042/124] [scsi] scsi: qla2xxx: Fix a small typo in qla_bsg.c + +Message-id: <20190801155618.12650-43-hmadhani@redhat.com> +Patchwork-id: 267852 +O-Subject: [RHEL 7.8 e-stor PATCH 042/118] scsi: qla2xxx: Fix a small typo in qla_bsg.c +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: "Milan P. Gandhi" + +Bugzilla 1729270 + +Fixed a typo for 'iiDMA' cmd in qla_bsg.c. + +Signed-off-by: Milan P. Gandhi +Signed-off-by: Martin K. Petersen +(cherry picked from commit 62439b4800419520bbb278beec2b6f06afa8b5ec) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_bsg.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index d7537675568b..4df08850825f 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1329,7 +1329,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) + + if (rval) { + ql_log(ql_log_warn, vha, 0x704c, +- "iIDMA cmd failed for %8phN -- " ++ "iiDMA cmd failed for %8phN -- " + "%04x %x %04x %04x.\n", fcport->port_name, + rval, fcport->fp_speed, mb[0], mb[1]); + rval = (DID_ERROR << 16); +-- +2.13.6 + diff --git a/SOURCES/0043-scsi-scsi-qla2xxx-Simplify-conditional-check-again.patch b/SOURCES/0043-scsi-scsi-qla2xxx-Simplify-conditional-check-again.patch new file mode 100644 index 0000000..29a9c43 --- /dev/null +++ b/SOURCES/0043-scsi-scsi-qla2xxx-Simplify-conditional-check-again.patch @@ -0,0 +1,60 @@ +From cf1eeb29f94b68e4ed8b82818aed297012d1b2dd Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:03 -0400 +Subject: [PATCH 043/124] [scsi] scsi: qla2xxx: Simplify conditional check + again + +Message-id: <20190801155618.12650-44-hmadhani@redhat.com> +Patchwork-id: 267819 +O-Subject: [RHEL 7.8 e-stor PATCH 043/118] scsi: qla2xxx: Simplify conditional check again +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Nathan Chancellor + +Bugzilla 1729270 + +Clang warns when it sees a logical not on the left side of a conditional +statement because it thinks the logical not should be applied to the whole +statement, not just the left side: + +drivers/scsi/qla2xxx/qla_nx.c:3703:7: warning: logical not is only +applied to the left hand side of this comparison +[-Wlogical-not-parentheses] + +This particular instance was already fixed by commit 0bfe7d3cae58 ("scsi: +qla2xxx: Simplify conditional check") upstream but it was reintroduced by +commit 3695310e37b4 ("scsi: qla2xxx: Update flash read/write routine") in +the 5.2/scsi-queue. + +Fixes: 3695310e37b4 ("scsi: qla2xxx: Update flash read/write routine") +Link: https://github.com/ClangBuiltLinux/linux/issues/80 +Signed-off-by: Nathan Chancellor +Reviewed-by: Nick Desaulniers +Signed-off-by: Martin K. Petersen +(cherry picked from commit 46333cebe77883ff38be59c3e7200c5a5145d6ee) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 687c4cb49ecb..5b407708c105 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -3695,8 +3695,8 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + /* Wait for pending cmds (physical and virtual) to complete */ +- if (!qla2x00_eh_wait_for_pending_commands(vha, 0, 0, +- WAIT_HOST) == QLA_SUCCESS) { ++ if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, ++ WAIT_HOST)) { + ql_dbg(ql_dbg_init, vha, 0x00b3, + "Done wait for " + "pending commands.\n"); +-- +2.13.6 + diff --git a/SOURCES/0044-scsi-scsi-qla2xxx-Set-the-SCSI-command-result-before.patch b/SOURCES/0044-scsi-scsi-qla2xxx-Set-the-SCSI-command-result-before.patch new file mode 100644 index 0000000..5cbb266 --- /dev/null +++ b/SOURCES/0044-scsi-scsi-qla2xxx-Set-the-SCSI-command-result-before.patch @@ -0,0 +1,58 @@ +From 3dc14fede0858b4a3ad5cf01e2c0411e9b4fa9b4 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:04 -0400 +Subject: [PATCH 044/124] [scsi] scsi: qla2xxx: Set the SCSI command result + before calling the command done + +Message-id: <20190801155618.12650-45-hmadhani@redhat.com> +Patchwork-id: 267820 +O-Subject: [RHEL 7.8 e-stor PATCH 044/118] scsi: qla2xxx: Set the SCSI command result before calling the command done +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch tries to address race condition between abort handler and +completion handler. When scsi command result is set by both abort and +completion handler, scsi_done() is only called after refcount on SRB +structure goes to zero. The abort handler sets this result prematurely even +when the refcount is non-zero value. Fix this by setting SCSI cmd->result +before scsi_done() is called. + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 740e29358e350077d18ee08700199e37b206edad) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index f5933550586d..03a760345a82 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -765,8 +765,6 @@ qla2x00_sp_compl(void *ptr, int res) + srb_t *sp = ptr; + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + +- cmd->result = res; +- + if (atomic_read(&sp->ref_count) == 0) { + ql_dbg(ql_dbg_io, sp->vha, 0x3015, + "SP reference-count to ZERO -- sp=%p cmd=%p.\n", +@@ -779,6 +777,7 @@ qla2x00_sp_compl(void *ptr, int res) + return; + + sp->free(sp); ++ cmd->result = res; + cmd->scsi_done(cmd); + } + +-- +2.13.6 + diff --git a/SOURCES/0045-scsi-scsi-qla2xxx-Set-the-qpair-in-SRB-to-NULL-when-.patch b/SOURCES/0045-scsi-scsi-qla2xxx-Set-the-qpair-in-SRB-to-NULL-when-.patch new file mode 100644 index 0000000..9597265 --- /dev/null +++ b/SOURCES/0045-scsi-scsi-qla2xxx-Set-the-qpair-in-SRB-to-NULL-when-.patch @@ -0,0 +1,45 @@ +From cf462e18838a8bf5cd1d450cc348d3252ca00b5c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:05 -0400 +Subject: [PATCH 045/124] [scsi] scsi: qla2xxx: Set the qpair in SRB to NULL + when SRB is released + +Message-id: <20190801155618.12650-46-hmadhani@redhat.com> +Patchwork-id: 267822 +O-Subject: [RHEL 7.8 e-stor PATCH 045/118] scsi: qla2xxx: Set the qpair in SRB to NULL when SRB is released +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch sets QPair pointer to NULL to prevent abort command racing ahead +of normal command completion handling during scsi_done call. + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ae6ccb0f8153fe9e3b9287a74aa9742ea212e89c) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_inline.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index e396dd14ab5f..98f544fe8788 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -240,6 +240,7 @@ done: + static inline void + qla2xxx_rel_qpair_sp(struct qla_qpair *qpair, srb_t *sp) + { ++ sp->qpair = NULL; + mempool_free(sp, qpair->srb_mempool); + QLA_QPAIR_MARK_NOT_BUSY(qpair); + } +-- +2.13.6 + diff --git a/SOURCES/0046-scsi-scsi-qla2xxx-Reset-the-FCF_ASYNC_-SENT-ACTIVE-f.patch b/SOURCES/0046-scsi-scsi-qla2xxx-Reset-the-FCF_ASYNC_-SENT-ACTIVE-f.patch new file mode 100644 index 0000000..03454dd --- /dev/null +++ b/SOURCES/0046-scsi-scsi-qla2xxx-Reset-the-FCF_ASYNC_-SENT-ACTIVE-f.patch @@ -0,0 +1,58 @@ +From eb69d415d6d05f0796e5636c69551c3744c36452 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:06 -0400 +Subject: [PATCH 046/124] [scsi] scsi: qla2xxx: Reset the + FCF_ASYNC_{SENT|ACTIVE} flags + +Message-id: <20190801155618.12650-47-hmadhani@redhat.com> +Patchwork-id: 267823 +O-Subject: [RHEL 7.8 e-stor PATCH 046/118] scsi: qla2xxx: Reset the FCF_ASYNC_{SENT|ACTIVE} flags +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +Driver maintains state machine for processing and completing switch +commands. This patch resets FCF_ASYNC_{SENT|ACTIVE} flag to indicate if the +previous command is active or sent, in order for next GPSC command to +advance the state machine. + +[mkp: commit desc typo] + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0257eda08e806b82ee1fc90ef73583b6f022845c) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 4864850d0844..34f8f39cdbe2 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3033,6 +3033,8 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + "Async done-%s res %x, WWPN %8phC \n", + sp->name, res, fcport->port_name); + ++ fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); ++ + if (res == QLA_FUNCTION_TIMEOUT) + return; + +@@ -4349,6 +4351,7 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport) + + done_free_sp: + sp->free(sp); ++ fcport->flags &= ~FCF_ASYNC_SENT; + done: + return rval; + } +-- +2.13.6 + diff --git a/SOURCES/0047-scsi-scsi-qla2xxx-Increase-the-max_sgl_segments-to-1.patch b/SOURCES/0047-scsi-scsi-qla2xxx-Increase-the-max_sgl_segments-to-1.patch new file mode 100644 index 0000000..76e99c3 --- /dev/null +++ b/SOURCES/0047-scsi-scsi-qla2xxx-Increase-the-max_sgl_segments-to-1.patch @@ -0,0 +1,49 @@ +From 73353cee67066aa4576c4d29cdd9efe9f97ebf6e Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:07 -0400 +Subject: [PATCH 047/124] [scsi] scsi: qla2xxx: Increase the max_sgl_segments + to 1024 + +Message-id: <20190801155618.12650-48-hmadhani@redhat.com> +Patchwork-id: 267824 +O-Subject: [RHEL 7.8 e-stor PATCH 047/118] scsi: qla2xxx: Increase the max_sgl_segments to 1024 +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch increases max_sgl_segments value from 128 to the maximum +supported which is 1024. Increasing max_sgl_segments will allow the driver +to support larger I/O sizes + +[mkp: commit desc tweak] + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 6b1f44466d9b3d7de04e4988a680f0e1a0850360) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 53496b1bafb6..c6522eb314a2 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -585,7 +585,7 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = { + .fcp_abort = qla_nvme_fcp_abort, + .poll_queue = qla_nvme_poll, + .max_hw_queues = 8, +- .max_sgl_segments = 128, ++ .max_sgl_segments = 1024, + .max_dif_sgl_segments = 64, + .dma_boundary = 0xFFFFFFFF, + .local_priv_sz = 8, +-- +2.13.6 + diff --git a/SOURCES/0048-scsi-scsi-qla2xxx-Disable-T10-DIF-feature-with-FC-NV.patch b/SOURCES/0048-scsi-scsi-qla2xxx-Disable-T10-DIF-feature-with-FC-NV.patch new file mode 100644 index 0000000..07f9ead --- /dev/null +++ b/SOURCES/0048-scsi-scsi-qla2xxx-Disable-T10-DIF-feature-with-FC-NV.patch @@ -0,0 +1,48 @@ +From c61f9649d320f191988627d73665c29e081fdf57 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:08 -0400 +Subject: [PATCH 048/124] [scsi] scsi: qla2xxx: Disable T10-DIF feature with + FC-NVMe during probe + +Message-id: <20190801155618.12650-49-hmadhani@redhat.com> +Patchwork-id: 267825 +O-Subject: [RHEL 7.8 e-stor PATCH 048/118] scsi: qla2xxx: Disable T10-DIF feature with FC-NVMe during probe +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +With FC-NVMe enabled, driver does not support T10 DIF/DIX. This patch +disables T10-PI information when ql2xnvmeenable is set. + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5da05a26b8305a625bc9d537671b981795b46dab) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 03a760345a82..42f964c7efe5 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -2973,6 +2973,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + /* This may fail but that's ok */ + pci_enable_pcie_error_reporting(pdev); + ++ /* Turn off T10-DIF when FC-NVMe is enabled */ ++ if (ql2xnvmeenable) ++ ql2xenabledif = 0; ++ + ha = kzalloc(sizeof(struct qla_hw_data), GFP_KERNEL); + if (!ha) { + ql_log_pci(ql_log_fatal, pdev, 0x0009, +-- +2.13.6 + diff --git a/SOURCES/0049-scsi-scsi-qla2xxx-Fix-incorrect-region-size-setting-.patch b/SOURCES/0049-scsi-scsi-qla2xxx-Fix-incorrect-region-size-setting-.patch new file mode 100644 index 0000000..049321a --- /dev/null +++ b/SOURCES/0049-scsi-scsi-qla2xxx-Fix-incorrect-region-size-setting-.patch @@ -0,0 +1,59 @@ +From f56241674fc137af2221a52cfa31326391a41626 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:09 -0400 +Subject: [PATCH 049/124] [scsi] scsi: qla2xxx: Fix incorrect region-size + setting in optrom SYSFS routines + +Message-id: <20190801155618.12650-50-hmadhani@redhat.com> +Patchwork-id: 267826 +O-Subject: [RHEL 7.8 e-stor PATCH 049/118] scsi: qla2xxx: Fix incorrect region-size setting in optrom SYSFS routines +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Andrew Vasquez + +Bugzilla 1729270 + +Commit e6f77540c067 ("scsi: qla2xxx: Fix an integer overflow in sysfs +code") incorrectly set 'optrom_region_size' to 'start+size', which can +overflow option-rom boundaries when 'start' is non-zero. Continue setting +optrom_region_size to the proper adjusted value of 'size'. + +Fixes: e6f77540c067 ("scsi: qla2xxx: Fix an integer overflow in sysfs code") +Cc: stable@vger.kernel.org +Signed-off-by: Andrew Vasquez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5cbdae10bf11f96e30b4d14de7b08c8b490e903c) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 14c19df8cb93..3903c68b4fe3 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -376,7 +376,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + } + + ha->optrom_region_start = start; +- ha->optrom_region_size = start + size; ++ ha->optrom_region_size = size; + + ha->optrom_state = QLA_SREADING; + ha->optrom_buffer = vmalloc(ha->optrom_region_size); +@@ -449,7 +449,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + } + + ha->optrom_region_start = start; +- ha->optrom_region_size = start + size; ++ ha->optrom_region_size = size; + + ha->optrom_state = QLA_SWRITING; + ha->optrom_buffer = vmalloc(ha->optrom_region_size); +-- +2.13.6 + diff --git a/SOURCES/0050-scsi-scsi-qla2xxx-Further-limit-FLASH-region-write-a.patch b/SOURCES/0050-scsi-scsi-qla2xxx-Further-limit-FLASH-region-write-a.patch new file mode 100644 index 0000000..b1b0bb9 --- /dev/null +++ b/SOURCES/0050-scsi-scsi-qla2xxx-Further-limit-FLASH-region-write-a.patch @@ -0,0 +1,61 @@ +From 068c56f1956b20bb1ca33b5ca48db07e32f0acc0 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:10 -0400 +Subject: [PATCH 050/124] [scsi] scsi: qla2xxx: Further limit FLASH region + write access from SysFS + +Message-id: <20190801155618.12650-51-hmadhani@redhat.com> +Patchwork-id: 267832 +O-Subject: [RHEL 7.8 e-stor PATCH 050/118] scsi: qla2xxx: Further limit FLASH region write access from SysFS +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Andrew Vasquez + +Bugzilla 1729270 + +Recent ISPs have larger and more complex flash-write semantics +(secure-access and signing). The BSG interfaces support these semantics for +all ISPs and is exclusively used by QLogic user-space tools. Limit +flash-write operations to ISPs <= 25xx. + +Signed-off-by: Andrew Vasquez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit e81d1bcbde06ad2b6413b1d75630a1a8c19175d0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 3903c68b4fe3..668454d701d0 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -430,6 +430,10 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + * 0x000000 -> 0x07ffff -- Boot code. + * 0x080000 -> 0x0fffff -- Firmware. + * 0x120000 -> 0x12ffff -- VPD and HBA parameters. ++ * ++ * > ISP25xx type boards: ++ * ++ * None -- should go through BSG. + */ + valid = 0; + if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0) +@@ -437,9 +441,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + else if (start == (ha->flt_region_boot * 4) || + start == (ha->flt_region_fw * 4)) + valid = 1; +- else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) +- || IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) +- || IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)) + valid = 1; + if (!valid) { + ql_log(ql_log_warn, vha, 0x7065, +-- +2.13.6 + diff --git a/SOURCES/0051-scsi-scsi-qla2xxx-Fix-fw-dump-corruption.patch b/SOURCES/0051-scsi-scsi-qla2xxx-Fix-fw-dump-corruption.patch new file mode 100644 index 0000000..1e1f282 --- /dev/null +++ b/SOURCES/0051-scsi-scsi-qla2xxx-Fix-fw-dump-corruption.patch @@ -0,0 +1,157 @@ +From 3a61f8d532aa7935db27ef327af18d886a38d63f Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:11 -0400 +Subject: [PATCH 051/124] [scsi] scsi: qla2xxx: Fix fw dump corruption + +Message-id: <20190801155618.12650-52-hmadhani@redhat.com> +Patchwork-id: 267828 +O-Subject: [RHEL 7.8 e-stor PATCH 051/118] scsi: qla2xxx: Fix fw dump corruption +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +If fw dump buffer size changes and there is an existing fw dump, then save +the old dump in the newly allocated buffer. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a4226ec3ef1214b0973abdba64db66e10f6b0a1c) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 84 +++++++++++++++++++++++++---------------- + 2 files changed, 53 insertions(+), 32 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index ead433fe0ff4..f2f388108dbf 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4053,6 +4053,7 @@ struct qla_hw_data { + } fwdt[2]; + struct qla2xxx_fw_dump *fw_dump; + uint32_t fw_dump_len; ++ u32 fw_dump_alloc_len; + bool fw_dumped; + bool fw_dump_mpi; + unsigned long fw_dump_cap_flags; +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index d4199cd560e2..3d06299ef65a 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3141,12 +3141,12 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) + !IS_QLA28XX(ha)) + mq_size = sizeof(struct qla2xxx_mq_chain); + /* +- * Allocate maximum buffer size for all queues. ++ * Allocate maximum buffer size for all queues - Q0. + * Resizing must be done at end-of-dump processing. + */ +- mq_size += ha->max_req_queues * ++ mq_size += (ha->max_req_queues - 1) * + (req->length * sizeof(request_t)); +- mq_size += ha->max_rsp_queues * ++ mq_size += (ha->max_rsp_queues - 1) * + (rsp->length * sizeof(response_t)); + } + if (ha->tgt.atio_ring) +@@ -3221,42 +3221,62 @@ try_eft: + ha->exlogin_size; + + allocate: +- if (!ha->fw_dump_len || dump_size != ha->fw_dump_len) { ++ if (!ha->fw_dump_len || dump_size > ha->fw_dump_alloc_len) { ++ ++ ql_dbg(ql_dbg_init, vha, 0x00c5, ++ "%s dump_size %d fw_dump_len %d fw_dump_alloc_len %d\n", ++ __func__, dump_size, ha->fw_dump_len, ++ ha->fw_dump_alloc_len); ++ + fw_dump = vmalloc(dump_size); + if (!fw_dump) { + ql_log(ql_log_warn, vha, 0x00c4, + "Unable to allocate (%d KB) for firmware dump.\n", + dump_size / 1024); + } else { +- if (ha->fw_dump) ++ if (ha->fw_dumped) { ++ memcpy(fw_dump, ha->fw_dump, ha->fw_dump_len); + vfree(ha->fw_dump); +- ha->fw_dump = fw_dump; +- +- ha->fw_dump_len = dump_size; +- ql_dbg(ql_dbg_init, vha, 0x00c5, +- "Allocated (%d KB) for firmware dump.\n", +- dump_size / 1024); +- +- if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) +- return; +- +- ha->fw_dump->signature[0] = 'Q'; +- ha->fw_dump->signature[1] = 'L'; +- ha->fw_dump->signature[2] = 'G'; +- ha->fw_dump->signature[3] = 'C'; +- ha->fw_dump->version = htonl(1); +- +- ha->fw_dump->fixed_size = htonl(fixed_size); +- ha->fw_dump->mem_size = htonl(mem_size); +- ha->fw_dump->req_q_size = htonl(req_q_size); +- ha->fw_dump->rsp_q_size = htonl(rsp_q_size); +- +- ha->fw_dump->eft_size = htonl(eft_size); +- ha->fw_dump->eft_addr_l = htonl(LSD(ha->eft_dma)); +- ha->fw_dump->eft_addr_h = htonl(MSD(ha->eft_dma)); +- +- ha->fw_dump->header_size = +- htonl(offsetof(struct qla2xxx_fw_dump, isp)); ++ ha->fw_dump = fw_dump; ++ ha->fw_dump_alloc_len = dump_size; ++ ql_dbg(ql_dbg_init, vha, 0x00c5, ++ "Re-Allocated (%d KB) and save firmware dump.\n", ++ dump_size / 1024); ++ } else { ++ if (ha->fw_dump) ++ vfree(ha->fw_dump); ++ ha->fw_dump = fw_dump; ++ ++ ha->fw_dump_len = ha->fw_dump_alloc_len = ++ dump_size; ++ ql_dbg(ql_dbg_init, vha, 0x00c5, ++ "Allocated (%d KB) for firmware dump.\n", ++ dump_size / 1024); ++ ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ return; ++ ++ ha->fw_dump->signature[0] = 'Q'; ++ ha->fw_dump->signature[1] = 'L'; ++ ha->fw_dump->signature[2] = 'G'; ++ ha->fw_dump->signature[3] = 'C'; ++ ha->fw_dump->version = htonl(1); ++ ++ ha->fw_dump->fixed_size = htonl(fixed_size); ++ ha->fw_dump->mem_size = htonl(mem_size); ++ ha->fw_dump->req_q_size = htonl(req_q_size); ++ ha->fw_dump->rsp_q_size = htonl(rsp_q_size); ++ ++ ha->fw_dump->eft_size = htonl(eft_size); ++ ha->fw_dump->eft_addr_l = ++ htonl(LSD(ha->eft_dma)); ++ ha->fw_dump->eft_addr_h = ++ htonl(MSD(ha->eft_dma)); ++ ++ ha->fw_dump->header_size = ++ htonl(offsetof ++ (struct qla2xxx_fw_dump, isp)); ++ } + } + } + } +-- +2.13.6 + diff --git a/SOURCES/0052-scsi-scsi-qla2xxx-Use-mutex-protection-during-qla2x0.patch b/SOURCES/0052-scsi-scsi-qla2xxx-Use-mutex-protection-during-qla2x0.patch new file mode 100644 index 0000000..08b8d7c --- /dev/null +++ b/SOURCES/0052-scsi-scsi-qla2xxx-Use-mutex-protection-during-qla2x0.patch @@ -0,0 +1,111 @@ +From 25f327a459d36581e4c739c17f88007df5371472 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:12 -0400 +Subject: [PATCH 052/124] [scsi] scsi: qla2xxx: Use mutex protection during + qla2x00_sysfs_read_fw_dump() + +Message-id: <20190801155618.12650-53-hmadhani@redhat.com> +Patchwork-id: 267830 +O-Subject: [RHEL 7.8 e-stor PATCH 052/118] scsi: qla2xxx: Use mutex protection during qla2x00_sysfs_read_fw_dump() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Add mutex protection to prevent driver from freeing the FW dump buffer +while the extraction is in progress. + +[mkp: commit desc] + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a6b95d1c71e9adef5ab5ba77c42a50d0b7b409d6) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 25 ++++++++++++++----------- + drivers/scsi/qla2xxx/qla_init.c | 6 +++++- + 2 files changed, 19 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 668454d701d0..cd866540c120 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -29,24 +29,27 @@ qla2x00_sysfs_read_fw_dump(struct file *filp, struct kobject *kobj, + if (!(ha->fw_dump_reading || ha->mctp_dump_reading)) + return 0; + ++ mutex_lock(&ha->optrom_mutex); + if (IS_P3P_TYPE(ha)) { + if (off < ha->md_template_size) { + rval = memory_read_from_buffer(buf, count, + &off, ha->md_tmplt_hdr, ha->md_template_size); +- return rval; ++ } else { ++ off -= ha->md_template_size; ++ rval = memory_read_from_buffer(buf, count, ++ &off, ha->md_dump, ha->md_dump_size); + } +- off -= ha->md_template_size; +- rval = memory_read_from_buffer(buf, count, +- &off, ha->md_dump, ha->md_dump_size); +- return rval; +- } else if (ha->mctp_dumped && ha->mctp_dump_reading) +- return memory_read_from_buffer(buf, count, &off, ha->mctp_dump, ++ } else if (ha->mctp_dumped && ha->mctp_dump_reading) { ++ rval = memory_read_from_buffer(buf, count, &off, ha->mctp_dump, + MCTP_DUMP_SIZE); +- else if (ha->fw_dump_reading) +- return memory_read_from_buffer(buf, count, &off, ha->fw_dump, ++ } else if (ha->fw_dump_reading) { ++ rval = memory_read_from_buffer(buf, count, &off, ha->fw_dump, + ha->fw_dump_len); +- else +- return 0; ++ } else { ++ rval = 0; ++ } ++ mutex_unlock(&ha->optrom_mutex); ++ return rval; + } + + static ssize_t +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 3d06299ef65a..9023e8790785 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3234,6 +3234,7 @@ allocate: + "Unable to allocate (%d KB) for firmware dump.\n", + dump_size / 1024); + } else { ++ mutex_lock(&ha->optrom_mutex); + if (ha->fw_dumped) { + memcpy(fw_dump, ha->fw_dump, ha->fw_dump_len); + vfree(ha->fw_dump); +@@ -3253,8 +3254,10 @@ allocate: + "Allocated (%d KB) for firmware dump.\n", + dump_size / 1024); + +- if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { ++ mutex_unlock(&ha->optrom_mutex); + return; ++ } + + ha->fw_dump->signature[0] = 'Q'; + ha->fw_dump->signature[1] = 'L'; +@@ -3277,6 +3280,7 @@ allocate: + htonl(offsetof + (struct qla2xxx_fw_dump, isp)); + } ++ mutex_unlock(&ha->optrom_mutex); + } + } + } +-- +2.13.6 + diff --git a/SOURCES/0053-scsi-scsi-qla2xxx-Cleanup-fcport-memory-to-prevent-l.patch b/SOURCES/0053-scsi-scsi-qla2xxx-Cleanup-fcport-memory-to-prevent-l.patch new file mode 100644 index 0000000..2bc9322 --- /dev/null +++ b/SOURCES/0053-scsi-scsi-qla2xxx-Cleanup-fcport-memory-to-prevent-l.patch @@ -0,0 +1,64 @@ +From 232cb29cd59ac769eed6b5c216f23f24961f9eab Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:13 -0400 +Subject: [PATCH 053/124] [scsi] scsi: qla2xxx: Cleanup fcport memory to + prevent leak + +Message-id: <20190801155618.12650-54-hmadhani@redhat.com> +Patchwork-id: 267829 +O-Subject: [RHEL 7.8 e-stor PATCH 053/118] scsi: qla2xxx: Cleanup fcport memory to prevent leak +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Clean up fcport list and loopid in one place and iterate through for loop. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ffbc64766683634d2c233519f2e70d2123580108) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 2 ++ + drivers/scsi/qla2xxx/qla_os.c | 7 ++----- + 2 files changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9023e8790785..eb9c4f8ee10f 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4835,6 +4835,8 @@ qla2x00_free_fcport(fc_port_t *fcport) + + fcport->ct_desc.ct_sns = NULL; + } ++ list_del(&fcport->list); ++ qla2x00_clear_loop_id(fcport); + kfree(fcport); + } + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 42f964c7efe5..64a523dff6be 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -3994,11 +3994,8 @@ void qla2x00_free_fcports(struct scsi_qla_host *vha) + { + fc_port_t *fcport, *tfcport; + +- list_for_each_entry_safe(fcport, tfcport, &vha->vp_fcports, list) { +- list_del(&fcport->list); +- qla2x00_clear_loop_id(fcport); +- kfree(fcport); +- } ++ list_for_each_entry_safe(fcport, tfcport, &vha->vp_fcports, list) ++ qla2x00_free_fcport(fcport); + } + + static inline void +-- +2.13.6 + diff --git a/SOURCES/0054-scsi-scsi-qla2xxx-Set-remote-port-devloss-timeout-to.patch b/SOURCES/0054-scsi-scsi-qla2xxx-Set-remote-port-devloss-timeout-to.patch new file mode 100644 index 0000000..bb27ef3 --- /dev/null +++ b/SOURCES/0054-scsi-scsi-qla2xxx-Set-remote-port-devloss-timeout-to.patch @@ -0,0 +1,78 @@ +From f0f1af81d3ee32fddd607b4f21c66997178c6b8c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:14 -0400 +Subject: [PATCH 054/124] [scsi] scsi: qla2xxx: Set remote port devloss timeout + to 0 + +Message-id: <20190801155618.12650-55-hmadhani@redhat.com> +Patchwork-id: 267831 +O-Subject: [RHEL 7.8 e-stor PATCH 054/118] scsi: qla2xxx: Set remote port devloss timeout to 0 +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch sets remote_port_devloss value to 0. This indicates to FC-NVMe +transport that driver is unloading and transport should not retry. + +Fixes: e476fe8af5ff ("scsi: qla2xxx: Fix unload when NVMe devices are configured") +Cc: stable@vger.kernel.org +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ffc81fc07efc94a04695a8c1d458a06aecaf9f30) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index c6522eb314a2..8d4624c9f75b 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -627,7 +627,6 @@ 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; +@@ -635,23 +634,19 @@ 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) { + ql_log(ql_log_info, fcport->vha, 0x2113, + "%s: fcport=%p\n", __func__, fcport); ++ nvme_fc_set_remoteport_devloss ++ (fcport->nvme_remote_port, 0); + init_completion(&fcport->nvme_del_done); +- nvme_fc_unregister_remoteport( +- fcport->nvme_remote_port); ++ if (nvme_fc_unregister_remoteport ++ (fcport->nvme_remote_port)) ++ ql_log(ql_log_info, fcport->vha, 0x2114, ++ "%s: Failed to unregister nvme_remote_port\n", ++ __func__); + wait_for_completion(&fcport->nvme_del_done); + break; + } +-- +2.13.6 + diff --git a/SOURCES/0055-scsi-scsi-qla2xxx-Cleanup-redundant-qla2x00_abort_al.patch b/SOURCES/0055-scsi-scsi-qla2xxx-Cleanup-redundant-qla2x00_abort_al.patch new file mode 100644 index 0000000..0b4c1c3 --- /dev/null +++ b/SOURCES/0055-scsi-scsi-qla2xxx-Cleanup-redundant-qla2x00_abort_al.patch @@ -0,0 +1,45 @@ +From 2229d93458e9e76a9b1bd6c978b16056629dab59 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:15 -0400 +Subject: [PATCH 055/124] [scsi] scsi: qla2xxx: Cleanup redundant + qla2x00_abort_all_cmds during unload + +Message-id: <20190801155618.12650-56-hmadhani@redhat.com> +Patchwork-id: 267834 +O-Subject: [RHEL 7.8 e-stor PATCH 055/118] scsi: qla2xxx: Cleanup redundant qla2x00_abort_all_cmds during unload +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Anil Gurumurthy + +Bugzilla 1729270 + +This patch removes redundant qla2x00_abort_all_cmds() during driver unload. + +Signed-off-by: Anil Gurumurthy +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit e39a6645d9ec3a9be6470adae1df0f924d1f0737) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 64a523dff6be..c440d5bffefe 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -3903,8 +3903,6 @@ qla2x00_remove_one(struct pci_dev *pdev) + + qla2x00_delete_all_vps(ha, base_vha); + +- qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); +- + qla2x00_dfs_remove(base_vha); + + qla84xx_put_chip(base_vha); +-- +2.13.6 + diff --git a/SOURCES/0056-scsi-scsi-qla2xxx-Fix-driver-unload-when-FC-NVMe-LUN.patch b/SOURCES/0056-scsi-scsi-qla2xxx-Fix-driver-unload-when-FC-NVMe-LUN.patch new file mode 100644 index 0000000..7c275c6 --- /dev/null +++ b/SOURCES/0056-scsi-scsi-qla2xxx-Fix-driver-unload-when-FC-NVMe-LUN.patch @@ -0,0 +1,98 @@ +From 970619c33d827965004346d7d3bb145d2a0cd664 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:16 -0400 +Subject: [PATCH 056/124] [scsi] scsi: qla2xxx: Fix driver unload when FC-NVMe + LUNs are connected + +Message-id: <20190801155618.12650-57-hmadhani@redhat.com> +Patchwork-id: 267837 +O-Subject: [RHEL 7.8 e-stor PATCH 056/118] scsi: qla2xxx: Fix driver unload when FC-NVMe LUNs are connected +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Giridhar Malavali + +Bugzilla 1729270 + +This patch allows driver to unload using "modprobe -r" when FC-NVMe LUNs +are connected. + +Signed-off-by: Giridhar Malavali +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit b2d1453a45aa8477b1d33ee94a7694146bb8b340) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 29 +++++++++++++++++++++++------ + drivers/scsi/qla2xxx/qla_os.c | 6 ++++-- + 2 files changed, 27 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 8d4624c9f75b..ae1aae52f59e 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -164,12 +164,13 @@ static void qla_nvme_sp_done(void *ptr, int res) + if (!atomic_dec_and_test(&sp->ref_count)) + return; + +- if (res == QLA_SUCCESS) +- fd->status = 0; +- else +- fd->status = NVME_SC_INTERNAL; +- +- fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; ++ if (res == QLA_SUCCESS) { ++ fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; ++ } else { ++ fd->rcv_rsplen = 0; ++ fd->transferred_length = 0; ++ } ++ fd->status = 0; + fd->done(fd); + qla2xxx_rel_qpair_sp(sp->qpair, sp); + +@@ -193,6 +194,22 @@ static void qla_nvme_abort_work(struct work_struct *work) + if (!ha->flags.fw_started && (fcport && fcport->deleted)) + return; + ++ if (ha->flags.host_shutting_down) { ++ ql_log(ql_log_info, sp->fcport->vha, 0xffff, ++ "%s Calling done on sp: %p, type: 0x%x, sp->ref_count: 0x%x\n", ++ __func__, sp, sp->type, atomic_read(&sp->ref_count)); ++ sp->done(sp, 0); ++ return; ++ } ++ ++ if (atomic_read(&sp->ref_count) == 0) { ++ WARN_ON(1); ++ ql_log(ql_log_info, fcport->vha, 0xffff, ++ "%s: command alredy aborted on sp: %p\n", ++ __func__, sp); ++ return; ++ } ++ + rval = ha->isp_ops->abort_command(sp); + + ql_dbg(ql_dbg_io, fcport->vha, 0x212b, +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index c440d5bffefe..1cf427cf1ffe 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -6835,8 +6835,10 @@ qla2x00_timer(scsi_qla_host_t *vha) + * FC-NVME + * see if the active AEN count has changed from what was last reported. + */ +- if (!vha->vp_idx && (atomic_read(&ha->nvme_active_aen_cnt) != +- ha->nvme_last_rptd_aen) && ha->zio_mode == QLA_ZIO_MODE_6) { ++ if (!vha->vp_idx && ++ (atomic_read(&ha->nvme_active_aen_cnt) != ha->nvme_last_rptd_aen) && ++ ha->zio_mode == QLA_ZIO_MODE_6 && ++ !ha->flags.host_shutting_down) { + ql_log(ql_log_info, vha, 0x3002, + "nvme: Sched: Set ZIO exchange threshold to %d.\n", + ha->nvme_last_rptd_aen); +-- +2.13.6 + diff --git a/SOURCES/0057-scsi-scsi-qla2xxx-Remove-useless-set-memory-to-zero-.patch b/SOURCES/0057-scsi-scsi-qla2xxx-Remove-useless-set-memory-to-zero-.patch new file mode 100644 index 0000000..cb4016c --- /dev/null +++ b/SOURCES/0057-scsi-scsi-qla2xxx-Remove-useless-set-memory-to-zero-.patch @@ -0,0 +1,44 @@ +From 0928805059bbbc09195920cd22bfa58ec797096c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:17 -0400 +Subject: [PATCH 057/124] [scsi] scsi: qla2xxx: Remove useless set memory to + zero use memset() + +Message-id: <20190801155618.12650-58-hmadhani@redhat.com> +Patchwork-id: 267833 +O-Subject: [RHEL 7.8 e-stor PATCH 057/118] scsi: qla2xxx: Remove useless set memory to zero use memset() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: YueHaibing + +Bugzilla 1729270 + +The memory return by kzalloc() has already be set to zero, so remove +useless memset(0). + +Signed-off-by: YueHaibing +Signed-off-by: Martin K. Petersen +(cherry picked from commit 25ea6b19db54a76879e388ff4dfd67be48890f0d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index eb9c4f8ee10f..69313bc7609a 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -8893,7 +8893,6 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, + "Failed to allocate memory for queue pair.\n"); + return NULL; + } +- memset(qpair, 0, sizeof(struct qla_qpair)); + + qpair->hw = vha->hw; + qpair->vha = vha; +-- +2.13.6 + diff --git a/SOURCES/0058-scsi-scsi-qla2xxx-fix-spelling-mistake-alredy-alread.patch b/SOURCES/0058-scsi-scsi-qla2xxx-fix-spelling-mistake-alredy-alread.patch new file mode 100644 index 0000000..1450933 --- /dev/null +++ b/SOURCES/0058-scsi-scsi-qla2xxx-fix-spelling-mistake-alredy-alread.patch @@ -0,0 +1,45 @@ +From fc9dacb4f1704d0652e9aaa971600c45af719d30 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:18 -0400 +Subject: [PATCH 058/124] [scsi] scsi: qla2xxx: fix spelling mistake "alredy" + -> "already" + +Message-id: <20190801155618.12650-59-hmadhani@redhat.com> +Patchwork-id: 267851 +O-Subject: [RHEL 7.8 e-stor PATCH 058/118] scsi: qla2xxx: fix spelling mistake "alredy" -> "already" +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Colin Ian King + +Bugzilla 1729270 + +There is a spelling mistake in a ql_log message. Fix it. + +Signed-off-by: Colin Ian King +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ef19af9c2852a39878d54f185a1b32b781719542) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index ae1aae52f59e..2e73b3ce52d1 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -205,7 +205,7 @@ static void qla_nvme_abort_work(struct work_struct *work) + if (atomic_read(&sp->ref_count) == 0) { + WARN_ON(1); + ql_log(ql_log_info, fcport->vha, 0xffff, +- "%s: command alredy aborted on sp: %p\n", ++ "%s: command already aborted on sp: %p\n", + __func__, sp); + return; + } +-- +2.13.6 + diff --git a/SOURCES/0059-scsi-scsi-qla2xxx-Remove-a-comment-that-refers-to-th.patch b/SOURCES/0059-scsi-scsi-qla2xxx-Remove-a-comment-that-refers-to-th.patch new file mode 100644 index 0000000..5766653 --- /dev/null +++ b/SOURCES/0059-scsi-scsi-qla2xxx-Remove-a-comment-that-refers-to-th.patch @@ -0,0 +1,49 @@ +From b3ef25d9a68911853a853a2a003765922bc2fa3d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:19 -0400 +Subject: [PATCH 059/124] [scsi] scsi: qla2xxx: Remove a comment that refers to + the SCSI host lock + +Message-id: <20190801155618.12650-60-hmadhani@redhat.com> +Patchwork-id: 267835 +O-Subject: [RHEL 7.8 e-stor PATCH 059/118] scsi: qla2xxx: Remove a comment that refers to the SCSI host lock +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since qla2xxx_queuecommand() no longer takes the SCSI host lock, remove a +comment that refers to the host lock. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit abe5706dcf47cfdf0b929fff727279614df3c263) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 1cf427cf1ffe..ebee824413c1 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -890,9 +890,6 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + cmd->scsi_done(cmd); + } + +-/* If we are SP1 here, we need to still take and release the host_lock as SP1 +- * does not have the changes necessary to avoid taking host->host_lock. +- */ + static int + qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) + { +-- +2.13.6 + diff --git a/SOURCES/0060-scsi-scsi-qla2xxx-Use-ARRAY_SIZE-in-the-definition-o.patch b/SOURCES/0060-scsi-scsi-qla2xxx-Use-ARRAY_SIZE-in-the-definition-o.patch new file mode 100644 index 0000000..fa4602a --- /dev/null +++ b/SOURCES/0060-scsi-scsi-qla2xxx-Use-ARRAY_SIZE-in-the-definition-o.patch @@ -0,0 +1,48 @@ +From 2923b237296b70c46a0091e25c920922bc053f8b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:20 -0400 +Subject: [PATCH 060/124] [scsi] scsi: qla2xxx: Use ARRAY_SIZE() in the + definition of QLA_LAST_SPEED + +Message-id: <20190801155618.12650-61-hmadhani@redhat.com> +Patchwork-id: 267845 +O-Subject: [RHEL 7.8 e-stor PATCH 060/118] scsi: qla2xxx: Use ARRAY_SIZE() in the definition of QLA_LAST_SPEED +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Make the code easier to read by avoiding to use a hard-coded constant. This +patch does not change any functionality. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit b0a1c5b5c38ad6ee813875a28472774474d72589) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_isr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 779753d0238a..bac8fcdf5356 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -365,7 +365,7 @@ qla2x00_get_link_speed_str(struct qla_hw_data *ha, uint16_t speed) + static const char *const link_speeds[] = { + "1", "2", "?", "4", "8", "16", "32", "10" + }; +-#define QLA_LAST_SPEED 7 ++#define QLA_LAST_SPEED (ARRAY_SIZE(link_speeds) - 1) + + if (IS_QLA2100(ha) || IS_QLA2200(ha)) + return link_speeds[0]; +-- +2.13.6 + diff --git a/SOURCES/0061-scsi-scsi-qla2xxx-Declare-local-symbols-static.patch b/SOURCES/0061-scsi-scsi-qla2xxx-Declare-local-symbols-static.patch new file mode 100644 index 0000000..42f7ed2 --- /dev/null +++ b/SOURCES/0061-scsi-scsi-qla2xxx-Declare-local-symbols-static.patch @@ -0,0 +1,54 @@ +From 7337ece0a50952c2788a36e62e1b8803e4cc519b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:21 -0400 +Subject: [PATCH 061/124] [scsi] scsi: qla2xxx: Declare local symbols static + +Message-id: <20190801155618.12650-62-hmadhani@redhat.com> +Patchwork-id: 267836 +O-Subject: [RHEL 7.8 e-stor PATCH 061/118] scsi: qla2xxx: Declare local symbols static +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +This patch avoids that sparse complains that a declaration is missing. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit b3ede8ea78e8f4c2377d89763e30b140b70f93c0) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index ebee824413c1..1c9aac36d6fe 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -284,14 +284,14 @@ MODULE_PARM_DESC(qla2xuseresexchforels, + "Reserve 1/2 of emergency exchanges for ELS.\n" + " 0 (default): disabled"); + +-int ql2xprotmask; ++static int ql2xprotmask; + module_param(ql2xprotmask, int, 0644); + MODULE_PARM_DESC(ql2xprotmask, + "Override DIF/DIX protection capabilities mask\n" + "Default is 0 which sets protection mask based on " + "capabilities reported by HBA firmware.\n"); + +-int ql2xprotguard; ++static int ql2xprotguard; + module_param(ql2xprotguard, int, 0644); + MODULE_PARM_DESC(ql2xprotguard, "Override choice of DIX checksum\n" + " 0 -- Let HBA firmware decide\n" +-- +2.13.6 + diff --git a/SOURCES/0062-scsi-scsi-qla2xxx-Make-qla2x00_process_response_queu.patch b/SOURCES/0062-scsi-scsi-qla2xxx-Make-qla2x00_process_response_queu.patch new file mode 100644 index 0000000..9a0b36a --- /dev/null +++ b/SOURCES/0062-scsi-scsi-qla2xxx-Make-qla2x00_process_response_queu.patch @@ -0,0 +1,145 @@ +From f9c796c0dde3f8a4d20562572d77b22e64c21197 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:22 -0400 +Subject: [PATCH 062/124] [scsi] scsi: qla2xxx: Make + qla2x00_process_response_queue() easier to read + +Message-id: <20190801155618.12650-63-hmadhani@redhat.com> +Patchwork-id: 267840 +O-Subject: [RHEL 7.8 e-stor PATCH 062/118] scsi: qla2xxx: Make qla2x00_process_response_queue() easier to read +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Make qla2x00_process_response_queue() easier to read by splitting this +function. This patch does not change any functionality. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 7b006b9755ac099f0e5b414425534353f620d585) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_isr.c | 85 +++++++++++++++++++++++------------------- + 1 file changed, 47 insertions(+), 38 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index bac8fcdf5356..4c2f21d6735b 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1971,6 +1971,52 @@ static void qla_ctrlvp_completed(scsi_qla_host_t *vha, struct req_que *req, + sp->done(sp, rval); + } + ++/* Process a single response queue entry. */ ++static void qla2x00_process_response_entry(struct scsi_qla_host *vha, ++ struct rsp_que *rsp, ++ sts_entry_t *pkt) ++{ ++ sts21_entry_t *sts21_entry; ++ sts22_entry_t *sts22_entry; ++ uint16_t handle_cnt; ++ uint16_t cnt; ++ ++ switch (pkt->entry_type) { ++ case STATUS_TYPE: ++ qla2x00_status_entry(vha, rsp, pkt); ++ break; ++ case STATUS_TYPE_21: ++ sts21_entry = (sts21_entry_t *)pkt; ++ handle_cnt = sts21_entry->handle_count; ++ for (cnt = 0; cnt < handle_cnt; cnt++) ++ qla2x00_process_completed_request(vha, rsp->req, ++ sts21_entry->handle[cnt]); ++ break; ++ case STATUS_TYPE_22: ++ sts22_entry = (sts22_entry_t *)pkt; ++ handle_cnt = sts22_entry->handle_count; ++ for (cnt = 0; cnt < handle_cnt; cnt++) ++ qla2x00_process_completed_request(vha, rsp->req, ++ sts22_entry->handle[cnt]); ++ break; ++ case STATUS_CONT_TYPE: ++ qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt); ++ break; ++ case MBX_IOCB_TYPE: ++ qla2x00_mbx_iocb_entry(vha, rsp->req, (struct mbx_entry *)pkt); ++ break; ++ case CT_IOCB_TYPE: ++ qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE); ++ break; ++ default: ++ /* Type Not Supported. */ ++ ql_log(ql_log_warn, vha, 0x504a, ++ "Received unknown response pkt type %x entry status=%x.\n", ++ pkt->entry_type, pkt->entry_status); ++ break; ++ } ++} ++ + /** + * qla2x00_process_response_queue() - Process response queue entries. + * @rsp: response queue +@@ -1982,8 +2028,6 @@ qla2x00_process_response_queue(struct rsp_que *rsp) + struct qla_hw_data *ha = rsp->hw; + struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; + sts_entry_t *pkt; +- uint16_t handle_cnt; +- uint16_t cnt; + + vha = pci_get_drvdata(ha->pdev); + +@@ -2008,42 +2052,7 @@ qla2x00_process_response_queue(struct rsp_que *rsp) + continue; + } + +- switch (pkt->entry_type) { +- case STATUS_TYPE: +- qla2x00_status_entry(vha, rsp, pkt); +- break; +- case STATUS_TYPE_21: +- handle_cnt = ((sts21_entry_t *)pkt)->handle_count; +- for (cnt = 0; cnt < handle_cnt; cnt++) { +- qla2x00_process_completed_request(vha, rsp->req, +- ((sts21_entry_t *)pkt)->handle[cnt]); +- } +- break; +- case STATUS_TYPE_22: +- handle_cnt = ((sts22_entry_t *)pkt)->handle_count; +- for (cnt = 0; cnt < handle_cnt; cnt++) { +- qla2x00_process_completed_request(vha, rsp->req, +- ((sts22_entry_t *)pkt)->handle[cnt]); +- } +- break; +- case STATUS_CONT_TYPE: +- qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt); +- break; +- case MBX_IOCB_TYPE: +- qla2x00_mbx_iocb_entry(vha, rsp->req, +- (struct mbx_entry *)pkt); +- break; +- case CT_IOCB_TYPE: +- qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE); +- break; +- default: +- /* Type Not Supported. */ +- ql_log(ql_log_warn, vha, 0x504a, +- "Received unknown response pkt type %x " +- "entry status=%x.\n", +- pkt->entry_type, pkt->entry_status); +- break; +- } ++ qla2x00_process_response_entry(vha, rsp, pkt); + ((response_t *)pkt)->signature = RESPONSE_PROCESSED; + wmb(); + } +-- +2.13.6 + diff --git a/SOURCES/0063-scsi-scsi-qla2xxx-Use-get-put_unaligned-where-approp.patch b/SOURCES/0063-scsi-scsi-qla2xxx-Use-get-put_unaligned-where-approp.patch new file mode 100644 index 0000000..9620335 --- /dev/null +++ b/SOURCES/0063-scsi-scsi-qla2xxx-Use-get-put_unaligned-where-approp.patch @@ -0,0 +1,145 @@ +From 0bc0a78cd7b22c81ddc6375166404589d50c8ce7 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:23 -0400 +Subject: [PATCH 063/124] [scsi] scsi: qla2xxx: Use get/put_unaligned where + appropriate + +Message-id: <20190801155618.12650-64-hmadhani@redhat.com> +Patchwork-id: 267839 +O-Subject: [RHEL 7.8 e-stor PATCH 063/118] scsi: qla2xxx: Use get/put_unaligned where appropriate +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +This patch makes the code easier to read but does not change any +functionality. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2c26348c4d090caeb308530ea893b37897e4a58d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_bsg.c | 2 +- + drivers/scsi/qla2xxx/qla_iocb.c | 21 +++++++++------------ + drivers/scsi/qla2xxx/qla_nvme.c | 4 ++-- + 3 files changed, 12 insertions(+), 15 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index 4df08850825f..7f9acc8cfbe2 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1025,7 +1025,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) + } + + flag = bsg_job->request->rqst_data.h_vendor.vendor_cmd[1]; +- fw_ver = le32_to_cpu(*((uint32_t *)((uint32_t *)fw_buf + 2))); ++ fw_ver = get_unaligned_le32((uint32_t *)fw_buf + 2); + + mn->entry_type = VERIFY_CHIP_IOCB_TYPE; + mn->entry_count = 1; +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index ec06bdc606f7..47558faacb4f 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -107,7 +107,7 @@ qla2x00_prep_cont_type0_iocb(struct scsi_qla_host *vha) + cont_pkt = (cont_entry_t *)req->ring_ptr; + + /* Load packet defaults. */ +- *((uint32_t *)(&cont_pkt->entry_type)) = cpu_to_le32(CONTINUE_TYPE); ++ put_unaligned_le32(CONTINUE_TYPE, &cont_pkt->entry_type); + + return (cont_pkt); + } +@@ -136,9 +136,8 @@ qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req) + cont_pkt = (cont_a64_entry_t *)req->ring_ptr; + + /* Load packet defaults. */ +- *((uint32_t *)(&cont_pkt->entry_type)) = IS_QLAFX00(vha->hw) ? +- cpu_to_le32(CONTINUE_A64_TYPE_FX00) : +- cpu_to_le32(CONTINUE_A64_TYPE); ++ put_unaligned_le32(IS_QLAFX00(vha->hw) ? CONTINUE_A64_TYPE_FX00 : ++ CONTINUE_A64_TYPE, &cont_pkt->entry_type); + + return (cont_pkt); + } +@@ -202,8 +201,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt, + cmd = GET_CMD_SP(sp); + + /* Update entry type to indicate Command Type 2 IOCB */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = +- cpu_to_le32(COMMAND_TYPE); ++ put_unaligned_le32(COMMAND_TYPE, &cmd_pkt->entry_type); + + /* No data transfer */ + if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { +@@ -260,7 +258,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, + cmd = GET_CMD_SP(sp); + + /* Update entry type to indicate Command Type 3 IOCB */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = cpu_to_le32(COMMAND_A64_TYPE); ++ put_unaligned_le32(COMMAND_A64_TYPE, &cmd_pkt->entry_type); + + /* No data transfer */ + if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { +@@ -597,7 +595,7 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt, + cmd = GET_CMD_SP(sp); + + /* Update entry type to indicate Command Type 3 IOCB */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = cpu_to_le32(COMMAND_TYPE_6); ++ put_unaligned_le32(COMMAND_TYPE_6, &cmd_pkt->entry_type); + + /* No data transfer */ + if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { +@@ -712,7 +710,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, + cmd = GET_CMD_SP(sp); + + /* Update entry type to indicate Command Type 3 IOCB */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = cpu_to_le32(COMMAND_TYPE_7); ++ put_unaligned_le32(COMMAND_TYPE_7, &cmd_pkt->entry_type); + + /* No data transfer */ + if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { +@@ -1435,7 +1433,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, + cmd = GET_CMD_SP(sp); + + /* Update entry type to indicate Command Type CRC_2 IOCB */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = cpu_to_le32(COMMAND_TYPE_CRC_2); ++ put_unaligned_le32(COMMAND_TYPE_CRC_2, &cmd_pkt->entry_type); + + vha = sp->vha; + ha = vha->hw; +@@ -3818,8 +3816,7 @@ qla25xx_build_bidir_iocb(srb_t *sp, struct scsi_qla_host *vha, + struct fc_bsg_job *bsg_job = sp->u.bsg_job; + + /*Update entry type to indicate bidir command */ +- *((uint32_t *)(&cmd_pkt->entry_type)) = +- cpu_to_le32(COMMAND_BIDIRECTIONAL); ++ put_unaligned_le32(COMMAND_BIDIRECTIONAL, &cmd_pkt->entry_type); + + /* Set the transfer direction, in this set both flags + * Also set the BD_WRAP_BACK flag, firmware will take care +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 2e73b3ce52d1..cbde02279838 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -460,8 +460,8 @@ static inline int qla2x00_start_nvme_mq(srb_t *sp) + req->ring_ptr++; + } + cont_pkt = (cont_a64_entry_t *)req->ring_ptr; +- *((uint32_t *)(&cont_pkt->entry_type)) = +- cpu_to_le32(CONTINUE_A64_TYPE); ++ put_unaligned_le32(CONTINUE_A64_TYPE, ++ &cont_pkt->entry_type); + + cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; + avail_dsds = 5; +-- +2.13.6 + diff --git a/SOURCES/0064-scsi-scsi-qla2xxx-Unregister-chrdev-if-module-initia.patch b/SOURCES/0064-scsi-scsi-qla2xxx-Unregister-chrdev-if-module-initia.patch new file mode 100644 index 0000000..a690f42 --- /dev/null +++ b/SOURCES/0064-scsi-scsi-qla2xxx-Unregister-chrdev-if-module-initia.patch @@ -0,0 +1,110 @@ +From 7f6f2106d0ef1540327b703cf5f6c1a178aa3dbb Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:24 -0400 +Subject: [PATCH 064/124] [scsi] scsi: qla2xxx: Unregister chrdev if module + initialization fails + +Message-id: <20190801155618.12650-65-hmadhani@redhat.com> +Patchwork-id: 267838 +O-Subject: [RHEL 7.8 e-stor PATCH 064/118] scsi: qla2xxx: Unregister chrdev if module initialization fails +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +If module initialization fails after the character device has been +registered, unregister the character device. Additionally, avoid +duplicating error path code. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Fixes: 6a03b4cd78f3 ("[SCSI] qla2xxx: Add char device to increase driver use count") # v2.6.35. +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit c794d24ec9eb6658909955772e70f34bef5b5b91) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 34 +++++++++++++++++++++------------- + 1 file changed, 21 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 1c9aac36d6fe..03d7d0af1f98 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -7366,8 +7366,7 @@ qla2x00_module_init(void) + /* Initialize target kmem_cache and mem_pools */ + ret = qlt_init(); + if (ret < 0) { +- kmem_cache_destroy(srb_cachep); +- return ret; ++ goto destroy_cache; + } else if (ret > 0) { + /* + * If initiator mode is explictly disabled by qlt_init(), +@@ -7391,11 +7390,10 @@ qla2x00_module_init(void) + qla2xxx_transport_template = + fc_attach_transport(&qla2xxx_transport_functions); + if (!qla2xxx_transport_template) { +- kmem_cache_destroy(srb_cachep); + ql_log(ql_log_fatal, NULL, 0x0002, + "fc_attach_transport failed...Failing load!.\n"); +- qlt_exit(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto qlt_exit; + } + + apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); +@@ -7407,27 +7405,37 @@ qla2x00_module_init(void) + qla2xxx_transport_vport_template = + fc_attach_transport(&qla2xxx_transport_vport_functions); + if (!qla2xxx_transport_vport_template) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); + ql_log(ql_log_fatal, NULL, 0x0004, + "fc_attach_transport vport failed...Failing load!.\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto unreg_chrdev; + } + ql_log(ql_log_info, NULL, 0x0005, + "QLogic Fibre Channel HBA Driver: %s.\n", + qla2x00_version_str); + ret = pci_register_driver(&qla2xxx_pci_driver); + if (ret) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); +- fc_release_transport(qla2xxx_transport_vport_template); + ql_log(ql_log_fatal, NULL, 0x0006, + "pci_register_driver failed...ret=%d Failing load!.\n", + ret); ++ goto release_vport_transport; + } + return ret; ++ ++release_vport_transport: ++ fc_release_transport(qla2xxx_transport_vport_template); ++ ++unreg_chrdev: ++ if (apidev_major >= 0) ++ unregister_chrdev(apidev_major, QLA2XXX_APIDEV); ++ fc_release_transport(qla2xxx_transport_template); ++ ++qlt_exit: ++ qlt_exit(); ++ ++destroy_cache: ++ kmem_cache_destroy(srb_cachep); ++ return ret; + } + + /** +-- +2.13.6 + diff --git a/SOURCES/0065-scsi-scsi-tcm_qla2xxx-Minimize-include-directives.patch b/SOURCES/0065-scsi-scsi-tcm_qla2xxx-Minimize-include-directives.patch new file mode 100644 index 0000000..1a92a51 --- /dev/null +++ b/SOURCES/0065-scsi-scsi-tcm_qla2xxx-Minimize-include-directives.patch @@ -0,0 +1,64 @@ +From 433d4c88b35c7dd25f7d683eabb7991470ec4ac3 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:25 -0400 +Subject: [PATCH 065/124] [scsi] scsi: tcm_qla2xxx: Minimize #include + directives + +Message-id: <20190801155618.12650-66-hmadhani@redhat.com> +Patchwork-id: 267847 +O-Subject: [RHEL 7.8 e-stor PATCH 065/118] scsi: tcm_qla2xxx: Minimize #include directives +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Only include those header files that are needed by the code in this source +file. + +[mkp: include build fix from Bart for SPARC] + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit c8538b0b9ed65eb22849217fd397d614a42216e7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +index 27fbaede49a4..4339cdcc3cb8 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -27,22 +27,16 @@ + + + #include +-#include + #include + #include +-#include + #include + #include +-#include + #include + #include + #include + #include + #include +-#include + #include +-#include +-#include + #include + #include + +-- +2.13.6 + diff --git a/SOURCES/0066-scsi-scsi-qla2xxx-Fix-FC-AL-connection-target-discov.patch b/SOURCES/0066-scsi-scsi-qla2xxx-Fix-FC-AL-connection-target-discov.patch new file mode 100644 index 0000000..13bc18a --- /dev/null +++ b/SOURCES/0066-scsi-scsi-qla2xxx-Fix-FC-AL-connection-target-discov.patch @@ -0,0 +1,56 @@ +From 9ecc82160dbbb167dbb900f3351b7d6137591289 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:26 -0400 +Subject: [PATCH 066/124] [scsi] scsi: qla2xxx: Fix FC-AL connection target + discovery + +Message-id: <20190801155618.12650-67-hmadhani@redhat.com> +Patchwork-id: 267841 +O-Subject: [RHEL 7.8 e-stor PATCH 066/118] scsi: qla2xxx: Fix FC-AL connection target discovery +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Commit 7f147f9bfd44 ("scsi: qla2xxx: Fix N2N target discovery with Local +loop") 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: stable@vger.kernel.org # 5.0+ +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Reviewed-by: Ewan D. Milne +Signed-off-by: Martin K. Petersen +(cherry picked from commit 4705f10e82c63924bd84a9b31d15839ec9ba3d06) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 69313bc7609a..5bf6f02ba147 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -5086,6 +5086,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.13.6 + diff --git a/SOURCES/0067-scsi-scsi-qla2xxx-Use-tabs-to-indent-code.patch b/SOURCES/0067-scsi-scsi-qla2xxx-Use-tabs-to-indent-code.patch new file mode 100644 index 0000000..70f96d7 --- /dev/null +++ b/SOURCES/0067-scsi-scsi-qla2xxx-Use-tabs-to-indent-code.patch @@ -0,0 +1,108 @@ +From 16f649d15fe967cad88e5ef40fe3d744cbbd99bf Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:27 -0400 +Subject: [PATCH 067/124] [scsi] scsi: qla2xxx: Use tabs to indent code + +Message-id: <20190801155618.12650-68-hmadhani@redhat.com> +Patchwork-id: 267842 +O-Subject: [RHEL 7.8 e-stor PATCH 067/118] scsi: qla2xxx: Use tabs to indent code +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Most but not all code in the qla2xxx driver uses tabs for indentation. +Make the qla2xxx code easier to read by using tabs consistently for +indentation. This patch improves conformance with the Linux kernel coding +style. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2703eaaf4eae64a742fdcf888c8fcf4de567fb7d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 30 +++++++++++++++--------------- + drivers/scsi/qla2xxx/qla_iocb.c | 12 ++++++------ + 2 files changed, 21 insertions(+), 21 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 5bf6f02ba147..88a77c4b2f13 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1620,21 +1620,21 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea) + */ + void qla_rscn_replay(fc_port_t *fcport) + { +- struct event_arg ea; +- +- switch (fcport->disc_state) { +- case DSC_DELETE_PEND: +- return; +- default: +- break; +- } +- +- if (fcport->scan_needed) { +- memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_RSCN; +- ea.id = fcport->d_id; +- ea.id.b.rsvd_1 = RSCN_PORT_ADDR; +- qla2x00_fcport_event_handler(fcport->vha, &ea); ++ struct event_arg ea; ++ ++ switch (fcport->disc_state) { ++ case DSC_DELETE_PEND: ++ return; ++ default: ++ break; ++ } ++ ++ if (fcport->scan_needed) { ++ memset(&ea, 0, sizeof(ea)); ++ ea.event = FCME_RSCN; ++ ea.id = fcport->d_id; ++ ea.id.b.rsvd_1 = RSCN_PORT_ADDR; ++ qla2x00_fcport_event_handler(fcport->vha, &ea); + } + } + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 47558faacb4f..9f7847adfc36 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -1544,18 +1544,18 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, + switch (scsi_get_prot_op(GET_CMD_SP(sp))) { + case SCSI_PROT_READ_INSERT: + case SCSI_PROT_WRITE_STRIP: +- total_bytes = data_bytes; +- data_bytes += dif_bytes; +- break; ++ total_bytes = data_bytes; ++ data_bytes += dif_bytes; ++ break; + + case SCSI_PROT_READ_STRIP: + case SCSI_PROT_WRITE_INSERT: + case SCSI_PROT_READ_PASS: + case SCSI_PROT_WRITE_PASS: +- total_bytes = data_bytes + dif_bytes; +- break; ++ total_bytes = data_bytes + dif_bytes; ++ break; + default: +- BUG(); ++ BUG(); + } + + if (!qla2x00_hba_err_chk_enabled(sp)) +-- +2.13.6 + diff --git a/SOURCES/0068-scsi-scsi-qla2xxx-Leave-a-blank-line-after-declarati.patch b/SOURCES/0068-scsi-scsi-qla2xxx-Leave-a-blank-line-after-declarati.patch new file mode 100644 index 0000000..af1f10f --- /dev/null +++ b/SOURCES/0068-scsi-scsi-qla2xxx-Leave-a-blank-line-after-declarati.patch @@ -0,0 +1,663 @@ +From 8f7bd68e4a8042f606fd27762d8c4818c6c64bc8 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:28 -0400 +Subject: [PATCH 068/124] [scsi] scsi: qla2xxx: Leave a blank line after + declarations + +Message-id: <20190801155618.12650-69-hmadhani@redhat.com> +Patchwork-id: 267843 +O-Subject: [RHEL 7.8 e-stor PATCH 068/118] scsi: qla2xxx: Leave a blank line after declarations +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +This patch improves readability of the qla2xxx source code. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit bd432bb53cffeae1ec3f77338d69bd89d9d45bb2) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek + +Conflicts: + drivers/scsi/qla2xxx/qla_os.c +--- + drivers/scsi/qla2xxx/qla_attr.c | 9 +++++++++ + drivers/scsi/qla2xxx/qla_bsg.c | 5 +++++ + drivers/scsi/qla2xxx/qla_dfs.c | 3 +++ + drivers/scsi/qla2xxx/qla_gs.c | 2 ++ + drivers/scsi/qla2xxx/qla_init.c | 5 +++++ + drivers/scsi/qla2xxx/qla_iocb.c | 2 ++ + drivers/scsi/qla2xxx/qla_isr.c | 3 +++ + drivers/scsi/qla2xxx/qla_mbx.c | 1 + + drivers/scsi/qla2xxx/qla_mr.c | 2 ++ + drivers/scsi/qla2xxx/qla_nvme.c | 1 + + drivers/scsi/qla2xxx/qla_nx.c | 12 ++++++++++++ + drivers/scsi/qla2xxx/qla_nx2.c | 3 +-- + drivers/scsi/qla2xxx/qla_os.c | 5 +++++ + drivers/scsi/qla2xxx/qla_target.c | 18 ++++++++++++++++++ + 14 files changed, 69 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index cd866540c120..6457a6d6d119 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -674,6 +674,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj, + int type; + uint32_t idc_control; + uint8_t *tmp_data = NULL; ++ + if (off != 0) + return -EINVAL; + +@@ -1080,6 +1081,7 @@ qla2x00_isp_name_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, "ISP%04X\n", vha->hw->pdev->device); + } + +@@ -1113,6 +1115,7 @@ qla2x00_model_desc_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, "%s\n", vha->hw->model_desc); + } + +@@ -1325,6 +1328,7 @@ qla2x00_optrom_bios_version_show(struct device *dev, + { + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); + struct qla_hw_data *ha = vha->hw; ++ + return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1], + ha->bios_revision[0]); + } +@@ -1335,6 +1339,7 @@ qla2x00_optrom_efi_version_show(struct device *dev, + { + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); + struct qla_hw_data *ha = vha->hw; ++ + return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1], + ha->efi_revision[0]); + } +@@ -1345,6 +1350,7 @@ qla2x00_optrom_fcode_version_show(struct device *dev, + { + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); + struct qla_hw_data *ha = vha->hw; ++ + return scnprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1], + ha->fcode_revision[0]); + } +@@ -1355,6 +1361,7 @@ qla2x00_optrom_fw_version_show(struct device *dev, + { + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); + struct qla_hw_data *ha = vha->hw; ++ + return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n", + ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2], + ha->fw_revision[3]); +@@ -1381,6 +1388,7 @@ qla2x00_total_isp_aborts_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); ++ + return scnprintf(buf, PAGE_SIZE, "%d\n", + vha->qla_stats.total_isp_aborts); + } +@@ -2819,6 +2827,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) + if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) { + if (ha->fw_attributes & BIT_4) { + int prot = 0, guard; ++ + vha->flags.difdix_supported = 1; + ql_dbg(ql_dbg_user, vha, 0x7082, + "Registered for DIF/DIX type 1 and 3 protection.\n"); +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index 7f9acc8cfbe2..783541fec019 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1503,6 +1503,7 @@ qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job) + uint32_t count; + dma_addr_t sfp_dma; + void *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma); ++ + if (!sfp) { + bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = + EXT_STATUS_NO_MEMORY; +@@ -1551,6 +1552,7 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job) + struct qla_status_reg *sr = (void *)bsg; + dma_addr_t sfp_dma; + uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma); ++ + if (!sfp) { + bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = + EXT_STATUS_NO_MEMORY; +@@ -1599,6 +1601,7 @@ qla2x00_write_fru_status(struct fc_bsg_job *bsg_job) + struct qla_status_reg *sr = (void *)bsg; + dma_addr_t sfp_dma; + uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma); ++ + if (!sfp) { + bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = + EXT_STATUS_NO_MEMORY; +@@ -1643,6 +1646,7 @@ qla2x00_write_i2c(struct fc_bsg_job *bsg_job) + struct qla_i2c_access *i2c = (void *)bsg; + dma_addr_t sfp_dma; + uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma); ++ + if (!sfp) { + bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = + EXT_STATUS_NO_MEMORY; +@@ -1686,6 +1690,7 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job) + struct qla_i2c_access *i2c = (void *)bsg; + dma_addr_t sfp_dma; + uint8_t *sfp = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &sfp_dma); ++ + if (!sfp) { + bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = + EXT_STATUS_NO_MEMORY; +diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c +index 4dd857da215a..d4f54a61cf33 100644 +--- a/drivers/scsi/qla2xxx/qla_dfs.c ++++ b/drivers/scsi/qla2xxx/qla_dfs.c +@@ -41,6 +41,7 @@ static int + qla2x00_dfs_tgt_sess_open(struct inode *inode, struct file *file) + { + scsi_qla_host_t *vha = inode->i_private; ++ + return single_open(file, qla2x00_dfs_tgt_sess_show, vha); + } + +@@ -161,6 +162,7 @@ static int + qla_dfs_fw_resource_cnt_open(struct inode *inode, struct file *file) + { + struct scsi_qla_host *vha = inode->i_private; ++ + return single_open(file, qla_dfs_fw_resource_cnt_show, vha); + } + +@@ -250,6 +252,7 @@ static int + qla_dfs_tgt_counters_open(struct inode *inode, struct file *file) + { + struct scsi_qla_host *vha = inode->i_private; ++ + return single_open(file, qla_dfs_tgt_counters_show, vha); + } + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 34f8f39cdbe2..6593203a19e1 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -1385,6 +1385,7 @@ qla2x00_mgmt_svr_login(scsi_qla_host_t *vha) + int ret, rval; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + struct qla_hw_data *ha = vha->hw; ++ + ret = QLA_SUCCESS; + if (vha->flags.management_server_logged_in) + return ret; +@@ -1423,6 +1424,7 @@ qla2x00_prep_ms_fdmi_iocb(scsi_qla_host_t *vha, uint32_t req_size, + { + ms_iocb_entry_t *ms_pkt; + struct qla_hw_data *ha = vha->hw; ++ + ms_pkt = ha->ms_iocb; + memset(ms_pkt, 0, sizeof(ms_iocb_entry_t)); + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 88a77c4b2f13..735ed201bbfd 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1482,6 +1482,7 @@ int qla24xx_post_newsess_work(struct scsi_qla_host *vha, port_id_t *id, + u8 *port_name, u8 *node_name, void *pla, u8 fc4_type) + { + struct qla_work_evt *e; ++ + e = qla2x00_alloc_work(vha, QLA_EVT_NEW_SESS); + if (!e) + return QLA_FUNCTION_FAILED; +@@ -1558,6 +1559,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea) + return; + { + unsigned long flags; ++ + fcport = qla2x00_find_fcport_by_nportid + (vha, &ea->id, 1); + if (fcport) { +@@ -4858,6 +4860,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) + int rval; + unsigned long flags, save_flags; + struct qla_hw_data *ha = vha->hw; ++ + rval = QLA_SUCCESS; + + /* Get Initiator ID */ +@@ -6413,6 +6416,7 @@ qla83xx_initiating_reset(scsi_qla_host_t *vha) + qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP); + } else { + const char *state = qla83xx_dev_state_to_string(dev_state); ++ + ql_log(ql_log_info, vha, 0xb057, "HW State: %s.\n", state); + + /* SV: XXX: Is timeout required here? */ +@@ -8217,6 +8221,7 @@ void + qla84xx_put_chip(struct scsi_qla_host *vha) + { + struct qla_hw_data *ha = vha->hw; ++ + if (ha->cs84xx) + kref_put(&ha->cs84xx->kref, __qla84xx_chip_release); + } +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 9f7847adfc36..8214d43d69c8 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -1114,6 +1114,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, + + if (sp) { + struct scsi_cmnd *cmd = GET_CMD_SP(sp); ++ + sgl = scsi_prot_sglist(cmd); + vha = sp->vha; + difctx = sp->u.scmd.ctx; +@@ -3442,6 +3443,7 @@ sufficient_dsds: + cmd_pkt->entry_status = (uint8_t) rsp->id; + } else { + struct cmd_type_7 *cmd_pkt; ++ + req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); + if (req->cnt < (req_cnt + 2)) { + cnt = (uint16_t)RD_REG_DWORD_RELAXED( +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 4c2f21d6735b..1c6022bbe734 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -839,6 +839,7 @@ skip_rio: + if (ha->flags.fawwpn_enabled && + (ha->current_topology == ISP_CFG_F)) { + void *wwpn = ha->init_cb->port_name; ++ + memcpy(vha->port_name, wwpn, WWN_SIZE); + fc_host_port_name(vha->host) = + wwn_to_u64(vha->port_name); +@@ -2247,6 +2248,7 @@ qla25xx_process_bidir_status_iocb(scsi_qla_host_t *vha, void *pkt, + struct fc_bsg_job *bsg_job = NULL; + sts_entry_t *sts; + struct sts_entry_24xx *sts24; ++ + sts = (sts_entry_t *) pkt; + sts24 = (struct sts_entry_24xx *) pkt; + +@@ -3082,6 +3084,7 @@ process_err: + /* Adjust ring index */ + if (IS_P3P_TYPE(ha)) { + struct device_reg_82xx __iomem *reg = &ha->iobase->isp82; ++ + WRT_REG_DWORD(®->rsp_q_out[0], rsp->ring_index); + } else { + WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index); +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 2b2678e1b043..401857a4a810 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -5732,6 +5732,7 @@ qla8044_md_get_template(scsi_qla_host_t *vha) + mbx_cmd_t *mcp = &mc; + int rval = QLA_FUNCTION_FAILED; + int offset = 0, size = MINIDUMP_SIZE_36K; ++ + ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0xb11f, + "Entered %s.\n", __func__); + +diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c +index a3464a76e0b4..ffe2a4887b07 100644 +--- a/drivers/scsi/qla2xxx/qla_mr.c ++++ b/drivers/scsi/qla2xxx/qla_mr.c +@@ -1321,6 +1321,7 @@ qlafx00_configure_devices(scsi_qla_host_t *vha) + { + int rval; + unsigned long flags; ++ + rval = QLA_SUCCESS; + + flags = vha->dpc_flags; +@@ -3322,6 +3323,7 @@ qlafx00_fxdisc_iocb(srb_t *sp, struct fxdisc_entry_fx00 *pfxiocb) + fx_iocb.flags = fxio->u.fxiocb.flags; + } else { + struct scatterlist *sg; ++ + bsg_job = sp->u.bsg_job; + piocb_rqst = (struct qla_mt_iocb_rqst_fx00 *) + &bsg_job->request->rqst_data.h_vendor.vendor_cmd[1]; +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index cbde02279838..6bf61f82a011 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -368,6 +368,7 @@ static inline int qla2x00_start_nvme_mq(srb_t *sp) + + if (unlikely(!fd->sqid)) { + struct nvme_fc_cmd_iu *cmd = fd->cmdaddr; ++ + if (cmd->sqe.common.opcode == nvme_admin_async_event) { + nvme->u.nvme.aen_op = 1; + atomic_inc(&ha->nvme_active_aen_cnt); +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 5b407708c105..8b325a2e6715 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -603,6 +603,7 @@ qla82xx_pci_set_window(struct qla_hw_data *ha, unsigned long long addr) + } else if (addr_in_range(addr, QLA82XX_ADDR_OCM0, + QLA82XX_ADDR_OCM0_MAX)) { + unsigned int temp1; ++ + if ((addr & 0x00ff800) == 0xff800) { + ql_log(ql_log_warn, vha, 0xb004, + "%s: QM access not handled.\n", __func__); +@@ -985,6 +986,7 @@ static int + qla82xx_read_status_reg(struct qla_hw_data *ha, uint32_t *val) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_INSTR_OPCODE, M25P_INSTR_RDSR); + qla82xx_wait_rom_busy(ha); + if (qla82xx_wait_rom_done(ha)) { +@@ -1025,6 +1027,7 @@ static int + qla82xx_flash_set_write_enable(struct qla_hw_data *ha) + { + uint32_t val; ++ + qla82xx_wait_rom_busy(ha); + qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ABYTE_CNT, 0); + qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_INSTR_OPCODE, M25P_INSTR_WREN); +@@ -1042,6 +1045,7 @@ static int + qla82xx_write_status_reg(struct qla_hw_data *ha, uint32_t val) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + if (qla82xx_flash_set_write_enable(ha)) + return -1; + qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_WDATA, val); +@@ -1058,6 +1062,7 @@ static int + qla82xx_write_disable_flash(struct qla_hw_data *ha) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_INSTR_OPCODE, M25P_INSTR_WRDI); + if (qla82xx_wait_rom_done(ha)) { + ql_log(ql_log_warn, vha, 0xb00f, +@@ -1430,6 +1435,7 @@ qla82xx_fw_load_from_flash(struct qla_hw_data *ha) + long memaddr = BOOTLD_START; + u64 data; + u32 high, low; ++ + size = (IMAGE_START - BOOTLD_START) / 8; + + for (i = 0; i < size; i++) { +@@ -1756,6 +1762,7 @@ int + qla82xx_reset_chip(scsi_qla_host_t *vha) + { + struct qla_hw_data *ha = vha->hw; ++ + ha->isp_ops->disable_intrs(ha); + + return QLA_SUCCESS; +@@ -1989,6 +1996,7 @@ qla82xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0) + uint16_t __iomem *wptr; + struct qla_hw_data *ha = vha->hw; + struct device_reg_82xx __iomem *reg = &ha->iobase->isp82; ++ + wptr = (uint16_t __iomem *)®->mailbox_out[1]; + + /* Load return mailbox registers. */ +@@ -2259,6 +2267,7 @@ void + qla82xx_enable_intrs(struct qla_hw_data *ha) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + qla82xx_mbx_intr_enable(vha); + spin_lock_irq(&ha->hardware_lock); + if (IS_QLA8044(ha)) +@@ -2273,6 +2282,7 @@ void + qla82xx_disable_intrs(struct qla_hw_data *ha) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + qla82xx_mbx_intr_disable(vha); + spin_lock_irq(&ha->hardware_lock); + if (IS_QLA8044(ha)) +@@ -4460,6 +4470,7 @@ qla82xx_beacon_on(struct scsi_qla_host *vha) + + int rval; + struct qla_hw_data *ha = vha->hw; ++ + qla82xx_idc_lock(ha); + rval = qla82xx_mbx_beacon_ctl(vha, 1); + +@@ -4480,6 +4491,7 @@ qla82xx_beacon_off(struct scsi_qla_host *vha) + + int rval; + struct qla_hw_data *ha = vha->hw; ++ + qla82xx_idc_lock(ha); + rval = qla82xx_mbx_beacon_ctl(vha, 0); + +diff --git a/drivers/scsi/qla2xxx/qla_nx2.c b/drivers/scsi/qla2xxx/qla_nx2.c +index 412d589fe550..68a68d55c35b 100644 +--- a/drivers/scsi/qla2xxx/qla_nx2.c ++++ b/drivers/scsi/qla2xxx/qla_nx2.c +@@ -2990,10 +2990,9 @@ qla8044_minidump_process_rddfe(struct scsi_qla_host *vha, + uint16_t count; + uint32_t poll, mask, modify_mask; + uint32_t wait_count = 0; +- + uint32_t *data_ptr = *d_ptr; +- + struct qla8044_minidump_entry_rddfe *rddfe; ++ + rddfe = (struct qla8044_minidump_entry_rddfe *) entry_hdr; + + addr1 = rddfe->addr_1; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 03d7d0af1f98..545208fa08c5 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -413,6 +413,7 @@ static void qla_init_base_qpair(struct scsi_qla_host *vha, struct req_que *req, + struct rsp_que *rsp) + { + struct qla_hw_data *ha = vha->hw; ++ + rsp->qpair = ha->base_qpair; + rsp->req = req; + ha->base_qpair->hw = ha; +@@ -437,6 +438,7 @@ static int qla2x00_alloc_queues(struct qla_hw_data *ha, struct req_que *req, + struct rsp_que *rsp) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); ++ + ha->req_q_map = kzalloc(sizeof(struct req_que *) * ha->max_req_queues, + GFP_KERNEL); + if (!ha->req_q_map) { +@@ -3519,6 +3521,7 @@ skip_dpc: + if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) { + if (ha->fw_attributes & BIT_4) { + int prot = 0, guard; ++ + base_vha->flags.difdix_supported = 1; + ql_dbg(ql_dbg_init, base_vha, 0x00f1, + "Registering for DIF/DIX type 1 and 3 protection.\n"); +@@ -4015,6 +4018,7 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport, + qla2xxx_wake_dpc(base_vha); + } else { + int now; ++ + if (rport) { + ql_dbg(ql_dbg_disc, fcport->vha, 0x2109, + "%s %8phN. rport %p roles %x\n", +@@ -5763,6 +5767,7 @@ qla83xx_force_lock_recovery(scsi_qla_host_t *base_vha) + uint32_t idc_lck_rcvry_stage_mask = 0x3; + uint32_t idc_lck_rcvry_owner_mask = 0x3c; + struct qla_hw_data *ha = base_vha->hw; ++ + ql_dbg(ql_dbg_p3p, base_vha, 0xb086, + "Trying force recovery of the IDC lock.\n"); + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 11e8a25973d8..6ed6bb8eb40f 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -177,6 +177,7 @@ static inline int qlt_issue_marker(struct scsi_qla_host *vha, int vha_locked) + /* Send marker if required */ + if (unlikely(vha->marker_needed != 0)) { + int rc = qla2x00_issue_marker(vha, vha_locked); ++ + if (rc != QLA_SUCCESS) { + ql_dbg(ql_dbg_tgt, vha, 0xe03d, + "qla_target(%d): issue_marker() failed\n", +@@ -550,6 +551,7 @@ static int qla24xx_post_nack_work(struct scsi_qla_host *vha, fc_port_t *fcport, + struct imm_ntfy_from_isp *ntfy, int type) + { + struct qla_work_evt *e; ++ + e = qla2x00_alloc_work(vha, QLA_EVT_NACK); + if (!e) + return QLA_FUNCTION_FAILED; +@@ -1071,6 +1073,7 @@ void qlt_free_session_done(struct work_struct *work) + struct qlt_plogi_ack_t *con = + sess->plogi_link[QLT_PLOGI_LINK_CONFLICT]; + struct imm_ntfy_from_isp *iocb; ++ + own = sess->plogi_link[QLT_PLOGI_LINK_SAME_WWN]; + + if (con) { +@@ -1322,6 +1325,7 @@ static int qla24xx_get_loop_id(struct scsi_qla_host *vha, const uint8_t *s_id, + res = -ENOENT; + for (i = 0; i < entries; i++) { + struct gid_list_info *gid = (struct gid_list_info *)id_iter; ++ + if ((gid->al_pa == s_id[2]) && + (gid->area == s_id[1]) && + (gid->domain == s_id[0])) { +@@ -2478,6 +2482,7 @@ static void qlt_unmap_sg(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) + { + struct qla_hw_data *ha; + struct qla_qpair *qpair; ++ + if (!cmd->sg_mapped) + return; + +@@ -3906,6 +3911,7 @@ static int qlt_term_ctio_exchange(struct qla_qpair *qpair, void *ctio, + + if (ctio != NULL) { + struct ctio7_from_24xx *c = (struct ctio7_from_24xx *)ctio; ++ + term = !(c->flags & + cpu_to_le16(OF_TERM_EXCH)); + } else +@@ -4748,6 +4754,7 @@ static int abort_cmds_for_s_id(struct scsi_qla_host *vha, port_id_t *s_id) + + list_for_each_entry(op, &vha->unknown_atio_list, cmd_list) { + uint32_t op_key = sid_to_key(op->atio.u.isp24.fcp_hdr.s_id); ++ + if (op_key == key) { + op->aborted = true; + count++; +@@ -4756,6 +4763,7 @@ static int abort_cmds_for_s_id(struct scsi_qla_host *vha, port_id_t *s_id) + + list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { + uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); ++ + if (cmd_key == key) { + cmd->aborted = 1; + count++; +@@ -5026,6 +5034,7 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha, + if (sess != NULL) { + bool delete = false; + int sec; ++ + spin_lock_irqsave(&tgt->ha->tgt.sess_lock, flags); + switch (sess->fw_login_state) { + case DSC_LS_PLOGI_PEND: +@@ -5178,6 +5187,7 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha, + case ELS_ADISC: + { + struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; ++ + if (tgt->link_reinit_iocb_pending) { + qlt_send_notify_ack(ha->base_qpair, + &tgt->link_reinit_iocb, 0, 0, 0, 0, 0, 0); +@@ -5241,6 +5251,7 @@ static void qlt_handle_imm_notify(struct scsi_qla_host *vha, + case IMM_NTFY_LIP_LINK_REINIT: + { + struct qla_tgt *tgt = vha->vha_tgt.qla_tgt; ++ + ql_dbg(ql_dbg_tgt_mgt, vha, 0xf033, + "qla_target(%d): LINK REINIT (loop %#x, " + "subcode %x)\n", vha->vp_idx, +@@ -5857,6 +5868,7 @@ static void qlt_response_pkt(struct scsi_qla_host *vha, + case CTIO_TYPE7: + { + struct ctio7_from_24xx *entry = (struct ctio7_from_24xx *)pkt; ++ + qlt_do_ctio_completion(vha, rsp, entry->handle, + le16_to_cpu(entry->status)|(pkt->entry_status << 16), + entry); +@@ -5867,6 +5879,7 @@ static void qlt_response_pkt(struct scsi_qla_host *vha, + { + struct atio_from_isp *atio = (struct atio_from_isp *)pkt; + int rc; ++ + if (atio->u.isp2x.status != + cpu_to_le16(ATIO_CDB_VALID)) { + ql_dbg(ql_dbg_tgt, vha, 0xe05e, +@@ -5915,6 +5928,7 @@ static void qlt_response_pkt(struct scsi_qla_host *vha, + case CONTINUE_TGT_IO_TYPE: + { + struct ctio_to_2xxx *entry = (struct ctio_to_2xxx *)pkt; ++ + qlt_do_ctio_completion(vha, rsp, entry->handle, + le16_to_cpu(entry->status)|(pkt->entry_status << 16), + entry); +@@ -5924,6 +5938,7 @@ static void qlt_response_pkt(struct scsi_qla_host *vha, + case CTIO_A64_TYPE: + { + struct ctio_to_2xxx *entry = (struct ctio_to_2xxx *)pkt; ++ + qlt_do_ctio_completion(vha, rsp, entry->handle, + le16_to_cpu(entry->status)|(pkt->entry_status << 16), + entry); +@@ -5938,6 +5953,7 @@ static void qlt_response_pkt(struct scsi_qla_host *vha, + case NOTIFY_ACK_TYPE: + if (tgt->notify_ack_expected > 0) { + struct nack_to_isp *entry = (struct nack_to_isp *)pkt; ++ + ql_dbg(ql_dbg_tgt, vha, 0xe036, + "NOTIFY_ACK seq %08x status %x\n", + le16_to_cpu(entry->u.isp2x.seq_id), +@@ -6213,6 +6229,7 @@ retry: + + if (rc == -ENOENT) { + qlt_port_logo_t logo; ++ + sid_to_portid(s_id, &logo.id); + logo.cmd_count = 1; + qlt_send_first_logo(vha, &logo); +@@ -6472,6 +6489,7 @@ int qlt_add_target(struct qla_hw_data *ha, struct scsi_qla_host *base_vha) + unsigned long flags; + + struct qla_qpair *qpair = ha->queue_pair_map[i]; ++ + h = &tgt->qphints[i + 1]; + INIT_LIST_HEAD(&h->hint_elem); + if (qpair) { +-- +2.13.6 + diff --git a/SOURCES/0069-scsi-scsi-qla2xxx-Fix-formatting-of-pointer-types.patch b/SOURCES/0069-scsi-scsi-qla2xxx-Fix-formatting-of-pointer-types.patch new file mode 100644 index 0000000..da2d2bb --- /dev/null +++ b/SOURCES/0069-scsi-scsi-qla2xxx-Fix-formatting-of-pointer-types.patch @@ -0,0 +1,106 @@ +From 89b8969c54687f975e38854325467b545eee5697 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:29 -0400 +Subject: [PATCH 069/124] [scsi] scsi: qla2xxx: Fix formatting of pointer types + +Message-id: <20190801155618.12650-70-hmadhani@redhat.com> +Patchwork-id: 267844 +O-Subject: [RHEL 7.8 e-stor PATCH 069/118] scsi: qla2xxx: Fix formatting of pointer types +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Improve source code readability by following the Linux kernel coding style +for pointer types. This patch only changes whitespace. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 845bbb09b54c1f712d4b1c9a0500cc62d6215398) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 2 +- + drivers/scsi/qla2xxx/qla_gbl.h | 2 +- + drivers/scsi/qla2xxx/qla_isr.c | 4 ++-- + drivers/scsi/qla2xxx/qla_os.c | 2 +- + drivers/scsi/qla2xxx/qla_target.c | 2 +- + 5 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index f2f388108dbf..1cc48efc43d2 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -3195,7 +3195,7 @@ struct isp_operations { + int (*start_scsi) (srb_t *); + int (*start_scsi_mq) (srb_t *); + int (*abort_isp) (struct scsi_qla_host *); +- int (*iospace_config)(struct qla_hw_data*); ++ int (*iospace_config)(struct qla_hw_data *); + int (*initialize_adapter)(struct scsi_qla_host *); + }; + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index e271e24fce23..0f6a62f1a576 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -242,7 +242,7 @@ extern void qla24xx_report_id_acquisition(scsi_qla_host_t *, + struct vp_rpt_id_entry_24xx *); + extern void qla2x00_do_dpc_all_vps(scsi_qla_host_t *); + extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *); +-extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *); ++extern scsi_qla_host_t *qla24xx_create_vhost(struct fc_vport *); + + extern void qla2x00_sp_free_dma(void *); + extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 1c6022bbe734..32e5793e6864 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1593,8 +1593,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, + } + + comp_status = fw_status[0] = le16_to_cpu(pkt->comp_status); +- fw_status[1] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_1); +- fw_status[2] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_2); ++ fw_status[1] = le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->error_subcode_1); ++ fw_status[2] = le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->error_subcode_2); + + if (iocb_type == ELS_IOCB_TYPE) { + els = &sp->u.iocb_cmd; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 545208fa08c5..e6e5f3812757 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1274,7 +1274,7 @@ qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha) + static int + sp_get(struct srb *sp) + { +- if (!refcount_inc_not_zero((refcount_t*)&sp->ref_count)) ++ if (!refcount_inc_not_zero((refcount_t *)&sp->ref_count)) + /* kref get fail */ + return ENXIO; + else +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 6ed6bb8eb40f..2e28758af56d 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -696,7 +696,7 @@ void qla24xx_do_nack_work(struct scsi_qla_host *vha, struct qla_work_evt *e) + break; + } + qla24xx_async_notify_ack(vha, e->u.nack.fcport, +- (struct imm_ntfy_from_isp*)e->u.nack.iocb, e->u.nack.type); ++ (struct imm_ntfy_from_isp *)e->u.nack.iocb, e->u.nack.type); + } + + void qla24xx_delete_sess_fn(struct work_struct *work) +-- +2.13.6 + diff --git a/SOURCES/0070-scsi-scsi-qla2xxx-Insert-spaces-where-required.patch b/SOURCES/0070-scsi-scsi-qla2xxx-Insert-spaces-where-required.patch new file mode 100644 index 0000000..9c13055 --- /dev/null +++ b/SOURCES/0070-scsi-scsi-qla2xxx-Insert-spaces-where-required.patch @@ -0,0 +1,256 @@ +From 837c3d326b1496db2652b0207124c66a3b2a2c0a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:30 -0400 +Subject: [PATCH 070/124] [scsi] scsi: qla2xxx: Insert spaces where required + +Message-id: <20190801155618.12650-71-hmadhani@redhat.com> +Patchwork-id: 267849 +O-Subject: [RHEL 7.8 e-stor PATCH 070/118] scsi: qla2xxx: Insert spaces where required +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Improve source code readability by inserting spaces where these are +required according to the coding standard. This patch only inserts +whitespace and does not make any other changes. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 58e2753c1163ebce9be0c8938cac2f237716eda1) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 6 +++--- + drivers/scsi/qla2xxx/qla_dbg.c | 2 +- + drivers/scsi/qla2xxx/qla_gs.c | 2 +- + drivers/scsi/qla2xxx/qla_init.c | 22 +++++++++++----------- + drivers/scsi/qla2xxx/qla_iocb.c | 2 +- + drivers/scsi/qla2xxx/qla_mbx.c | 4 ++-- + drivers/scsi/qla2xxx/qla_os.c | 4 ++-- + drivers/scsi/qla2xxx/qla_sup.c | 2 +- + drivers/scsi/qla2xxx/qla_target.h | 2 +- + 9 files changed, 23 insertions(+), 23 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 6457a6d6d119..c7075f0a5019 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -889,7 +889,7 @@ do_read: + count = 0; + } + +- count = actual_size > count ? count: actual_size; ++ count = actual_size > count ? count : actual_size; + memcpy(buf, ha->xgmac_data, count); + + return count; +@@ -2811,8 +2811,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) + + /* initialized vport states */ + atomic_set(&vha->loop_state, LOOP_DOWN); +- vha->vp_err_state= VP_ERR_PORTDWN; +- vha->vp_prev_err_state= VP_ERR_UNKWN; ++ vha->vp_err_state = VP_ERR_PORTDWN; ++ vha->vp_prev_err_state = VP_ERR_UNKWN; + /* Check if physical ha port is Up */ + if (atomic_read(&base_vha->loop_state) == LOOP_DOWN || + atomic_read(&base_vha->loop_state) == LOOP_DEAD) { +diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c +index ae202fa427c5..446278c155b7 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -446,7 +446,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram, + } + } + +- *nxt = rval == QLA_SUCCESS ? &ram[cnt]: NULL; ++ *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL; + return rval; + } + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 6593203a19e1..368eecc13c30 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -2448,7 +2448,7 @@ qla2x00_fdmiv2_rpa(scsi_qla_host_t *vha) + eiter->type = cpu_to_be16(FDMI_PORT_MAX_FRAME_SIZE); + eiter->len = cpu_to_be16(4 + 4); + eiter->a.max_frame_size = IS_FWI2_CAPABLE(ha) ? +- le16_to_cpu(icb24->frame_payload_size): ++ le16_to_cpu(icb24->frame_payload_size) : + le16_to_cpu(ha->init_cb->frame_payload_size); + eiter->a.max_frame_size = cpu_to_be32(eiter->a.max_frame_size); + size += 4 + 4; +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 735ed201bbfd..a47d09583375 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4725,7 +4725,7 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) + ha->zio_mode = icb->add_firmware_options[0] & + (BIT_3 | BIT_2 | BIT_1 | BIT_0); + ha->zio_timer = icb->interrupt_delay_timer ? +- icb->interrupt_delay_timer: 2; ++ icb->interrupt_delay_timer : 2; + } + icb->add_firmware_options[0] &= + ~(BIT_3 | BIT_2 | BIT_1 | BIT_0); +@@ -4758,7 +4758,7 @@ qla2x00_rport_del(void *data) + unsigned long flags; + + spin_lock_irqsave(fcport->vha->host->host_lock, flags); +- rport = fcport->drport ? fcport->drport: fcport->rport; ++ rport = fcport->drport ? fcport->drport : fcport->rport; + fcport->drport = NULL; + spin_unlock_irqrestore(fcport->vha->host->host_lock, flags); + if (rport) { +@@ -7215,11 +7215,11 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + ha->flags.disable_risc_code_load = 0; + ha->flags.enable_lip_reset = 0; + ha->flags.enable_lip_full_login = +- le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0; ++ le32_to_cpu(nv->host_p) & BIT_10 ? 1 : 0; + ha->flags.enable_target_reset = +- le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0; ++ le32_to_cpu(nv->host_p) & BIT_11 ? 1 : 0; + ha->flags.enable_led_scheme = 0; +- ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0; ++ ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1 : 0; + + ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) & + (BIT_6 | BIT_5 | BIT_4)) >> 4; +@@ -7293,7 +7293,7 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) + ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & + (BIT_3 | BIT_2 | BIT_1 | BIT_0); + ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ? +- le16_to_cpu(icb->interrupt_delay_timer): 2; ++ le16_to_cpu(icb->interrupt_delay_timer) : 2; + } + icb->firmware_options_2 &= cpu_to_le32( + ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); +@@ -8239,7 +8239,7 @@ qla84xx_init_chip(scsi_qla_host_t *vha) + + mutex_unlock(&ha->cs84xx->fw_update_mutex); + +- return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED: ++ return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED : + QLA_SUCCESS; + } + +@@ -8435,11 +8435,11 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + ha->flags.disable_risc_code_load = 0; + ha->flags.enable_lip_reset = 0; + ha->flags.enable_lip_full_login = +- le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0; ++ le32_to_cpu(nv->host_p) & BIT_10 ? 1 : 0; + ha->flags.enable_target_reset = +- le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0; ++ le32_to_cpu(nv->host_p) & BIT_11 ? 1 : 0; + ha->flags.enable_led_scheme = 0; +- ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0; ++ ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1 : 0; + + ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) & + (BIT_6 | BIT_5 | BIT_4)) >> 4; +@@ -8512,7 +8512,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & + (BIT_3 | BIT_2 | BIT_1 | BIT_0); + ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ? +- le16_to_cpu(icb->interrupt_delay_timer): 2; ++ le16_to_cpu(icb->interrupt_delay_timer) : 2; + } + icb->firmware_options_2 &= cpu_to_le32( + ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 8214d43d69c8..cb1d0067bc3d 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2536,7 +2536,7 @@ qla2x00_logout_iocb(srb_t *sp, struct mbx_entry *mbx) + SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); + mbx->mb0 = cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); + mbx->mb1 = HAS_EXTENDED_IDS(ha) ? +- cpu_to_le16(sp->fcport->loop_id): ++ cpu_to_le16(sp->fcport->loop_id) : + cpu_to_le16(sp->fcport->loop_id << 8); + mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain); + mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 | +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 401857a4a810..ff660656dc4e 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -2035,7 +2035,7 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) + + /* Passback COS information. */ + fcport->supported_classes = (pd->options & BIT_4) ? +- FC_COS_CLASS2: FC_COS_CLASS3; ++ FC_COS_CLASS2 : FC_COS_CLASS3; + } + + gpd_error_out: +@@ -3279,7 +3279,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, + + /* Issue marker IOCB. */ + rval2 = qla2x00_marker(vha, ha->base_qpair, fcport->loop_id, l, +- type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID); ++ type == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID); + if (rval2 != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0x1099, + "Failed to issue marker IOCB (%x).\n", rval2); +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index e6e5f3812757..57ca13874045 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -107,7 +107,7 @@ MODULE_PARM_DESC(ql2xshiftctondsd, + "Set to control shifting of command type processing " + "based on total number of SG elements."); + +-int ql2xfdmienable=1; ++int ql2xfdmienable = 1; + module_param(ql2xfdmienable, int, S_IRUGO|S_IWUSR); + module_param_named(fdmi, ql2xfdmienable, int, S_IRUGO|S_IWUSR); + MODULE_PARM_DESC(ql2xfdmienable, +@@ -153,7 +153,7 @@ MODULE_PARM_DESC(ql2xenablehba_err_chk, + " 1 -- Error isolation enabled only for DIX Type 0\n" + " 2 -- Error isolation enabled for all Types\n"); + +-int ql2xiidmaenable=1; ++int ql2xiidmaenable = 1; + module_param(ql2xiidmaenable, int, S_IRUGO); + MODULE_PARM_DESC(ql2xiidmaenable, + "Enables iIDMA settings " +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index ec14d10bff4c..a5d47ae24ef6 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -987,7 +987,7 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) + ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0300 | + fdt->unprotect_sec_cmd); + ha->fdt_protect_sec_cmd = fdt->protect_sec_cmd ? +- flash_conf_addr(ha, 0x0300 | fdt->protect_sec_cmd): ++ flash_conf_addr(ha, 0x0300 | fdt->protect_sec_cmd) : + flash_conf_addr(ha, 0x0336); + } + goto done; +diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h +index c0bc02a4caf6..7541e116009a 100644 +--- a/drivers/scsi/qla2xxx/qla_target.h ++++ b/drivers/scsi/qla2xxx/qla_target.h +@@ -864,7 +864,7 @@ enum trace_flags { + TRC_CTIO_ERR = BIT_11, + TRC_CTIO_DONE = BIT_12, + TRC_CTIO_ABORTED = BIT_13, +- TRC_CTIO_STRANGE= BIT_14, ++ TRC_CTIO_STRANGE = BIT_14, + TRC_CMD_DONE = BIT_15, + TRC_CMD_CHK_STOP = BIT_16, + TRC_CMD_FREE = BIT_17, +-- +2.13.6 + diff --git a/SOURCES/0071-scsi-scsi-qla2xxx-Move-the-port_state_strdefinition-.patch b/SOURCES/0071-scsi-scsi-qla2xxx-Move-the-port_state_strdefinition-.patch new file mode 100644 index 0000000..964c824 --- /dev/null +++ b/SOURCES/0071-scsi-scsi-qla2xxx-Move-the-port_state_strdefinition-.patch @@ -0,0 +1,75 @@ +From f089e13f8bf95cf42f6a3a0591a75d04dbcf6f6b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:31 -0400 +Subject: [PATCH 071/124] [scsi] scsi: qla2xxx: Move the + port_state_strdefinition from a .h to a .c file + +Message-id: <20190801155618.12650-72-hmadhani@redhat.com> +Patchwork-id: 267855 +O-Subject: [RHEL 7.8 e-stor PATCH 071/118] scsi: qla2xxx: Move the port_state_str[] definition from a .h to a .c file +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Reduce the size of the qla2xxx kernel module by moving an array definition +from a .h into a .c file. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit c4dc7cd314398f03c1c6e5034b8913aeb40b2646) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 8 +------- + drivers/scsi/qla2xxx/qla_isr.c | 8 ++++++++ + 2 files changed, 9 insertions(+), 7 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 1cc48efc43d2..8ad107855ea1 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2478,13 +2478,7 @@ struct event_arg { + #define FCS_DEVICE_LOST 3 + #define FCS_ONLINE 4 + +-static const char * const port_state_str[] = { +- "Unknown", +- "UNCONFIGURED", +- "DEAD", +- "LOST", +- "ONLINE" +-}; ++extern const char *const port_state_str[5]; + + /* + * FC port flags. +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 32e5793e6864..f099a812e29f 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -22,6 +22,14 @@ static void qla2x00_status_cont_entry(struct rsp_que *, sts_cont_entry_t *); + static int qla2x00_error_entry(scsi_qla_host_t *, struct rsp_que *, + sts_entry_t *); + ++const char *const port_state_str[] = { ++ "Unknown", ++ "UNCONFIGURED", ++ "DEAD", ++ "LOST", ++ "ONLINE" ++}; ++ + /** + * qla2100_intr_handler() - Process interrupts for the ISP2100 and ISP2200. + * @irq: interrupt number +-- +2.13.6 + diff --git a/SOURCES/0072-scsi-scsi-qla2xxx-Declare-qla24xx_build_scsi_crc_2_i.patch b/SOURCES/0072-scsi-scsi-qla2xxx-Declare-qla24xx_build_scsi_crc_2_i.patch new file mode 100644 index 0000000..4cda318 --- /dev/null +++ b/SOURCES/0072-scsi-scsi-qla2xxx-Declare-qla24xx_build_scsi_crc_2_i.patch @@ -0,0 +1,63 @@ +From a8640485122eaaa9108ada9d89e9843437611ee6 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:32 -0400 +Subject: [PATCH 072/124] [scsi] scsi: qla2xxx: Declare + qla24xx_build_scsi_crc_2_iocbs() static + +Message-id: <20190801155618.12650-73-hmadhani@redhat.com> +Patchwork-id: 267846 +O-Subject: [RHEL 7.8 e-stor PATCH 072/118] scsi: qla2xxx: Declare qla24xx_build_scsi_crc_2_iocbs() static +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since qla24xx_build_scsi_crc_2_iocbs() is only used inside a single source +file, declare this function static. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit c20605edb38a1201d56ec83696b0b7a692a9f157) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 2 -- + drivers/scsi/qla2xxx/qla_iocb.c | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 0f6a62f1a576..7254b5d8fbc1 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -293,8 +293,6 @@ extern int qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *, srb_t *, + uint32_t *, uint16_t, struct qla_tgt_cmd *); + extern int qla24xx_get_one_block_sg(uint32_t, struct qla2_sgx *, uint32_t *); + extern int qla24xx_configure_prot_mode(srb_t *, uint16_t *); +-extern int qla24xx_build_scsi_crc_2_iocbs(srb_t *, +- struct cmd_type_crc_2 *, uint16_t, uint16_t, uint16_t); + + /* + * Global Function Prototypes in qla_mbx.c source file. +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index cb1d0067bc3d..7f0b3dd5d815 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -1411,7 +1411,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, + * @tot_prot_dsds: Total number of segments with protection information + * @fw_prot_opts: Protection options to be passed to firmware + */ +-inline int ++static inline int + qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, + uint16_t tot_dsds, uint16_t tot_prot_dsds, uint16_t fw_prot_opts) + { +-- +2.13.6 + diff --git a/SOURCES/0073-scsi-scsi-qla2xxx-Remove-qla_tgt_cmd.data_work-and-q.patch b/SOURCES/0073-scsi-scsi-qla2xxx-Remove-qla_tgt_cmd.data_work-and-q.patch new file mode 100644 index 0000000..7c0545f --- /dev/null +++ b/SOURCES/0073-scsi-scsi-qla2xxx-Remove-qla_tgt_cmd.data_work-and-q.patch @@ -0,0 +1,65 @@ +From 24f7604a53a1c23739aca10b2ed8ff61cb6a9b02 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:33 -0400 +Subject: [PATCH 073/124] [scsi] scsi: qla2xxx: Remove qla_tgt_cmd.data_work + and qla_tgt_cmd.data_work_free + +Message-id: <20190801155618.12650-74-hmadhani@redhat.com> +Patchwork-id: 267848 +O-Subject: [RHEL 7.8 e-stor PATCH 073/118] scsi: qla2xxx: Remove qla_tgt_cmd.data_work and qla_tgt_cmd.data_work_free +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +The 'data_work' and 'data_work_free' member variables are set but never +used. Hence remove both member variables. See also commit 6bcbb3174caa +("qla2xxx: Fix incorrect tcm_qla2xxx_free_cmd use during TMR ABORT (v2)"). + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit bb63e47b6f6832f1eb5be4207c65a6f268e01059) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.h | 2 -- + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 -- + 2 files changed, 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h +index 7541e116009a..2779b9a83898 100644 +--- a/drivers/scsi/qla2xxx/qla_target.h ++++ b/drivers/scsi/qla2xxx/qla_target.h +@@ -899,8 +899,6 @@ struct qla_tgt_cmd { + unsigned int cmd_sent_to_fw:1; + unsigned int cmd_in_wq:1; + unsigned int aborted:1; +- unsigned int data_work:1; +- unsigned int data_work_free:1; + unsigned int released:1; + + struct scatterlist *sg; /* cmd data buffer SG vector */ +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +index 4339cdcc3cb8..d61d02cd3f86 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -534,9 +534,7 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work) + return; + } + +- cmd->data_work = 1; + if (cmd->aborted) { +- cmd->data_work_free = 1; + spin_unlock_irqrestore(&cmd->cmd_lock, flags); + + tcm_qla2xxx_free_cmd(cmd); +-- +2.13.6 + diff --git a/SOURCES/0074-scsi-scsi-qla2xxx-Remove-two-superfluous-casts.patch b/SOURCES/0074-scsi-scsi-qla2xxx-Remove-two-superfluous-casts.patch new file mode 100644 index 0000000..8975af9 --- /dev/null +++ b/SOURCES/0074-scsi-scsi-qla2xxx-Remove-two-superfluous-casts.patch @@ -0,0 +1,58 @@ +From e716a20452ccde2a39e9bba85a86de27cb6a0afe Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:34 -0400 +Subject: [PATCH 074/124] [scsi] scsi: qla2xxx: Remove two superfluous casts + +Message-id: <20190801155618.12650-75-hmadhani@redhat.com> +Patchwork-id: 267850 +O-Subject: [RHEL 7.8 e-stor PATCH 074/118] scsi: qla2xxx: Remove two superfluous casts +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Casting a void pointer into another pointer before assigning the pointer to +a variable is not useful. Hence remove such casts. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 81bcf1c5cf0ee875de3f3b0c930194dcf56969ee) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 2e28758af56d..a7ded20abf14 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -4031,7 +4031,7 @@ static void qlt_do_ctio_completion(struct scsi_qla_host *vha, + return; + } + +- cmd = (struct qla_tgt_cmd *)qlt_ctio_to_cmd(vha, rsp, handle, ctio); ++ cmd = qlt_ctio_to_cmd(vha, rsp, handle, ctio); + if (cmd == NULL) + return; + +@@ -5805,8 +5805,7 @@ static void qlt_handle_abts_completion(struct scsi_qla_host *vha, + struct qla_tgt_mgmt_cmd *mcmd; + struct qla_hw_data *ha = vha->hw; + +- mcmd = (struct qla_tgt_mgmt_cmd *)qlt_ctio_to_cmd(vha, rsp, +- pkt->handle, pkt); ++ mcmd = qlt_ctio_to_cmd(vha, rsp, pkt->handle, pkt); + if (mcmd == NULL && h != QLA_TGT_SKIP_HANDLE) { + ql_dbg(ql_dbg_async, vha, 0xe064, + "qla_target(%d): ABTS Comp without mcmd\n", +-- +2.13.6 + diff --git a/SOURCES/0075-scsi-scsi-qla2xxx-Move-qla2x00_set_fcport_state-from.patch b/SOURCES/0075-scsi-scsi-qla2xxx-Move-qla2x00_set_fcport_state-from.patch new file mode 100644 index 0000000..dcdb4dd --- /dev/null +++ b/SOURCES/0075-scsi-scsi-qla2xxx-Move-qla2x00_set_fcport_state-from.patch @@ -0,0 +1,108 @@ +From ac5fafff15ce5f5ea5481365220165dabdf9cc9c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:35 -0400 +Subject: [PATCH 075/124] [scsi] scsi: qla2xxx: Move qla2x00_set_fcport_state() + from a .h into a .c file + +Message-id: <20190801155618.12650-76-hmadhani@redhat.com> +Patchwork-id: 267854 +O-Subject: [RHEL 7.8 e-stor PATCH 075/118] scsi: qla2xxx: Move qla2x00_set_fcport_state() from a .h into a .c file +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +The qla2x00_set_fcport_state() function is not in the hot path so move its +definition from a .h into a .c file. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Reviewed-by: Johannes Thumshirn +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit a630bdc54f6d41a525694766168ddb9b8ffe8392) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 17 +++++++++++++++++ + drivers/scsi/qla2xxx/qla_inline.h | 19 ------------------- + 3 files changed, 18 insertions(+), 19 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 7254b5d8fbc1..b98ec6d92720 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -80,6 +80,7 @@ int qla2x00_post_work(struct scsi_qla_host *vha, struct qla_work_evt *e); + extern void *qla2x00_alloc_iocbs_ready(struct qla_qpair *, srb_t *); + extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *); + ++extern void qla2x00_set_fcport_state(fc_port_t *fcport, int state); + extern fc_port_t * + qla2x00_alloc_fcport(scsi_qla_host_t *, gfp_t ); + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index a47d09583375..15085251f59f 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -4771,6 +4771,23 @@ qla2x00_rport_del(void *data) + } + } + ++void qla2x00_set_fcport_state(fc_port_t *fcport, int state) ++{ ++ int old_state; ++ ++ old_state = atomic_read(&fcport->state); ++ atomic_set(&fcport->state, state); ++ ++ /* Don't print state transitions during initial allocation of fcport */ ++ if (old_state && old_state != state) { ++ ql_dbg(ql_dbg_disc, fcport->vha, 0x207d, ++ "FCPort %8phC state transitioned from %s to %s - portid=%02x%02x%02x.\n", ++ fcport->port_name, port_state_str[old_state], ++ port_state_str[state], fcport->d_id.b.domain, ++ fcport->d_id.b.area, fcport->d_id.b.al_pa); ++ } ++} ++ + /** + * qla2x00_alloc_fcport() - Allocate a generic fcport. + * @vha: HA context +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index 98f544fe8788..f3c3ddc94eec 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -142,25 +142,6 @@ qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx) + INIT_LIST_HEAD(&ctx->dsd_list); + } + +-static inline void +-qla2x00_set_fcport_state(fc_port_t *fcport, int state) +-{ +- int old_state; +- +- old_state = atomic_read(&fcport->state); +- atomic_set(&fcport->state, state); +- +- /* Don't print state transitions during initial allocation of fcport */ +- if (old_state && old_state != state) { +- ql_dbg(ql_dbg_disc, fcport->vha, 0x207d, +- "FCPort %8phC state transitioned from %s to %s - " +- "portid=%02x%02x%02x.\n", fcport->port_name, +- port_state_str[old_state], port_state_str[state], +- fcport->d_id.b.domain, fcport->d_id.b.area, +- fcport->d_id.b.al_pa); +- } +-} +- + static inline int + qla2x00_hba_err_chk_enabled(srb_t *sp) + { +-- +2.13.6 + diff --git a/SOURCES/0076-scsi-scsi-qla2xxx-Fix-read-offset-in-qla24xx_load_ri.patch b/SOURCES/0076-scsi-scsi-qla2xxx-Fix-read-offset-in-qla24xx_load_ri.patch new file mode 100644 index 0000000..dc5464e --- /dev/null +++ b/SOURCES/0076-scsi-scsi-qla2xxx-Fix-read-offset-in-qla24xx_load_ri.patch @@ -0,0 +1,250 @@ +From 035ffe68fc976c04a594d4e9dd9c36b22043760c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:36 -0400 +Subject: [PATCH 076/124] [scsi] scsi: qla2xxx: Fix read offset in + qla24xx_load_risc_flash() + +Message-id: <20190801155618.12650-77-hmadhani@redhat.com> +Patchwork-id: 267872 +O-Subject: [RHEL 7.8 e-stor PATCH 076/118] scsi: qla2xxx: Fix read offset in qla24xx_load_risc_flash() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +This patch fixes regression introduced by commit f8f97b0c5b7f ("scsi: +qla2xxx: Cleanups for NVRAM/Flash read/write path") where flash read/write +routine cleanup left out code which resulted into checksum failure leading +to use-after-free stack during driver load. + +Following stack trace is seen in the log file + +qla2xxx [0000:00:00.0]-0005: : QLogic Fibre Channel HBA Driver: 10.01.00.16-k. +qla2xxx [0000:00:0b.0]-001d: : Found an ISP2532 irq 11 iobase 0x0000000000f47f03. +qla2xxx [0000:00:0b.0]-00cd:8: ISP Firmware failed checksum. +qla2xxx [0000:00:0b.0]-00cf:8: Setup chip ****FAILED****. +qla2xxx [0000:00:0b.0]-00d6:8: Failed to initialize adapter - Adapter flags 2. +================================================================== +BUG: KASAN: use-after-free in __list_del_entry_valid+0x15/0xd0 +Read of size 8 at addr ffff8880ca05a490 by task modprobe/857 + +CPU: 0 PID: 857 Comm: modprobe Not tainted 5.1.0-rc1-dbg+ #4 +Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 +Call Trace: + dump_stack+0x86/0xca + print_address_description+0x6c/0x234 + ? __list_del_entry_valid+0x15/0xd0 + kasan_report.cold.3+0x1b/0x34 + ? __list_del_entry_valid+0x15/0xd0 + ? __kmem_cache_shutdown.cold.95+0xf5/0x176 + ? __list_del_entry_valid+0x15/0xd0 + __asan_load8+0x54/0x90 + __list_del_entry_valid+0x15/0xd0 + dma_pool_destroy+0x4f/0x260 + ? dma_free_attrs+0xb4/0xd0 + qla2x00_mem_free+0x529/0xcc0 [qla2xxx] + ? kobject_put+0xdb/0x230 + qla2x00_probe_one+0x2b5e/0x45f0 [qla2xxx] + ? qla2xxx_pci_error_detected+0x210/0x210 [qla2xxx] + ? match_held_lock+0x20/0x240 + ? find_held_lock+0xca/0xf0 + ? mark_held_locks+0x86/0xb0 + ? _raw_spin_unlock_irqrestore+0x52/0x60 + ? __pm_runtime_resume+0x5b/0xb0 + ? lockdep_hardirqs_on+0x185/0x260 + ? _raw_spin_unlock_irqrestore+0x52/0x60 + ? trace_hardirqs_on+0x24/0x130 + ? preempt_count_sub+0x13/0xc0 + ? _raw_spin_unlock_irqrestore+0x3d/0x60 + pci_device_probe+0x154/0x1e0 + really_probe+0x17d/0x540 + ? device_driver_attach+0x90/0x90 + driver_probe_device+0x113/0x170 + ? device_driver_attach+0x90/0x90 + device_driver_attach+0x88/0x90 + __driver_attach+0xb5/0x190 + bus_for_each_dev+0xf8/0x160 + ? subsys_dev_iter_exit+0x10/0x10 + ? kasan_check_read+0x11/0x20 + ? preempt_count_sub+0x13/0xc0 + ? _raw_spin_unlock+0x2c/0x50 + driver_attach+0x26/0x30 + bus_add_driver+0x238/0x2f0 + driver_register+0xd7/0x150 + __pci_register_driver+0xd5/0xe0 + ? 0xffffffffa06c8000 + qla2x00_module_init+0x208/0x254 [qla2xxx] + do_one_initcall+0xc0/0x3c9 + ? trace_event_raw_event_initcall_finish+0x150/0x150 + ? __kasan_kmalloc.constprop.5+0xc7/0xd0 + ? kasan_unpoison_shadow+0x35/0x50 + ? kasan_poison_shadow+0x2f/0x40 + ? __asan_register_globals+0x5a/0x70 + do_init_module+0x103/0x330 + load_module+0x36df/0x3b70 + ? fsnotify+0x611/0x640 + ? module_frob_arch_sections+0x20/0x20 + ? kernel_read+0x74/0xa0 + ? kasan_check_write+0x14/0x20 + ? kernel_read_file+0x25e/0x320 + ? do_mmap+0x42c/0x6c0 + __do_sys_finit_module+0x133/0x1c0 + ? __do_sys_finit_module+0x133/0x1c0 + ? __do_sys_init_module+0x210/0x210 + ? fput_many+0x1b/0xc0 + ? fput+0xe/0x10 + ? do_syscall_64+0x14/0x210 + ? entry_SYSCALL_64_after_hwframe+0x49/0xbe + __x64_sys_finit_module+0x3e/0x50 + do_syscall_64+0x72/0x210 + entry_SYSCALL_64_after_hwframe+0x49/0xbe +RIP: 0033:0x7f8bd5c03219 +Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 47 fc 0c 00 f7 d8 64 89 01 48 +RSP: 002b:00007fff9d11de98 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 +RAX: ffffffffffffffda RBX: 000055ef21596b50 RCX: 00007f8bd5c03219 +RDX: 0000000000000000 RSI: 000055ef21596570 RDI: 0000000000000004 +RBP: 000055ef21596570 R08: 0000000000000000 R09: 0000000000000000 +R10: 0000000000000004 R11: 0000000000000246 R12: 0000000000000000 +R13: 000055ef21596c80 R14: 0000000000040000 R15: 000055ef21596b50 + +Allocated by task 857: + save_stack+0x43/0xd0 + __kasan_kmalloc.constprop.5+0xc7/0xd0 + kasan_kmalloc+0x9/0x10 + kmem_cache_alloc_trace+0x144/0x300 + dma_pool_create+0xb5/0x3b0 + qla2x00_mem_alloc+0xb98/0x1ad0 [qla2xxx] + qla2x00_probe_one+0xe28/0x45f0 [qla2xxx] + pci_device_probe+0x154/0x1e0 + really_probe+0x17d/0x540 + driver_probe_device+0x113/0x170 + device_driver_attach+0x88/0x90 + __driver_attach+0xb5/0x190 + bus_for_each_dev+0xf8/0x160 + driver_attach+0x26/0x30 + bus_add_driver+0x238/0x2f0 + driver_register+0xd7/0x150 + __pci_register_driver+0xd5/0xe0 + qla2x00_module_init+0x208/0x254 [qla2xxx] + do_one_initcall+0xc0/0x3c9 + do_init_module+0x103/0x330 + load_module+0x36df/0x3b70 + __do_sys_finit_module+0x133/0x1c0 + __x64_sys_finit_module+0x3e/0x50 + do_syscall_64+0x72/0x210 + entry_SYSCALL_64_after_hwframe+0x49/0xbe + +Freed by task 857: + save_stack+0x43/0xd0 + __kasan_slab_free+0x139/0x190 + kasan_slab_free+0xe/0x10 + kfree+0xf0/0x2c0 + dma_pool_destroy+0x24c/0x260 + qla2x00_mem_free+0x529/0xcc0 [qla2xxx] + qla2x00_free_device+0x167/0x1b0 [qla2xxx] + qla2x00_probe_one+0x2b28/0x45f0 [qla2xxx] + pci_device_probe+0x154/0x1e0 + really_probe+0x17d/0x540 + driver_probe_device+0x113/0x170 + device_driver_attach+0x88/0x90 + __driver_attach+0xb5/0x190 + bus_for_each_dev+0xf8/0x160 + driver_attach+0x26/0x30 + bus_add_driver+0x238/0x2f0 + driver_register+0xd7/0x150 + __pci_register_driver+0xd5/0xe0 + qla2x00_module_init+0x208/0x254 [qla2xxx] + do_one_initcall+0xc0/0x3c9 + do_init_module+0x103/0x330 + load_module+0x36df/0x3b70 + __do_sys_finit_module+0x133/0x1c0 + __x64_sys_finit_module+0x3e/0x50 + do_syscall_64+0x72/0x210 + entry_SYSCALL_64_after_hwframe+0x49/0xbe + +The buggy address belongs to the object at ffff8880ca05a400 + which belongs to the cache kmalloc-192 of size 192 +The buggy address is located 144 bytes inside of + 192-byte region [ffff8880ca05a400, ffff8880ca05a4c0) +The buggy address belongs to the page: +page:ffffea0003281680 count:1 mapcount:0 mapping:ffff88811bf03380 index:0x0 compound_mapcount: 0 +flags: 0x4000000000010200(slab|head) +raw: 4000000000010200 0000000000000000 0000000c00000001 ffff88811bf03380 +raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000 +page dumped because: kasan: bad access detected + +Memory state around the buggy address: + ffff8880ca05a380: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc + ffff8880ca05a400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb +>ffff8880ca05a480: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc + ^ + ffff8880ca05a500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + ffff8880ca05a580: 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc +================================================================== + +Fixes: f8f97b0c5b7f ("scsi: qla2xxx: Cleanups for NVRAM/Flash read/write path") +Reported-by: Bart Van Assche +Tested-by: Bart Van Assche +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 1710ac17547ac8b5c44fbd74de41dee3fe26ee81) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek + +Conflicts: + drivers/scsi/qla2xxx/qla_init.c +--- + drivers/scsi/qla2xxx/qla_init.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 15085251f59f..0e8826599c65 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -7727,8 +7727,6 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, + + dcode = fwdt->template; + qla24xx_read_flash_data(vha, dcode, faddr, risc_size); +- for (i = 0; i < risc_size; i++) +- dcode[i] = le32_to_cpu(dcode[i]); + + if (!qla27xx_fwdt_template_valid(dcode)) { + ql_log(ql_log_warn, vha, 0x0165, +@@ -7894,22 +7892,11 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + } + + fwcode = (void *)blob->fw->data; +- dcode = fwcode + 4; ++ dcode = fwcode; + if (qla24xx_risc_firmware_invalid(dcode)) { + ql_log(ql_log_fatal, vha, 0x0093, + "Unable to verify integrity of firmware image (%Zd).\n", + blob->fw->size); +- return QLA_FUNCTION_FAILED; +- } +- for (i = 0; i < 4; i++) +- dcode[i] = be32_to_cpu(fwcode[i + 4]); +- if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff && +- dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) || +- (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 && +- dcode[3] == 0)) { +- ql_log(ql_log_fatal, vha, 0x0094, +- "Unable to verify integrity of firmware image (%Zd).\n", +- blob->fw->size); + ql_log(ql_log_fatal, vha, 0x0095, + "Firmware data: %08x %08x %08x %08x.\n", + dcode[0], dcode[1], dcode[2], dcode[3]); +@@ -7932,7 +7919,6 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) + + dlen = ha->fw_transfer_size >> 2; + for (fragment = 0; risc_size; fragment++) { +- dlen = (uint32_t)(ha->fw_transfer_size >> 2); + if (dlen > risc_size) + dlen = risc_size; + +-- +2.13.6 + diff --git a/SOURCES/0077-scsi-scsi-qla2xxx-Update-two-source-code-comments.patch b/SOURCES/0077-scsi-scsi-qla2xxx-Update-two-source-code-comments.patch new file mode 100644 index 0000000..77410f1 --- /dev/null +++ b/SOURCES/0077-scsi-scsi-qla2xxx-Update-two-source-code-comments.patch @@ -0,0 +1,64 @@ +From 99897294c4e617c6751e49a60074f9ead2517ef1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:37 -0400 +Subject: [PATCH 077/124] [scsi] scsi: qla2xxx: Update two source code comments + +Message-id: <20190801155618.12650-78-hmadhani@redhat.com> +Patchwork-id: 267853 +O-Subject: [RHEL 7.8 e-stor PATCH 077/118] scsi: qla2xxx: Update two source code comments +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Change one occurrence of "*(" into "()" and change one occurrence of +"lcoate" into "locate". Fix the reference to qla_tgt_handle_cmd_for_atio(): +there has never been a function with that name. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Fixes: 75f8c1f693ee ("[SCSI] tcm_qla2xxx: Add >= 24xx series fabric module for target-core") # v3.5. +Fixes: 2d70c103fd2a ("[SCSI] qla2xxx: Add LLD target-mode infrastructure for >= 24xx series") # v3.5. +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 67eb4a60782a0e1142a3789fbb49617bbbe32796) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 2 +- + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index a7ded20abf14..308aa315f099 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -4243,7 +4243,7 @@ static void __qlt_do_work(struct qla_tgt_cmd *cmd) + if (ret != 0) + goto out_term; + /* +- * Drop extra session reference from qla_tgt_handle_cmd_for_atio*( ++ * Drop extra session reference from qlt_handle_cmd_for_atio(). + */ + spin_lock_irqsave(&ha->tgt.sess_lock, flags); + ha->tgt.tgt_ops->put_sess(sess); +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +index d61d02cd3f86..1122340cc2ac 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -1503,7 +1503,7 @@ static int tcm_qla2xxx_check_initiator_node_acl( + */ + tpg = lport->tpg_1; + if (!tpg) { +- pr_err("Unable to lcoate struct tcm_qla2xxx_lport->tpg_1\n"); ++ pr_err("Unable to locate struct tcm_qla2xxx_lport->tpg_1\n"); + return -EINVAL; + } + se_tpg = &tpg->se_tpg; +-- +2.13.6 + diff --git a/SOURCES/0078-scsi-scsi-qla2xxx-Fix-a-format-specifier.patch b/SOURCES/0078-scsi-scsi-qla2xxx-Fix-a-format-specifier.patch new file mode 100644 index 0000000..9dea9ed --- /dev/null +++ b/SOURCES/0078-scsi-scsi-qla2xxx-Fix-a-format-specifier.patch @@ -0,0 +1,48 @@ +From 7546efb64ab2e654d61b33bcd62002950243a62a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:38 -0400 +Subject: [PATCH 078/124] [scsi] scsi: qla2xxx: Fix a format specifier + +Message-id: <20190801155618.12650-79-hmadhani@redhat.com> +Patchwork-id: 267856 +O-Subject: [RHEL 7.8 e-stor PATCH 078/118] scsi: qla2xxx: Fix a format specifier +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since mcmd->sess->port_name is eight bytes long, use %8phC to format that +port name instead of %phC. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery") # v4.11. +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 19ce192cd718e02f880197c0983404ca48236807) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 308aa315f099..eaa32f5e7d19 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -2386,7 +2386,7 @@ void qlt_xmit_tm_rsp(struct qla_tgt_mgmt_cmd *mcmd) + mcmd->orig_iocb.imm_ntfy.u.isp24.status_subcode == + ELS_TPRLO) { + ql_dbg(ql_dbg_disc, vha, 0x2106, +- "TM response logo %phC status %#x state %#x", ++ "TM response logo %8phC status %#x state %#x", + mcmd->sess->port_name, mcmd->fc_tm_rsp, + mcmd->flags); + qlt_schedule_sess_for_deletion(mcmd->sess); +-- +2.13.6 + diff --git a/SOURCES/0079-scsi-scsi-qla2xxx-Move-qla2x00_set_reserved_loop_ids.patch b/SOURCES/0079-scsi-scsi-qla2xxx-Move-qla2x00_set_reserved_loop_ids.patch new file mode 100644 index 0000000..88f0e9e --- /dev/null +++ b/SOURCES/0079-scsi-scsi-qla2xxx-Move-qla2x00_set_reserved_loop_ids.patch @@ -0,0 +1,85 @@ +From 75d6abe137209168d1011e00454d44f3f00b5057 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:39 -0400 +Subject: [PATCH 079/124] [scsi] scsi: qla2xxx: Move + qla2x00_set_reserved_loop_ids() definition + +Message-id: <20190801155618.12650-80-hmadhani@redhat.com> +Patchwork-id: 267860 +O-Subject: [RHEL 7.8 e-stor PATCH 079/118] scsi: qla2xxx: Move qla2x00_set_reserved_loop_ids() definition +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since qla2x00_set_reserved_loop_ids() only has a single caller, move it +into the source file from where it is called. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0e145a595d4113caee8c1d9d3345781567c43826) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_inline.h | 14 -------------- + drivers/scsi/qla2xxx/qla_os.c | 13 +++++++++++++ + 2 files changed, 13 insertions(+), 14 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index f3c3ddc94eec..888f43a1afc9 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -90,20 +90,6 @@ host_to_adap(uint8_t *src, uint8_t *dst, uint32_t bsize) + *odest++ = cpu_to_le32(*isrc); + } + +-static inline void +-qla2x00_set_reserved_loop_ids(struct qla_hw_data *ha) +-{ +- int i; +- +- if (IS_FWI2_CAPABLE(ha)) +- return; +- +- for (i = 0; i < SNS_FIRST_LOOP_ID; i++) +- set_bit(i, ha->loop_id_map); +- set_bit(MANAGEMENT_SERVER, ha->loop_id_map); +- set_bit(BROADCAST, ha->loop_id_map); +-} +- + static inline int + qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) + { +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 57ca13874045..d85dd97a883a 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4110,6 +4110,19 @@ qla2x00_mark_all_devices_lost(scsi_qla_host_t *vha, int defer) + } + } + ++static void qla2x00_set_reserved_loop_ids(struct qla_hw_data *ha) ++{ ++ int i; ++ ++ if (IS_FWI2_CAPABLE(ha)) ++ return; ++ ++ for (i = 0; i < SNS_FIRST_LOOP_ID; i++) ++ set_bit(i, ha->loop_id_map); ++ set_bit(MANAGEMENT_SERVER, ha->loop_id_map); ++ set_bit(BROADCAST, ha->loop_id_map); ++} ++ + /* + * qla2x00_mem_alloc + * Allocates adapter memory. +-- +2.13.6 + diff --git a/SOURCES/0080-scsi-scsi-qla2xxx-Declare-qla2x00_find_new_loop_id-s.patch b/SOURCES/0080-scsi-scsi-qla2xxx-Declare-qla2x00_find_new_loop_id-s.patch new file mode 100644 index 0000000..12324cb --- /dev/null +++ b/SOURCES/0080-scsi-scsi-qla2xxx-Declare-qla2x00_find_new_loop_id-s.patch @@ -0,0 +1,161 @@ +From fc061b83075a164fbfb5767572f92bc9db37f80d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:40 -0400 +Subject: [PATCH 080/124] [scsi] scsi: qla2xxx: Declare + qla2x00_find_new_loop_id() static + +Message-id: <20190801155618.12650-81-hmadhani@redhat.com> +Patchwork-id: 267857 +O-Subject: [RHEL 7.8 e-stor PATCH 080/118] scsi: qla2xxx: Declare qla2x00_find_new_loop_id() static +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since all qla2x00_find_new_loop_id() calls occur in the same source file as +the definition of this function, move that function to just before its +first caller and declare it static. Convert the header above this function +into kernel-doc format. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 94f5b9167e902bf7f30ef09fc02a74a71498ffee) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 2 - + drivers/scsi/qla2xxx/qla_init.c | 92 +++++++++++++++++++---------------------- + 2 files changed, 43 insertions(+), 51 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index b98ec6d92720..78d27d384ce6 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -39,8 +39,6 @@ extern int qla81xx_load_risc(scsi_qla_host_t *, uint32_t *); + extern int qla2x00_perform_loop_resync(scsi_qla_host_t *); + extern int qla2x00_loop_resync(scsi_qla_host_t *); + +-extern int qla2x00_find_new_loop_id(scsi_qla_host_t *, fc_port_t *); +- + extern int qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *); + extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *); + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 0e8826599c65..99a1dfcc25b7 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -514,6 +514,49 @@ done: + return rval; + } + ++/** ++ * qla2x00_find_new_loop_id - scan through our port list and find a new usable loop ID ++ * @vha: adapter state pointer. ++ * @dev: port structure pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) ++{ ++ int rval; ++ struct qla_hw_data *ha = vha->hw; ++ unsigned long flags = 0; ++ ++ rval = QLA_SUCCESS; ++ ++ spin_lock_irqsave(&ha->vport_slock, flags); ++ ++ dev->loop_id = find_first_zero_bit(ha->loop_id_map, LOOPID_MAP_SIZE); ++ if (dev->loop_id >= LOOPID_MAP_SIZE || ++ qla2x00_is_reserved_id(vha, dev->loop_id)) { ++ dev->loop_id = FC_NO_LOOP_ID; ++ rval = QLA_FUNCTION_FAILED; ++ } else { ++ set_bit(dev->loop_id, ha->loop_id_map); ++ } ++ spin_unlock_irqrestore(&ha->vport_slock, flags); ++ ++ if (rval == QLA_SUCCESS) ++ ql_dbg(ql_dbg_disc, dev->vha, 0x2086, ++ "Assigning new loopid=%x, portid=%x.\n", ++ dev->loop_id, dev->d_id.b24); ++ else ++ ql_log(ql_log_warn, dev->vha, 0x2087, ++ "No loop_id's available, portid=%x.\n", ++ dev->d_id.b24); ++ ++ return rval; ++} ++ + static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + struct event_arg *ea) + { +@@ -5893,55 +5936,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha) + return (rval); + } + +-/* +- * qla2x00_find_new_loop_id +- * Scan through our port list and find a new usable loop ID. +- * +- * Input: +- * ha: adapter state pointer. +- * dev: port structure pointer. +- * +- * Returns: +- * qla2x00 local function return status code. +- * +- * Context: +- * Kernel context. +- */ +-int +-qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) +-{ +- int rval; +- struct qla_hw_data *ha = vha->hw; +- unsigned long flags = 0; +- +- rval = QLA_SUCCESS; +- +- spin_lock_irqsave(&ha->vport_slock, flags); +- +- dev->loop_id = find_first_zero_bit(ha->loop_id_map, +- LOOPID_MAP_SIZE); +- if (dev->loop_id >= LOOPID_MAP_SIZE || +- qla2x00_is_reserved_id(vha, dev->loop_id)) { +- dev->loop_id = FC_NO_LOOP_ID; +- rval = QLA_FUNCTION_FAILED; +- } else +- set_bit(dev->loop_id, ha->loop_id_map); +- +- spin_unlock_irqrestore(&ha->vport_slock, flags); +- +- if (rval == QLA_SUCCESS) +- ql_dbg(ql_dbg_disc, dev->vha, 0x2086, +- "Assigning new loopid=%x, portid=%x.\n", +- dev->loop_id, dev->d_id.b24); +- else +- ql_log(ql_log_warn, dev->vha, 0x2087, +- "No loop_id's available, portid=%x.\n", +- dev->d_id.b24); +- +- return (rval); +-} +- +- + /* FW does not set aside Loop id for MGMT Server/FFFFFAh */ + int + qla2x00_reserve_mgmt_server_loop_id(scsi_qla_host_t *vha) +-- +2.13.6 + diff --git a/SOURCES/0081-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch b/SOURCES/0081-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch new file mode 100644 index 0000000..3c440e0 --- /dev/null +++ b/SOURCES/0081-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch @@ -0,0 +1,52 @@ +From 55a16a2dafb7ae62943b6ab88e19bcd0a41ecc4b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:41 -0400 +Subject: [PATCH 081/124] [scsi] scsi: qla2xxx: Remove a set-but-not-used + variable + +Message-id: <20190801155618.12650-82-hmadhani@redhat.com> +Patchwork-id: 267859 +O-Subject: [RHEL 7.8 e-stor PATCH 081/118] scsi: qla2xxx: Remove a set-but-not-used variable +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 6eaa5f9448a7e0fb6bfecf17f47ce9f186d1e264) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_iocb.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 7f0b3dd5d815..a1289b70a359 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -3044,7 +3044,6 @@ qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) + scsi_qla_host_t *vha = sp->vha; + struct qla_hw_data *ha = vha->hw; + struct fc_bsg_job *bsg_job = sp->u.bsg_job; +- int loop_iterartion = 0; + int entry_count = 1; + + memset(ct_iocb, 0, sizeof(ms_iocb_entry_t)); +@@ -3102,7 +3101,6 @@ qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) + *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); + *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); + *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); +- loop_iterartion++; + avail_dsds--; + } + ct_iocb->entry_count = entry_count; +-- +2.13.6 + diff --git a/SOURCES/0082-scsi-scsi-qla2xxx-Move-qla2x00_clear_loop_id-from-ql.patch b/SOURCES/0082-scsi-scsi-qla2xxx-Move-qla2x00_clear_loop_id-from-ql.patch new file mode 100644 index 0000000..3fb8bec --- /dev/null +++ b/SOURCES/0082-scsi-scsi-qla2xxx-Move-qla2x00_clear_loop_id-from-ql.patch @@ -0,0 +1,94 @@ +From d9bdbb07bc1e569e7e8ea99a1694a3f35cc1c985 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:42 -0400 +Subject: [PATCH 082/124] [scsi] scsi: qla2xxx: Move qla2x00_clear_loop_id() + from qla_inline.h into qla_init.c + +Message-id: <20190801155618.12650-83-hmadhani@redhat.com> +Patchwork-id: 267863 +O-Subject: [RHEL 7.8 e-stor PATCH 082/118] scsi: qla2xxx: Move qla2x00_clear_loop_id() from qla_inline.h into qla_init.c +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since qla2x00_clear_loop_id() is not in the hot path, uninline it. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit ef1eb688b86ca3052131e8dc3ae85edb9fdca4a3) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 12 ++++++++++++ + drivers/scsi/qla2xxx/qla_inline.h | 12 ------------ + 3 files changed, 13 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 78d27d384ce6..27193f858ca2 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -38,6 +38,7 @@ extern int qla81xx_load_risc(scsi_qla_host_t *, uint32_t *); + + extern int qla2x00_perform_loop_resync(scsi_qla_host_t *); + extern int qla2x00_loop_resync(scsi_qla_host_t *); ++extern void qla2x00_clear_loop_id(fc_port_t *fcport); + + extern int qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *); + extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *); +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 99a1dfcc25b7..3e6fec211fd9 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -557,6 +557,18 @@ static int qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) + return rval; + } + ++void qla2x00_clear_loop_id(fc_port_t *fcport) ++{ ++ struct qla_hw_data *ha = fcport->vha->hw; ++ ++ if (fcport->loop_id == FC_NO_LOOP_ID || ++ qla2x00_is_reserved_id(fcport->vha, fcport->loop_id)) ++ return; ++ ++ clear_bit(fcport->loop_id, ha->loop_id_map); ++ fcport->loop_id = FC_NO_LOOP_ID; ++} ++ + static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + struct event_arg *ea) + { +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index 888f43a1afc9..412a5f2063a5 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -102,18 +102,6 @@ qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) + } + + static inline void +-qla2x00_clear_loop_id(fc_port_t *fcport) { +- struct qla_hw_data *ha = fcport->vha->hw; +- +- if (fcport->loop_id == FC_NO_LOOP_ID || +- qla2x00_is_reserved_id(fcport->vha, fcport->loop_id)) +- return; +- +- clear_bit(fcport->loop_id, ha->loop_id_map); +- fcport->loop_id = FC_NO_LOOP_ID; +-} +- +-static inline void + qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx) + { + struct dsd_dma *dsd, *tdsd; +-- +2.13.6 + diff --git a/SOURCES/0083-scsi-scsi-qla2xxx-Move-qla2x00_is_reserved_id-from-q.patch b/SOURCES/0083-scsi-scsi-qla2xxx-Move-qla2x00_is_reserved_id-from-q.patch new file mode 100644 index 0000000..29be8d7 --- /dev/null +++ b/SOURCES/0083-scsi-scsi-qla2xxx-Move-qla2x00_is_reserved_id-from-q.patch @@ -0,0 +1,81 @@ +From 01845ff985ace691ac7a05a59e51806ab8774b53 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:43 -0400 +Subject: [PATCH 083/124] [scsi] scsi: qla2xxx: Move qla2x00_is_reserved_id() + from qla_inline.h into qla_init.c + +Message-id: <20190801155618.12650-84-hmadhani@redhat.com> +Patchwork-id: 267866 +O-Subject: [RHEL 7.8 e-stor PATCH 083/118] scsi: qla2xxx: Move qla2x00_is_reserved_id() from qla_inline.h into qla_init.c +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +The previous patch moved all qla2x00_is_reserved_id() callers into +qla_init.c. Hence also move the qla2x00_is_reserved_id() definition into +qla_init.c. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0c6660b27feb9034fc7c9f85ec2fb6cc2395b49d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 11 +++++++++++ + drivers/scsi/qla2xxx/qla_inline.h | 11 ----------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 3e6fec211fd9..75a8ebe57e54 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -514,6 +514,17 @@ done: + return rval; + } + ++static bool qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) ++{ ++ struct qla_hw_data *ha = vha->hw; ++ ++ if (IS_FWI2_CAPABLE(ha)) ++ return loop_id > NPH_LAST_HANDLE; ++ ++ return (loop_id > ha->max_loop_id && loop_id < SNS_FIRST_LOOP_ID) || ++ loop_id == MANAGEMENT_SERVER || loop_id == BROADCAST; ++} ++ + /** + * qla2x00_find_new_loop_id - scan through our port list and find a new usable loop ID + * @vha: adapter state pointer. +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index 412a5f2063a5..a3bd72ad0def 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -90,17 +90,6 @@ host_to_adap(uint8_t *src, uint8_t *dst, uint32_t bsize) + *odest++ = cpu_to_le32(*isrc); + } + +-static inline int +-qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) +-{ +- struct qla_hw_data *ha = vha->hw; +- if (IS_FWI2_CAPABLE(ha)) +- return (loop_id > NPH_LAST_HANDLE); +- +- return ((loop_id > ha->max_loop_id && loop_id < SNS_FIRST_LOOP_ID) || +- loop_id == MANAGEMENT_SERVER || loop_id == BROADCAST); +-} +- + static inline void + qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx) + { +-- +2.13.6 + diff --git a/SOURCES/0084-scsi-scsi-qla2xxx-Remove-the-fcport-test-from-qla_nv.patch b/SOURCES/0084-scsi-scsi-qla2xxx-Remove-the-fcport-test-from-qla_nv.patch new file mode 100644 index 0000000..bec79fc --- /dev/null +++ b/SOURCES/0084-scsi-scsi-qla2xxx-Remove-the-fcport-test-from-qla_nv.patch @@ -0,0 +1,53 @@ +From 60d8d6c625b733097207b69fa67f0d4173c158e4 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:44 -0400 +Subject: [PATCH 084/124] [scsi] scsi: qla2xxx: Remove the fcport test from + qla_nvme_abort_work() + +Message-id: <20190801155618.12650-85-hmadhani@redhat.com> +Patchwork-id: 267858 +O-Subject: [RHEL 7.8 e-stor PATCH 084/118] scsi: qla2xxx: Remove the fcport test from qla_nvme_abort_work() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Testing whether a pointer is not NULL after it has been dereferenced is not +useful. Hence remove the if (fcport) test. This was detected by Coverity. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit dafbe56f6e338c7f583a524c714942f892c1f50a) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 6bf61f82a011..73d6b7833830 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -186,10 +186,9 @@ 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, 0xffff, +- "%s called for sp=%p, hndl=%x on fcport=%p deleted=%d\n", +- __func__, sp, sp->handle, fcport, fcport->deleted); ++ ql_dbg(ql_dbg_io, fcport->vha, 0xffff, ++ "%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; +-- +2.13.6 + diff --git a/SOURCES/0085-scsi-scsi-qla2xxx-NULL-check-before-some-freeing-fun.patch b/SOURCES/0085-scsi-scsi-qla2xxx-NULL-check-before-some-freeing-fun.patch new file mode 100644 index 0000000..75c572e --- /dev/null +++ b/SOURCES/0085-scsi-scsi-qla2xxx-NULL-check-before-some-freeing-fun.patch @@ -0,0 +1,99 @@ +From c3beeeba12adf40609862b3ec075fb9289d59bd1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:45 -0400 +Subject: [PATCH 085/124] [scsi] scsi: qla2xxx: NULL check before some freeing + functions is not needed + +Message-id: <20190801155618.12650-86-hmadhani@redhat.com> +Patchwork-id: 267864 +O-Subject: [RHEL 7.8 e-stor PATCH 085/118] scsi: qla2xxx: NULL check before some freeing functions is not needed +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Thomas Meyer + +Bugzilla 1729270 + +NULL check before some freeing functions is not needed. + +Signed-off-by: Thomas Meyer +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 75c1d48a338bdf3ce850166be527598017e0ebca) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 24 ++++++++---------------- + 1 file changed, 8 insertions(+), 16 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index d85dd97a883a..326c0e6588de 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4493,12 +4493,10 @@ fail_free_nvram: + kfree(ha->nvram); + ha->nvram = NULL; + fail_free_ctx_mempool: +- if (ha->ctx_mempool) +- mempool_destroy(ha->ctx_mempool); ++ mempool_destroy(ha->ctx_mempool); + ha->ctx_mempool = NULL; + fail_free_srb_mempool: +- if (ha->srb_mempool) +- mempool_destroy(ha->srb_mempool); ++ mempool_destroy(ha->srb_mempool); + ha->srb_mempool = NULL; + fail_free_gid_list: + dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), +@@ -4806,8 +4804,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) + dma_free_coherent(&ha->pdev->dev, MCTP_DUMP_SIZE, ha->mctp_dump, + ha->mctp_dump_dma); + +- if (ha->srb_mempool) +- mempool_destroy(ha->srb_mempool); ++ mempool_destroy(ha->srb_mempool); + + if (ha->dcbx_tlv) + dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, +@@ -4843,8 +4840,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) + if (ha->async_pd) + dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma); + +- if (ha->s_dma_pool) +- dma_pool_destroy(ha->s_dma_pool); ++ dma_pool_destroy(ha->s_dma_pool); + + if (ha->gid_list) + dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), +@@ -4865,14 +4861,11 @@ qla2x00_mem_free(struct qla_hw_data *ha) + } + } + +- if (ha->dl_dma_pool) +- dma_pool_destroy(ha->dl_dma_pool); ++ dma_pool_destroy(ha->dl_dma_pool); + +- if (ha->fcp_cmnd_dma_pool) +- dma_pool_destroy(ha->fcp_cmnd_dma_pool); ++ dma_pool_destroy(ha->fcp_cmnd_dma_pool); + +- if (ha->ctx_mempool) +- mempool_destroy(ha->ctx_mempool); ++ mempool_destroy(ha->ctx_mempool); + + if (ql2xenabledif) { + struct dsd_dma *dsd, *nxt; +@@ -7467,8 +7460,7 @@ qla2x00_module_exit(void) + qla2x00_release_firmware(); + kmem_cache_destroy(srb_cachep); + qlt_exit(); +- if (ctx_cachep) +- kmem_cache_destroy(ctx_cachep); ++ kmem_cache_destroy(ctx_cachep); + fc_release_transport(qla2xxx_transport_template); + fc_release_transport(qla2xxx_transport_vport_template); + } +-- +2.13.6 + diff --git a/SOURCES/0086-scsi-scsi-qla2xxx-Make-qla2x00_mem_free-easier-to-ve.patch b/SOURCES/0086-scsi-scsi-qla2xxx-Make-qla2x00_mem_free-easier-to-ve.patch new file mode 100644 index 0000000..062413a --- /dev/null +++ b/SOURCES/0086-scsi-scsi-qla2xxx-Make-qla2x00_mem_free-easier-to-ve.patch @@ -0,0 +1,191 @@ +From 36ba69d80d0c4b30cdd9dec197a30d72451ece4d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:46 -0400 +Subject: [PATCH 086/124] [scsi] scsi: qla2xxx: Make qla2x00_mem_free() easier + to verify + +Message-id: <20190801155618.12650-87-hmadhani@redhat.com> +Patchwork-id: 267861 +O-Subject: [RHEL 7.8 e-stor PATCH 086/118] scsi: qla2xxx: Make qla2x00_mem_free() easier to verify +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Instead of clearing all freed pointers at the end of qla2x00_mem_free(), +clear freed pointers immediately after having freed the memory these +pointers point at. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5365bf99e360bf3c31f2d5ba8f20f60dd47f6a86) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 61 +++++++++++++++++---------------------- + drivers/scsi/qla2xxx/qla_target.c | 3 ++ + 2 files changed, 30 insertions(+), 34 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 326c0e6588de..43a109f3676c 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4803,28 +4803,37 @@ qla2x00_mem_free(struct qla_hw_data *ha) + if (ha->mctp_dump) + dma_free_coherent(&ha->pdev->dev, MCTP_DUMP_SIZE, ha->mctp_dump, + ha->mctp_dump_dma); ++ ha->mctp_dump = NULL; + + mempool_destroy(ha->srb_mempool); ++ ha->srb_mempool = NULL; + + if (ha->dcbx_tlv) + dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, + ha->dcbx_tlv, ha->dcbx_tlv_dma); ++ ha->dcbx_tlv = NULL; + + if (ha->xgmac_data) + dma_free_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE, + ha->xgmac_data, ha->xgmac_data_dma); ++ ha->xgmac_data = NULL; + + if (ha->sns_cmd) + dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt), + ha->sns_cmd, ha->sns_cmd_dma); ++ ha->sns_cmd = NULL; ++ ha->sns_cmd_dma = 0; + + if (ha->ct_sns) + dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt), + ha->ct_sns, ha->ct_sns_dma); ++ ha->ct_sns = NULL; ++ ha->ct_sns_dma = 0; + + if (ha->sfp_data) + dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ha->sfp_data, + ha->sfp_data_dma); ++ ha->sfp_data = NULL; + + if (ha->flt) + dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, +@@ -4832,19 +4841,28 @@ qla2x00_mem_free(struct qla_hw_data *ha) + + if (ha->ms_iocb) + dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); ++ ha->ms_iocb = NULL; ++ ha->ms_iocb_dma = 0; + + if (ha->ex_init_cb) + dma_pool_free(ha->s_dma_pool, + ha->ex_init_cb, ha->ex_init_cb_dma); ++ ha->ex_init_cb = NULL; ++ ha->ex_init_cb_dma = 0; + + if (ha->async_pd) + dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma); ++ ha->async_pd = NULL; ++ ha->async_pd_dma = 0; + + dma_pool_destroy(ha->s_dma_pool); ++ ha->s_dma_pool = NULL; + + if (ha->gid_list) + dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), + ha->gid_list, ha->gid_list_dma); ++ ha->gid_list = NULL; ++ ha->gid_list_dma = 0; + + if (IS_QLA82XX(ha)) { + if (!list_empty(&ha->gbl_dsd_list)) { +@@ -4862,10 +4880,13 @@ qla2x00_mem_free(struct qla_hw_data *ha) + } + + dma_pool_destroy(ha->dl_dma_pool); ++ ha->dl_dma_pool = NULL; + + dma_pool_destroy(ha->fcp_cmnd_dma_pool); ++ ha->fcp_cmnd_dma_pool = NULL; + + mempool_destroy(ha->ctx_mempool); ++ ha->ctx_mempool = NULL; + + if (ql2xenabledif) { + struct dsd_dma *dsd, *nxt; +@@ -4898,47 +4919,19 @@ qla2x00_mem_free(struct qla_hw_data *ha) + if (ha->init_cb) + dma_free_coherent(&ha->pdev->dev, ha->init_cb_size, + ha->init_cb, ha->init_cb_dma); ++ ha->init_cb = NULL; ++ ha->init_cb_dma = 0; + + vfree(ha->optrom_buffer); ++ ha->optrom_buffer = NULL; + kfree(ha->nvram); ++ ha->nvram = NULL; + kfree(ha->npiv_info); ++ ha->npiv_info = NULL; + kfree(ha->swl); ++ ha->swl = NULL; + kfree(ha->loop_id_map); +- +- ha->srb_mempool = NULL; +- ha->ctx_mempool = NULL; +- ha->sns_cmd = NULL; +- ha->sns_cmd_dma = 0; +- ha->ct_sns = NULL; +- ha->ct_sns_dma = 0; +- ha->ms_iocb = NULL; +- ha->ms_iocb_dma = 0; +- ha->init_cb = NULL; +- ha->init_cb_dma = 0; +- ha->ex_init_cb = NULL; +- ha->ex_init_cb_dma = 0; +- ha->async_pd = NULL; +- ha->async_pd_dma = 0; + ha->loop_id_map = NULL; +- ha->npiv_info = NULL; +- ha->optrom_buffer = NULL; +- ha->swl = NULL; +- ha->nvram = NULL; +- ha->mctp_dump = NULL; +- ha->dcbx_tlv = NULL; +- ha->xgmac_data = NULL; +- ha->sfp_data = NULL; +- +- ha->s_dma_pool = NULL; +- ha->dl_dma_pool = NULL; +- ha->fcp_cmnd_dma_pool = NULL; +- +- ha->gid_list = NULL; +- ha->gid_list_dma = 0; +- +- ha->tgt.atio_ring = NULL; +- ha->tgt.atio_dma = 0; +- ha->tgt.tgt_vp_map = NULL; + } + + struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index eaa32f5e7d19..204004431c3f 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -7320,7 +7320,10 @@ qlt_mem_free(struct qla_hw_data *ha) + sizeof(struct atio_from_isp), ha->tgt.atio_ring, + ha->tgt.atio_dma); + } ++ ha->tgt.atio_ring = NULL; ++ ha->tgt.atio_dma = 0; + kfree(ha->tgt.tgt_vp_map); ++ ha->tgt.tgt_vp_map = NULL; + } + + /* vport_slock to be held by the caller */ +-- +2.13.6 + diff --git a/SOURCES/0087-scsi-scsi-qla2xxx-Avoid-that-qla2x00_mem_free-crashe.patch b/SOURCES/0087-scsi-scsi-qla2xxx-Avoid-that-qla2x00_mem_free-crashe.patch new file mode 100644 index 0000000..d004544 --- /dev/null +++ b/SOURCES/0087-scsi-scsi-qla2xxx-Avoid-that-qla2x00_mem_free-crashe.patch @@ -0,0 +1,56 @@ +From a6d9fa818b1654d83699b14b2787fe41a0399468 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:47 -0400 +Subject: [PATCH 087/124] [scsi] scsi: qla2xxx: Avoid that qla2x00_mem_free() + crashes if called twice + +Message-id: <20190801155618.12650-88-hmadhani@redhat.com> +Patchwork-id: 267862 +O-Subject: [RHEL 7.8 e-stor PATCH 087/118] scsi: qla2xxx: Avoid that qla2x00_mem_free() crashes if called twice +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Clear each pointer after having freed memory such that it becomes safe to +call qla2x00_mem_free() twice. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit dc035d4e934e586a663cbef0cf7ea3900e12bb7d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 43a109f3676c..11fa33fde436 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4838,6 +4838,8 @@ qla2x00_mem_free(struct qla_hw_data *ha) + if (ha->flt) + dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, + ha->flt, ha->flt_dma); ++ ha->flt = NULL; ++ ha->flt_dma = 0; + + if (ha->ms_iocb) + dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); +@@ -4913,6 +4915,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) + + if (ha->dif_bundl_pool) + dma_pool_destroy(ha->dif_bundl_pool); ++ ha->dif_bundl_pool = NULL; + + qlt_mem_free(ha); + +-- +2.13.6 + diff --git a/SOURCES/0088-scsi-scsi-qla2xxx-Avoid-that-Coverity-complains-abou.patch b/SOURCES/0088-scsi-scsi-qla2xxx-Avoid-that-Coverity-complains-abou.patch new file mode 100644 index 0000000..f643a6a --- /dev/null +++ b/SOURCES/0088-scsi-scsi-qla2xxx-Avoid-that-Coverity-complains-abou.patch @@ -0,0 +1,60 @@ +From 025fc3a4d57c2e584da0ae1cbde5be3b558936db Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:48 -0400 +Subject: [PATCH 088/124] [scsi] scsi: qla2xxx: Avoid that Coverity complains + about dereferencing a NULL rport pointer + +Message-id: <20190801155618.12650-89-hmadhani@redhat.com> +Patchwork-id: 267865 +O-Subject: [RHEL 7.8 e-stor PATCH 088/118] scsi: qla2xxx: Avoid that Coverity complains about dereferencing a NULL rport pointer +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since Coverity cannot know that rport != NULL in qla2xxx_queuecommand() and +since there is code in that function that dereferences the rport pointer, +modify qla2xxx_queuecommand() such that it fails SCSI commands if rport == +NULL. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2dbb02fd495c9b2e41ba37d6fec2aa713d328788) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 11fa33fde436..83d06db7e9fa 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -906,7 +906,8 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) + uint32_t tag; + uint16_t hwq; + +- if (unlikely(test_bit(UNLOADING, &base_vha->dpc_flags))) { ++ if (unlikely(test_bit(UNLOADING, &base_vha->dpc_flags)) || ++ WARN_ON_ONCE(!rport)) { + cmd->result = DID_NO_CONNECT << 16; + goto qc24_fail_command; + } +@@ -1033,7 +1034,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + srb_t *sp; + int rval; + +- rval = fc_remote_port_chkready(rport); ++ rval = rport ? fc_remote_port_chkready(rport) : FC_PORTSTATE_OFFLINE; + if (rval) { + cmd->result = rval; + ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3076, +-- +2.13.6 + diff --git a/SOURCES/0089-scsi-scsi-qla2xxx-Log-the-status-code-if-a-firmware-.patch b/SOURCES/0089-scsi-scsi-qla2xxx-Log-the-status-code-if-a-firmware-.patch new file mode 100644 index 0000000..7824a56 --- /dev/null +++ b/SOURCES/0089-scsi-scsi-qla2xxx-Log-the-status-code-if-a-firmware-.patch @@ -0,0 +1,70 @@ +From 807b71a6bc9d9863c6ea45e6c04e25e1938b4bd5 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:49 -0400 +Subject: [PATCH 089/124] [scsi] scsi: qla2xxx: Log the status code if a + firmware command fails + +Message-id: <20190801155618.12650-90-hmadhani@redhat.com> +Patchwork-id: 267867 +O-Subject: [RHEL 7.8 e-stor PATCH 089/118] scsi: qla2xxx: Log the status code if a firmware command fails +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +It is important to know why a firmware command failed. Hence log 'rval' +together with the values of the mailbox registers if a firwmare command +fails. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 3f918ffae8e788d70e6488598d00e0bf717d7737) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_mbx.c | 4 ++-- + drivers/scsi/qla2xxx/qla_mr.c | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index ff660656dc4e..823fe8402b67 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -567,9 +567,9 @@ mbx_done: + mcp->mb[0]); + } else if (rval) { + if (ql2xextended_error_logging & (ql_dbg_disc|ql_dbg_mbx)) { +- pr_warn("%s [%s]-%04x:%ld: **** Failed", QL_MSGHDR, ++ pr_warn("%s [%s]-%04x:%ld: **** Failed=%x", QL_MSGHDR, + dev_name(&ha->pdev->dev), 0x1020+0x800, +- vha->host_no); ++ vha->host_no, rval); + mboxes = mcp->in_mb; + cnt = 4; + for (i = 0; i < ha->mbx_count && cnt; i++, mboxes >>= 1) +diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c +index ffe2a4887b07..815d22ff35f6 100644 +--- a/drivers/scsi/qla2xxx/qla_mr.c ++++ b/drivers/scsi/qla2xxx/qla_mr.c +@@ -271,9 +271,9 @@ premature_exit: + + if (rval) { + ql_log(ql_log_warn, base_vha, 0x1163, +- "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, " +- "mb[3]=%x, cmd=%x ****.\n", +- mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command); ++ "**** Failed=%x mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n", ++ rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], ++ command); + } else { + ql_dbg(ql_dbg_mbx, base_vha, 0x1164, "Done %s.\n", __func__); + } +-- +2.13.6 + diff --git a/SOURCES/0090-scsi-scsi-qla2xxx-Fix-a-qla24xx_enable_msix-error-pa.patch b/SOURCES/0090-scsi-scsi-qla2xxx-Fix-a-qla24xx_enable_msix-error-pa.patch new file mode 100644 index 0000000..858c4e0 --- /dev/null +++ b/SOURCES/0090-scsi-scsi-qla2xxx-Fix-a-qla24xx_enable_msix-error-pa.patch @@ -0,0 +1,59 @@ +From f750ece8349ad34a3b3b92d768fe74710e4d07cb Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:50 -0400 +Subject: [PATCH 090/124] [scsi] scsi: qla2xxx: Fix a qla24xx_enable_msix() + error path + +Message-id: <20190801155618.12650-91-hmadhani@redhat.com> +Patchwork-id: 267885 +O-Subject: [RHEL 7.8 e-stor PATCH 090/118] scsi: qla2xxx: Fix a qla24xx_enable_msix() error path +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Make sure that the allocated interrupts are freed if allocating memory for +the msix_entries array fails. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 24afabdbd0b3553963a2bbf465895492b14d1107) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_isr.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index f099a812e29f..7c58e04c5d70 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -3495,7 +3495,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) + ql_log(ql_log_fatal, vha, 0x00c8, + "Failed to allocate memory for ha->msix_entries.\n"); + ret = -ENOMEM; +- goto msix_out; ++ goto free_irqs; + } + ha->flags.msix_enabled = 1; + +@@ -3578,6 +3578,10 @@ msix_register_fail: + + msix_out: + return ret; ++ ++free_irqs: ++ pci_free_irq_vectors(ha->pdev); ++ goto msix_out; + } + + int +-- +2.13.6 + diff --git a/SOURCES/0091-scsi-scsi-qla2xxx-Fix-use-after-free-issues-in-qla2x.patch b/SOURCES/0091-scsi-scsi-qla2xxx-Fix-use-after-free-issues-in-qla2x.patch new file mode 100644 index 0000000..2226b67 --- /dev/null +++ b/SOURCES/0091-scsi-scsi-qla2xxx-Fix-use-after-free-issues-in-qla2x.patch @@ -0,0 +1,111 @@ +From 6e7fb2024250405d737e56985d6a86282f1175c4 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:51 -0400 +Subject: [PATCH 091/124] [scsi] scsi: qla2xxx: Fix use-after-free issues in + qla2xxx_qpair_sp_free_dma() + +Message-id: <20190801155618.12650-92-hmadhani@redhat.com> +Patchwork-id: 267868 +O-Subject: [RHEL 7.8 e-stor PATCH 091/118] scsi: qla2xxx: Fix use-after-free issues in qla2xxx_qpair_sp_free_dma() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +The current order for freeing memory is as follows: +- struct crc_context itself. +- struct crc_context member pointers. + +Change the freeing order into the following: +- struct crc_context member pointers. +- struct crc_context itself. + +Detected by Coverity. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Fixes: 50b812755e97 ("scsi: qla2xxx: Fix DMA error when the DIF sg buffer crosses 4GB boundary") # v5.1-rc1. +Fixes: d74595278f4a ("scsi: qla2xxx: Add multiple queue pair functionality.") # v4.10. +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit d8f945bf8096375f458683b5718722a2d5dda2f0) +Signed-off-by: Himanshu Madhani + +Conflicts: + drivers/scsi/qla2xxx/qla_os.c + +[ HM: RHEL7.8 kernel does not have wait_event_lock_irq_timeout() ] +[ commit 711a08d79f71 ("scsi: qla2xxx: Change abort wait_loop ] +[ from msleep to wait_event_timeout") was not pulled into src ] +[ resulting into deviation from upstream ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 38 ++++++++++++++++++++------------------ + 1 file changed, 20 insertions(+), 18 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 83d06db7e9fa..bc72d4802844 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -811,25 +811,8 @@ qla2xxx_qpair_sp_free_dma(void *ptr) + sp->flags &= ~SRB_CRC_CTX_DSD_VALID; + } + +- if (sp->flags & SRB_CRC_CTX_DMA_VALID) { +- struct crc_context *ctx0 = ctx; +- +- dma_pool_free(ha->dl_dma_pool, ctx, ctx0->crc_ctx_dma); +- sp->flags &= ~SRB_CRC_CTX_DMA_VALID; +- } +- +- if (sp->flags & SRB_FCP_CMND_DMA_VALID) { +- struct ct6_dsd *ctx1 = ctx; +- dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd, +- ctx1->fcp_cmnd_dma); +- list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list); +- ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt; +- ha->gbl_dsd_avail += ctx1->dsd_use_cnt; +- mempool_free(ctx1, ha->ctx_mempool); +- sp->flags &= ~SRB_FCP_CMND_DMA_VALID; +- } + if (sp->flags & SRB_DIF_BUNDL_DMA_VALID) { +- struct crc_context *difctx = sp->u.scmd.ctx; ++ struct crc_context *difctx = ctx; + struct dsd_dma *dif_dsd, *nxt_dsd; + + list_for_each_entry_safe(dif_dsd, nxt_dsd, +@@ -864,6 +847,25 @@ qla2xxx_qpair_sp_free_dma(void *ptr) + sp->flags &= ~SRB_DIF_BUNDL_DMA_VALID; + } + ++ if (sp->flags & SRB_FCP_CMND_DMA_VALID) { ++ struct ct6_dsd *ctx1 = ctx; ++ ++ dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd, ++ ctx1->fcp_cmnd_dma); ++ list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list); ++ ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt; ++ ha->gbl_dsd_avail += ctx1->dsd_use_cnt; ++ mempool_free(ctx1, ha->ctx_mempool); ++ sp->flags &= ~SRB_FCP_CMND_DMA_VALID; ++ } ++ ++ if (sp->flags & SRB_CRC_CTX_DMA_VALID) { ++ struct crc_context *ctx0 = ctx; ++ ++ dma_pool_free(ha->dl_dma_pool, ctx, ctx0->crc_ctx_dma); ++ sp->flags &= ~SRB_CRC_CTX_DMA_VALID; ++ } ++ + end: + CMD_SP(cmd) = NULL; + qla2xxx_rel_qpair_sp(sp->qpair, sp); +-- +2.13.6 + diff --git a/SOURCES/0092-scsi-scsi-qla2xxx-Pass-little-endian-values-to-the-f.patch b/SOURCES/0092-scsi-scsi-qla2xxx-Pass-little-endian-values-to-the-f.patch new file mode 100644 index 0000000..cab34a1 --- /dev/null +++ b/SOURCES/0092-scsi-scsi-qla2xxx-Pass-little-endian-values-to-the-f.patch @@ -0,0 +1,75 @@ +From 183c439f0708db00b85c027270edc61a850fb2f1 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:52 -0400 +Subject: [PATCH 092/124] [scsi] scsi: qla2xxx: Pass little-endian values to + the firmware + +Message-id: <20190801155618.12650-93-hmadhani@redhat.com> +Patchwork-id: 267869 +O-Subject: [RHEL 7.8 e-stor PATCH 092/118] scsi: qla2xxx: Pass little-endian values to the firmware +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Pass dsd_list_len in little endian format to the firmware instead of in CPU +endian format. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 6e73985a9dea627114531723bdae6f8c1f59d5e8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_iocb.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index a1289b70a359..4498cf78e156 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -976,7 +976,7 @@ alloc_and_fill: + /* add new list to cmd iocb or last list */ + *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); + *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = dsd_list_len; ++ *cur_dsd++ = cpu_to_le32(dsd_list_len); + cur_dsd = (uint32_t *)next_dsd; + } + *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); +@@ -1079,7 +1079,7 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, + /* add new list to cmd iocb or last list */ + *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); + *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = dsd_list_len; ++ *cur_dsd++ = cpu_to_le32(dsd_list_len); + cur_dsd = (uint32_t *)next_dsd; + } + sle_dma = sg_dma_address(sg); +@@ -1324,7 +1324,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, + cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); + *cur_dsd++ = + cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = dsd_list_len; ++ *cur_dsd++ = cpu_to_le32(dsd_list_len); + cur_dsd = dsd_ptr->dsd_addr; + } + *cur_dsd++ = cpu_to_le32(LSD(dif_dsd->dsd_list_dma)); +@@ -1385,7 +1385,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, + cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); + *cur_dsd++ = + cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); +- *cur_dsd++ = dsd_list_len; ++ *cur_dsd++ = cpu_to_le32(dsd_list_len); + cur_dsd = dsd_ptr->dsd_addr; + } + sle_dma = sg_dma_address(sg); +-- +2.13.6 + diff --git a/SOURCES/0093-scsi-scsi-qla2xxx-Check-the-size-of-firmware-data-st.patch b/SOURCES/0093-scsi-scsi-qla2xxx-Check-the-size-of-firmware-data-st.patch new file mode 100644 index 0000000..96266ca --- /dev/null +++ b/SOURCES/0093-scsi-scsi-qla2xxx-Check-the-size-of-firmware-data-st.patch @@ -0,0 +1,86 @@ +From a23950ba57e7e834f0ab5d689693e568e6ed29c9 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:53 -0400 +Subject: [PATCH 093/124] [scsi] scsi: qla2xxx: Check the size of firmware data + structures at compile time + +Message-id: <20190801155618.12650-94-hmadhani@redhat.com> +Patchwork-id: 267877 +O-Subject: [RHEL 7.8 e-stor PATCH 093/118] scsi: qla2xxx: Check the size of firmware data structures at compile time +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Since the next patch will modify several firmware data structures, add +compile time checks that verify that these structures have the correct +size. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit bc04459ce4e5d394d79fe2a0660d43c1a40b6eb8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 24 ++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_target.c | 3 +++ + 2 files changed, 27 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index bc72d4802844..bf0896af5ad3 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -7364,6 +7364,30 @@ qla2x00_module_init(void) + { + int ret = 0; + ++ BUILD_BUG_ON(sizeof(cmd_entry_t) != 64); ++ BUILD_BUG_ON(sizeof(cont_a64_entry_t) != 64); ++ BUILD_BUG_ON(sizeof(cont_entry_t) != 64); ++ BUILD_BUG_ON(sizeof(init_cb_t) != 96); ++ BUILD_BUG_ON(sizeof(ms_iocb_entry_t) != 64); ++ BUILD_BUG_ON(sizeof(request_t) != 64); ++ BUILD_BUG_ON(sizeof(struct access_chip_84xx) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_bidir) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_nvme) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_type_6) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_type_7) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_type_7_fx00) != 64); ++ BUILD_BUG_ON(sizeof(struct cmd_type_crc_2) != 64); ++ BUILD_BUG_ON(sizeof(struct ct_entry_24xx) != 64); ++ BUILD_BUG_ON(sizeof(struct ctio_crc2_to_fw) != 64); ++ BUILD_BUG_ON(sizeof(struct els_entry_24xx) != 64); ++ BUILD_BUG_ON(sizeof(struct fxdisc_entry_fx00) != 64); ++ BUILD_BUG_ON(sizeof(struct init_cb_24xx) != 128); ++ BUILD_BUG_ON(sizeof(struct init_cb_81xx) != 128); ++ BUILD_BUG_ON(sizeof(struct pt_ls4_request) != 64); ++ BUILD_BUG_ON(sizeof(struct sns_cmd_pkt) != 2064); ++ BUILD_BUG_ON(sizeof(struct verify_chip_entry_84xx) != 64); ++ BUILD_BUG_ON(sizeof(struct vf_evfp_entry_24xx) != 56); ++ + /* Allocate cache for SRBs. */ + srb_cachep = kmem_cache_create("qla2xxx_srbs", sizeof(srb_t), 0, + SLAB_HWCACHE_ALIGN, NULL); +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 204004431c3f..398a8d6b4db6 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -7407,6 +7407,9 @@ int __init qlt_init(void) + { + int ret; + ++ BUILD_BUG_ON(sizeof(struct ctio7_to_24xx) != 64); ++ BUILD_BUG_ON(sizeof(struct ctio_to_2xxx) != 64); ++ + if (!qlt_parse_ini_mode()) { + ql_log(ql_log_fatal, NULL, 0xe06b, + "qlt_parse_ini_mode() failed\n"); +-- +2.13.6 + diff --git a/SOURCES/0094-scsi-scsi-qla2xxx-Use-an-on-stack-completion-in-qla2.patch b/SOURCES/0094-scsi-scsi-qla2xxx-Use-an-on-stack-completion-in-qla2.patch new file mode 100644 index 0000000..34e330a --- /dev/null +++ b/SOURCES/0094-scsi-scsi-qla2xxx-Use-an-on-stack-completion-in-qla2.patch @@ -0,0 +1,113 @@ +From cfd10f094a0b2bd21d110009a83b5f46d9514fcd Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:54 -0400 +Subject: [PATCH 094/124] [scsi] scsi: qla2xxx: Use an on-stack completion in + qla24xx_control_vp() + +Message-id: <20190801155618.12650-95-hmadhani@redhat.com> +Patchwork-id: 267884 +O-Subject: [RHEL 7.8 e-stor PATCH 094/118] scsi: qla2xxx: Use an on-stack completion in qla24xx_control_vp() +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +This patch reduces the size of struct srb. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 982cc4be05d6d0d8b15b1340416737ad60bddcae) +Signed-off-by: Himanshu Madhani + +Conflicts: + drivers/scsi/qla2xxx/qla_def.h + drivers/scsi/qla2xxx/qla_iocb.c + +[ HM: Since RHEL78 code does not include commit ID 12975426d888 ] +[ ("scsi: qla2xxx: Uninline qla2x00_init_timer()") qla_iocb.c does ] +[ not include qla2x00_init_timer(). So init_completion() is removed ] +[ from qla_inline.h ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 2 +- + drivers/scsi/qla2xxx/qla_inline.h | 1 - + drivers/scsi/qla2xxx/qla_mid.c | 9 +++++++-- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 8ad107855ea1..e5e1081501a9 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -555,7 +555,7 @@ typedef struct srb { + u32 gen2; /* scratch */ + int rc; + int retry_count; +- struct completion comp; ++ struct completion *comp; + union { + struct srb_iocb iocb_cmd; + struct fc_bsg_job *bsg_job; +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index a3bd72ad0def..03fd0288ac03 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -227,7 +227,6 @@ qla2x00_init_timer(srb_t *sp, unsigned long tmo) + sp->u.iocb_cmd.timer.data = (unsigned long)sp; + sp->u.iocb_cmd.timer.function = qla2x00_sp_timeout; + sp->free = qla2x00_sp_free; +- init_completion(&sp->comp); + if (IS_QLAFX00(sp->vha->hw) && (sp->type == SRB_FXIOCB_DCMD)) + init_completion(&sp->u.iocb_cmd.u.fxiocb.fxiocb_comp); + add_timer(&sp->u.iocb_cmd.timer); +diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c +index c5f367fae270..203188563735 100644 +--- a/drivers/scsi/qla2xxx/qla_mid.c ++++ b/drivers/scsi/qla2xxx/qla_mid.c +@@ -904,7 +904,8 @@ static void qla_ctrlvp_sp_done(void *s, int res) + { + struct srb *sp = s; + +- complete(&sp->comp); ++ if (sp->comp) ++ complete(sp->comp); + /* don't free sp here. Let the caller do the free */ + } + +@@ -921,6 +922,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + struct qla_hw_data *ha = vha->hw; + int vp_index = vha->vp_idx; + struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); ++ DECLARE_COMPLETION_ONSTACK(comp); + srb_t *sp; + + ql_dbg(ql_dbg_vport, vha, 0x10c1, +@@ -935,6 +937,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + + sp->type = SRB_CTRL_VP; + sp->name = "ctrl_vp"; ++ sp->comp = ∁ + sp->done = qla_ctrlvp_sp_done; + sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; + qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); +@@ -952,7 +955,9 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + ql_dbg(ql_dbg_vport, vha, 0x113f, "%s hndl %x submitted\n", + sp->name, sp->handle); + +- wait_for_completion(&sp->comp); ++ wait_for_completion(&comp); ++ sp->comp = NULL; ++ + rval = sp->rc; + switch (rval) { + case QLA_FUNCTION_TIMEOUT: +-- +2.13.6 + diff --git a/SOURCES/0095-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch b/SOURCES/0095-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch new file mode 100644 index 0000000..552a236 --- /dev/null +++ b/SOURCES/0095-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch @@ -0,0 +1,55 @@ +From 2fa2b6f1ce7650c17ce52d79a2da5c60f97d206a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:55 -0400 +Subject: [PATCH 095/124] [scsi] scsi: qla2xxx: Remove a set-but-not-used + variable + +Message-id: <20190801155618.12650-96-hmadhani@redhat.com> +Patchwork-id: 267870 +O-Subject: [RHEL 7.8 e-stor PATCH 095/118] scsi: qla2xxx: Remove a set-but-not-used variable +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +This patch does not change any functionality. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit eb023220f4eac1703e22e48ed62310a6565b3a1f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index bf0896af5ad3..da093e59768b 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1804,7 +1804,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) + static void + __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + { +- int cnt, status; ++ int cnt; + unsigned long flags; + srb_t *sp; + scsi_qla_host_t *vha = qp->vha; +@@ -1854,7 +1854,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + if (!sp_get(sp)) { + spin_unlock_irqrestore + (qp->qp_lock_ptr, flags); +- status = qla2xxx_eh_abort( ++ qla2xxx_eh_abort( + GET_CMD_SP(sp)); + spin_lock_irqsave + (qp->qp_lock_ptr, flags); +-- +2.13.6 + diff --git a/SOURCES/0096-scsi-scsi-qla2xxx-Split-the-__qla2x00_abort_all_cmds.patch b/SOURCES/0096-scsi-scsi-qla2xxx-Split-the-__qla2x00_abort_all_cmds.patch new file mode 100644 index 0000000..fac2267 --- /dev/null +++ b/SOURCES/0096-scsi-scsi-qla2xxx-Split-the-__qla2x00_abort_all_cmds.patch @@ -0,0 +1,133 @@ +From 5889d7fc7bf72136f9229bffd5372b13056b108e Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:56 -0400 +Subject: [PATCH 096/124] [scsi] scsi: qla2xxx: Split the + __qla2x00_abort_all_cmds() function + +Message-id: <20190801155618.12650-97-hmadhani@redhat.com> +Patchwork-id: 267895 +O-Subject: [RHEL 7.8 e-stor PATCH 096/118] scsi: qla2xxx: Split the __qla2x00_abort_all_cmds() function +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +Nesting in __qla2x00_abort_all_cmds() is way too deep. Reduce the nesting +level by introducing a helper function. This patch does not change any +functionality. + +Reviewed-by: Laurence Oberman +Acked-by: Himanshu Madhani +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit c4e521b654e15e372a6429e269e7e907b4698224) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 80 +++++++++++++++++++------------------------ + 1 file changed, 36 insertions(+), 44 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index da093e59768b..a13798c4d178 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1801,6 +1801,41 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) + return QLA_SUCCESS; + } + ++static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, ++ unsigned long *flags) ++ __releases(qp->qp_lock_ptr) ++ __acquires(qp->qp_lock_ptr) ++{ ++ scsi_qla_host_t *vha = qp->vha; ++ struct qla_hw_data *ha = vha->hw; ++ ++ if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) { ++ if (!sp_get(sp)) { ++ /* got sp */ ++ spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); ++ qla_nvme_abort(ha, sp, res); ++ spin_lock_irqsave(qp->qp_lock_ptr, *flags); ++ } ++ } else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy && ++ !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && ++ !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) { ++ /* ++ * Don't abort commands in adapter during EEH recovery as it's ++ * not accessible/responding. ++ * ++ * Get a reference to the sp and drop the lock. The reference ++ * ensures this sp->done() call and not the call in ++ * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res'). ++ */ ++ if (!sp_get(sp)) { ++ spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); ++ qla2xxx_eh_abort(GET_CMD_SP(sp)); ++ spin_lock_irqsave(qp->qp_lock_ptr, *flags); ++ } ++ } ++ sp->done(sp, res); ++} ++ + static void + __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + { +@@ -1823,50 +1858,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + req->outstanding_cmds[cnt] = NULL; + switch (sp->cmd_type) { + case TYPE_SRB: +- if (sp->type == SRB_NVME_CMD || +- sp->type == SRB_NVME_LS) { +- if (!sp_get(sp)) { +- /* got sp */ +- spin_unlock_irqrestore +- (qp->qp_lock_ptr, +- flags); +- qla_nvme_abort(ha, sp, res); +- spin_lock_irqsave +- (qp->qp_lock_ptr, flags); +- } +- } else if (GET_CMD_SP(sp) && +- !ha->flags.eeh_busy && +- (!test_bit(ABORT_ISP_ACTIVE, +- &vha->dpc_flags)) && +- !qla2x00_isp_reg_stat(ha) && +- (sp->type == SRB_SCSI_CMD)) { +- /* +- * Don't abort commands in adapter +- * during EEH recovery as it's not +- * accessible/responding. +- * +- * Get a reference to the sp and drop +- * the lock. The reference ensures this +- * sp->done() call and not the call in +- * qla2xxx_eh_abort() ends the SCSI cmd +- * (with result 'res'). +- */ +- if (!sp_get(sp)) { +- spin_unlock_irqrestore +- (qp->qp_lock_ptr, flags); +- qla2xxx_eh_abort( +- GET_CMD_SP(sp)); +- spin_lock_irqsave +- (qp->qp_lock_ptr, flags); +- /* +- * Get rid of extra reference caused +- * by early exit from qla2xxx_eh_abort +- */ +- if (status == FAST_IO_FAIL) +- atomic_dec(&sp->ref_count); +- } +- } +- sp->done(sp, res); ++ qla2x00_abort_srb(qp, sp, res, &flags); + break; + case TYPE_TGT_CMD: + if (!vha->hw->tgt.tgt_ops || !tgt || +-- +2.13.6 + diff --git a/SOURCES/0097-scsi-scsi-qla2xxx-Fix-race-conditions-in-the-code-fo.patch b/SOURCES/0097-scsi-scsi-qla2xxx-Fix-race-conditions-in-the-code-fo.patch new file mode 100644 index 0000000..75c8b68 --- /dev/null +++ b/SOURCES/0097-scsi-scsi-qla2xxx-Fix-race-conditions-in-the-code-fo.patch @@ -0,0 +1,391 @@ +From 92d94d4d1779723fb5605f1d1fa235f86047da00 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:57 -0400 +Subject: [PATCH 097/124] [scsi] scsi: qla2xxx: Fix race conditions in the code + for aborting SCSI commands + +Message-id: <20190801155618.12650-98-hmadhani@redhat.com> +Patchwork-id: 267896 +O-Subject: [RHEL 7.8 e-stor PATCH 097/118] scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +In the *_done() functions, instead of returning early if sp->ref_count >= +2, only decrement sp->ref_count. In qla2xxx_eh_abort(), instead of deciding +what to do based on the value of sp->ref_count, decide which action to take +depending on the completion status of the firmware abort. Remove srb.cwaitq +and use srb.comp instead. In qla2x00_abort_srb(), call +isp_ops->abort_command() directly instead of calling qla2xxx_eh_abort(). + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 219d27d7147e07fe899a781bd72f9180b78c3852) +Signed-off-by: Himanshu Madhani + +Conflicts: + drivers/scsi/qla2xxx/qla_os.c + +[HM: RHEL78 kernel source does not have commit 25ab0bc334b4 ] +[ ("scsi: sched/wait: Add wait_event_lock_irq_timeout for ] +[ TASK_UNINTERRUPTIBLE usage"). Since this macro was missing ] +[ commit 711a08d79f71 ("scsi: qla2xxx: Change abort wait_loop ] +[ from msleep to wait_event_timeout") was not backported. ] +[ This patch now removes code that was added by commit 711a08d79f71 ] +[ Due to skipped commit code shows deviation from upstream ] +[ in qla_os.c, qla2xxx_qpair_sp_compl() and qla2x00_sp_free_dma() ] +[ brings in source from commit 711a08d79f71, to set the cmd->result ] +[ and CMD_SP(cmd) also removes double qla2x00_rel_sp() ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 34 +-------- + drivers/scsi/qla2xxx/qla_nvme.h | 1 - + drivers/scsi/qla2xxx/qla_os.c | 150 ++++++++++++++++------------------------ + 3 files changed, 62 insertions(+), 123 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 73d6b7833830..8ddd44bb6c7f 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -137,8 +137,7 @@ static void qla_nvme_sp_ls_done(void *ptr, int res) + return; + } + +- if (!atomic_dec_and_test(&sp->ref_count)) +- return; ++ atomic_dec(&sp->ref_count); + + if (res) + res = -EINVAL; +@@ -161,8 +160,7 @@ static void qla_nvme_sp_done(void *ptr, int res) + nvme = &sp->u.iocb_cmd; + fd = nvme->u.nvme.desc; + +- if (!atomic_dec_and_test(&sp->ref_count)) +- return; ++ atomic_dec(&sp->ref_count); + + if (res == QLA_SUCCESS) { + fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; +@@ -611,34 +609,6 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = { + .fcprqst_priv_sz = sizeof(struct nvme_private), + }; + +-#define NVME_ABORT_POLLING_PERIOD 2 +-static int qla_nvme_wait_on_command(srb_t *sp) +-{ +- int ret = QLA_SUCCESS; +- +- wait_event_timeout(sp->nvme_ls_waitq, (atomic_read(&sp->ref_count) > 1), +- NVME_ABORT_POLLING_PERIOD*HZ); +- +- if (atomic_read(&sp->ref_count) > 1) +- ret = QLA_FUNCTION_FAILED; +- +- return ret; +-} +- +-void qla_nvme_abort(struct qla_hw_data *ha, struct srb *sp, int res) +-{ +- int rval; +- +- if (ha->flags.fw_started) { +- rval = ha->isp_ops->abort_command(sp); +- if (!rval && !qla_nvme_wait_on_command(sp)) +- ql_log(ql_log_warn, NULL, 0x2112, +- "timed out waiting on sp=%p\n", sp); +- } else { +- sp->done(sp, res); +- } +-} +- + static void qla_nvme_unregister_remote_port(struct work_struct *work) + { + struct fc_port *fcport = container_of(work, struct fc_port, +diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h +index da8dad5ad693..0db04f0a4d5d 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.h ++++ b/drivers/scsi/qla2xxx/qla_nvme.h +@@ -145,7 +145,6 @@ struct pt_ls4_rx_unsol { + int qla_nvme_register_hba(struct scsi_qla_host *); + int qla_nvme_register_remote(struct scsi_qla_host *, struct fc_port *); + void qla_nvme_delete(struct scsi_qla_host *); +-void qla_nvme_abort(struct qla_hw_data *, struct srb *sp, int res); + void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *, struct pt_ls4_request *, + struct req_que *); + void qla24xx_async_gffid_sp_done(void *, int); +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index a13798c4d178..a32074dd4727 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -728,7 +728,7 @@ qla2x00_sp_free_dma(void *ptr) + } + + if (!ctx) +- goto end; ++ return; + + if (sp->flags & SRB_CRC_CTX_DSD_VALID) { + /* List assured to be having elements */ +@@ -753,12 +753,6 @@ qla2x00_sp_free_dma(void *ptr) + ha->gbl_dsd_avail += ctx1->dsd_use_cnt; + mempool_free(ctx1, ha->ctx_mempool); + } +- +-end: +- if (sp->type != SRB_NVME_CMD && sp->type != SRB_NVME_LS) { +- CMD_SP(cmd) = NULL; +- qla2x00_rel_sp(sp); +- } + } + + void +@@ -766,6 +760,7 @@ qla2x00_sp_compl(void *ptr, int res) + { + srb_t *sp = ptr; + struct scsi_cmnd *cmd = GET_CMD_SP(sp); ++ struct completion *comp = sp->comp; + + if (atomic_read(&sp->ref_count) == 0) { + ql_dbg(ql_dbg_io, sp->vha, 0x3015, +@@ -775,12 +770,15 @@ qla2x00_sp_compl(void *ptr, int res) + WARN_ON(atomic_read(&sp->ref_count) == 0); + return; + } +- if (!atomic_dec_and_test(&sp->ref_count)) +- return; ++ ++ atomic_dec(&sp->ref_count); + + sp->free(sp); + cmd->result = res; + cmd->scsi_done(cmd); ++ if (comp) ++ complete(comp); ++ qla2x00_rel_sp(sp); + } + + void +@@ -803,7 +801,7 @@ qla2xxx_qpair_sp_free_dma(void *ptr) + } + + if (!ctx) +- goto end; ++ return; + + if (sp->flags & SRB_CRC_CTX_DSD_VALID) { + /* List assured to be having elements */ +@@ -865,10 +863,6 @@ qla2xxx_qpair_sp_free_dma(void *ptr) + dma_pool_free(ha->dl_dma_pool, ctx, ctx0->crc_ctx_dma); + sp->flags &= ~SRB_CRC_CTX_DMA_VALID; + } +- +-end: +- CMD_SP(cmd) = NULL; +- qla2xxx_rel_qpair_sp(sp->qpair, sp); + } + + void +@@ -876,8 +870,7 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + { + srb_t *sp = ptr; + struct scsi_cmnd *cmd = GET_CMD_SP(sp); +- +- cmd->result = res; ++ struct completion *comp = sp->comp; + + if (atomic_read(&sp->ref_count) == 0) { + ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3079, +@@ -887,11 +880,16 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + WARN_ON(atomic_read(&sp->ref_count) == 0); + return; + } +- if (!atomic_dec_and_test(&sp->ref_count)) +- return; ++ ++ atomic_dec(&sp->ref_count); + + sp->free(sp); ++ cmd->result = res; ++ CMD_SP(cmd) = NULL; + cmd->scsi_done(cmd); ++ if (comp) ++ complete(comp); ++ qla2xxx_rel_qpair_sp(sp->qpair, sp); + } + + static int +@@ -1336,7 +1334,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + int ret; + unsigned int id, lun; + unsigned long flags; +- int rval, wait = 0; ++ int rval; + struct qla_hw_data *ha = vha->hw; + struct qla_qpair *qpair; + +@@ -1349,7 +1347,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + ret = fc_block_scsi_eh(cmd); + if (ret != 0) + return ret; +- ret = SUCCESS; + + sp = (srb_t *) CMD_SP(cmd); + if (!sp) +@@ -1360,7 +1357,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + return SUCCESS; + + spin_lock_irqsave(qpair->qp_lock_ptr, flags); +- if (!CMD_SP(cmd)) { ++ if (sp->type != SRB_SCSI_CMD || GET_CMD_SP(sp) != cmd) { + /* there's a chance an interrupt could clear + the ptr as part of done & free */ + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +@@ -1381,58 +1378,31 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + "Aborting from RISC nexus=%ld:%d:%u sp=%p cmd=%p handle=%x\n", + vha->host_no, id, lun, sp, cmd, sp->handle); + +- /* Get a reference to the sp and drop the lock.*/ +- + rval = ha->isp_ops->abort_command(sp); +- if (rval) { +- if (rval == QLA_FUNCTION_PARAMETER_ERROR) +- ret = SUCCESS; +- else +- ret = FAILED; +- +- ql_dbg(ql_dbg_taskm, vha, 0x8003, +- "Abort command mbx failed cmd=%p, rval=%x.\n", cmd, rval); +- } else { +- ql_dbg(ql_dbg_taskm, vha, 0x8004, +- "Abort command mbx success cmd=%p.\n", cmd); +- wait = 1; +- } +- +- spin_lock_irqsave(qpair->qp_lock_ptr, flags); +- /* +- * Clear the slot in the oustanding_cmds array if we can't find the +- * command to reclaim the resources. +- */ +- if (rval == QLA_FUNCTION_PARAMETER_ERROR) +- vha->req->outstanding_cmds[sp->handle] = NULL; +- +- /* +- * sp->done will do ref_count-- +- * sp_get() took an extra count above +- */ +- sp->done(sp, DID_RESET << 16); ++ ql_dbg(ql_dbg_taskm, vha, 0x8003, ++ "Abort command mbx cmd=%p, rval=%x.\n", cmd, rval); + +- /* Did the command return during mailbox execution? */ +- if (ret == FAILED && !CMD_SP(cmd)) ++ switch (rval) { ++ case QLA_SUCCESS: ++ /* ++ * The command has been aborted. That means that the firmware ++ * won't report a completion. ++ */ ++ sp->done(sp, DID_ABORT << 16); + ret = SUCCESS; +- +- if (!CMD_SP(cmd)) +- wait = 0; +- +- spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +- +- /* Wait for the command to be returned. */ +- if (wait) { +- if (qla2x00_eh_wait_on_command(cmd) != QLA_SUCCESS) { +- ql_log(ql_log_warn, vha, 0x8006, +- "Abort handler timed out cmd=%p.\n", cmd); +- ret = FAILED; +- } ++ break; ++ default: ++ /* ++ * Either abort failed or abort and completion raced. Let ++ * the SCSI core retry the abort in the former case. ++ */ ++ ret = FAILED; ++ break; + } + + ql_log(ql_log_info, vha, 0x801c, +- "Abort command issued nexus=%ld:%d:%d -- %d %x.\n", +- vha->host_no, id, lun, wait, ret); ++ "Abort command issued nexus=%ld:%d:%d -- %x.\n", ++ vha->host_no, id, lun, ret); + + return ret; + } +@@ -1806,34 +1776,34 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + __releases(qp->qp_lock_ptr) + __acquires(qp->qp_lock_ptr) + { ++ DECLARE_COMPLETION_ONSTACK(comp); + scsi_qla_host_t *vha = qp->vha; + struct qla_hw_data *ha = vha->hw; ++ int rval; + +- if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) { +- if (!sp_get(sp)) { +- /* got sp */ +- spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); +- qla_nvme_abort(ha, sp, res); +- spin_lock_irqsave(qp->qp_lock_ptr, *flags); +- } +- } else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy && +- !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && +- !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) { +- /* +- * Don't abort commands in adapter during EEH recovery as it's +- * not accessible/responding. +- * +- * Get a reference to the sp and drop the lock. The reference +- * ensures this sp->done() call and not the call in +- * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res'). +- */ +- if (!sp_get(sp)) { +- spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); +- qla2xxx_eh_abort(GET_CMD_SP(sp)); +- spin_lock_irqsave(qp->qp_lock_ptr, *flags); ++ if (sp_get(sp)) ++ return; ++ ++ if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS || ++ (sp->type == SRB_SCSI_CMD && !ha->flags.eeh_busy && ++ !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && ++ !qla2x00_isp_reg_stat(ha))) { ++ sp->comp = ∁ ++ rval = ha->isp_ops->abort_command(sp); ++ spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); ++ ++ switch (rval) { ++ case QLA_SUCCESS: ++ sp->done(sp, res); ++ break; ++ case QLA_FUNCTION_PARAMETER_ERROR: ++ wait_for_completion(&comp); ++ break; + } ++ ++ spin_lock_irqsave(qp->qp_lock_ptr, *flags); ++ sp->comp = NULL; + } +- sp->done(sp, res); + } + + static void +-- +2.13.6 + diff --git a/SOURCES/0098-scsi-scsi-qla2xxx-Complain-loudly-about-reference-co.patch b/SOURCES/0098-scsi-scsi-qla2xxx-Complain-loudly-about-reference-co.patch new file mode 100644 index 0000000..22d527d --- /dev/null +++ b/SOURCES/0098-scsi-scsi-qla2xxx-Complain-loudly-about-reference-co.patch @@ -0,0 +1,114 @@ +From cc9cd21f1c1e14fa5b2b3129f505447bc3be9283 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:58 -0400 +Subject: [PATCH 098/124] [scsi] scsi: qla2xxx: Complain loudly about reference + count underflow + +Message-id: <20190801155618.12650-99-hmadhani@redhat.com> +Patchwork-id: 267873 +O-Subject: [RHEL 7.8 e-stor PATCH 098/118] scsi: qla2xxx: Complain loudly about reference count underflow +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +A reference count underflow is a severe bug. Hence complain loudly if a +reference count underflow happens. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit db4bf822c58cd2b4a6718c982ce48a5292f5cc6a) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 15 +++++---------- + drivers/scsi/qla2xxx/qla_os.c | 16 ++-------------- + 2 files changed, 7 insertions(+), 24 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 8ddd44bb6c7f..dea081c27182 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -131,11 +131,8 @@ static void qla_nvme_sp_ls_done(void *ptr, int res) + struct nvmefc_ls_req *fd; + struct nvme_private *priv; + +- if (atomic_read(&sp->ref_count) == 0) { +- ql_log(ql_log_warn, sp->fcport->vha, 0x2123, +- "SP reference-count to ZERO on LS_done -- sp=%p.\n", sp); ++ if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) + return; +- } + + atomic_dec(&sp->ref_count); + +@@ -160,6 +157,9 @@ static void qla_nvme_sp_done(void *ptr, int res) + nvme = &sp->u.iocb_cmd; + fd = nvme->u.nvme.desc; + ++ if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) ++ return; ++ + atomic_dec(&sp->ref_count); + + if (res == QLA_SUCCESS) { +@@ -199,13 +199,8 @@ static void qla_nvme_abort_work(struct work_struct *work) + return; + } + +- if (atomic_read(&sp->ref_count) == 0) { +- WARN_ON(1); +- ql_log(ql_log_info, fcport->vha, 0xffff, +- "%s: command already aborted on sp: %p\n", +- __func__, sp); ++ if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) + return; +- } + + rval = ha->isp_ops->abort_command(sp); + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index a32074dd4727..a3159a9a4c3e 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -762,14 +762,8 @@ qla2x00_sp_compl(void *ptr, int res) + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct completion *comp = sp->comp; + +- if (atomic_read(&sp->ref_count) == 0) { +- ql_dbg(ql_dbg_io, sp->vha, 0x3015, +- "SP reference-count to ZERO -- sp=%p cmd=%p.\n", +- sp, GET_CMD_SP(sp)); +- if (ql2xextended_error_logging & ql_dbg_io) +- WARN_ON(atomic_read(&sp->ref_count) == 0); ++ if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) + return; +- } + + atomic_dec(&sp->ref_count); + +@@ -872,14 +866,8 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct completion *comp = sp->comp; + +- if (atomic_read(&sp->ref_count) == 0) { +- ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3079, +- "SP reference-count to ZERO -- sp=%p cmd=%p.\n", +- sp, GET_CMD_SP(sp)); +- if (ql2xextended_error_logging & ql_dbg_io) +- WARN_ON(atomic_read(&sp->ref_count) == 0); ++ if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) + return; +- } + + atomic_dec(&sp->ref_count); + +-- +2.13.6 + diff --git a/SOURCES/0099-scsi-scsi-qla2xxx-Avoid-that-qlt_send_resp_ctio-corr.patch b/SOURCES/0099-scsi-scsi-qla2xxx-Avoid-that-qlt_send_resp_ctio-corr.patch new file mode 100644 index 0000000..57b386d --- /dev/null +++ b/SOURCES/0099-scsi-scsi-qla2xxx-Avoid-that-qlt_send_resp_ctio-corr.patch @@ -0,0 +1,65 @@ +From af7b3fbefd45cd9cba7e46e451eb64e1b7bbe7b0 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:55:59 -0400 +Subject: [PATCH 099/124] [scsi] scsi: qla2xxx: Avoid that qlt_send_resp_ctio() + corrupts memory + +Message-id: <20190801155618.12650-100-hmadhani@redhat.com> +Patchwork-id: 267894 +O-Subject: [RHEL 7.8 e-stor PATCH 099/118] scsi: qla2xxx: Avoid that qlt_send_resp_ctio() corrupts memory +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1729270 + +The "(&ctio->u.status1.sense_data)[i]" where i >= 0 expressions in +qlt_send_resp_ctio() are probably typos and should have been +"(&ctio->u.status1.sense_data[4 * i])" instead. Instead of only fixing +these typos, modify the code for storing sense data such that it becomes +easy to read. This patch fixes a Coverity complaint about accessing an +array outside its bounds. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Fixes: be25152c0d9e ("qla2xxx: Improve T10-DIF/PI handling in driver.") # v4.11. +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a861b49273578e255426a499842cf7f465456351) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 398a8d6b4db6..f79b51fcbca3 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -2328,14 +2328,14 @@ void qlt_send_resp_ctio(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd, + ctio->u.status1.scsi_status |= + cpu_to_le16(SS_RESIDUAL_UNDER); + +- /* Response code and sense key */ +- put_unaligned_le32(((0x70 << 24) | (sense_key << 8)), +- (&ctio->u.status1.sense_data)[0]); ++ /* Fixed format sense data. */ ++ ctio->u.status1.sense_data[0] = 0x70; ++ ctio->u.status1.sense_data[2] = sense_key; + /* Additional sense length */ +- put_unaligned_le32(0x0a, (&ctio->u.status1.sense_data)[1]); ++ ctio->u.status1.sense_data[7] = 0xa; + /* ASC and ASCQ */ +- put_unaligned_le32(((asc << 24) | (ascq << 16)), +- (&ctio->u.status1.sense_data)[3]); ++ ctio->u.status1.sense_data[12] = asc; ++ ctio->u.status1.sense_data[13] = ascq; + + /* Memory Barrier */ + wmb(); +-- +2.13.6 + diff --git a/SOURCES/0100-scsi-scsi-qla2xxx-Fix-hardlockup-in-abort-command-du.patch b/SOURCES/0100-scsi-scsi-qla2xxx-Fix-hardlockup-in-abort-command-du.patch new file mode 100644 index 0000000..5bbbcab --- /dev/null +++ b/SOURCES/0100-scsi-scsi-qla2xxx-Fix-hardlockup-in-abort-command-du.patch @@ -0,0 +1,60 @@ +From 5937da964b5dc63f0934a6fb9f44506d3c29b846 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:00 -0400 +Subject: [PATCH 100/124] [scsi] scsi: qla2xxx: Fix hardlockup in abort command + during driver remove + +Message-id: <20190801155618.12650-101-hmadhani@redhat.com> +Patchwork-id: 267871 +O-Subject: [RHEL 7.8 e-stor PATCH 100/118] scsi: qla2xxx: Fix hardlockup in abort command during driver remove +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Arun Easi + +Bugzilla 1729270 + +[436194.555537] NMI watchdog: Watchdog detected hard LOCKUP on cpu 5 +[436194.555558] RIP: 0010:native_queued_spin_lock_slowpath+0x63/0x1e0 + +[436194.555563] Call Trace: +[436194.555564] _raw_spin_lock_irqsave+0x30/0x40 +[436194.555564] qla24xx_async_abort_command+0x29/0xd0 [qla2xxx] +[436194.555565] qla24xx_abort_command+0x208/0x2d0 [qla2xxx] +[436194.555565] __qla2x00_abort_all_cmds+0x16b/0x290 [qla2xxx] +[436194.555565] qla2x00_abort_all_cmds+0x42/0x60 [qla2xxx] +[436194.555566] qla2x00_abort_isp_cleanup+0x2bd/0x3a0 [qla2xxx] +[436194.555566] qla2x00_remove_one+0x1ad/0x360 [qla2xxx] +[436194.555566] pci_device_remove+0x3b/0xb0 + +Fixes: 219d27d7147e (scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands) +Cc: stable@vger.kernel.org # 5.2 +Signed-off-by: Arun Easi +Signed-off-by: Himanshu Madhani +Reviewed-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5589b08e5be47e426158f659a892153b4a831921) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 a3159a9a4c3e..f3200e25d1e7 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1777,8 +1777,8 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && + !qla2x00_isp_reg_stat(ha))) { + sp->comp = ∁ +- rval = ha->isp_ops->abort_command(sp); + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); ++ rval = ha->isp_ops->abort_command(sp); + + switch (rval) { + case QLA_SUCCESS: +-- +2.13.6 + diff --git a/SOURCES/0101-scsi-scsi-qla2xxx-remove-double-assignment-in-qla2x0.patch b/SOURCES/0101-scsi-scsi-qla2xxx-remove-double-assignment-in-qla2x0.patch new file mode 100644 index 0000000..8266641 --- /dev/null +++ b/SOURCES/0101-scsi-scsi-qla2xxx-remove-double-assignment-in-qla2x0.patch @@ -0,0 +1,44 @@ +From 48a739840275a881f822c03afbc927c52bc8db70 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:01 -0400 +Subject: [PATCH 101/124] [scsi] scsi: qla2xxx: remove double assignment in + qla2x00_update_fcport + +Message-id: <20190801155618.12650-102-hmadhani@redhat.com> +Patchwork-id: 267889 +O-Subject: [RHEL 7.8 e-stor PATCH 101/118] scsi: qla2xxx: remove double assignment in qla2x00_update_fcport +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Enzo Matsumiya + +Bugzilla 1729270 + +Remove double assignment in qla2x00_update_fcport(). + +Signed-off-by: Enzo Matsumiya +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a90ef98b21cf40784af7ace77038f8341a7b96c8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 75a8ebe57e54..dc597073020f 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -5418,7 +5418,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) + fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT); + fcport->deleted = 0; + fcport->logout_on_delete = 1; +- fcport->login_retry = vha->hw->login_retry_count; + fcport->n2n_chip_reset = fcport->n2n_link_reset_cnt = 0; + + switch (vha->hw->current_topology) { +-- +2.13.6 + diff --git a/SOURCES/0102-scsi-scsi-qla2xxx-Fix-kernel-crash-after-disconnecti.patch b/SOURCES/0102-scsi-scsi-qla2xxx-Fix-kernel-crash-after-disconnecti.patch new file mode 100644 index 0000000..099a692 --- /dev/null +++ b/SOURCES/0102-scsi-scsi-qla2xxx-Fix-kernel-crash-after-disconnecti.patch @@ -0,0 +1,164 @@ +From 741f33d07b43d9585bec668d21d2cbbafdf646db Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:02 -0400 +Subject: [PATCH 102/124] [scsi] scsi: qla2xxx: Fix kernel crash after + disconnecting NVMe devices + +Message-id: <20190801155618.12650-103-hmadhani@redhat.com> +Patchwork-id: 267891 +O-Subject: [RHEL 7.8 e-stor PATCH 102/118] scsi: qla2xxx: Fix kernel crash after disconnecting NVMe devices +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Arun Easi + +Bugzilla 1729270 + +BUG: unable to handle kernel NULL pointer dereference at (null) +IP: [] qla_nvme_unregister_remote_port+0x6c/0xf0 [qla2xxx] +PGD 800000084cf41067 PUD 84d288067 PMD 0 +Oops: 0000 [#1] SMP +Call Trace: + [] process_one_work+0x17f/0x440 + [] worker_thread+0x126/0x3c0 + [] ? manage_workers.isra.26+0x2a0/0x2a0 + [] kthread+0xd1/0xe0 + [] ? insert_kthread_work+0x40/0x40 + [] ret_from_fork_nospec_begin+0x21/0x21 + [] ? insert_kthread_work+0x40/0x40 +RIP [] qla_nvme_unregister_remote_port+0x6c/0xf0 [qla2xxx] + +The crash is due to a bad entry in the nvme_rport_list. This list is not +protected, and when a remoteport_delete callback is called, driver +traverses the list and crashes. + +Actually, the list could be removed and driver could traverse the main +fcport list instead. Fix does exactly that. + +Signed-off-by: Arun Easi +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 6a81533d616fe581b0d421ee6db3319eeac9486d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 - + drivers/scsi/qla2xxx/qla_nvme.c | 37 ++++++++++--------------------------- + drivers/scsi/qla2xxx/qla_nvme.h | 1 - + drivers/scsi/qla2xxx/qla_os.c | 1 - + 4 files changed, 10 insertions(+), 30 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index e5e1081501a9..7d07c6e65eed 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4411,7 +4411,6 @@ typedef struct scsi_qla_host { + + struct nvme_fc_local_port *nvme_local_port; + struct completion nvme_del_done; +- struct list_head nvme_rport_list; + + uint16_t fcoe_vlan_id; + uint16_t fcoe_fcf_idx; +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index dea081c27182..494082a6f8ed 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -74,7 +74,6 @@ int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) + + rport = fcport->nvme_remote_port->private; + rport->fcport = fcport; +- list_add_tail(&rport->list, &vha->nvme_rport_list); + + fcport->nvme_flag |= NVME_FLAG_REGISTERED; + return 0; +@@ -559,19 +558,12 @@ static void qla_nvme_localport_delete(struct nvme_fc_local_port *lport) + static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) + { + fc_port_t *fcport; +- struct qla_nvme_rport *qla_rport = rport->private, *trport; ++ struct qla_nvme_rport *qla_rport = rport->private; + + fcport = qla_rport->fcport; + fcport->nvme_remote_port = NULL; + fcport->nvme_flag &= ~NVME_FLAG_REGISTERED; + +- list_for_each_entry_safe(qla_rport, trport, +- &fcport->vha->nvme_rport_list, list) { +- if (qla_rport->fcport == fcport) { +- list_del(&qla_rport->list); +- break; +- } +- } + complete(&fcport->nvme_del_done); + + if (!test_bit(UNLOADING, &fcport->vha->dpc_flags)) { +@@ -608,7 +600,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; ++ int ret; + + if (!IS_ENABLED(CONFIG_NVME_FC)) + return; +@@ -616,23 +608,14 @@ 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); + +- list_for_each_entry_safe(qla_rport, trport, +- &fcport->vha->nvme_rport_list, list) { +- if (qla_rport->fcport == fcport) { +- ql_log(ql_log_info, fcport->vha, 0x2113, +- "%s: fcport=%p\n", __func__, fcport); +- nvme_fc_set_remoteport_devloss +- (fcport->nvme_remote_port, 0); +- init_completion(&fcport->nvme_del_done); +- if (nvme_fc_unregister_remoteport +- (fcport->nvme_remote_port)) +- ql_log(ql_log_info, fcport->vha, 0x2114, +- "%s: Failed to unregister nvme_remote_port\n", +- __func__); +- wait_for_completion(&fcport->nvme_del_done); +- break; +- } +- } ++ nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0); ++ init_completion(&fcport->nvme_del_done); ++ ret = nvme_fc_unregister_remoteport(fcport->nvme_remote_port); ++ if (ret) ++ ql_log(ql_log_info, fcport->vha, 0x2114, ++ "%s: Failed to unregister nvme_remote_port (%d)\n", ++ __func__, ret); ++ wait_for_completion(&fcport->nvme_del_done); + } + + void qla_nvme_delete(struct scsi_qla_host *vha) +diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h +index 0db04f0a4d5d..a48f9e7a3567 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.h ++++ b/drivers/scsi/qla2xxx/qla_nvme.h +@@ -36,7 +36,6 @@ struct nvme_private { + }; + + struct qla_nvme_rport { +- struct list_head list; + struct fc_port *fcport; + }; + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index f3200e25d1e7..5009c5e4b276 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4925,7 +4925,6 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, + INIT_LIST_HEAD(&vha->logo_list); + INIT_LIST_HEAD(&vha->plogi_ack_list); + INIT_LIST_HEAD(&vha->gnl.fcports); +- INIT_LIST_HEAD(&vha->nvme_rport_list); + INIT_LIST_HEAD(&vha->gpnid_list); + INIT_WORK(&vha->iocb_work, qla2x00_iocb_work_fn); + +-- +2.13.6 + diff --git a/SOURCES/0103-scsi-scsi-qla2xxx-on-session-delete-return-nvme-cmd.patch b/SOURCES/0103-scsi-scsi-qla2xxx-on-session-delete-return-nvme-cmd.patch new file mode 100644 index 0000000..e26b494 --- /dev/null +++ b/SOURCES/0103-scsi-scsi-qla2xxx-on-session-delete-return-nvme-cmd.patch @@ -0,0 +1,115 @@ +From c1cee792ace4dc1d66b236b14881e2f3d34da1db Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:03 -0400 +Subject: [PATCH 103/124] [scsi] scsi: qla2xxx: on session delete, return nvme + cmd + +Message-id: <20190801155618.12650-104-hmadhani@redhat.com> +Patchwork-id: 267886 +O-Subject: [RHEL 7.8 e-stor PATCH 103/118] scsi: qla2xxx: on session delete, return nvme cmd +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + + - on session delete or chip reset, reject all NVME commands. + + - on NVME command submission error, free srb resource. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2eb9238affa72a5260b14388cf56598f7413109b) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 28 +++++++++++++++++++--------- + 1 file changed, 19 insertions(+), 9 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 494082a6f8ed..d6b36a9e9917 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -239,8 +239,16 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, + struct qla_hw_data *ha; + srb_t *sp; + ++ ++ if (!fcport || (fcport && fcport->deleted)) ++ return rval; ++ + vha = fcport->vha; + ha = vha->hw; ++ ++ if (!ha->flags.fw_started) ++ return rval; ++ + /* Alloc SRB structure */ + sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC); + if (!sp) +@@ -272,6 +280,7 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, + "qla2x00_start_sp failed = %d\n", rval); + atomic_dec(&sp->ref_count); + wake_up(&sp->nvme_ls_waitq); ++ sp->free(sp); + return rval; + } + +@@ -503,11 +512,11 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + + fcport = qla_rport->fcport; + +- vha = fcport->vha; +- +- if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) ++ if (!qpair || !fcport || (qpair && !qpair->fw_started) || ++ (fcport && fcport->deleted)) + return rval; + ++ vha = fcport->vha; + /* + * If we know the dev is going away while the transport is still sending + * IO's return busy back to stall the IO Q. This happens when the +@@ -540,6 +549,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + "qla2x00_start_nvme_mq failed = %d\n", rval); + atomic_dec(&sp->ref_count); + wake_up(&sp->nvme_ls_waitq); ++ sp->free(sp); + } + + return rval; +@@ -566,14 +576,13 @@ static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) + + complete(&fcport->nvme_del_done); + +- if (!test_bit(UNLOADING, &fcport->vha->dpc_flags)) { +- INIT_WORK(&fcport->free_work, qlt_free_session_done); +- schedule_work(&fcport->free_work); +- } ++ INIT_WORK(&fcport->free_work, qlt_free_session_done); ++ schedule_work(&fcport->free_work); + + fcport->nvme_flag &= ~NVME_FLAG_DELETING; + ql_log(ql_log_info, fcport->vha, 0x2110, +- "remoteport_delete of %p completed.\n", fcport); ++ "remoteport_delete of %p %8phN completed.\n", ++ fcport, fcport->port_name); + } + + static struct nvme_fc_port_template qla_nvme_fc_transport = { +@@ -606,7 +615,8 @@ static void qla_nvme_unregister_remote_port(struct work_struct *work) + return; + + ql_log(ql_log_warn, NULL, 0x2112, +- "%s: unregister remoteport on %p\n",__func__, fcport); ++ "%s: unregister remoteport on %p %8phN\n", ++ __func__, fcport, fcport->port_name); + + nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0); + init_completion(&fcport->nvme_del_done); +-- +2.13.6 + diff --git a/SOURCES/0104-scsi-scsi-qla2xxx-Fix-NVME-cmd-and-LS-cmd-timeout-ra.patch b/SOURCES/0104-scsi-scsi-qla2xxx-Fix-NVME-cmd-and-LS-cmd-timeout-ra.patch new file mode 100644 index 0000000..1a30d4e --- /dev/null +++ b/SOURCES/0104-scsi-scsi-qla2xxx-Fix-NVME-cmd-and-LS-cmd-timeout-ra.patch @@ -0,0 +1,350 @@ +From 392c09746aef3c0df400cca10d0974260c0f220c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:04 -0400 +Subject: [PATCH 104/124] [scsi] scsi: qla2xxx: Fix NVME cmd and LS cmd timeout + race condition + +Message-id: <20190801155618.12650-105-hmadhani@redhat.com> +Patchwork-id: 267892 +O-Subject: [RHEL 7.8 e-stor PATCH 104/118] scsi: qla2xxx: Fix NVME cmd and LS cmd timeout race condition +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +This patch uses kref to protect access between fcp_abort path and nvme +command and LS command completion path. Stack trace below shows the abort +path is accessing stale memory (nvme_private->sp). + +When command kref reaches 0, nvme_private & srb resource will be +disconnected from each other. Any subsequence nvme abort request will not +be able to reference the original srb. + +[ 5631.003998] BUG: unable to handle kernel paging request at 00000010000005d8 +[ 5631.004016] IP: [] qla_nvme_abort_work+0x22/0x100 [qla2xxx] +[ 5631.004086] Workqueue: events qla_nvme_abort_work [qla2xxx] +[ 5631.004097] RIP: 0010:[] [] qla_nvme_abort_work+0x22/0x100 [qla2xxx] +[ 5631.004109] Call Trace: +[ 5631.004115] [] ? pwq_dec_nr_in_flight+0x64/0xb0 +[ 5631.004117] [] process_one_work+0x17f/0x440 +[ 5631.004120] [] worker_thread+0x126/0x3c0 + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 4c2a2d0178d5d8006a6bc50c8dc0ed122e4e946e) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 3 + + drivers/scsi/qla2xxx/qla_nvme.c | 163 ++++++++++++++++++++++++++++------------ + drivers/scsi/qla2xxx/qla_nvme.h | 1 + + 3 files changed, 117 insertions(+), 50 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 7d07c6e65eed..b3c10c0f24c7 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -541,6 +541,8 @@ typedef struct srb { + uint8_t cmd_type; + uint8_t pad[3]; + atomic_t ref_count; ++ struct kref cmd_kref; /* need to migrate ref_count over to this */ ++ void *priv; + wait_queue_head_t nvme_ls_waitq; + struct fc_port *fcport; + struct scsi_qla_host *vha; +@@ -563,6 +565,7 @@ typedef struct srb { + } u; + void (*done)(void *, int); + void (*free)(void *); ++ void (*put_fn)(struct kref *kref); + } srb_t; + + #define GET_CMD_SP(sp) (sp->u.scmd.cmd) +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index d6b36a9e9917..081320afaab4 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -123,53 +123,91 @@ static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport, + return 0; + } + ++static void qla_nvme_release_fcp_cmd_kref(struct kref *kref) ++{ ++ struct srb *sp = container_of(kref, struct srb, cmd_kref); ++ struct nvme_private *priv = (struct nvme_private *)sp->priv; ++ struct nvmefc_fcp_req *fd; ++ struct srb_iocb *nvme; ++ unsigned long flags; ++ ++ if (!priv) ++ goto out; ++ ++ nvme = &sp->u.iocb_cmd; ++ fd = nvme->u.nvme.desc; ++ ++ spin_lock_irqsave(&priv->cmd_lock, flags); ++ priv->sp = NULL; ++ sp->priv = NULL; ++ if (priv->comp_status == QLA_SUCCESS) { ++ fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; ++ } else { ++ fd->rcv_rsplen = 0; ++ fd->transferred_length = 0; ++ } ++ fd->status = 0; ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ ++ fd->done(fd); ++out: ++ qla2xxx_rel_qpair_sp(sp->qpair, sp); ++} ++ ++static void qla_nvme_release_ls_cmd_kref(struct kref *kref) ++{ ++ struct srb *sp = container_of(kref, struct srb, cmd_kref); ++ struct nvme_private *priv = (struct nvme_private *)sp->priv; ++ struct nvmefc_ls_req *fd; ++ unsigned long flags; ++ ++ if (!priv) ++ goto out; ++ ++ spin_lock_irqsave(&priv->cmd_lock, flags); ++ priv->sp = NULL; ++ sp->priv = NULL; ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ ++ fd = priv->fd; ++ fd->done(fd, priv->comp_status); ++out: ++ qla2x00_rel_sp(sp); ++} ++ ++static void qla_nvme_ls_complete(struct work_struct *work) ++{ ++ struct nvme_private *priv = ++ container_of(work, struct nvme_private, ls_work); ++ ++ kref_put(&priv->sp->cmd_kref, qla_nvme_release_ls_cmd_kref); ++} ++ + static void qla_nvme_sp_ls_done(void *ptr, int res) + { + srb_t *sp = ptr; +- struct srb_iocb *nvme; +- struct nvmefc_ls_req *fd; + struct nvme_private *priv; + +- if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) ++ if (WARN_ON_ONCE(kref_read(&sp->cmd_kref) == 0)) + return; + +- atomic_dec(&sp->ref_count); +- + if (res) + res = -EINVAL; + +- nvme = &sp->u.iocb_cmd; +- fd = nvme->u.nvme.desc; +- priv = fd->private; ++ priv = (struct nvme_private *)sp->priv; + priv->comp_status = res; ++ INIT_WORK(&priv->ls_work, qla_nvme_ls_complete); + schedule_work(&priv->ls_work); +- /* work schedule doesn't need the sp */ +- qla2x00_rel_sp(sp); + } + ++/* it assumed that QPair lock is held. */ + static void qla_nvme_sp_done(void *ptr, int res) + { + srb_t *sp = ptr; +- struct srb_iocb *nvme; +- struct nvmefc_fcp_req *fd; ++ struct nvme_private *priv = (struct nvme_private *)sp->priv; + +- nvme = &sp->u.iocb_cmd; +- fd = nvme->u.nvme.desc; +- +- if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) +- return; +- +- atomic_dec(&sp->ref_count); +- +- if (res == QLA_SUCCESS) { +- fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; +- } else { +- fd->rcv_rsplen = 0; +- fd->transferred_length = 0; +- } +- fd->status = 0; +- fd->done(fd); +- qla2xxx_rel_qpair_sp(sp->qpair, sp); ++ priv->comp_status = res; ++ kref_put(&sp->cmd_kref, qla_nvme_release_fcp_cmd_kref); + + return; + } +@@ -188,44 +226,50 @@ static void qla_nvme_abort_work(struct work_struct *work) + __func__, sp, sp->handle, fcport, fcport->deleted); + + if (!ha->flags.fw_started && (fcport && fcport->deleted)) +- return; ++ goto out; + + if (ha->flags.host_shutting_down) { + ql_log(ql_log_info, sp->fcport->vha, 0xffff, + "%s Calling done on sp: %p, type: 0x%x, sp->ref_count: 0x%x\n", + __func__, sp, sp->type, atomic_read(&sp->ref_count)); + sp->done(sp, 0); +- return; ++ goto out; + } + +- if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) +- return; +- + rval = ha->isp_ops->abort_command(sp); + + ql_dbg(ql_dbg_io, fcport->vha, 0x212b, + "%s: %s command for sp=%p, handle=%x on fcport=%p rval=%x\n", + __func__, (rval != QLA_SUCCESS) ? "Failed to abort" : "Aborted", + sp, sp->handle, fcport, rval); ++ ++out: ++ /* kref_get was done before work was schedule. */ ++ kref_put(&sp->cmd_kref, sp->put_fn); + } + + static void qla_nvme_ls_abort(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd) + { + struct nvme_private *priv = fd->private; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&priv->cmd_lock, flags); ++ if (!priv->sp) { ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ return; ++ } ++ ++ if (!kref_get_unless_zero(&priv->sp->cmd_kref)) { ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); + + INIT_WORK(&priv->abort_work, qla_nvme_abort_work); + schedule_work(&priv->abort_work); + } + +-static void qla_nvme_ls_complete(struct work_struct *work) +-{ +- struct nvme_private *priv = +- container_of(work, struct nvme_private, ls_work); +- struct nvmefc_ls_req *fd = priv->fd; +- +- fd->done(fd, priv->comp_status); +-} + + static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd) +@@ -257,11 +301,13 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, + sp->type = SRB_NVME_LS; + sp->name = "nvme_ls"; + sp->done = qla_nvme_sp_ls_done; +- atomic_set(&sp->ref_count, 1); +- nvme = &sp->u.iocb_cmd; ++ sp->put_fn = qla_nvme_release_ls_cmd_kref; ++ sp->priv = (void *)priv; + priv->sp = sp; ++ kref_init(&sp->cmd_kref); ++ spin_lock_init(&priv->cmd_lock); ++ nvme = &sp->u.iocb_cmd; + priv->fd = fd; +- INIT_WORK(&priv->ls_work, qla_nvme_ls_complete); + nvme->u.nvme.desc = fd; + nvme->u.nvme.dir = 0; + nvme->u.nvme.dl = 0; +@@ -278,9 +324,10 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, + if (rval != QLA_SUCCESS) { + ql_log(ql_log_warn, vha, 0x700e, + "qla2x00_start_sp failed = %d\n", rval); +- atomic_dec(&sp->ref_count); + wake_up(&sp->nvme_ls_waitq); +- sp->free(sp); ++ sp->priv = NULL; ++ priv->sp = NULL; ++ qla2x00_rel_sp(sp); + return rval; + } + +@@ -292,6 +339,18 @@ static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport, + struct nvmefc_fcp_req *fd) + { + struct nvme_private *priv = fd->private; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&priv->cmd_lock, flags); ++ if (!priv->sp) { ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ return; ++ } ++ if (!kref_get_unless_zero(&priv->sp->cmd_kref)) { ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); ++ return; ++ } ++ spin_unlock_irqrestore(&priv->cmd_lock, flags); + + INIT_WORK(&priv->abort_work, qla_nvme_abort_work); + schedule_work(&priv->abort_work); +@@ -532,12 +591,15 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + if (!sp) + return -EBUSY; + +- atomic_set(&sp->ref_count, 1); + init_waitqueue_head(&sp->nvme_ls_waitq); ++ kref_init(&sp->cmd_kref); ++ spin_lock_init(&priv->cmd_lock); ++ sp->priv = (void *)priv; + priv->sp = sp; + sp->type = SRB_NVME_CMD; + sp->name = "nvme_cmd"; + sp->done = qla_nvme_sp_done; ++ sp->put_fn = qla_nvme_release_fcp_cmd_kref; + sp->qpair = qpair; + sp->vha = vha; + nvme = &sp->u.iocb_cmd; +@@ -547,9 +609,10 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + if (rval != QLA_SUCCESS) { + ql_log(ql_log_warn, vha, 0x212d, + "qla2x00_start_nvme_mq failed = %d\n", rval); +- atomic_dec(&sp->ref_count); + wake_up(&sp->nvme_ls_waitq); +- sp->free(sp); ++ sp->priv = NULL; ++ priv->sp = NULL; ++ qla2xxx_rel_qpair_sp(sp->qpair, sp); + } + + return rval; +diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h +index a48f9e7a3567..31ffa1e003f1 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.h ++++ b/drivers/scsi/qla2xxx/qla_nvme.h +@@ -33,6 +33,7 @@ struct nvme_private { + struct work_struct ls_work; + struct work_struct abort_work; + int comp_status; ++ spinlock_t cmd_lock; + }; + + struct qla_nvme_rport { +-- +2.13.6 + diff --git a/SOURCES/0105-scsi-scsi-qla2xxx-move-IO-flush-to-the-front-of-NVME.patch b/SOURCES/0105-scsi-scsi-qla2xxx-move-IO-flush-to-the-front-of-NVME.patch new file mode 100644 index 0000000..59279ca --- /dev/null +++ b/SOURCES/0105-scsi-scsi-qla2xxx-move-IO-flush-to-the-front-of-NVME.patch @@ -0,0 +1,147 @@ +From d2bb1b2d6d650c7a447e283b45a55015e560bc1b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:05 -0400 +Subject: [PATCH 105/124] [scsi] scsi: qla2xxx: move IO flush to the front of + NVME rport unregistration + +Message-id: <20190801155618.12650-106-hmadhani@redhat.com> +Patchwork-id: 267888 +O-Subject: [RHEL 7.8 e-stor PATCH 105/118] scsi: qla2xxx: move IO flush to the front of NVME rport unregistration +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +On session deletion, current qla code would unregister an NVMe session +before flushing IOs. This patch would move the unregistration of NVMe +session after IO flush. This way FC-NVMe layer would not have to wait for +stuck IOs. In addition, qla2xxx would stop accepting new IOs during session +deletion. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit baf23eddbf2a4ba9bf2bdb342686c71a8042e39b) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 - + drivers/scsi/qla2xxx/qla_gbl.h | 2 ++ + drivers/scsi/qla2xxx/qla_nvme.c | 14 ++------------ + drivers/scsi/qla2xxx/qla_target.c | 16 ++++++++-------- + 4 files changed, 12 insertions(+), 21 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index b3c10c0f24c7..4c82d210c95d 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2378,7 +2378,6 @@ typedef struct fc_port { + unsigned int id_changed:1; + unsigned int scan_needed:1; + +- struct work_struct nvme_del_work; + struct completion nvme_del_done; + uint32_t nvme_prli_service_param; + #define NVME_PRLI_SP_CONF BIT_7 +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 27193f858ca2..5075d447c69e 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -906,4 +906,6 @@ void qlt_remove_target_resources(struct qla_hw_data *); + void qlt_set_mode(struct scsi_qla_host *); + int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode); + ++/* nvme.c */ ++void qla_nvme_unregister_remote_port(struct fc_port *fcport); + #endif /* _QLA_GBL_H */ +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 081320afaab4..74fbe38eaae2 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -12,8 +12,6 @@ + + static struct nvme_fc_port_template qla_nvme_fc_transport; + +-static void qla_nvme_unregister_remote_port(struct work_struct *); +- + int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) + { + struct qla_nvme_rport *rport; +@@ -38,7 +36,6 @@ int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) + (fcport->nvme_flag & NVME_FLAG_REGISTERED)) + return 0; + +- INIT_WORK(&fcport->nvme_del_work, qla_nvme_unregister_remote_port); + fcport->nvme_flag &= ~NVME_FLAG_RESETTING; + + memset(&req, 0, sizeof(struct nvme_fc_port_info)); +@@ -636,16 +633,11 @@ static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) + fcport = qla_rport->fcport; + fcport->nvme_remote_port = NULL; + fcport->nvme_flag &= ~NVME_FLAG_REGISTERED; +- +- complete(&fcport->nvme_del_done); +- +- INIT_WORK(&fcport->free_work, qlt_free_session_done); +- schedule_work(&fcport->free_work); +- + fcport->nvme_flag &= ~NVME_FLAG_DELETING; + ql_log(ql_log_info, fcport->vha, 0x2110, + "remoteport_delete of %p %8phN completed.\n", + fcport, fcport->port_name); ++ complete(&fcport->nvme_del_done); + } + + static struct nvme_fc_port_template qla_nvme_fc_transport = { +@@ -668,10 +660,8 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = { + .fcprqst_priv_sz = sizeof(struct nvme_private), + }; + +-static void qla_nvme_unregister_remote_port(struct work_struct *work) ++void qla_nvme_unregister_remote_port(struct fc_port *fcport) + { +- struct fc_port *fcport = container_of(work, struct fc_port, +- nvme_del_work); + int ret; + + if (!IS_ENABLED(CONFIG_NVME_FC)) +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index f79b51fcbca3..9e16a97f8fcb 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -1012,6 +1012,12 @@ void qlt_free_session_done(struct work_struct *work) + else + logout_started = true; + } ++ } /* if sess->logout_on_delete */ ++ ++ if (sess->nvme_flag & NVME_FLAG_REGISTERED && ++ !(sess->nvme_flag & NVME_FLAG_DELETING)) { ++ sess->nvme_flag |= NVME_FLAG_DELETING; ++ qla_nvme_unregister_remote_port(sess); + } + } + +@@ -1163,14 +1169,8 @@ void qlt_unreg_sess(struct fc_port *sess) + sess->last_rscn_gen = sess->rscn_gen; + sess->last_login_gen = sess->login_gen; + +- if (sess->nvme_flag & NVME_FLAG_REGISTERED && +- !(sess->nvme_flag & NVME_FLAG_DELETING)) { +- sess->nvme_flag |= NVME_FLAG_DELETING; +- schedule_work(&sess->nvme_del_work); +- } else { +- INIT_WORK(&sess->free_work, qlt_free_session_done); +- schedule_work(&sess->free_work); +- } ++ INIT_WORK(&sess->free_work, qlt_free_session_done); ++ schedule_work(&sess->free_work); + } + EXPORT_SYMBOL(qlt_unreg_sess); + +-- +2.13.6 + diff --git a/SOURCES/0106-scsi-scsi-qla2xxx-Remove-unnecessary-null-check.patch b/SOURCES/0106-scsi-scsi-qla2xxx-Remove-unnecessary-null-check.patch new file mode 100644 index 0000000..bf0535f --- /dev/null +++ b/SOURCES/0106-scsi-scsi-qla2xxx-Remove-unnecessary-null-check.patch @@ -0,0 +1,46 @@ +From 0ed777da08d81dc1c246177a5295d96f63279b19 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:06 -0400 +Subject: [PATCH 106/124] [scsi] scsi: qla2xxx: Remove unnecessary null check + +Message-id: <20190801155618.12650-107-hmadhani@redhat.com> +Patchwork-id: 267875 +O-Subject: [RHEL 7.8 e-stor PATCH 106/118] scsi: qla2xxx: Remove unnecessary null check +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: YueHaibing + +Bugzilla 1729270 + +A null check before dma_pool_destroy is redundant, so remove it. This is +detected by coccinelle. + +Signed-off-by: YueHaibing +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0b3b6fe299c471e44ed8713b7a602882626e693f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 5009c5e4b276..c98ba0cd5183 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4866,8 +4866,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) + } + } + +- if (ha->dif_bundl_pool) +- dma_pool_destroy(ha->dif_bundl_pool); ++ dma_pool_destroy(ha->dif_bundl_pool); + ha->dif_bundl_pool = NULL; + + qlt_mem_free(ha); +-- +2.13.6 + diff --git a/SOURCES/0107-scsi-scsi-qla2xxx-Replace-vmalloc-memset-with-vzallo.patch b/SOURCES/0107-scsi-scsi-qla2xxx-Replace-vmalloc-memset-with-vzallo.patch new file mode 100644 index 0000000..0dd9cc4 --- /dev/null +++ b/SOURCES/0107-scsi-scsi-qla2xxx-Replace-vmalloc-memset-with-vzallo.patch @@ -0,0 +1,71 @@ +From 0a9e3bccfbfbf1efcdce1fbdad1231ef93b03541 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:07 -0400 +Subject: [PATCH 107/124] [scsi] scsi: qla2xxx: Replace vmalloc + memset with + vzalloc + +Message-id: <20190801155618.12650-108-hmadhani@redhat.com> +Patchwork-id: 267880 +O-Subject: [RHEL 7.8 e-stor PATCH 107/118] scsi: qla2xxx: Replace vmalloc + memset with vzalloc +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Chuhong Yuan + +Bugzilla 1729270 + +Use vzalloc instead of using vmalloc to allocate memory and then zeroing it +with memset. This simplifies the code. + +Signed-off-by: Chuhong Yuan +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 56cc8fae5f7e9f38cb367754c52491ba1645d1bf) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index c7075f0a5019..a1fbf1af9ea0 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -382,7 +382,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + ha->optrom_region_size = size; + + ha->optrom_state = QLA_SREADING; +- ha->optrom_buffer = vmalloc(ha->optrom_region_size); ++ ha->optrom_buffer = vzalloc(ha->optrom_region_size); + if (ha->optrom_buffer == NULL) { + ql_log(ql_log_warn, vha, 0x7062, + "Unable to allocate memory for optrom retrieval " +@@ -404,7 +404,6 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + "Reading flash region -- 0x%x/0x%x.\n", + ha->optrom_region_start, ha->optrom_region_size); + +- memset(ha->optrom_buffer, 0, ha->optrom_region_size); + ha->isp_ops->read_optrom(vha, ha->optrom_buffer, + ha->optrom_region_start, ha->optrom_region_size); + break; +@@ -457,7 +456,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + ha->optrom_region_size = size; + + ha->optrom_state = QLA_SWRITING; +- ha->optrom_buffer = vmalloc(ha->optrom_region_size); ++ ha->optrom_buffer = vzalloc(ha->optrom_region_size); + if (ha->optrom_buffer == NULL) { + ql_log(ql_log_warn, vha, 0x7066, + "Unable to allocate memory for optrom update " +@@ -472,7 +471,6 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + "Staging flash region write -- 0x%x/0x%x.\n", + ha->optrom_region_start, ha->optrom_region_size); + +- memset(ha->optrom_buffer, 0, ha->optrom_region_size); + break; + case 3: + if (ha->optrom_state != QLA_SWRITING) { +-- +2.13.6 + diff --git a/SOURCES/0108-scsi-scsi-qla2xxx-Fix-DMA-unmap-leak.patch b/SOURCES/0108-scsi-scsi-qla2xxx-Fix-DMA-unmap-leak.patch new file mode 100644 index 0000000..37173df --- /dev/null +++ b/SOURCES/0108-scsi-scsi-qla2xxx-Fix-DMA-unmap-leak.patch @@ -0,0 +1,63 @@ +From e977659d2f2a9f740bfb740afe48c3e6765ef0fe Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:08 -0400 +Subject: [PATCH 108/124] [scsi] scsi: qla2xxx: Fix DMA unmap leak + +Message-id: <20190801155618.12650-109-hmadhani@redhat.com> +Patchwork-id: 267882 +O-Subject: [RHEL 7.8 e-stor PATCH 108/118] scsi: qla2xxx: Fix DMA unmap leak +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Himanshu Madhani + +Bugzilla 1729270 + +With debug kernel we see following wanings indicating memory leak. + +[28809.523959] WARNING: CPU: 3 PID: 6790 at lib/dma-debug.c:978 +dma_debug_device_change+0x166/0x1d0 +[28809.523964] pci 0000:0c:00.6: DMA-API: device driver has pending DMA +allocations while released from device [count=5] +[28809.523964] One of leaked entries details: [device +address=0x00000002aefe4000] [size=8208 bytes] [mapped with DMA_BIDIRECTIONAL] +[mapped as coherent] + +Fix this by unmapping DMA memory. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 5d328de64d89400dcf9911125844d8adc0db697f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_bsg.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index 783541fec019..c59a56aa626b 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -333,6 +333,8 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) + dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, + bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); + if (!req_sg_cnt) { ++ dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, ++ bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); + rval = -ENOMEM; + goto done_free_fcport; + } +@@ -340,6 +342,8 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) + rsp_sg_cnt = dma_map_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, + bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); + if (!rsp_sg_cnt) { ++ dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, ++ bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); + rval = -ENOMEM; + goto done_free_fcport; + } +-- +2.13.6 + diff --git a/SOURCES/0109-scsi-scsi-qla2xxx-Fix-different-size-DMA-Alloc-Unmap.patch b/SOURCES/0109-scsi-scsi-qla2xxx-Fix-different-size-DMA-Alloc-Unmap.patch new file mode 100644 index 0000000..3e47cfc --- /dev/null +++ b/SOURCES/0109-scsi-scsi-qla2xxx-Fix-different-size-DMA-Alloc-Unmap.patch @@ -0,0 +1,55 @@ +From 73bab7c039e77daab1c1d99c06a4b95a8d2a0369 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:09 -0400 +Subject: [PATCH 109/124] [scsi] scsi: qla2xxx: Fix different size DMA + Alloc/Unmap + +Message-id: <20190801155618.12650-110-hmadhani@redhat.com> +Patchwork-id: 267887 +O-Subject: [RHEL 7.8 e-stor PATCH 109/118] scsi: qla2xxx: Fix different size DMA Alloc/Unmap +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +[ 17.177276] qla2xxx 0000:05:00.0: DMA-API: device driver frees DMA memory + with different size [device address=0x00000006198b0000] [map size=32784 bytes] + [unmap size=8208 bytes] +[ 17.177390] RIP: 0010:check_unmap+0x7a2/0x1750 +[ 17.177425] Call Trace: +[ 17.177438] debug_dma_free_coherent+0x1b5/0x2d5 +[ 17.177470] dma_free_attrs+0x7f/0x140 +[ 17.177489] qla24xx_sp_unmap+0x1e2/0x610 [qla2xxx] +[ 17.177509] qla24xx_async_gnnft_done+0x9c6/0x17d0 [qla2xxx] +[ 17.177535] qla2x00_do_work+0x514/0x2200 [qla2xxx] + +Fixes: b5f3bc39a0e8 ("scsi: qla2xxx: Fix inconsistent DMA mem alloc/free") +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit d376dbda187317d06d3a2d495b43a7983e4a3250) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 368eecc13c30..d8ffc03431d4 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -4159,7 +4159,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp) + sp->u.iocb_cmd.u.ctarg.rsp = dma_zalloc_coherent( + &vha->hw->pdev->dev, rspsz, + &sp->u.iocb_cmd.u.ctarg.rsp_dma, GFP_KERNEL); +- sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = sizeof(struct ct_sns_pkt); ++ sp->u.iocb_cmd.u.ctarg.rsp_allocated_size = rspsz; + if (!sp->u.iocb_cmd.u.ctarg.rsp) { + ql_log(ql_log_warn, vha, 0xffff, + "Failed to allocate ct_sns request.\n"); +-- +2.13.6 + diff --git a/SOURCES/0110-scsi-scsi-qla2xxx-Fix-abort-timeout-race-condition.patch b/SOURCES/0110-scsi-scsi-qla2xxx-Fix-abort-timeout-race-condition.patch new file mode 100644 index 0000000..56080f2 --- /dev/null +++ b/SOURCES/0110-scsi-scsi-qla2xxx-Fix-abort-timeout-race-condition.patch @@ -0,0 +1,87 @@ +From 9a632cf08cf8aa40ff3c33fc6dc8925d081a92be Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:10 -0400 +Subject: [PATCH 110/124] [scsi] scsi: qla2xxx: Fix abort timeout race + condition + +Message-id: <20190801155618.12650-111-hmadhani@redhat.com> +Patchwork-id: 267890 +O-Subject: [RHEL 7.8 e-stor PATCH 110/118] scsi: qla2xxx: Fix abort timeout race condition. +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +If an abort times out, the Abort IOCB completion and Abort timer can race +against each other. This patch provides unique error code for timer path to +allow proper cleanup. + +[mkp: typo] + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0c6df59061b23c7a951836d23977be34e896d3da) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 18 ++++++++++++++++-- + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 4c82d210c95d..2ddf38c323ca 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -4661,6 +4661,7 @@ struct secure_flash_update_block_pk { + #define QLA_SUSPENDED 0x106 + #define QLA_BUSY 0x107 + #define QLA_ALREADY_REGISTERED 0x109 ++#define QLA_OS_TIMER_EXPIRED 0x10a + + #define NVRAM_DELAY() udelay(10) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index dc597073020f..d37704f64046 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1790,9 +1790,22 @@ qla24xx_abort_iocb_timeout(void *data) + { + srb_t *sp = data; + struct srb_iocb *abt = &sp->u.iocb_cmd; ++ struct qla_qpair *qpair = sp->qpair; ++ u32 handle; ++ unsigned long flags; ++ ++ spin_lock_irqsave(qpair->qp_lock_ptr, flags); ++ for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) { ++ /* removing the abort */ ++ if (qpair->req->outstanding_cmds[handle] == sp) { ++ qpair->req->outstanding_cmds[handle] = NULL; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + + abt->u.abt.comp_status = CS_TIMEOUT; +- sp->done(sp, QLA_FUNCTION_TIMEOUT); ++ sp->done(sp, QLA_OS_TIMER_EXPIRED); + } + + static void +@@ -1801,7 +1814,8 @@ qla24xx_abort_sp_done(void *ptr, int res) + srb_t *sp = ptr; + struct srb_iocb *abt = &sp->u.iocb_cmd; + +- if (del_timer(&sp->u.iocb_cmd.timer)) { ++ if ((res == QLA_OS_TIMER_EXPIRED) || ++ del_timer(&sp->u.iocb_cmd.timer)) { + if (sp->flags & SRB_WAKEUP_ON_COMP) + complete(&abt->u.abt.comp); + else +-- +2.13.6 + diff --git a/SOURCES/0111-scsi-scsi-qla2xxx-Allow-NVMe-IO-to-resume-with-short.patch b/SOURCES/0111-scsi-scsi-qla2xxx-Allow-NVMe-IO-to-resume-with-short.patch new file mode 100644 index 0000000..cead2a5 --- /dev/null +++ b/SOURCES/0111-scsi-scsi-qla2xxx-Allow-NVMe-IO-to-resume-with-short.patch @@ -0,0 +1,54 @@ +From 2a6ba2926dce7aa598e3800f6395a51ea5ca3cea Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:11 -0400 +Subject: [PATCH 111/124] [scsi] scsi: qla2xxx: Allow NVMe IO to resume with + short cable pull + +Message-id: <20190801155618.12650-112-hmadhani@redhat.com> +Patchwork-id: 267897 +O-Subject: [RHEL 7.8 e-stor PATCH 111/118] scsi: qla2xxx: Allow NVMe IO to resume with short cable pull +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Current driver report dev_loss_tmo to 0 for NVMe devices with short cable +pull. This causes NVMe controller to be freed along with NVMe namespace. +The side affect is IO would stop. By not setting dev_loss_tmo to 0, NVMe +namespace would stay until cable is plugged back in. This allows IO to +resume afterward. + +[mkp: commit desc] + +Signed-off-by: Arun Easi +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 727e9a39a33b1547e4b2091dd79b5596de451810) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_nvme.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index 74fbe38eaae2..ad406511f2ec 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -671,7 +671,9 @@ void qla_nvme_unregister_remote_port(struct fc_port *fcport) + "%s: unregister remoteport on %p %8phN\n", + __func__, fcport, fcport->port_name); + +- nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0); ++ if (test_bit(PFLG_DRIVER_REMOVING, &fcport->vha->pci_flags)) ++ nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0); ++ + init_completion(&fcport->nvme_del_done); + ret = nvme_fc_unregister_remoteport(fcport->nvme_remote_port); + if (ret) +-- +2.13.6 + diff --git a/SOURCES/0112-scsi-scsi-qla2xxx-Fix-hang-in-fcport-delete-path.patch b/SOURCES/0112-scsi-scsi-qla2xxx-Fix-hang-in-fcport-delete-path.patch new file mode 100644 index 0000000..dc7f4af --- /dev/null +++ b/SOURCES/0112-scsi-scsi-qla2xxx-Fix-hang-in-fcport-delete-path.patch @@ -0,0 +1,59 @@ +From 6b2393ab0eedcb1489fe9cb61e15aa3f0198776d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:12 -0400 +Subject: [PATCH 112/124] [scsi] scsi: qla2xxx: Fix hang in fcport delete path + +Message-id: <20190801155618.12650-113-hmadhani@redhat.com> +Patchwork-id: 267893 +O-Subject: [RHEL 7.8 e-stor PATCH 112/118] scsi: qla2xxx: Fix hang in fcport delete path +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +A hang was observed in the fcport delete path when the device was +responding slow and an issue-lip path (results in session termination) was +taken. + +Fix this by issuing logo requests unconditionally. + +PID: 19491 TASK: ffff8e23e67bb150 CPU: 0 COMMAND: "kworker/0:0" + #0 [ffff8e2370297bf8] __schedule at ffffffffb4f7dbb0 + #1 [ffff8e2370297c88] schedule at ffffffffb4f7e199 + #2 [ffff8e2370297c98] schedule_timeout at ffffffffb4f7ba68 + #3 [ffff8e2370297d40] msleep at ffffffffb48ad9ff + #4 [ffff8e2370297d58] qlt_free_session_done at ffffffffc0c32052 [qla2xxx] + #5 [ffff8e2370297e20] process_one_work at ffffffffb48bcfdf + #6 [ffff8e2370297e68] worker_thread at ffffffffb48bdca6 + #7 [ffff8e2370297ec8] kthread at ffffffffb48c4f81 + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit b6398873de637972204b9bac4bd5d32683161c80) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index d37704f64046..fc8e886ebb43 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -286,9 +286,6 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) + struct srb_iocb *lio; + int rval = QLA_FUNCTION_FAILED; + +- if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) +- return rval; +- + fcport->flags |= FCF_ASYNC_SENT; + sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); + if (!sp) +-- +2.13.6 + diff --git a/SOURCES/0113-scsi-scsi-qla2xxx-Use-common-update-firmware-options.patch b/SOURCES/0113-scsi-scsi-qla2xxx-Use-common-update-firmware-options.patch new file mode 100644 index 0000000..144ab79 --- /dev/null +++ b/SOURCES/0113-scsi-scsi-qla2xxx-Use-common-update-firmware-options.patch @@ -0,0 +1,46 @@ +From 75149dceb9836dff780fe5ae306845a993d53e2b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:13 -0400 +Subject: [PATCH 113/124] [scsi] scsi: qla2xxx: Use common + update-firmware-options routine for ISP27xx+ + +Message-id: <20190801155618.12650-114-hmadhani@redhat.com> +Patchwork-id: 267878 +O-Subject: [RHEL 7.8 e-stor PATCH 113/118] scsi: qla2xxx: Use common update-firmware-options routine for ISP27xx+ +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Andrew Vasquez + +Bugzilla 1729270 + +Leverage the generic routine, qla24xx_update_fw_options(), for the +configuration of firmware options for ISP27xx/ISP28xx. + +Signed-off-by: Andrew Vasquez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 42273944c34e5e0c9b58cc0ccb1a7f5365117957) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 c98ba0cd5183..10e05c60a2d7 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -2601,7 +2601,7 @@ static struct isp_operations qla27xx_isp_ops = { + .config_rings = qla24xx_config_rings, + .reset_adapter = qla24xx_reset_adapter, + .nvram_config = qla81xx_nvram_config, +- .update_fw_options = qla81xx_update_fw_options, ++ .update_fw_options = qla24xx_update_fw_options, + .load_risc = qla81xx_load_risc, + .pci_info_str = qla24xx_pci_info_str, + .fw_version_str = qla24xx_fw_version_str, +-- +2.13.6 + diff --git a/SOURCES/0114-scsi-scsi-qla2xxx-Fix-NVMe-port-discovery-after-a-sh.patch b/SOURCES/0114-scsi-scsi-qla2xxx-Fix-NVMe-port-discovery-after-a-sh.patch new file mode 100644 index 0000000..1c79825 --- /dev/null +++ b/SOURCES/0114-scsi-scsi-qla2xxx-Fix-NVMe-port-discovery-after-a-sh.patch @@ -0,0 +1,72 @@ +From bc01bd437894fde056996a3dda1ea365b68ab942 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:14 -0400 +Subject: [PATCH 114/124] [scsi] scsi: qla2xxx: Fix NVMe port discovery after a + short device port loss + +Message-id: <20190801155618.12650-115-hmadhani@redhat.com> +Patchwork-id: 267874 +O-Subject: [RHEL 7.8 e-stor PATCH 114/118] scsi: qla2xxx: Fix NVMe port discovery after a short device port loss +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Arun Easi + +Bugzilla 1729270 + +The following sequence of event leads to NVME port disappearing: + + - device port shut + - nvme_fc_unregister_remoteport + - device port online + - remote port delete completes + - relogin is scheduled + - "post gidpn" message appears due to rscn generation # mismatch + +In short, if a device comes back online sooner than an unregister +completion, a mismatch in rscn generation number occurs, which is not +handled correctly during device relogin. Fix this by starting with a redo +of GNL. + +When ql2xextended_error_logging is enabled, the re-plugged device's +discovery stops with the following messages printed: + +--8<-- +qla2xxx [0000:41:00.0]-480d:3: Relogin scheduled. +qla2xxx [0000:41:00.0]-4800:3: DPC handler sleeping. +qla2xxx [0000:41:00.0]-2902:3: qla24xx_handle_relogin_event 21:00:00:24:ff:17:9e:91 DS 0 LS 7 P 0 del 2 cnfl + (null) rscn 1|2 login 1|2 fl 1 +qla2xxx [0000:41:00.0]-28e9:3: qla24xx_handle_relogin_event 1666 21:00:00:24:ff:17:9e:91 post gidpn +qla2xxx [0000:41:00.0]-480e:3: Relogin end. +--8<-- + +Signed-off-by: Arun Easi +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 2a00c4ebbbfd88f0754acb96cf402f323357384e) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index fc8e886ebb43..22e3dcd3ab62 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1587,9 +1587,9 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, + } + + if (fcport->last_rscn_gen != fcport->rscn_gen) { +- ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gidpn\n", ++ ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gnl\n", + __func__, __LINE__, fcport->port_name); +- ++ qla24xx_post_gnl_work(vha, fcport); + return; + } + +-- +2.13.6 + diff --git a/SOURCES/0115-scsi-scsi-qla2xxx-Correct-error-handling-during-init.patch b/SOURCES/0115-scsi-scsi-qla2xxx-Correct-error-handling-during-init.patch new file mode 100644 index 0000000..a14260f --- /dev/null +++ b/SOURCES/0115-scsi-scsi-qla2xxx-Correct-error-handling-during-init.patch @@ -0,0 +1,111 @@ +From 0ee7d9ad01f4885ddec721d3bfb3b161709efb66 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:15 -0400 +Subject: [PATCH 115/124] [scsi] scsi: qla2xxx: Correct error handling during + initialization failures + +Message-id: <20190801155618.12650-116-hmadhani@redhat.com> +Patchwork-id: 267876 +O-Subject: [RHEL 7.8 e-stor PATCH 115/118] scsi: qla2xxx: Correct error handling during initialization failures +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Andrew Vasquez + +Bugzilla 1729270 + +Current code misses or fails to account for proper recovery during early +initialization failures: + + - Properly unwind allocations during probe() failures. + + - Protect against non-initialization memory allocations during + unwinding. + + - Propagate error status during HW initialization. + + - Release SCSI host reference when memory allocations fail. + +Signed-off-by: Andrew Vasquez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 9e6d7196449711306cbe385a312be953e5100063) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 4 ++++ + drivers/scsi/qla2xxx/qla_os.c | 12 +++++++++--- + 2 files changed, 13 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 22e3dcd3ab62..65d8b8faadba 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -2280,6 +2280,10 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha) + if (qla_ini_mode_enabled(vha) || qla_dual_mode_enabled(vha)) + rval = qla2x00_init_rings(vha); + ++ /* No point in continuing if firmware initialization failed. */ ++ if (rval != QLA_SUCCESS) ++ return rval; ++ + ha->flags.chip_reset_done = 1; + + if (rval == QLA_SUCCESS && IS_QLA84XX(ha)) { +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 10e05c60a2d7..2e96a41839e0 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1851,8 +1851,13 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) + int que; + struct qla_hw_data *ha = vha->hw; + ++ /* Continue only if initialization complete. */ ++ if (!ha->base_qpair) ++ return; + __qla2x00_abort_all_cmds(ha->base_qpair, res); + ++ if (!ha->queue_pair_map) ++ return; + for (que = 0; que < ha->max_qpairs; que++) { + if (!ha->queue_pair_map[que]) + continue; +@@ -3278,6 +3283,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) + ql_log(ql_log_fatal, base_vha, 0x003d, + "Failed to allocate memory for queue pointers..." + "aborting.\n"); ++ ret = -ENODEV; + goto probe_failed; + } + +@@ -4843,7 +4849,7 @@ qla2x00_mem_free(struct qla_hw_data *ha) + mempool_destroy(ha->ctx_mempool); + ha->ctx_mempool = NULL; + +- if (ql2xenabledif) { ++ if (ql2xenabledif && ha->dif_bundl_pool) { + struct dsd_dma *dsd, *nxt; + + list_for_each_entry_safe(dsd, nxt, &ha->pool.unusable.head, +@@ -4939,7 +4945,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, + if (!vha->gnl.l) { + ql_log(ql_log_fatal, vha, 0xd04a, + "Alloc failed for name list.\n"); +- scsi_remove_host(vha->host); ++ scsi_host_put(vha->host); + return NULL; + } + +@@ -4951,7 +4957,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, + "Alloc failed for scan database.\n"); + dma_free_coherent(&ha->pdev->dev, vha->gnl.size, + vha->gnl.l, vha->gnl.ldma); +- scsi_remove_host(vha->host); ++ scsi_host_put(vha->host); + return NULL; + } + INIT_DELAYED_WORK(&vha->scan.scan_work, qla_scan_work_fn); +-- +2.13.6 + diff --git a/SOURCES/0116-scsi-scsi-qla2xxx-Fix-Relogin-to-prevent-modifying-s.patch b/SOURCES/0116-scsi-scsi-qla2xxx-Fix-Relogin-to-prevent-modifying-s.patch new file mode 100644 index 0000000..1c27d4b --- /dev/null +++ b/SOURCES/0116-scsi-scsi-qla2xxx-Fix-Relogin-to-prevent-modifying-s.patch @@ -0,0 +1,124 @@ +From fb71549041f959dd080132f4d38be15bcacb891e Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:16 -0400 +Subject: [PATCH 116/124] [scsi] scsi: qla2xxx: Fix Relogin to prevent + modifying scan_state flag + +Message-id: <20190801155618.12650-117-hmadhani@redhat.com> +Patchwork-id: 267879 +O-Subject: [RHEL 7.8 e-stor PATCH 116/118] scsi: qla2xxx: Fix Relogin to prevent modifying scan_state flag +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Relogin fails to move forward due to scan_state flag indicating device is +not there. Before relogin process, Session delete process accidently +modified the scan_state flag. + +[mkp: typos] + +Fixes: 79140e2f4fa7 ("scsi: qla2xxx: Fix login state machine freeze") +Cc: stable@vger.kernel.org +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit d31ca849b04a6d0434e0835bee1f43bd162e4344) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 25 ++++++++++++++++++++----- + drivers/scsi/qla2xxx/qla_os.c | 1 + + drivers/scsi/qla2xxx/qla_target.c | 1 - + 3 files changed, 21 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 65d8b8faadba..d04dec910dc3 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -216,8 +216,13 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, + struct srb_iocb *lio; + int rval = QLA_FUNCTION_FAILED; + +- if (!vha->flags.online) +- goto done; ++ if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || ++ fcport->loop_id == FC_NO_LOOP_ID) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "%s: %8phC - not sending command.\n", ++ __func__, fcport->port_name); ++ return rval; ++ } + + sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); + if (!sp) +@@ -1186,8 +1191,13 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) + struct port_database_24xx *pd; + struct qla_hw_data *ha = vha->hw; + +- if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) ++ if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || ++ fcport->loop_id == FC_NO_LOOP_ID) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "%s: %8phC - not sending command.\n", ++ __func__, fcport->port_name); + return rval; ++ } + + fcport->disc_state = DSC_GPDB; + +@@ -1967,8 +1977,11 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) + return; + } + +- if (fcport->disc_state == DSC_DELETE_PEND) ++ if ((fcport->disc_state == DSC_DELETE_PEND) || ++ (fcport->disc_state == DSC_DELETED)) { ++ set_bit(RELOGIN_NEEDED, &vha->dpc_flags); + return; ++ } + + if (ea->sp->gen2 != fcport->login_gen) { + /* target side must have changed it. */ +@@ -6728,8 +6741,10 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha) + } + + /* Clear all async request states across all VPs. */ +- list_for_each_entry(fcport, &vha->vp_fcports, list) ++ list_for_each_entry(fcport, &vha->vp_fcports, list) { + fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT); ++ fcport->scan_state = 0; ++ } + spin_lock_irqsave(&ha->vport_slock, flags); + list_for_each_entry(vp, &ha->vp_list, list) { + atomic_inc(&vp->vref_count); +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 2e96a41839e0..fee4975787ec 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5218,6 +5218,7 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) + if (fcport) { + fcport->id_changed = 1; + fcport->scan_state = QLA_FCPORT_FOUND; ++ fcport->chip_reset = vha->hw->base_qpair->chip_reset; + memcpy(fcport->node_name, e->u.new_sess.node_name, WWN_SIZE); + + if (pla) { +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 9e16a97f8fcb..cb205c7a3a62 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -1217,7 +1217,6 @@ static void qla24xx_chk_fcp_state(struct fc_port *sess) + sess->logout_on_delete = 0; + sess->logo_ack_needed = 0; + sess->fw_login_state = DSC_LS_PORT_UNAVAIL; +- sess->scan_state = 0; + } + } + +-- +2.13.6 + diff --git a/SOURCES/0117-scsi-scsi-qla2xxx-Reject-EH_-abort-device_reset-targ.patch b/SOURCES/0117-scsi-scsi-qla2xxx-Reject-EH_-abort-device_reset-targ.patch new file mode 100644 index 0000000..ff78770 --- /dev/null +++ b/SOURCES/0117-scsi-scsi-qla2xxx-Reject-EH_-abort-device_reset-targ.patch @@ -0,0 +1,67 @@ +From f615a5c65929978d0c1192086b31c6fd3174170a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 1 Aug 2019 15:56:17 -0400 +Subject: [PATCH 117/124] [scsi] scsi: qla2xxx: Reject + EH_{abort|device_reset|target_request} + +Message-id: <20190801155618.12650-118-hmadhani@redhat.com> +Patchwork-id: 267881 +O-Subject: [RHEL 7.8 e-stor PATCH 117/118] scsi: qla2xxx: Reject EH_{abort|device_reset|target_request} +Bugzilla: 1729270 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1729270 + +Reject eh_{abort|device_reset|target_reset} when rport is being torn down +or chip is down. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 7f4374e67b3046c9628cf0ab93a117704a38e95d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index fee4975787ec..542a97d713cc 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1344,6 +1344,9 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + if (!qpair) + return SUCCESS; + ++ if (sp->fcport && sp->fcport->deleted) ++ return SUCCESS; ++ + spin_lock_irqsave(qpair->qp_lock_ptr, flags); + if (sp->type != SRB_SCSI_CMD || GET_CMD_SP(sp) != cmd) { + /* there's a chance an interrupt could clear +@@ -1468,6 +1471,9 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, + if (err != 0) + return err; + ++ if (fcport->deleted) ++ return SUCCESS; ++ + ql_log(ql_log_info, vha, 0x8009, + "%s RESET ISSUED nexus=%ld:%d:%d cmd=%p.\n", name, vha->host_no, + cmd->device->id, cmd->device->lun, cmd); +@@ -1581,6 +1587,9 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) + return ret; + ret = FAILED; + ++ if (qla2x00_chip_is_down(vha)) ++ return ret; ++ + ql_log(ql_log_info, vha, 0x8012, + "BUS RESET ISSUED nexus=%ld:%d:%d.\n", vha->host_no, id, lun); + +-- +2.13.6 + diff --git a/SOURCES/0118-scsi-qla2xxx-Update-driver-version-to-10.01.00.18.07.patch b/SOURCES/0118-scsi-qla2xxx-Update-driver-version-to-10.01.00.18.07.patch new file mode 100644 index 0000000..93f91fe --- /dev/null +++ b/SOURCES/0118-scsi-qla2xxx-Update-driver-version-to-10.01.00.18.07.patch @@ -0,0 +1,42 @@ +From 6001d9fc56ee51ad27a17f1c43a0fcf09f3e5621 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Tue, 6 Aug 2019 14:27:22 -0400 +Subject: [PATCH 118/124] [scsi] qla2xxx: Update driver version to + 10.01.00.18.07.8-k + +Message-id: <20190806142722.42747-1-hmadhani@redhat.com> +Patchwork-id: 268307 +O-Subject: [RHEL 7.8 e-stor PATCH v2 118/118] qla2xxx: Update driver version to 10.01.00.18.07.8-k +Bugzilla: 1729270 +RH-Acked-by: Jan Stancek +RH-Acked-by: Ewan Milne + +Bugzilla 1729270 + +Upstream-status: RHEL-Only + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 7e01bfb86ea4..3c5c94460aa0 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.12.07.7-k" ++#define QLA2XXX_VERSION "10.01.00.18.07.8-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_VER 0 +-- +2.13.6 + diff --git a/SOURCES/0120-scsi-scsi-qla2xxx-qla2x00_alloc_fw_dump-set-ha-eft.patch b/SOURCES/0120-scsi-scsi-qla2xxx-qla2x00_alloc_fw_dump-set-ha-eft.patch new file mode 100644 index 0000000..b5ee5b2 --- /dev/null +++ b/SOURCES/0120-scsi-scsi-qla2xxx-qla2x00_alloc_fw_dump-set-ha-eft.patch @@ -0,0 +1,56 @@ +From 8823763ab0d04b7a5062fdfc35d89f2e46edd8ae Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Wed, 4 Sep 2019 21:04:18 -0400 +Subject: [PATCH 120/124] [scsi] scsi: qla2xxx: qla2x00_alloc_fw_dump: set + ha->eft + +Message-id: <20190904210419.3503-2-hmadhani@redhat.com> +Patchwork-id: 270921 +O-Subject: [RHEL7.8 e-stor PATCH 1/2] scsi: qla2xxx: qla2x00_alloc_fw_dump: set ha->eft +Bugzilla: 1749039 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso +RH-Acked-by: Maurizio Lombardi +RH-Acked-by: Ewan Milne + +From: Martin Wilck + +Bugzilla 1749039 + +In qla2x00_alloc_fw_dump(), an existing EFT buffer (e.g. from previous +invocation of qla2x00_alloc_offload_mem()) is freed. The buffer is then +re-allocated, but without setting the eft and eft_dma fields to the new +values. + +Fixes: a28d9e4ef997 ("scsi: qla2xxx: Add support for multiple fwdump templates/segments") +Cc: Joe Carnuccio +Cc: Quinn Tran +Cc: Himanshu Madhani +Cc: Bart Van Assche +Signed-off-by: Martin Wilck +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit edbd56472a636ab396f5ee6783e8438fa725a6ee) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 00b85cb99db1..52d336706349 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3278,6 +3278,8 @@ try_eft: + ql_dbg(ql_dbg_init, vha, 0x00c3, + "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024); + eft_size = EFT_SIZE; ++ ha->eft_dma = tc_dma; ++ ha->eft = tc; + } + + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { +-- +2.13.6 + diff --git a/SOURCES/0121-scsi-scsi-qla2xxx-cleanup-trace-buffer-initializatio.patch b/SOURCES/0121-scsi-scsi-qla2xxx-cleanup-trace-buffer-initializatio.patch new file mode 100644 index 0000000..7b17e86 --- /dev/null +++ b/SOURCES/0121-scsi-scsi-qla2xxx-cleanup-trace-buffer-initializatio.patch @@ -0,0 +1,333 @@ +From c4057d8b60cf06e57bee74fb596f64291803852e Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Wed, 4 Sep 2019 21:04:19 -0400 +Subject: [PATCH 121/124] [scsi] scsi: qla2xxx: cleanup trace buffer + initialization + +Message-id: <20190904210419.3503-3-hmadhani@redhat.com> +Patchwork-id: 270922 +O-Subject: [RHEL7.8 e-stor PATCH 2/2] scsi: qla2xxx: cleanup trace buffer initialization +Bugzilla: 1749039 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Tony Camuso +RH-Acked-by: Maurizio Lombardi +RH-Acked-by: Ewan Milne + +From: Martin Wilck + +Bugzilla 1749039 + +Avoid code duplication between qla2x00_alloc_offload_mem() and +qla2x00_alloc_fw_dump() by moving the FCE and EFT buffer allocation and +initialization to separate functions. Cleanly track failure and success by +making sure that the ha->eft, ha->fce and respective eft_dma, fce_dma +members are set if and only if the buffers are properly allocated and +initialized. Avoid pointless buffer reallocation. Eliminate some goto +statements. Make sure the fce_enabled flag is cleared when the FCE buffer +is freed. + +Fixes: ad0a0b01f088 ("scsi: qla2xxx: Fix Firmware dump size for Extended login and Exchange Offload") +Fixes: a28d9e4ef997 ("scsi: qla2xxx: Add support for multiple fwdump templates/segments") +Cc: Joe Carnuccio +Cc: Quinn Tran +Cc: Himanshu Madhani +Cc: Bart Van Assche +Signed-off-by: Martin Wilck +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 3cf92f4bfccbb3e378cd86dc46e09c2bc18cda26) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 216 ++++++++++++++++++---------------------- + drivers/scsi/qla2xxx/qla_os.c | 1 + + 2 files changed, 100 insertions(+), 117 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 52d336706349..4ca6fc8dce63 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -3113,103 +3113,113 @@ qla24xx_chip_diag(scsi_qla_host_t *vha) + } + + static void +-qla2x00_alloc_offload_mem(scsi_qla_host_t *vha) ++qla2x00_init_fce_trace(scsi_qla_host_t *vha) + { + int rval; + dma_addr_t tc_dma; + void *tc; + struct qla_hw_data *ha = vha->hw; + +- if (ha->eft) { ++ if (!IS_FWI2_CAPABLE(ha)) ++ return; ++ ++ if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && ++ !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ return; ++ ++ if (ha->fce) { + ql_dbg(ql_dbg_init, vha, 0x00bd, +- "%s: Offload Mem is already allocated.\n", +- __func__); ++ "%s: FCE Mem is already allocated.\n", ++ __func__); + return; + } + +- if (IS_FWI2_CAPABLE(ha)) { +- /* Allocate memory for Fibre Channel Event Buffer. */ +- if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- goto try_eft; ++ /* Allocate memory for Fibre Channel Event Buffer. */ ++ tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, ++ GFP_KERNEL); ++ if (!tc) { ++ ql_log(ql_log_warn, vha, 0x00be, ++ "Unable to allocate (%d KB) for FCE.\n", ++ FCE_SIZE / 1024); ++ return; ++ } + +- if (ha->fce) +- dma_free_coherent(&ha->pdev->dev, +- FCE_SIZE, ha->fce, ha->fce_dma); +- +- /* Allocate memory for Fibre Channel Event Buffer. */ +- tc = dma_zalloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, +- GFP_KERNEL); +- if (!tc) { +- ql_log(ql_log_warn, vha, 0x00be, +- "Unable to allocate (%d KB) for FCE.\n", +- FCE_SIZE / 1024); +- goto try_eft; +- } +- +- rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS, +- ha->fce_mb, &ha->fce_bufs); +- if (rval) { +- ql_log(ql_log_warn, vha, 0x00bf, +- "Unable to initialize FCE (%d).\n", rval); +- dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc, +- tc_dma); +- ha->flags.fce_enabled = 0; +- goto try_eft; +- } +- ql_dbg(ql_dbg_init, vha, 0x00c0, +- "Allocate (%d KB) for FCE...\n", FCE_SIZE / 1024); +- +- ha->flags.fce_enabled = 1; +- ha->fce_dma = tc_dma; +- ha->fce = tc; +- +-try_eft: +- if (ha->eft) +- dma_free_coherent(&ha->pdev->dev, +- EFT_SIZE, ha->eft, ha->eft_dma); ++ rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS, ++ ha->fce_mb, &ha->fce_bufs); ++ if (rval) { ++ ql_log(ql_log_warn, vha, 0x00bf, ++ "Unable to initialize FCE (%d).\n", rval); ++ dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc, tc_dma); ++ return; ++ } + +- /* Allocate memory for Extended Trace Buffer. */ +- tc = dma_zalloc_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 eft_err; +- } ++ ql_dbg(ql_dbg_init, vha, 0x00c0, ++ "Allocated (%d KB) for FCE...\n", FCE_SIZE / 1024); + +- 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); +- goto eft_err; +- } +- ql_dbg(ql_dbg_init, vha, 0x00c3, +- "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024); ++ ha->flags.fce_enabled = 1; ++ ha->fce_dma = tc_dma; ++ ha->fce = tc; ++} ++ ++static void ++qla2x00_init_eft_trace(scsi_qla_host_t *vha) ++{ ++ int rval; ++ dma_addr_t tc_dma; ++ void *tc; ++ struct qla_hw_data *ha = vha->hw; ++ ++ if (!IS_FWI2_CAPABLE(ha)) ++ return; + +- ha->eft_dma = tc_dma; +- ha->eft = tc; ++ if (ha->eft) { ++ ql_dbg(ql_dbg_init, vha, 0x00bd, ++ "%s: EFT Mem is already allocated.\n", ++ __func__); ++ return; + } + +-eft_err: +- return; ++ /* 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); ++ return; ++ } ++ ++ 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); ++ return; ++ } ++ ++ ql_dbg(ql_dbg_init, vha, 0x00c3, ++ "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024); ++ ++ ha->eft_dma = tc_dma; ++ ha->eft = tc; ++} ++ ++static void ++qla2x00_alloc_offload_mem(scsi_qla_host_t *vha) ++{ ++ qla2x00_init_fce_trace(vha); ++ qla2x00_init_eft_trace(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; +@@ -3247,39 +3257,13 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) + } + if (ha->tgt.atio_ring) + mq_size += ha->tgt.atio_q_length * sizeof(request_t); +- /* Allocate memory for Fibre Channel Event Buffer. */ +- if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) && +- !IS_QLA27XX(ha) && !IS_QLA28XX(ha)) +- goto try_eft; + +- fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE; +-try_eft: ++ qla2x00_init_fce_trace(vha); ++ if (ha->fce) ++ fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE; ++ qla2x00_init_eft_trace(vha); + 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_size = EFT_SIZE; +- ha->eft_dma = tc_dma; +- ha->eft = tc; ++ eft_size = EFT_SIZE; + } + + if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) { +@@ -3301,24 +3285,22 @@ try_eft: + j, fwdt->dump_size); + dump_size += fwdt->dump_size; + } +- goto allocate; ++ } else { ++ req_q_size = req->length * sizeof(request_t); ++ rsp_q_size = rsp->length * sizeof(response_t); ++ dump_size = offsetof(struct qla2xxx_fw_dump, isp); ++ dump_size += fixed_size + mem_size + req_q_size + rsp_q_size ++ + eft_size; ++ ha->chain_offset = dump_size; ++ dump_size += mq_size + fce_size; ++ if (ha->exchoffld_buf) ++ dump_size += sizeof(struct qla2xxx_offld_chain) + ++ ha->exchoffld_size; ++ if (ha->exlogin_buf) ++ dump_size += sizeof(struct qla2xxx_offld_chain) + ++ ha->exlogin_size; + } + +- req_q_size = req->length * sizeof(request_t); +- rsp_q_size = rsp->length * sizeof(response_t); +- dump_size = offsetof(struct qla2xxx_fw_dump, isp); +- dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + eft_size; +- ha->chain_offset = dump_size; +- dump_size += mq_size + fce_size; +- +- if (ha->exchoffld_buf) +- dump_size += sizeof(struct qla2xxx_offld_chain) + +- ha->exchoffld_size; +- if (ha->exlogin_buf) +- dump_size += sizeof(struct qla2xxx_offld_chain) + +- ha->exlogin_size; +- +-allocate: + if (!ha->fw_dump_len || dump_size > ha->fw_dump_alloc_len) { + + ql_dbg(ql_dbg_init, vha, 0x00c5, +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 542a97d713cc..0eb37e0a8985 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -4740,6 +4740,7 @@ qla2x00_free_fw_dump(struct qla_hw_data *ha) + + ha->fce = NULL; + ha->fce_dma = 0; ++ ha->flags.fce_enabled = 0; + ha->eft = NULL; + ha->eft_dma = 0; + ha->fw_dumped = 0; +-- +2.13.6 + diff --git a/SOURCES/0122-scsi-scsi-qla2xxx-Fix-flash-read-for-Qlogic-ISPs.patch b/SOURCES/0122-scsi-scsi-qla2xxx-Fix-flash-read-for-Qlogic-ISPs.patch new file mode 100644 index 0000000..fdb8bc6 --- /dev/null +++ b/SOURCES/0122-scsi-scsi-qla2xxx-Fix-flash-read-for-Qlogic-ISPs.patch @@ -0,0 +1,99 @@ +From ae0934db1ad3e7deceb2ce974ee80fbf892c021d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Tue, 10 Sep 2019 01:07:18 -0400 +Subject: [PATCH 122/124] [scsi] scsi: qla2xxx: Fix flash read for Qlogic ISPs + +Message-id: <20190910010719.22540-2-hmadhani@redhat.com> +Patchwork-id: 271160 +O-Subject: [RHEL7.8 e-stor PATCH 1/2] scsi: qla2xxx: Fix flash read for Qlogic ISPs +Bugzilla: 1743185 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne + +From: Quinn Tran + +Bugzilla 1743185 + +Use adapter specific callback to read flash instead of ISP adapter +specific. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Reviewed-by: Ewan D. Milne +Link: https://lore.kernel.org/r/20190830222402.23688-3-hmadhani@marvell.com +Signed-off-by: Martin K. Petersen +(cherry picked from commit cb92cb1657c438efe7c88c9759f40c0a9d46c353) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 4 ++-- + drivers/scsi/qla2xxx/qla_nx.c | 1 + + drivers/scsi/qla2xxx/qla_sup.c | 8 ++++---- + 3 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 4ca6fc8dce63..661ecb5bc0e4 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -8324,7 +8324,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ? + "primary" : "secondary"); + } +- qla24xx_read_flash_data(vha, ha->vpd, faddr, ha->vpd_size >> 2); ++ ha->isp_ops->read_optrom(vha, ha->vpd, faddr << 2, ha->vpd_size); + + /* Get NVRAM data into cache and calculate checksum. */ + faddr = ha->flt_region_nvram; +@@ -8336,7 +8336,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha) + "Loading %s nvram image.\n", + active_regions.aux.vpd_nvram == QLA27XX_PRIMARY_IMAGE ? + "primary" : "secondary"); +- qla24xx_read_flash_data(vha, ha->nvram, faddr, ha->nvram_size >> 2); ++ ha->isp_ops->read_optrom(vha, ha->nvram, faddr << 2, ha->nvram_size); + + dptr = (uint32_t *)nv; + for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++, dptr++) +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 8b325a2e6715..e90de07a0ee2 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -2284,6 +2284,7 @@ qla82xx_disable_intrs(struct qla_hw_data *ha) + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); + + qla82xx_mbx_intr_disable(vha); ++ + spin_lock_irq(&ha->hardware_lock); + if (IS_QLA8044(ha)) + qla8044_wr_reg(ha, LEG_INTR_MASK_OFFSET, 1); +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index a5d47ae24ef6..40ed07fc1fa6 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -680,8 +680,8 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + + ha->flt_region_flt = flt_addr; + wptr = (uint16_t *)ha->flt; +- qla24xx_read_flash_data(vha, (void *)flt, flt_addr, +- (sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE) >> 2); ++ ha->isp_ops->read_optrom(vha, (void *)flt, flt_addr << 2, ++ (sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE)); + + if (le16_to_cpu(*wptr) == 0xffff) + goto no_flash_data; +@@ -948,11 +948,11 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) + struct req_que *req = ha->req_q_map[0]; + uint16_t cnt, chksum; + uint16_t *wptr = (void *)req->ring; +- struct qla_fdt_layout *fdt = (void *)req->ring; ++ struct qla_fdt_layout *fdt = (struct qla_fdt_layout *)req->ring; + uint8_t man_id, flash_id; + uint16_t mid = 0, fid = 0; + +- qla24xx_read_flash_data(vha, (void *)fdt, ha->flt_region_fdt, ++ ha->isp_ops->read_optrom(vha, fdt, ha->flt_region_fdt << 2, + OPTROM_BURST_DWORDS); + if (le16_to_cpu(*wptr) == 0xffff) + goto no_flash_data; +-- +2.13.6 + diff --git a/SOURCES/0123-scsi-scsi-qla2xxx-Fix-driver-reload-for-ISP82xx.patch b/SOURCES/0123-scsi-scsi-qla2xxx-Fix-driver-reload-for-ISP82xx.patch new file mode 100644 index 0000000..0fe86e0 --- /dev/null +++ b/SOURCES/0123-scsi-scsi-qla2xxx-Fix-driver-reload-for-ISP82xx.patch @@ -0,0 +1,77 @@ +From 7aa925496676369431b45e4ec82bd419df9b3e8b Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Tue, 10 Sep 2019 01:07:19 -0400 +Subject: [PATCH 123/124] [scsi] scsi: qla2xxx: Fix driver reload for ISP82xx + +Message-id: <20190910010719.22540-3-hmadhani@redhat.com> +Patchwork-id: 271159 +O-Subject: [RHEL7.8 e-stor PATCH 2/2] scsi: qla2xxx: Fix driver reload for ISP82xx +Bugzilla: 1743185 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne + +From: Himanshu Madhani + +Bugzilla 1743185 + +HINT_MBX_INT_PENDING is not guaranteed to be cleared by firmware. Remove +check that prevent driver load with ISP82XX. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Reviewed-by: Ewan D. Milne +Link: https://lore.kernel.org/r/20190830222402.23688-4-hmadhani@marvell.com +Signed-off-by: Martin K. Petersen +(cherry picked from commit 32a13df21668b92f70f0673387f29251e0f285ec) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_mbx.c | 16 ++-------------- + drivers/scsi/qla2xxx/qla_nx.c | 3 ++- + 2 files changed, 4 insertions(+), 15 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 88ff41dd40cd..11a4c4bd62fc 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -253,21 +253,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) + if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) { + set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); + +- if (IS_P3P_TYPE(ha)) { +- if (RD_REG_DWORD(®->isp82.hint) & +- HINT_MBX_INT_PENDING) { +- ha->flags.mbox_busy = 0; +- spin_unlock_irqrestore(&ha->hardware_lock, +- flags); +- +- atomic_dec(&ha->num_pend_mbx_stage2); +- ql_dbg(ql_dbg_mbx, vha, 0x1010, +- "Pending mailbox timeout, exiting.\n"); +- rval = QLA_FUNCTION_TIMEOUT; +- goto premature_exit; +- } ++ if (IS_P3P_TYPE(ha)) + WRT_REG_DWORD(®->isp82.hint, HINT_MBX_INT_PENDING); +- } else if (IS_FWI2_CAPABLE(ha)) ++ else if (IS_FWI2_CAPABLE(ha)) + WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); + else + WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index e90de07a0ee2..397226994341 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -2283,7 +2283,8 @@ qla82xx_disable_intrs(struct qla_hw_data *ha) + { + scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); + +- qla82xx_mbx_intr_disable(vha); ++ if (ha->interrupts_on) ++ qla82xx_mbx_intr_disable(vha); + + spin_lock_irq(&ha->hardware_lock); + if (IS_QLA8044(ha)) +-- +2.13.6 + diff --git a/SOURCES/0124-scsi-scsi-qla2xxx-Use-correct-size-in-call-to-dma_fr.patch b/SOURCES/0124-scsi-scsi-qla2xxx-Use-correct-size-in-call-to-dma_fr.patch new file mode 100644 index 0000000..0be2711 --- /dev/null +++ b/SOURCES/0124-scsi-scsi-qla2xxx-Use-correct-size-in-call-to-dma_fr.patch @@ -0,0 +1,59 @@ +From 08cf51e5506021ec563608334a2cdafc7a97d6e7 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 3 Oct 2019 15:44:18 -0400 +Subject: [PATCH 124/124] [scsi] scsi: qla2xxx: Use correct size in call to + dma_free_coherent() in qla2400_sp_unmap() + +Message-id: <20191003154418.34113-1-hmadhani@redhat.com> +Patchwork-id: 276604 +O-Subject: [RHEL7.8 e-stor PATCH] scsi: qla2xxx: Use correct size in call to dma_free_coherent() in qla2400_sp_unmap() +Bugzilla: 1668767 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Jerry Snitselaar +RH-Acked-by: Ewan Milne +RH-Acked-by: Laurence Oberman + +Bugzilla: 1668767 + +Brewbuild: +https://brewweb.devel.redhat.com/taskinfo?taskID=23831253 + +Testing: +Verified by Customer and RedHat/Marvell engineers. + +This patch matches code upstream which was resolved +as merge conflict by Linus. + +Upstream-status: RHEL-only + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index d8ffc03431d4..23976623af7b 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3169,7 +3169,7 @@ void qla24xx_sp_unmap(scsi_qla_host_t *vha, srb_t *sp) + default: + if (sp->u.iocb_cmd.u.ctarg.req) { + dma_free_coherent(&vha->hw->pdev->dev, +- sizeof(struct ct_sns_pkt), ++ sp->u.iocb_cmd.u.ctarg.req_allocated_size, + sp->u.iocb_cmd.u.ctarg.req, + sp->u.iocb_cmd.u.ctarg.req_dma); + sp->u.iocb_cmd.u.ctarg.req = NULL; +@@ -3177,7 +3177,7 @@ void qla24xx_sp_unmap(scsi_qla_host_t *vha, srb_t *sp) + + if (sp->u.iocb_cmd.u.ctarg.rsp) { + dma_free_coherent(&vha->hw->pdev->dev, +- sizeof(struct ct_sns_pkt), ++ sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, + sp->u.iocb_cmd.u.ctarg.rsp, + sp->u.iocb_cmd.u.ctarg.rsp_dma); + sp->u.iocb_cmd.u.ctarg.rsp = NULL; +-- +2.13.6 + diff --git a/SOURCES/0125-scsi-scsi-qla2xxx-Initialized-mailbox-to-prevent-dri.patch b/SOURCES/0125-scsi-scsi-qla2xxx-Initialized-mailbox-to-prevent-dri.patch new file mode 100644 index 0000000..572e2a3 --- /dev/null +++ b/SOURCES/0125-scsi-scsi-qla2xxx-Initialized-mailbox-to-prevent-dri.patch @@ -0,0 +1,71 @@ +From 6ae9cc7375f15c0c6b6b24b1f39824c5631ca056 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Fri, 8 Nov 2019 20:28:02 -0500 +Subject: [PATCH 125/155] [scsi] scsi: qla2xxx: Initialized mailbox to prevent + driver load failure + +Message-id: <20191108202802.16449-1-hmadhani@redhat.com> +Patchwork-id: 284635 +O-Subject: [RHEL 7.8 e-store PATCH] scsi: qla2xxx: Initialized mailbox to prevent driver load failure +Bugzilla: 1770307 +RH-Acked-by: Ewan Milne +RH-Acked-by: Tomas Henzl +RH-Acked-by: Jarod Wilson + +From: Himanshu Madhani + +Bugzilla: 1770307 + +Brewbuild: +========== +https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=24573208 + +Testing: +======== +Verified by Marvell test team + +This patch fixes issue with Gen7 adapter in a blade environment where one +of the ports will not be detected by driver. Firmware expects mailbox 11 to +be set or cleared by driver for newer ISP. + +Following message is seen in the log file: + +[ 18.810892] qla2xxx [0000:d8:00.0]-1820:1: **** Failed=102 mb[0]=4005 mb[1]=37 mb[2]=20 mb[3]=8 +[ 18.819596] cmd=2 **** + +[mkp: typos] + +Link: https://lore.kernel.org/r/20191022193643.7076-2-hmadhani@marvell.com +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit c2ff2a36eff60efb5e123c940115216d6bf65684) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_mbx.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 11a4c4bd62fc..e082535ed733 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -698,6 +698,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + mcp->mb[2] = LSW(risc_addr); + mcp->mb[3] = 0; + mcp->mb[4] = 0; ++ mcp->mb[11] = 0; + ha->flags.using_lr_setting = 0; + if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) || + IS_QLA27XX(ha) || IS_QLA28XX(ha)) { +@@ -742,7 +743,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) + if (ha->flags.exchoffld_enabled) + mcp->mb[4] |= ENABLE_EXCHANGE_OFFLD; + +- mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1; ++ mcp->out_mb |= MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_11; + mcp->in_mb |= MBX_3 | MBX_2 | MBX_1; + } else { + mcp->mb[1] = LSW(risc_addr); +-- +2.13.6 + diff --git a/SOURCES/0126-scsi-scsi-qla2xxx-Fix-panic-from-use-after-free-in-q.patch b/SOURCES/0126-scsi-scsi-qla2xxx-Fix-panic-from-use-after-free-in-q.patch new file mode 100644 index 0000000..2091ae1 --- /dev/null +++ b/SOURCES/0126-scsi-scsi-qla2xxx-Fix-panic-from-use-after-free-in-q.patch @@ -0,0 +1,63 @@ +From 81d7cd4d8d5fa46e14666b0e5e8576aebf94d089 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:36 -0500 +Subject: [PATCH 126/155] [scsi] scsi: qla2xxx: Fix panic from use after free + in qla2x00_async_tm_cmd + +Message-id: <20191121163701.43688-2-hmadhani@redhat.com> +Patchwork-id: 287845 +O-Subject: [RHLE 7.8 e-stor PATCH v3 01/26] scsi: qla2xxx: Fix panic from use after free in qla2x00_async_tm_cmd +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bill Kuzeja + +Bugzilla 1731581 + +In qla2x00_async_tm_cmd, we reference off sp after it has been freed. This +caused a panic on a system running a slub debug kernel. Since fcport is +passed in anyways, just use that instead. + +Signed-off-by: Bill Kuzeja +Acked-by: Giridhar Malavali +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 388a49959ee4e4e99f160241d9599efa62cd4299) +Signed-off-by: Himanshu Madhani + +[ hmadhani: upstream code when this patch was submitted was before Qpair ] +[ changes were added. RH code has changes for qpair pulled in earlier ] +[ so this patch shows deviation from upstream. However, actual change in ] +[ the patch is applicable and has not been altered ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 661ecb5bc0e4..1c74e8b0e10d 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1781,13 +1781,13 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, + + /* Issue Marker IOCB */ + qla2x00_marker(vha, vha->hw->base_qpair, +- sp->fcport->loop_id, lun, ++ fcport->loop_id, lun, + flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID); + } + + done_free_sp: + sp->free(sp); +- sp->fcport->flags &= ~FCF_ASYNC_SENT; ++ fcport->flags &= ~FCF_ASYNC_SENT; + done: + return rval; + } +-- +2.13.6 + diff --git a/SOURCES/0127-scsi-scsi-qla2xxx-Fix-stuck-login-session.patch b/SOURCES/0127-scsi-scsi-qla2xxx-Fix-stuck-login-session.patch new file mode 100644 index 0000000..aca0874 --- /dev/null +++ b/SOURCES/0127-scsi-scsi-qla2xxx-Fix-stuck-login-session.patch @@ -0,0 +1,92 @@ +From 282c166b09f7a186d96a8f7d99d92a40820852bb Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:37 -0500 +Subject: [PATCH 127/155] [scsi] scsi: qla2xxx: Fix stuck login session + +Message-id: <20191121163701.43688-3-hmadhani@redhat.com> +Patchwork-id: 287844 +O-Subject: [RHLE 7.8 e-stor PATCH v3 02/26] scsi: qla2xxx: Fix stuck login session +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +Login session was stucked on cable pull. When FW is in the middle PRLI +PENDING + driver is in Initiator mode, driver fails to check back with FW to +see if the PRLI has completed. This patch would re-check with FW again to +make sure PRLI would complete before pushing forward with relogin. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Reviewed-by: Ewan D. Milne +Link: https://lore.kernel.org/r/20190830222402.23688-5-hmadhani@marvell.com +Signed-off-by: Martin K. Petersen +(cherry picked from commit ce0ba496dccfc15d3a8866b845864585b5d316ff) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 23 +++++++++++------------ + 1 file changed, 11 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 1c74e8b0e10d..3eecb873a84e 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -732,6 +732,15 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + fcport->fw_login_state = current_login_state; + fcport->d_id = id; + switch (current_login_state) { ++ case DSC_LS_PRLI_PEND: ++ /* ++ * In the middle of PRLI. Let it finish. ++ * Allow relogin code to recheck state again ++ * with GNL. Push disc_state back to DELETED ++ * so GNL can go out again ++ */ ++ fcport->disc_state = DSC_DELETED; ++ break; + case DSC_LS_PRLI_COMP: + if ((e->prli_svc_param_word_3[0] & BIT_4) == 0) + fcport->port_type = FCT_INITIATOR; +@@ -1407,7 +1416,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + u64 wwn; + u16 sec; + +- ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20d8, ++ ql_dbg(ql_dbg_disc, vha, 0x20d8, + "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d lid %d scan %d\n", + __func__, fcport->port_name, fcport->disc_state, + fcport->fw_login_state, fcport->login_pause, fcport->flags, +@@ -1418,6 +1427,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + return 0; + + if ((fcport->loop_id != FC_NO_LOOP_ID) && ++ qla_dual_mode_enabled(vha) && + ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) || + (fcport->fw_login_state == DSC_LS_PRLI_PEND))) + return 0; +@@ -1585,17 +1595,6 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, + fcport->last_login_gen, fcport->login_gen, + fcport->flags); + +- if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) || +- (fcport->fw_login_state == DSC_LS_PRLI_PEND)) +- return; +- +- if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) { +- if (time_before_eq(jiffies, fcport->plogi_nack_done_deadline)) { +- set_bit(RELOGIN_NEEDED, &vha->dpc_flags); +- return; +- } +- } +- + if (fcport->last_rscn_gen != fcport->rscn_gen) { + ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gnl\n", + __func__, __LINE__, fcport->port_name); +-- +2.13.6 + diff --git a/SOURCES/0128-scsi-scsi-qla2xxx-Remove-a-superfluous-forward-decla.patch b/SOURCES/0128-scsi-scsi-qla2xxx-Remove-a-superfluous-forward-decla.patch new file mode 100644 index 0000000..4cba1f8 --- /dev/null +++ b/SOURCES/0128-scsi-scsi-qla2xxx-Remove-a-superfluous-forward-decla.patch @@ -0,0 +1,49 @@ +From f0969d1c707aceee6f073dda9c0c2105f861eca4 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:38 -0500 +Subject: [PATCH 128/155] [scsi] scsi: qla2xxx: Remove a superfluous forward + declaration + +Message-id: <20191121163701.43688-4-hmadhani@redhat.com> +Patchwork-id: 287848 +O-Subject: [RHLE 7.8 e-stor PATCH v3 03/26] scsi: qla2xxx: Remove a superfluous forward declaration +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Since qlt_make_local_sess() is defined before it is called, remove the +forward declaration of that function. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 36645232d9fccc3cea0e91499d1048f27db60f6f) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_target.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index cb205c7a3a62..83be92c72fb3 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -4189,8 +4189,6 @@ static inline int qlt_get_fcp_task_attr(struct scsi_qla_host *vha, + return fcp_task_attr; + } + +-static struct fc_port *qlt_make_local_sess(struct scsi_qla_host *, +- uint8_t *); + /* + * Process context for I/O path into tcm_qla2xxx code + */ +-- +2.13.6 + diff --git a/SOURCES/0129-scsi-scsi-qla2xxx-Reduce-the-number-of-forward-decla.patch b/SOURCES/0129-scsi-scsi-qla2xxx-Reduce-the-number-of-forward-decla.patch new file mode 100644 index 0000000..3ee92af --- /dev/null +++ b/SOURCES/0129-scsi-scsi-qla2xxx-Reduce-the-number-of-forward-decla.patch @@ -0,0 +1,145 @@ +From b9deafb836fb43407e7799698d390dd1adc5b630 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:39 -0500 +Subject: [PATCH 129/155] [scsi] scsi: qla2xxx: Reduce the number of forward + declarations + +Message-id: <20191121163701.43688-5-hmadhani@redhat.com> +Patchwork-id: 287846 +O-Subject: [RHLE 7.8 e-stor PATCH v3 04/26] scsi: qla2xxx: Reduce the number of forward declarations +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Move the SCSI host template definition after the definition of the +functions that it references. Remove the forward declarations that became +unnecessary by that change. This patch does not change any functionality. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 6515ad717bd723f7564581ffdfd5d8064602f29f) +Signed-off-by: Himanshu Madhani + +[RH src uses different template for .change_queue_depth and .change_queue_type ] +[In addition, .use_host_winde_tags is not present upstream, also eh_timed_out ] +[ is not present in RH src ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 78 +++++++++++++++++-------------------------- + 1 file changed, 31 insertions(+), 47 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 0eb37e0a8985..85243e30eb9e 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -305,59 +305,12 @@ MODULE_PARM_DESC(ql2xdifbundlinginternalbuffers, + "0 (Default). Based on check.\n" + "1 Force using internal buffers\n"); + +-/* +- * SCSI host template entry points +- */ +-static int qla2xxx_slave_configure(struct scsi_device * device); +-static int qla2xxx_slave_alloc(struct scsi_device *); +-static int qla2xxx_scan_finished(struct Scsi_Host *, unsigned long time); +-static void qla2xxx_scan_start(struct Scsi_Host *); +-static void qla2xxx_slave_destroy(struct scsi_device *); +-static int qla2xxx_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmd); +-static int qla2xxx_eh_abort(struct scsi_cmnd *); +-static int qla2xxx_eh_device_reset(struct scsi_cmnd *); +-static int qla2xxx_eh_target_reset(struct scsi_cmnd *); +-static int qla2xxx_eh_bus_reset(struct scsi_cmnd *); +-static int qla2xxx_eh_host_reset(struct scsi_cmnd *); +- + static int qla2x00_change_queue_depth(struct scsi_device *, int, int); + static int qla2x00_change_queue_type(struct scsi_device *, int); + static void qla2x00_clear_drv_active(struct qla_hw_data *); + static void qla2x00_free_device(scsi_qla_host_t *); + static void qla2x00_destroy_deferred_work(struct qla_hw_data *); + +- +-struct scsi_host_template qla2xxx_driver_template = { +- .module = THIS_MODULE, +- .name = QLA2XXX_DRIVER_NAME, +- .queuecommand = qla2xxx_queuecommand, +- +- .eh_abort_handler = qla2xxx_eh_abort, +- .eh_device_reset_handler = qla2xxx_eh_device_reset, +- .eh_target_reset_handler = qla2xxx_eh_target_reset, +- .eh_bus_reset_handler = qla2xxx_eh_bus_reset, +- .eh_host_reset_handler = qla2xxx_eh_host_reset, +- +- .slave_configure = qla2xxx_slave_configure, +- +- .slave_alloc = qla2xxx_slave_alloc, +- .slave_destroy = qla2xxx_slave_destroy, +- .scan_finished = qla2xxx_scan_finished, +- .scan_start = qla2xxx_scan_start, +- .change_queue_depth = qla2x00_change_queue_depth, +- .change_queue_type = qla2x00_change_queue_type, +- .this_id = -1, +- .cmd_per_lun = 3, +- .use_clustering = ENABLE_CLUSTERING, +- .sg_tablesize = SG_ALL, +- +- .max_sectors = 0xFFFF, +- .shost_attrs = qla2x00_host_attrs, +- +- .supported_mode = MODE_INITIATOR, +- .use_host_wide_tags = 1, +-}; +- + static struct scsi_transport_template *qla2xxx_transport_template = NULL; + struct scsi_transport_template *qla2xxx_transport_vport_template = NULL; + +@@ -7265,6 +7218,37 @@ qla2xxx_pci_resume(struct pci_dev *pdev) + ha->flags.eeh_busy = 0; + } + ++struct scsi_host_template qla2xxx_driver_template = { ++ .module = THIS_MODULE, ++ .name = QLA2XXX_DRIVER_NAME, ++ .queuecommand = qla2xxx_queuecommand, ++ ++ .eh_abort_handler = qla2xxx_eh_abort, ++ .eh_device_reset_handler = qla2xxx_eh_device_reset, ++ .eh_target_reset_handler = qla2xxx_eh_target_reset, ++ .eh_bus_reset_handler = qla2xxx_eh_bus_reset, ++ .eh_host_reset_handler = qla2xxx_eh_host_reset, ++ ++ .slave_configure = qla2xxx_slave_configure, ++ ++ .slave_alloc = qla2xxx_slave_alloc, ++ .slave_destroy = qla2xxx_slave_destroy, ++ .scan_finished = qla2xxx_scan_finished, ++ .scan_start = qla2xxx_scan_start, ++ .change_queue_depth = qla2x00_change_queue_depth, ++ .change_queue_type = qla2x00_change_queue_type, ++ .this_id = -1, ++ .cmd_per_lun = 3, ++ .use_clustering = ENABLE_CLUSTERING, ++ .sg_tablesize = SG_ALL, ++ ++ .max_sectors = 0xFFFF, ++ .shost_attrs = qla2x00_host_attrs, ++ ++ .supported_mode = MODE_INITIATOR, ++ .use_host_wide_tags = 1, ++}; ++ + static const struct pci_error_handlers qla2xxx_err_handler = { + .error_detected = qla2xxx_pci_error_detected, + .mmio_enabled = qla2xxx_pci_mmio_enabled, +-- +2.13.6 + diff --git a/SOURCES/0130-scsi-scsi-qla2xxx-Make-qla24xx_async_abort_cmd-stati.patch b/SOURCES/0130-scsi-scsi-qla2xxx-Make-qla24xx_async_abort_cmd-stati.patch new file mode 100644 index 0000000..df47249 --- /dev/null +++ b/SOURCES/0130-scsi-scsi-qla2xxx-Make-qla24xx_async_abort_cmd-stati.patch @@ -0,0 +1,257 @@ +From 85a4f5412689ab8b2d60af510a501eb865fc7ef9 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:40 -0500 +Subject: [PATCH 130/155] [scsi] scsi: qla2xxx: Make qla24xx_async_abort_cmd() + static + +Message-id: <20191121163701.43688-6-hmadhani@redhat.com> +Patchwork-id: 287869 +O-Subject: [RHLE 7.8 e-stor PATCH v3 05/26] scsi: qla2xxx: Make qla24xx_async_abort_cmd() static +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Since qla24xx_async_abort_cmd() is only called from inside qla_init.c, +declare that function static. Reorder a few functions to avoid that any +forward declarations are needed. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 1956eee58872e622cfe03f060a5d8a20d24afe47) +Signed-off-by: Himanshu Madhani + +Conflicts: + drivers/scsi/qla2xxx/qla_init.c + +[ hmadhani: RHEL 7.8 submission via bz1729270 included commit ] +[ 0c6df59061b23c7a951836d23977be34e896d3da earlier ] +[ than this patch which moves qla24xx_abort_iocb_timeout() ] +[ to make it static. This patch preserves changes and ] +[ moves the function. No change in acutal source due to ] +[ this patch is introduced. ] + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 1 - + drivers/scsi/qla2xxx/qla_init.c | 177 ++++++++++++++++++++-------------------- + 2 files changed, 87 insertions(+), 91 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 5075d447c69e..6d59359e0d21 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -219,7 +219,6 @@ extern void qla24xx_sched_upd_fcport(fc_port_t *); + void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *, + uint16_t *); + int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *); +-int qla24xx_async_abort_cmd(srb_t *, bool); + int qla24xx_post_relogin_work(struct scsi_qla_host *vha); + void qla2x00_wait_for_sess_deletion(scsi_qla_host_t *); + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 3eecb873a84e..8da5ef9e19f5 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -95,6 +95,93 @@ qla2x00_get_async_timeout(struct scsi_qla_host *vha) + return tmo; + } + ++static void qla24xx_abort_iocb_timeout(void *data) ++{ ++ srb_t *sp = data; ++ struct srb_iocb *abt = &sp->u.iocb_cmd; ++ struct qla_qpair *qpair = sp->qpair; ++ u32 handle; ++ unsigned long flags; ++ ++ spin_lock_irqsave(qpair->qp_lock_ptr, flags); ++ for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) { ++ /* removing the abort */ ++ if (qpair->req->outstanding_cmds[handle] == sp) { ++ qpair->req->outstanding_cmds[handle] = NULL; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); ++ ++ abt->u.abt.comp_status = CS_TIMEOUT; ++ sp->done(sp, QLA_OS_TIMER_EXPIRED); ++} ++ ++static void qla24xx_abort_sp_done(void *ptr, int res) ++{ ++ srb_t *sp = ptr; ++ struct srb_iocb *abt = &sp->u.iocb_cmd; ++ ++ if ((res == QLA_OS_TIMER_EXPIRED) || ++ del_timer(&sp->u.iocb_cmd.timer)) { ++ if (sp->flags & SRB_WAKEUP_ON_COMP) ++ complete(&abt->u.abt.comp); ++ else ++ sp->free(sp); ++ } ++} ++ ++static int qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) ++{ ++ scsi_qla_host_t *vha = cmd_sp->vha; ++ struct srb_iocb *abt_iocb; ++ srb_t *sp; ++ int rval = QLA_FUNCTION_FAILED; ++ ++ sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport, ++ GFP_ATOMIC); ++ if (!sp) ++ goto done; ++ ++ abt_iocb = &sp->u.iocb_cmd; ++ sp->type = SRB_ABT_CMD; ++ sp->name = "abort"; ++ sp->qpair = cmd_sp->qpair; ++ if (wait) ++ sp->flags = SRB_WAKEUP_ON_COMP; ++ ++ abt_iocb->timeout = qla24xx_abort_iocb_timeout; ++ init_completion(&abt_iocb->u.abt.comp); ++ /* FW can send 2 x ABTS's timeout/20s */ ++ qla2x00_init_timer(sp, 42); ++ ++ abt_iocb->u.abt.cmd_hndl = cmd_sp->handle; ++ abt_iocb->u.abt.req_que_no = cpu_to_le16(cmd_sp->qpair->req->id); ++ ++ sp->done = qla24xx_abort_sp_done; ++ ++ ql_dbg(ql_dbg_async, vha, 0x507c, ++ "Abort command issued - hdl=%x, type=%x\n", ++ cmd_sp->handle, cmd_sp->type); ++ ++ rval = qla2x00_start_sp(sp); ++ if (rval != QLA_SUCCESS) ++ goto done_free_sp; ++ ++ if (wait) { ++ wait_for_completion(&abt_iocb->u.abt.comp); ++ rval = abt_iocb->u.abt.comp_status == CS_COMPLETE ? ++ QLA_SUCCESS : QLA_FUNCTION_FAILED; ++ } else { ++ goto done; ++ } ++ ++done_free_sp: ++ sp->free(sp); ++done: ++ return rval; ++} ++ + void + qla2x00_async_iocb_timeout(void *data) + { +@@ -1791,96 +1878,6 @@ done: + return rval; + } + +-static void +-qla24xx_abort_iocb_timeout(void *data) +-{ +- srb_t *sp = data; +- struct srb_iocb *abt = &sp->u.iocb_cmd; +- struct qla_qpair *qpair = sp->qpair; +- u32 handle; +- unsigned long flags; +- +- spin_lock_irqsave(qpair->qp_lock_ptr, flags); +- for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) { +- /* removing the abort */ +- if (qpair->req->outstanding_cmds[handle] == sp) { +- qpair->req->outstanding_cmds[handle] = NULL; +- break; +- } +- } +- spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +- +- abt->u.abt.comp_status = CS_TIMEOUT; +- sp->done(sp, QLA_OS_TIMER_EXPIRED); +-} +- +-static void +-qla24xx_abort_sp_done(void *ptr, int res) +-{ +- srb_t *sp = ptr; +- struct srb_iocb *abt = &sp->u.iocb_cmd; +- +- if ((res == QLA_OS_TIMER_EXPIRED) || +- del_timer(&sp->u.iocb_cmd.timer)) { +- if (sp->flags & SRB_WAKEUP_ON_COMP) +- complete(&abt->u.abt.comp); +- else +- sp->free(sp); +- } +-} +- +-int +-qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) +-{ +- scsi_qla_host_t *vha = cmd_sp->vha; +- struct srb_iocb *abt_iocb; +- srb_t *sp; +- int rval = QLA_FUNCTION_FAILED; +- +- sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport, +- GFP_ATOMIC); +- if (!sp) +- goto done; +- +- abt_iocb = &sp->u.iocb_cmd; +- sp->type = SRB_ABT_CMD; +- sp->name = "abort"; +- sp->qpair = cmd_sp->qpair; +- if (wait) +- sp->flags = SRB_WAKEUP_ON_COMP; +- +- abt_iocb->timeout = qla24xx_abort_iocb_timeout; +- init_completion(&abt_iocb->u.abt.comp); +- /* FW can send 2 x ABTS's timeout/20s */ +- qla2x00_init_timer(sp, 42); +- +- abt_iocb->u.abt.cmd_hndl = cmd_sp->handle; +- abt_iocb->u.abt.req_que_no = cpu_to_le16(cmd_sp->qpair->req->id); +- +- sp->done = qla24xx_abort_sp_done; +- +- ql_dbg(ql_dbg_async, vha, 0x507c, +- "Abort command issued - hdl=%x, type=%x\n", +- cmd_sp->handle, cmd_sp->type); +- +- rval = qla2x00_start_sp(sp); +- if (rval != QLA_SUCCESS) +- goto done_free_sp; +- +- if (wait) { +- wait_for_completion(&abt_iocb->u.abt.comp); +- rval = abt_iocb->u.abt.comp_status == CS_COMPLETE ? +- QLA_SUCCESS : QLA_FUNCTION_FAILED; +- } else { +- goto done; +- } +- +-done_free_sp: +- sp->free(sp); +-done: +- return rval; +-} +- + int + qla24xx_async_abort_command(srb_t *sp) + { +-- +2.13.6 + diff --git a/SOURCES/0131-scsi-scsi-qla2xxx-Really-fix-qla2xxx_eh_abort.patch b/SOURCES/0131-scsi-scsi-qla2xxx-Really-fix-qla2xxx_eh_abort.patch new file mode 100644 index 0000000..247b5df --- /dev/null +++ b/SOURCES/0131-scsi-scsi-qla2xxx-Really-fix-qla2xxx_eh_abort.patch @@ -0,0 +1,98 @@ +From 5d69aadca6a34dbd28749ba285ed57b42e63253c Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:41 -0500 +Subject: [PATCH 131/155] [scsi] scsi: qla2xxx: Really fix qla2xxx_eh_abort() + +Message-id: <20191121163701.43688-7-hmadhani@redhat.com> +Patchwork-id: 287855 +O-Subject: [RHLE 7.8 e-stor PATCH v3 06/26] scsi: qla2xxx: Really fix qla2xxx_eh_abort() +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +I'm not sure how this happened but the patch that was intended to fix abort +handling was incomplete. This patch fixes that patch as follows: + + - If aborting the SCSI command failed, wait until the SCSI command + completes. + + - Return SUCCESS instead of FAILED if an abort attempt races with SCSI + command completion. + + - Since qla2xxx_eh_abort() increments the sp reference count by calling + sp_get(), decrement the sp reference count before returning. + +Cc: Himanshu Madhani +Fixes: 219d27d7147e ("scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands") +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 8dd9593cc07ad7d999bef81b06789ef873a94881) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 85243e30eb9e..9e0a724f08f6 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1271,6 +1271,7 @@ static int + qla2xxx_eh_abort(struct scsi_cmnd *cmd) + { + scsi_qla_host_t *vha = shost_priv(cmd->device->host); ++ DECLARE_COMPLETION_ONSTACK(comp); + srb_t *sp; + int ret; + unsigned int id, lun; +@@ -1308,6 +1309,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + return SUCCESS; + } + ++ /* Get a reference to the sp and drop the lock. */ + if (sp_get(sp)){ + /* ref_count is already 0 */ + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +@@ -1335,6 +1337,23 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + sp->done(sp, DID_ABORT << 16); + ret = SUCCESS; + break; ++ case QLA_FUNCTION_PARAMETER_ERROR: { ++ /* Wait for the command completion. */ ++ uint32_t ratov = ha->r_a_tov/10; ++ uint32_t ratov_j = msecs_to_jiffies(4 * ratov * 1000); ++ ++ WARN_ON_ONCE(sp->comp); ++ sp->comp = ∁ ++ if (!wait_for_completion_timeout(&comp, ratov_j)) { ++ ql_dbg(ql_dbg_taskm, vha, 0xffff, ++ "%s: Abort wait timer (4 * R_A_TOV[%d]) expired\n", ++ __func__, ha->r_a_tov); ++ ret = FAILED; ++ } else { ++ ret = SUCCESS; ++ } ++ break; ++ } + default: + /* + * Either abort failed or abort and completion raced. Let +@@ -1344,6 +1363,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + break; + } + ++ sp->comp = NULL; ++ atomic_dec(&sp->ref_count); + ql_log(ql_log_info, vha, 0x801c, + "Abort command issued nexus=%ld:%d:%d -- %x.\n", + vha->host_no, id, lun, ret); +-- +2.13.6 + diff --git a/SOURCES/0132-scsi-scsi-qla2xxx-Introduce-the-function-qla2xxx_ini.patch b/SOURCES/0132-scsi-scsi-qla2xxx-Introduce-the-function-qla2xxx_ini.patch new file mode 100644 index 0000000..5b5efd8 --- /dev/null +++ b/SOURCES/0132-scsi-scsi-qla2xxx-Introduce-the-function-qla2xxx_ini.patch @@ -0,0 +1,82 @@ +From 5851de30cd35a70d8c8d0e3d9b8d086e9837ed49 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:42 -0500 +Subject: [PATCH 132/155] [scsi] scsi: qla2xxx: Introduce the function + qla2xxx_init_sp() + +Message-id: <20191121163701.43688-8-hmadhani@redhat.com> +Patchwork-id: 287850 +O-Subject: [RHLE 7.8 e-stor PATCH v3 07/26] scsi: qla2xxx: Introduce the function qla2xxx_init_sp() +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +This patch does not change any functionality but makes the next patch +easier to read. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit bdb61b9b944d1e5b7cee5a9fe21014363c55b811) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_inline.h | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index 03fd0288ac03..278db58f6e70 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -152,6 +152,18 @@ qla2x00_chip_is_down(scsi_qla_host_t *vha) + return (qla2x00_reset_active(vha) || !vha->hw->flags.fw_started); + } + ++static void qla2xxx_init_sp(srb_t *sp, scsi_qla_host_t *vha, ++ struct qla_qpair *qpair, fc_port_t *fcport) ++{ ++ memset(sp, 0, sizeof(*sp)); ++ sp->fcport = fcport; ++ sp->iocbs = 1; ++ sp->vha = vha; ++ sp->qpair = qpair; ++ sp->cmd_type = TYPE_SRB; ++ INIT_LIST_HEAD(&sp->elem); ++} ++ + static inline srb_t * + qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair, + fc_port_t *fcport, gfp_t flag) +@@ -164,19 +176,9 @@ qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair, + return NULL; + + sp = mempool_alloc(qpair->srb_mempool, flag); +- if (!sp) +- goto done; +- +- memset(sp, 0, sizeof(*sp)); +- sp->fcport = fcport; +- sp->iocbs = 1; +- sp->vha = vha; +- sp->qpair = qpair; +- sp->cmd_type = TYPE_SRB; +- INIT_LIST_HEAD(&sp->elem); +- +-done: +- if (!sp) ++ if (sp) ++ qla2xxx_init_sp(sp, vha, qpair, fcport); ++ else + QLA_QPAIR_MARK_NOT_BUSY(qpair); + return sp; + } +-- +2.13.6 + diff --git a/SOURCES/0133-scsi-scsi-qla2xxx-Fix-a-race-condition-between-abort.patch b/SOURCES/0133-scsi-scsi-qla2xxx-Fix-a-race-condition-between-abort.patch new file mode 100644 index 0000000..6ad6c2f --- /dev/null +++ b/SOURCES/0133-scsi-scsi-qla2xxx-Fix-a-race-condition-between-abort.patch @@ -0,0 +1,172 @@ +From b07af7d76a087066c597aec11bef189e0da88541 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:43 -0500 +Subject: [PATCH 133/155] [scsi] scsi: qla2xxx: Fix a race condition between + aborting and completing a SCSI command + +Message-id: <20191121163701.43688-9-hmadhani@redhat.com> +Patchwork-id: 287863 +O-Subject: [RHLE 7.8 e-stor PATCH v3 08/26] scsi: qla2xxx: Fix a race condition between aborting and completing a SCSI command +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Instead of allocating a struct srb dynamically from inside .queuecommand(), +set qla2xxx_driver_template.cmd_size such that struct scsi_cmnd and struct +srb are contiguous. Do not call QLA_QPAIR_MARK_BUSY() / +QLA_QPAIR_MARK_NOT_BUSY() for SRBs associated with SCSI commands. That is +safe because scsi_remove_host() is called before queue pairs are deleted +and scsi_remove_host() waits for all outstanding SCSI commands to finish. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 85cffefa09e448906a6f0bc20f422d75a18675bd) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 - + drivers/scsi/qla2xxx/qla_os.c | 45 ++++++++---------------------------------- + 2 files changed, 8 insertions(+), 38 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 5975f107d65d..3f6319edabd4 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -569,7 +569,6 @@ typedef struct srb { + } srb_t; + + #define GET_CMD_SP(sp) (sp->u.scmd.cmd) +-#define SET_CMD_SP(sp, cmd) (sp->u.scmd.cmd = cmd) + #define GET_CMD_CTX_SP(sp) (sp->u.scmd.ctx) + + #define GET_CMD_SENSE_LEN(sp) \ +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 9e0a724f08f6..b2500db628f1 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -725,7 +725,6 @@ qla2x00_sp_compl(void *ptr, int res) + cmd->scsi_done(cmd); + if (comp) + complete(comp); +- qla2x00_rel_sp(sp); + } + + void +@@ -830,7 +829,6 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + cmd->scsi_done(cmd); + if (comp) + complete(comp); +- qla2xxx_rel_qpair_sp(sp->qpair, sp); + } + + static int +@@ -927,9 +925,8 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) + else + goto qc24_target_busy; + +- sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC); +- if (!sp) +- goto qc24_host_busy; ++ sp = scsi_cmd_priv(cmd); ++ qla2xxx_init_sp(sp, vha, vha->hw->base_qpair, fcport); + + sp->u.scmd.cmd = cmd; + sp->type = SRB_SCSI_CMD; +@@ -950,9 +947,6 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) + qc24_host_busy_free_sp: + sp->free(sp); + +-qc24_host_busy: +- return SCSI_MLQUEUE_HOST_BUSY; +- + qc24_target_busy: + return SCSI_MLQUEUE_TARGET_BUSY; + +@@ -1013,9 +1007,8 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + else + goto qc24_target_busy; + +- sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, GFP_ATOMIC); +- if (!sp) +- goto qc24_host_busy; ++ sp = scsi_cmd_priv(cmd); ++ qla2xxx_init_sp(sp, vha, qpair, fcport); + + sp->u.scmd.cmd = cmd; + sp->type = SRB_SCSI_CMD; +@@ -1039,9 +1032,6 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + qc24_host_busy_free_sp: + sp->free(sp); + +-qc24_host_busy: +- return SCSI_MLQUEUE_HOST_BUSY; +- + qc24_target_busy: + return SCSI_MLQUEUE_TARGET_BUSY; + +@@ -1275,10 +1265,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + srb_t *sp; + int ret; + unsigned int id, lun; +- unsigned long flags; + int rval; + struct qla_hw_data *ha = vha->hw; +- struct qla_qpair *qpair; + + if (qla2x00_isp_reg_stat(ha)) { + ql_log(ql_log_info, vha, 0x8042, +@@ -1290,32 +1278,14 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + if (ret != 0) + return ret; + +- sp = (srb_t *) CMD_SP(cmd); +- if (!sp) +- return SUCCESS; +- +- qpair = sp->qpair; +- if (!qpair) +- return SUCCESS; ++ sp = scsi_cmd_priv(cmd); + + if (sp->fcport && sp->fcport->deleted) + return SUCCESS; + +- spin_lock_irqsave(qpair->qp_lock_ptr, flags); +- if (sp->type != SRB_SCSI_CMD || GET_CMD_SP(sp) != cmd) { +- /* there's a chance an interrupt could clear +- the ptr as part of done & free */ +- spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +- return SUCCESS; +- } +- +- /* Get a reference to the sp and drop the lock. */ +- if (sp_get(sp)){ +- /* ref_count is already 0 */ +- spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); ++ /* Return if the command has already finished. */ ++ if (sp_get(sp)) + return SUCCESS; +- } +- spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + + id = cmd->device->id; + lun = cmd->device->lun; +@@ -7268,6 +7238,7 @@ struct scsi_host_template qla2xxx_driver_template = { + + .supported_mode = MODE_INITIATOR, + .use_host_wide_tags = 1, ++ .cmd_size = sizeof(srb_t), + }; + + static const struct pci_error_handlers qla2xxx_err_handler = { +-- +2.13.6 + diff --git a/SOURCES/0134-scsi-scsi-qla2xxx-Fix-N2N-link-reset.patch b/SOURCES/0134-scsi-scsi-qla2xxx-Fix-N2N-link-reset.patch new file mode 100644 index 0000000..8b4e24c --- /dev/null +++ b/SOURCES/0134-scsi-scsi-qla2xxx-Fix-N2N-link-reset.patch @@ -0,0 +1,321 @@ +From 6292615948dbabf20ccde5ec088480ae712637b5 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:44 -0500 +Subject: [PATCH 134/155] [scsi] scsi: qla2xxx: Fix N2N link reset + +Message-id: <20191121163701.43688-10-hmadhani@redhat.com> +Patchwork-id: 287870 +O-Subject: [RHLE 7.8 e-stor PATCH v3 09/26] scsi: qla2xxx: Fix N2N link reset +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +Fix stalled link recovery for N2N with FC-NVMe connection. + +Link: https://lore.kernel.org/r/20190912180918.6436-6-hmadhani@marvell.com +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 7f2a398d59d658818f3d219645164676fbbc88e8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 3 +- + drivers/scsi/qla2xxx/qla_init.c | 107 +++++++++++++++++++++++++++++----------- + drivers/scsi/qla2xxx/qla_mbx.c | 23 +++++++-- + drivers/scsi/qla2xxx/qla_os.c | 4 ++ + 4 files changed, 103 insertions(+), 34 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 3f6319edabd4..9108762875ed 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2379,6 +2379,7 @@ typedef struct fc_port { + unsigned int query:1; + unsigned int id_changed:1; + unsigned int scan_needed:1; ++ unsigned int n2n_flag:1; + + struct completion nvme_del_done; + uint32_t nvme_prli_service_param; +@@ -2429,7 +2430,6 @@ typedef struct fc_port { + uint8_t fc4_type; + uint8_t fc4f_nvme; + uint8_t scan_state; +- uint8_t n2n_flag; + + unsigned long last_queue_full; + unsigned long last_ramp_up; +@@ -3020,6 +3020,7 @@ enum scan_flags_t { + enum fc4type_t { + FS_FC4TYPE_FCP = BIT_0, + FS_FC4TYPE_NVME = BIT_1, ++ FS_FCP_IS_N2N = BIT_7, + }; + + struct fab_scan_rp { +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 8da5ef9e19f5..fc30eda330a4 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -757,12 +757,15 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + break; + default: + if ((id.b24 != fcport->d_id.b24 && +- fcport->d_id.b24) || ++ fcport->d_id.b24 && ++ fcport->loop_id != FC_NO_LOOP_ID) || + (fcport->loop_id != FC_NO_LOOP_ID && + fcport->loop_id != loop_id)) { + ql_dbg(ql_dbg_disc, vha, 0x20e3, + "%s %d %8phC post del sess\n", + __func__, __LINE__, fcport->port_name); ++ if (fcport->n2n_flag) ++ fcport->d_id.b24 = 0; + qlt_schedule_sess_for_deletion(fcport); + return; + } +@@ -770,6 +773,8 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + } + + fcport->loop_id = loop_id; ++ if (fcport->n2n_flag) ++ fcport->d_id.b24 = id.b24; + + wwn = wwn_to_u64(fcport->port_name); + qlt_find_sess_invalidate_other(vha, wwn, +@@ -986,7 +991,7 @@ qla24xx_async_gnl_sp_done(void *s, int res) + wwn = wwn_to_u64(e->port_name); + + ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20e8, +- "%s %8phC %02x:%02x:%02x state %d/%d lid %x \n", ++ "%s %8phC %02x:%02x:%02x CLS %x/%x lid %x \n", + __func__, (void *)&wwn, e->port_id[2], e->port_id[1], + e->port_id[0], e->current_login_state, e->last_login_state, + (loop_id & 0x7fff)); +@@ -1519,7 +1524,8 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + (fcport->fw_login_state == DSC_LS_PRLI_PEND))) + return 0; + +- if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) { ++ if (fcport->fw_login_state == DSC_LS_PLOGI_COMP && ++ !N2N_TOPO(vha->hw)) { + if (time_before_eq(jiffies, fcport->plogi_nack_done_deadline)) { + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); + return 0; +@@ -1590,8 +1596,9 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + qla24xx_post_gpdb_work(vha, fcport, 0); + } else { + ql_dbg(ql_dbg_disc, vha, 0x2118, +- "%s %d %8phC post NVMe PRLI\n", +- __func__, __LINE__, fcport->port_name); ++ "%s %d %8phC post %s PRLI\n", ++ __func__, __LINE__, fcport->port_name, ++ fcport->fc4f_nvme ? "NVME" : "FC"); + qla24xx_post_prli_work(vha, fcport); + } + break; +@@ -1934,17 +1941,38 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea) + break; + } + +- if (ea->fcport->n2n_flag) { ++ if (ea->fcport->fc4f_nvme) { + ql_dbg(ql_dbg_disc, vha, 0x2118, + "%s %d %8phC post fc4 prli\n", + __func__, __LINE__, ea->fcport->port_name); + ea->fcport->fc4f_nvme = 0; +- ea->fcport->n2n_flag = 0; + qla24xx_post_prli_work(vha, ea->fcport); ++ return; ++ } ++ ++ /* at this point both PRLI NVME & PRLI FCP failed */ ++ if (N2N_TOPO(vha->hw)) { ++ if (ea->fcport->n2n_link_reset_cnt < 3) { ++ ea->fcport->n2n_link_reset_cnt++; ++ /* ++ * remote port is not sending Plogi. Reset ++ * link to kick start his state machine ++ */ ++ set_bit(N2N_LINK_RESET, &vha->dpc_flags); ++ } else { ++ ql_log(ql_log_warn, vha, 0x2119, ++ "%s %d %8phC Unable to reconnect\n", ++ __func__, __LINE__, ea->fcport->port_name); ++ } ++ } else { ++ /* ++ * switch connect. login failed. Take connection ++ * down and allow relogin to retrigger ++ */ ++ ea->fcport->flags &= ~FCF_ASYNC_SENT; ++ ea->fcport->keep_nport_handle = 0; ++ qlt_schedule_sess_for_deletion(ea->fcport); + } +- ql_dbg(ql_dbg_disc, vha, 0x2119, +- "%s %d %8phC unhandle event of %x\n", +- __func__, __LINE__, ea->fcport->port_name, ea->data[0]); + break; + } + } +@@ -5095,28 +5123,47 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha) + unsigned long flags; + + /* Inititae N2N login. */ +- if (test_and_clear_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags)) { +- /* borrowing */ +- u32 *bp, i, sz; +- +- memset(ha->init_cb, 0, ha->init_cb_size); +- sz = min_t(int, sizeof(struct els_plogi_payload), +- ha->init_cb_size); +- rval = qla24xx_get_port_login_templ(vha, ha->init_cb_dma, +- (void *)ha->init_cb, sz); +- if (rval == QLA_SUCCESS) { +- bp = (uint32_t *)ha->init_cb; +- for (i = 0; i < sz/4 ; i++, bp++) +- *bp = cpu_to_be32(*bp); ++ if (N2N_TOPO(ha)) { ++ if (test_and_clear_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags)) { ++ /* borrowing */ ++ u32 *bp, i, sz; ++ ++ memset(ha->init_cb, 0, ha->init_cb_size); ++ sz = min_t(int, sizeof(struct els_plogi_payload), ++ ha->init_cb_size); ++ rval = qla24xx_get_port_login_templ(vha, ++ ha->init_cb_dma, (void *)ha->init_cb, sz); ++ if (rval == QLA_SUCCESS) { ++ bp = (uint32_t *)ha->init_cb; ++ for (i = 0; i < sz/4 ; i++, bp++) ++ *bp = cpu_to_be32(*bp); + +- memcpy(&ha->plogi_els_payld.data, (void *)ha->init_cb, +- sizeof(ha->plogi_els_payld.data)); +- set_bit(RELOGIN_NEEDED, &vha->dpc_flags); +- } else { +- ql_dbg(ql_dbg_init, vha, 0x00d1, +- "PLOGI ELS param read fail.\n"); ++ memcpy(&ha->plogi_els_payld.data, ++ (void *)ha->init_cb, ++ sizeof(ha->plogi_els_payld.data)); ++ set_bit(RELOGIN_NEEDED, &vha->dpc_flags); ++ } else { ++ ql_dbg(ql_dbg_init, vha, 0x00d1, ++ "PLOGI ELS param read fail.\n"); ++ goto skip_login; ++ } ++ } ++ ++ list_for_each_entry(fcport, &vha->vp_fcports, list) { ++ if (fcport->n2n_flag) { ++ qla24xx_fcport_handle_login(vha, fcport); ++ return QLA_SUCCESS; ++ } ++ } ++skip_login: ++ spin_lock_irqsave(&vha->work_lock, flags); ++ vha->scan.scan_retry++; ++ spin_unlock_irqrestore(&vha->work_lock, flags); ++ ++ if (vha->scan.scan_retry < MAX_SCAN_RETRIES) { ++ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); ++ set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); + } +- return QLA_SUCCESS; + } + + found_devs = 0; +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index e082535ed733..4183b969036b 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -2248,7 +2248,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + +- ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x105a, ++ ql_dbg(ql_dbg_disc, vha, 0x105a, + "Entered %s.\n", __func__); + + if (IS_CNA_CAPABLE(vha->hw)) { +@@ -3882,14 +3882,23 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + case TOPO_N2N: + ha->current_topology = ISP_CFG_N; + spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); ++ list_for_each_entry(fcport, &vha->vp_fcports, list) { ++ fcport->scan_state = QLA_FCPORT_SCAN; ++ fcport->n2n_flag = 0; ++ } ++ + fcport = qla2x00_find_fcport_by_wwpn(vha, + rptid_entry->u.f1.port_name, 1); + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); + + if (fcport) { + fcport->plogi_nack_done_deadline = jiffies + HZ; +- fcport->dm_login_expire = jiffies + 3*HZ; ++ fcport->dm_login_expire = jiffies + 2*HZ; + fcport->scan_state = QLA_FCPORT_FOUND; ++ fcport->n2n_flag = 1; ++ if (vha->flags.nvme_enabled) ++ fcport->fc4f_nvme = 1; ++ + switch (fcport->disc_state) { + case DSC_DELETED: + set_bit(RELOGIN_NEEDED, +@@ -3923,7 +3932,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + rptid_entry->u.f1.port_name, + rptid_entry->u.f1.node_name, + NULL, +- FC4_TYPE_UNKNOWN); ++ FS_FCP_IS_N2N); + } + + /* if our portname is higher then initiate N2N login */ +@@ -4022,6 +4031,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + + list_for_each_entry(fcport, &vha->vp_fcports, list) { + fcport->scan_state = QLA_FCPORT_SCAN; ++ fcport->n2n_flag = 0; + } + + fcport = qla2x00_find_fcport_by_wwpn(vha, +@@ -4031,6 +4041,13 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + fcport->login_retry = vha->hw->login_retry_count; + fcport->plogi_nack_done_deadline = jiffies + HZ; + fcport->scan_state = QLA_FCPORT_FOUND; ++ fcport->n2n_flag = 1; ++ fcport->d_id.b.domain = ++ rptid_entry->u.f2.remote_nport_id[2]; ++ fcport->d_id.b.area = ++ rptid_entry->u.f2.remote_nport_id[1]; ++ fcport->d_id.b.al_pa = ++ rptid_entry->u.f2.remote_nport_id[0]; + } + } + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index b2500db628f1..c9e0f1968d45 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5135,6 +5135,10 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) + + memcpy(fcport->port_name, e->u.new_sess.port_name, + WWN_SIZE); ++ ++ if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N) ++ fcport->n2n_flag = 1; ++ + } else { + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %8phC mem alloc fail.\n", +-- +2.13.6 + diff --git a/SOURCES/0135-scsi-scsi-qla2xxx-Fix-N2N-link-up-fail.patch b/SOURCES/0135-scsi-scsi-qla2xxx-Fix-N2N-link-up-fail.patch new file mode 100644 index 0000000..2cf328b --- /dev/null +++ b/SOURCES/0135-scsi-scsi-qla2xxx-Fix-N2N-link-up-fail.patch @@ -0,0 +1,74 @@ +From 7541a8f6d5cbaaf82e386e508cb3a878bed19c98 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:45 -0500 +Subject: [PATCH 135/155] [scsi] scsi: qla2xxx: Fix N2N link up fail + +Message-id: <20191121163701.43688-11-hmadhani@redhat.com> +Patchwork-id: 287857 +O-Subject: [RHLE 7.8 e-stor PATCH v3 10/26] scsi: qla2xxx: Fix N2N link up fail +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +During link up/bounce, qla driver would do command flush as part of +cleanup. In this case, the flush can intefere with FW state. This patch +allows FW to be in control of link up. + +Link: https://lore.kernel.org/r/20190912180918.6436-7-hmadhani@marvell.com +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit f3f1938bb673b1b5ad182c4608f5f8a24921eea3) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_mbx.c | 2 ++ + drivers/scsi/qla2xxx/qla_os.c | 6 ++---- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 4183b969036b..844db5bc3e34 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -3896,6 +3896,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + fcport->dm_login_expire = jiffies + 2*HZ; + fcport->scan_state = QLA_FCPORT_FOUND; + fcport->n2n_flag = 1; ++ fcport->keep_nport_handle = 1; + if (vha->flags.nvme_enabled) + fcport->fc4f_nvme = 1; + +@@ -4041,6 +4042,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, + fcport->login_retry = vha->hw->login_retry_count; + fcport->plogi_nack_done_deadline = jiffies + HZ; + fcport->scan_state = QLA_FCPORT_FOUND; ++ fcport->keep_nport_handle = 1; + fcport->n2n_flag = 1; + fcport->d_id.b.domain = + rptid_entry->u.f2.remote_nport_id[2]; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index c9e0f1968d45..385264e0a3f4 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5235,11 +5235,9 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) + if (dfcp) + qlt_schedule_sess_for_deletion(tfcp); + +- +- if (N2N_TOPO(vha->hw)) +- fcport->flags &= ~FCF_FABRIC_DEVICE; +- + if (N2N_TOPO(vha->hw)) { ++ fcport->flags &= ~FCF_FABRIC_DEVICE; ++ fcport->keep_nport_handle = 1; + if (vha->flags.nvme_enabled) { + fcport->fc4f_nvme = 1; + fcport->n2n_flag = 1; +-- +2.13.6 + diff --git a/SOURCES/0136-scsi-scsi-qla2xxx-Use-tabs-instead-of-spaces-for-ind.patch b/SOURCES/0136-scsi-scsi-qla2xxx-Use-tabs-instead-of-spaces-for-ind.patch new file mode 100644 index 0000000..0269ac3 --- /dev/null +++ b/SOURCES/0136-scsi-scsi-qla2xxx-Use-tabs-instead-of-spaces-for-ind.patch @@ -0,0 +1,133 @@ +From 0b10b1ce904dad6ce4f799be14a85da1383628db Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:46 -0500 +Subject: [PATCH 136/155] [scsi] scsi: qla2xxx: Use tabs instead of spaces for + indentation + +Message-id: <20191121163701.43688-12-hmadhani@redhat.com> +Patchwork-id: 287861 +O-Subject: [RHLE 7.8 e-stor PATCH v3 11/26] scsi: qla2xxx: Use tabs instead of spaces for indentation +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +This patch only modifies whitespace. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 0184793df2e860534380a66aa76b8807e71188c2) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 78 +++++++++++++++++++++---------------------- + 1 file changed, 39 insertions(+), 39 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 23976623af7b..ed92645e2f03 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3476,54 +3476,54 @@ done: + + void qla24xx_handle_gffid_event(scsi_qla_host_t *vha, struct event_arg *ea) + { +- fc_port_t *fcport = ea->fcport; ++ fc_port_t *fcport = ea->fcport; + +- qla24xx_post_gnl_work(vha, fcport); ++ qla24xx_post_gnl_work(vha, fcport); + } + + void qla24xx_async_gffid_sp_done(void *s, int res) + { +- struct srb *sp = s; +- struct scsi_qla_host *vha = sp->vha; +- fc_port_t *fcport = sp->fcport; +- struct ct_sns_rsp *ct_rsp; +- struct event_arg ea; +- +- ql_dbg(ql_dbg_disc, vha, 0x2133, +- "Async done-%s res %x ID %x. %8phC\n", +- sp->name, res, fcport->d_id.b24, fcport->port_name); +- +- fcport->flags &= ~FCF_ASYNC_SENT; +- ct_rsp = &fcport->ct_desc.ct_sns->p.rsp; +- /* +- * FC-GS-7, 5.2.3.12 FC-4 Features - format +- * The format of the FC-4 Features object, as defined by the FC-4, +- * Shall be an array of 4-bit values, one for each type code value +- */ +- if (!res) { +- if (ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET] & 0xf) { +- /* w1 b00:03 */ +- fcport->fc4_type = +- ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; +- fcport->fc4_type &= 0xf; +- } ++ struct srb *sp = s; ++ struct scsi_qla_host *vha = sp->vha; ++ fc_port_t *fcport = sp->fcport; ++ struct ct_sns_rsp *ct_rsp; ++ struct event_arg ea; ++ ++ ql_dbg(ql_dbg_disc, vha, 0x2133, ++ "Async done-%s res %x ID %x. %8phC\n", ++ sp->name, res, fcport->d_id.b24, fcport->port_name); + +- if (ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET] & 0xf) { +- /* w5 [00:03]/28h */ +- fcport->fc4f_nvme = +- ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; +- fcport->fc4f_nvme &= 0xf; ++ fcport->flags &= ~FCF_ASYNC_SENT; ++ ct_rsp = &fcport->ct_desc.ct_sns->p.rsp; ++ /* ++ * FC-GS-7, 5.2.3.12 FC-4 Features - format ++ * The format of the FC-4 Features object, as defined by the FC-4, ++ * Shall be an array of 4-bit values, one for each type code value ++ */ ++ if (!res) { ++ if (ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET] & 0xf) { ++ /* w1 b00:03 */ ++ fcport->fc4_type = ++ ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; ++ fcport->fc4_type &= 0xf; + } +- } + +- memset(&ea, 0, sizeof(ea)); +- ea.sp = sp; +- ea.fcport = sp->fcport; +- ea.rc = res; +- ea.event = FCME_GFFID_DONE; ++ if (ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET] & 0xf) { ++ /* w5 [00:03]/28h */ ++ fcport->fc4f_nvme = ++ ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; ++ fcport->fc4f_nvme &= 0xf; ++ } ++ } + +- qla2x00_fcport_event_handler(vha, &ea); +- sp->free(sp); ++ memset(&ea, 0, sizeof(ea)); ++ ea.sp = sp; ++ ea.fcport = sp->fcport; ++ ea.rc = res; ++ ea.event = FCME_GFFID_DONE; ++ ++ qla2x00_fcport_event_handler(vha, &ea); ++ sp->free(sp); + } + + /* Get FC4 Feature with Nport ID. */ +-- +2.13.6 + diff --git a/SOURCES/0137-scsi-scsi-qla2xxx-Dual-FCP-NVMe-target-port-support.patch b/SOURCES/0137-scsi-scsi-qla2xxx-Dual-FCP-NVMe-target-port-support.patch new file mode 100644 index 0000000..da3b917 --- /dev/null +++ b/SOURCES/0137-scsi-scsi-qla2xxx-Dual-FCP-NVMe-target-port-support.patch @@ -0,0 +1,481 @@ +From f705e9236b22df5bc170d449f4100368f7e5915d Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:47 -0500 +Subject: [PATCH 137/155] [scsi] scsi: qla2xxx: Dual FCP-NVMe target port + support + +Message-id: <20191121163701.43688-13-hmadhani@redhat.com> +Patchwork-id: 287851 +O-Subject: [RHLE 7.8 e-stor PATCH v3 12/26] scsi: qla2xxx: Dual FCP-NVMe target port support +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Michael Hernandez + +Bugzilla 1731581 + +Some storage arrays advertise FCP LUNs and NVMe namespaces behind the same +WWN. The driver now offers a user option by way of NVRAM parameter to +allow users to choose, on a per port basis, the kind of FC-4 type they +would like to prioritize for login. + +Link: https://lore.kernel.org/r/20190912180918.6436-9-hmadhani@marvell.com +Signed-off-by: Michael Hernandez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 84ed362ac40ca44dbbbebf767301463aa72bc797) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 26 ++++++++++++++-- + drivers/scsi/qla2xxx/qla_fw.h | 2 ++ + drivers/scsi/qla2xxx/qla_gs.c | 42 ++++++++++++++----------- + drivers/scsi/qla2xxx/qla_init.c | 64 ++++++++++++++++++++++----------------- + drivers/scsi/qla2xxx/qla_inline.h | 12 ++++++++ + drivers/scsi/qla2xxx/qla_mbx.c | 11 ++++--- + drivers/scsi/qla2xxx/qla_os.c | 17 +++++------ + 7 files changed, 114 insertions(+), 60 deletions(-) + +Index: src/drivers/scsi/qla2xxx/qla_def.h +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_def.h 2019-12-20 19:04:14.604251603 +0100 ++++ src/drivers/scsi/qla2xxx/qla_def.h 2019-12-20 19:04:41.787008568 +0100 +@@ -2244,7 +2244,7 @@ + uint8_t fabric_port_name[WWN_SIZE]; + uint16_t fp_speed; + uint8_t fc4_type; +- uint8_t fc4f_nvme; /* nvme fc4 feature bits */ ++ uint8_t fc4_features; + } sw_info_t; + + /* FCP-4 types */ +@@ -2425,7 +2425,7 @@ + u32 supported_classes; + + uint8_t fc4_type; +- uint8_t fc4f_nvme; ++ uint8_t fc4_features; + uint8_t scan_state; + + unsigned long last_queue_full; +@@ -2456,6 +2456,9 @@ + u16 n2n_chip_reset; + } fc_port_t; + ++#define FC4_PRIORITY_NVME 0 ++#define FC4_PRIORITY_FCP 1 ++ + #define QLA_FCPORT_SCAN 1 + #define QLA_FCPORT_FOUND 2 + +@@ -4269,6 +4272,8 @@ + atomic_t nvme_active_aen_cnt; + uint16_t nvme_last_rptd_aen; /* Last recorded aen count */ + ++ uint8_t fc4_type_priority; ++ + atomic_t zio_threshold; + uint16_t last_zio_threshold; + #define DEFAULT_ZIO_THRESHOLD 5 +@@ -4787,6 +4792,23 @@ + ha->current_topology == ISP_CFG_N || \ + !ha->current_topology) + ++#define NVME_TYPE(fcport) \ ++ (fcport->fc4_type & FS_FC4TYPE_NVME) \ ++ ++#define FCP_TYPE(fcport) \ ++ (fcport->fc4_type & FS_FC4TYPE_FCP) \ ++ ++#define NVME_ONLY_TARGET(fcport) \ ++ (NVME_TYPE(fcport) && !FCP_TYPE(fcport)) \ ++ ++#define NVME_FCP_TARGET(fcport) \ ++ (FCP_TYPE(fcport) && NVME_TYPE(fcport)) \ ++ ++#define NVME_TARGET(ha, fcport) \ ++ ((NVME_FCP_TARGET(fcport) && \ ++ (ha->fc4_type_priority == FC4_PRIORITY_NVME)) || \ ++ NVME_ONLY_TARGET(fcport)) \ ++ + #include "qla_target.h" + #include "qla_gbl.h" + #include "qla_dbg.h" +Index: src/drivers/scsi/qla2xxx/qla_fw.h +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_fw.h 2019-12-20 19:04:14.604251603 +0100 ++++ src/drivers/scsi/qla2xxx/qla_fw.h 2019-12-20 19:04:41.787008568 +0100 +@@ -2106,4 +2106,6 @@ + #define FA_FLASH_LAYOUT_ADDR_83 (0x3F1000/4) + #define FA_FLASH_LAYOUT_ADDR_28 (0x11000/4) + ++#define NVRAM_DUAL_FCP_NVME_FLAG_OFFSET 0x196 ++ + #endif +Index: src/drivers/scsi/qla2xxx/qla_gs.c +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_gs.c 2019-12-20 19:04:14.605251594 +0100 ++++ src/drivers/scsi/qla2xxx/qla_gs.c 2019-12-20 19:04:41.788008559 +0100 +@@ -256,7 +256,7 @@ + WWN_SIZE); + + fcport->fc4_type = (ct_rsp->rsp.ga_nxt.fc4_types[2] & BIT_0) ? +- FC4_TYPE_FCP_SCSI : FC4_TYPE_OTHER; ++ FS_FC4TYPE_FCP : FC4_TYPE_OTHER; + + if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && + ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) +@@ -2917,7 +2917,7 @@ + struct ct_sns_req *ct_req; + struct ct_sns_rsp *ct_rsp; + struct qla_hw_data *ha = vha->hw; +- uint8_t fcp_scsi_features = 0; ++ uint8_t fcp_scsi_features = 0, nvme_features = 0; + struct ct_arg arg; + + for (i = 0; i < ha->max_fibre_devices; i++) { +@@ -2965,14 +2965,19 @@ + ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; + fcp_scsi_features &= 0x0f; + +- if (fcp_scsi_features) +- list[i].fc4_type = FC4_TYPE_FCP_SCSI; +- else +- list[i].fc4_type = FC4_TYPE_OTHER; ++ if (fcp_scsi_features) { ++ list[i].fc4_type = FS_FC4TYPE_FCP; ++ list[i].fc4_features = fcp_scsi_features; ++ } + +- list[i].fc4f_nvme = ++ nvme_features = + ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; +- list[i].fc4f_nvme &= 0xf; ++ nvme_features &= 0xf; ++ ++ if (nvme_features) { ++ list[i].fc4_type |= FS_FC4TYPE_NVME; ++ list[i].fc4_features = nvme_features; ++ } + } + + /* Last device exit. */ +@@ -3488,6 +3493,8 @@ + fc_port_t *fcport = sp->fcport; + struct ct_sns_rsp *ct_rsp; + struct event_arg ea; ++ uint8_t fc4_scsi_feat; ++ uint8_t fc4_nvme_feat; + + ql_dbg(ql_dbg_disc, vha, 0x2133, + "Async done-%s res %x ID %x. %8phC\n", +@@ -3495,24 +3502,25 @@ + + fcport->flags &= ~FCF_ASYNC_SENT; + ct_rsp = &fcport->ct_desc.ct_sns->p.rsp; ++ fc4_scsi_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; ++ fc4_nvme_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; ++ + /* + * FC-GS-7, 5.2.3.12 FC-4 Features - format + * The format of the FC-4 Features object, as defined by the FC-4, + * Shall be an array of 4-bit values, one for each type code value + */ + if (!res) { +- if (ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET] & 0xf) { ++ if (fc4_scsi_feat & 0xf) { + /* w1 b00:03 */ +- fcport->fc4_type = +- ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; +- fcport->fc4_type &= 0xf; +- } ++ fcport->fc4_type = FS_FC4TYPE_FCP; ++ fcport->fc4_features = fc4_scsi_feat & 0xf; ++ } + +- if (ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET] & 0xf) { ++ if (fc4_nvme_feat & 0xf) { + /* w5 [00:03]/28h */ +- fcport->fc4f_nvme = +- ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET]; +- fcport->fc4f_nvme &= 0xf; ++ fcport->fc4_type |= FS_FC4TYPE_NVME; ++ fcport->fc4_features = fc4_nvme_feat & 0xf; + } + } + +Index: src/drivers/scsi/qla2xxx/qla_init.c +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_init.c 2019-12-20 19:04:14.610251550 +0100 ++++ src/drivers/scsi/qla2xxx/qla_init.c 2019-12-20 19:04:41.789008550 +0100 +@@ -334,7 +334,7 @@ + else + lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI; + +- if (fcport->fc4f_nvme) ++ if (NVME_TARGET(vha->hw, fcport)) + lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI; + + ql_dbg(ql_dbg_disc, vha, 0x2072, +@@ -737,19 +737,17 @@ + + loop_id = le16_to_cpu(e->nport_handle); + loop_id = (loop_id & 0x7fff); +- if (fcport->fc4f_nvme) ++ if (NVME_TARGET(vha->hw, fcport)) + current_login_state = e->current_login_state >> 4; + else + current_login_state = e->current_login_state & 0xf; + +- + ql_dbg(ql_dbg_disc, vha, 0x20e2, +- "%s found %8phC CLS [%x|%x] nvme %d ID[%02x%02x%02x|%02x%02x%02x] lid[%d|%d]\n", ++ "%s found %8phC CLS [%x|%x] fc4_type %d ID[%06x|%06x] lid[%d|%d]\n", + __func__, fcport->port_name, + e->current_login_state, fcport->fw_login_state, +- fcport->fc4f_nvme, id.b.domain, id.b.area, id.b.al_pa, +- fcport->d_id.b.domain, fcport->d_id.b.area, +- fcport->d_id.b.al_pa, loop_id, fcport->loop_id); ++ fcport->fc4_type, id.b24, fcport->d_id.b24, ++ loop_id, fcport->loop_id); + + switch (fcport->disc_state) { + case DSC_DELETE_PEND: +@@ -1245,13 +1243,13 @@ + sp->done = qla2x00_async_prli_sp_done; + lio->u.logio.flags = 0; + +- if (fcport->fc4f_nvme) ++ if (NVME_TARGET(vha->hw, fcport)) + 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"); ++ fcport->login_retry, NVME_TARGET(vha->hw, fcport) ? "nvme" : "fc"); + + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { +@@ -1402,14 +1400,14 @@ + fcport->flags &= ~FCF_ASYNC_SENT; + + ql_dbg(ql_dbg_disc, vha, 0x20d2, +- "%s %8phC DS %d LS %d nvme %x rc %d\n", __func__, fcport->port_name, +- fcport->disc_state, pd->current_login_state, fcport->fc4f_nvme, +- ea->rc); ++ "%s %8phC DS %d LS %d fc4_type %x rc %d\n", __func__, ++ fcport->port_name, fcport->disc_state, pd->current_login_state, ++ fcport->fc4_type, ea->rc); + + if (fcport->disc_state == DSC_DELETE_PEND) + return; + +- if (fcport->fc4f_nvme) ++ if (NVME_TARGET(vha->hw, fcport)) + ls = pd->current_login_state >> 4; + else + ls = pd->current_login_state & 0xf; +@@ -1598,7 +1596,8 @@ + ql_dbg(ql_dbg_disc, vha, 0x2118, + "%s %d %8phC post %s PRLI\n", + __func__, __LINE__, fcport->port_name, +- fcport->fc4f_nvme ? "NVME" : "FC"); ++ NVME_TARGET(vha->hw, fcport) ? "NVME" : ++ "FC"); + qla24xx_post_prli_work(vha, fcport); + } + break; +@@ -1941,13 +1940,22 @@ + break; + } + +- if (ea->fcport->fc4f_nvme) { ++ /* ++ * Retry PRLI with other FC-4 type if failure occurred on dual ++ * FCP/NVMe port ++ */ ++ if (NVME_FCP_TARGET(ea->fcport)) { ++ if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME) ++ ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME; ++ else ++ ea->fcport->fc4_type &= ~FS_FC4TYPE_FCP; + ql_dbg(ql_dbg_disc, vha, 0x2118, +- "%s %d %8phC post fc4 prli\n", +- __func__, __LINE__, ea->fcport->port_name); +- ea->fcport->fc4f_nvme = 0; ++ "%s %d %8phC post %s prli\n", ++ __func__, __LINE__, ea->fcport->port_name, ++ (ea->fcport->fc4_type & FS_FC4TYPE_NVME) ? ++ "NVMe" : "FCP"); + qla24xx_post_prli_work(vha, ea->fcport); +- return; ++ break; + } + + /* at this point both PRLI NVME & PRLI FCP failed */ +@@ -2030,7 +2038,7 @@ + * force a relogin attempt via implicit LOGO, PLOGI, and PRLI + * requests. + */ +- if (ea->fcport->fc4f_nvme) { ++ if (NVME_TARGET(vha->hw, ea->fcport)) { + ql_dbg(ql_dbg_disc, vha, 0x2117, + "%s %d %8phC post prli\n", + __func__, __LINE__, ea->fcport->port_name); +@@ -5486,7 +5494,7 @@ + + qla2x00_iidma_fcport(vha, fcport); + +- if (fcport->fc4f_nvme) { ++ if (NVME_TARGET(vha->hw, fcport)) { + qla_nvme_register_remote(vha, fcport); + fcport->disc_state = DSC_LOGIN_COMPLETE; + qla2x00_set_fcport_state(fcport, FCS_ONLINE); +@@ -5814,11 +5822,8 @@ + new_fcport->fc4_type = swl[swl_idx].fc4_type; + + new_fcport->nvme_flag = 0; +- new_fcport->fc4f_nvme = 0; + if (vha->flags.nvme_enabled && +- swl[swl_idx].fc4f_nvme) { +- new_fcport->fc4f_nvme = +- swl[swl_idx].fc4f_nvme; ++ swl[swl_idx].fc4_type & FS_FC4TYPE_NVME) { + ql_log(ql_log_info, vha, 0x2131, + "FOUND: NVME port %8phC as FC Type 28h\n", + new_fcport->port_name); +@@ -5874,7 +5879,7 @@ + + /* Bypass ports whose FCP-4 type is not FCP_SCSI */ + if (ql2xgffidenable && +- (new_fcport->fc4_type != FC4_TYPE_FCP_SCSI && ++ (!(new_fcport->fc4_type & FS_FC4TYPE_FCP) && + new_fcport->fc4_type != FC4_TYPE_UNKNOWN)) + continue; + +@@ -5943,7 +5948,7 @@ + break; + } + +- if (fcport->fc4f_nvme) { ++ if (NVME_TARGET(vha->hw, fcport)) { + if (fcport->disc_state == DSC_DELETE_PEND) { + fcport->disc_state = DSC_GNL; + vha->fcport_count--; +@@ -8613,6 +8618,11 @@ + /* N2N: driver will initiate Login instead of FW */ + icb->firmware_options_3 |= BIT_8; + ++ /* Determine NVMe/FCP priority for target ports */ ++ ha->fc4_type_priority = qla2xxx_get_fc4_priority(vha); ++ ql_log(ql_log_info, vha, 0xffff, "FC4 priority set to %s\n", ++ ha->fc4_type_priority & BIT_0 ? "FCP" : "NVMe"); ++ + if (rval) { + ql_log(ql_log_warn, vha, 0x0076, + "NVRAM configuration failed.\n"); +Index: src/drivers/scsi/qla2xxx/qla_inline.h +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_inline.h 2019-12-20 19:04:14.610251550 +0100 ++++ src/drivers/scsi/qla2xxx/qla_inline.h 2019-12-20 19:04:41.789008550 +0100 +@@ -320,3 +320,15 @@ + + WRT_REG_DWORD(req->req_q_in, req->ring_index); + } ++ ++static inline int ++qla2xxx_get_fc4_priority(struct scsi_qla_host *vha) ++{ ++ uint32_t data; ++ ++ data = ++ ((uint8_t *)vha->hw->nvram)[NVRAM_DUAL_FCP_NVME_FLAG_OFFSET]; ++ ++ ++ return ((data >> 6) & BIT_0); ++} +Index: src/drivers/scsi/qla2xxx/qla_mbx.c +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_mbx.c 2019-12-20 19:04:14.611251541 +0100 ++++ src/drivers/scsi/qla2xxx/qla_mbx.c 2019-12-20 19:07:11.648678207 +0100 +@@ -1930,7 +1930,7 @@ + pd24 = (struct port_database_24xx *) pd; + + /* Check for logged in state. */ +- if (fcport->fc4f_nvme) { ++ if (NVME_TARGET(ha, fcport)) { + current_login_state = pd24->current_login_state >> 4; + last_login_state = pd24->last_login_state >> 4; + } else { +@@ -3897,8 +3897,9 @@ + fcport->scan_state = QLA_FCPORT_FOUND; + fcport->n2n_flag = 1; + fcport->keep_nport_handle = 1; ++ fcport->fc4_type = FS_FC4TYPE_FCP; + if (vha->flags.nvme_enabled) +- fcport->fc4f_nvme = 1; ++ fcport->fc4_type |= FS_FC4TYPE_NVME; + + switch (fcport->disc_state) { + case DSC_DELETED: +@@ -6362,7 +6363,7 @@ + uint64_t zero = 0; + u8 current_login_state, last_login_state; + +- if (fcport->fc4f_nvme) { ++ if (NVME_TARGET(vha->hw, fcport)) { + current_login_state = pd->current_login_state >> 4; + last_login_state = pd->last_login_state >> 4; + } else { +@@ -6397,7 +6398,7 @@ + fcport->d_id.b.al_pa = pd->port_id[2]; + fcport->d_id.b.rsvd_1 = 0; + +- if (fcport->fc4f_nvme) { ++ if (NVME_TARGET(vha->hw, fcport)) { + fcport->port_type = FCT_NVME; + } else { + /* If not target must be initiator or unknown type. */ +Index: src/drivers/scsi/qla2xxx/qla_os.c +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_os.c 2019-12-20 19:04:14.613251523 +0100 ++++ src/drivers/scsi/qla2xxx/qla_os.c 2019-12-20 19:04:41.791008533 +0100 +@@ -5125,19 +5125,17 @@ + fcport->d_id = e->u.new_sess.id; + fcport->flags |= FCF_FABRIC_DEVICE; + fcport->fw_login_state = DSC_LS_PLOGI_PEND; +- if (e->u.new_sess.fc4_type == FS_FC4TYPE_FCP) +- fcport->fc4_type = FC4_TYPE_FCP_SCSI; +- +- if (e->u.new_sess.fc4_type == FS_FC4TYPE_NVME) { +- fcport->fc4_type = FC4_TYPE_OTHER; +- fcport->fc4f_nvme = FC4_TYPE_NVME; +- } + + memcpy(fcport->port_name, e->u.new_sess.port_name, + WWN_SIZE); + +- if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N) ++ fcport->fc4_type = e->u.new_sess.fc4_type; ++ if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N) { ++ fcport->fc4_type = FS_FC4TYPE_FCP; + fcport->n2n_flag = 1; ++ if (vha->flags.nvme_enabled) ++ fcport->fc4_type |= FS_FC4TYPE_NVME; ++ } + + } else { + ql_dbg(ql_dbg_disc, vha, 0xffff, +@@ -5239,7 +5237,8 @@ + fcport->flags &= ~FCF_FABRIC_DEVICE; + fcport->keep_nport_handle = 1; + if (vha->flags.nvme_enabled) { +- fcport->fc4f_nvme = 1; ++ fcport->fc4_type = ++ (FS_FC4TYPE_NVME | FS_FC4TYPE_FCP); + fcport->n2n_flag = 1; + } + fcport->fw_login_state = 0; diff --git a/SOURCES/0138-scsi-scsi-qla2xxx-Inline-the-qla2x00_fcport_event_ha.patch b/SOURCES/0138-scsi-scsi-qla2xxx-Inline-the-qla2x00_fcport_event_ha.patch new file mode 100644 index 0000000..d2f69ce --- /dev/null +++ b/SOURCES/0138-scsi-scsi-qla2xxx-Inline-the-qla2x00_fcport_event_ha.patch @@ -0,0 +1,459 @@ +From 453f1d71efe9b3c00293d2812c3903ceac9935e2 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:48 -0500 +Subject: [PATCH 138/155] [scsi] scsi: qla2xxx: Inline the + qla2x00_fcport_event_handler() function + +Message-id: <20191121163701.43688-14-hmadhani@redhat.com> +Patchwork-id: 287859 +O-Subject: [RHLE 7.8 e-stor PATCH v3 13/26] scsi: qla2xxx: Inline the qla2x00_fcport_event_handler() function +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Instead of calling qla2x00_fcport_event_handler() and letting the switch +statement inside that function decide which other function to call, call +the latter function directly. Remove the event member from the event_arg +structure because it is no longer needed. Remove the +qla_handle_els_plogi_done() function because it is never called. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 897def2004213636ffe2e9ee6a75660c5b53b03d) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 17 ------ + drivers/scsi/qla2xxx/qla_gbl.h | 6 +- + drivers/scsi/qla2xxx/qla_gs.c | 15 ++--- + drivers/scsi/qla2xxx/qla_init.c | 131 ++++++++++------------------------------ + drivers/scsi/qla2xxx/qla_iocb.c | 3 +- + drivers/scsi/qla2xxx/qla_isr.c | 3 +- + drivers/scsi/qla2xxx/qla_os.c | 3 +- + 7 files changed, 45 insertions(+), 133 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index fc3ef1d6902b..61c67c99e0c3 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2330,22 +2330,6 @@ enum login_state { /* FW control Target side */ + DSC_LS_LOGO_PEND, + }; + +-enum fcport_mgt_event { +- FCME_RELOGIN = 1, +- FCME_RSCN, +- FCME_PLOGI_DONE, /* Initiator side sent LLIOCB */ +- FCME_PRLI_DONE, +- FCME_GNL_DONE, +- FCME_GPSC_DONE, +- FCME_GPDB_DONE, +- FCME_GPNID_DONE, +- FCME_GFFID_DONE, +- FCME_ADISC_DONE, +- FCME_GNNID_DONE, +- FCME_GFPNID_DONE, +- FCME_ELS_PLOGI_DONE, +-}; +- + enum rscn_addr_format { + RSCN_PORT_ADDR, + RSCN_AREA_ADDR, +@@ -2466,7 +2450,6 @@ typedef struct fc_port { + #define QLA_FCPORT_FOUND 2 + + struct event_arg { +- enum fcport_mgt_event event; + fc_port_t *fcport; + srb_t *sp; + port_id_t id; +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 6d59359e0d21..e0b1f0652403 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -96,7 +96,11 @@ extern int qla2x00_init_rings(scsi_qla_host_t *); + extern struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *, + int, int, bool); + extern int qla2xxx_delete_qpair(struct scsi_qla_host *, struct qla_qpair *); +-void qla2x00_fcport_event_handler(scsi_qla_host_t *, struct event_arg *); ++void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea); ++void qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, ++ struct event_arg *ea); ++void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, ++ struct event_arg *ea); + int qla24xx_async_gpdb(struct scsi_qla_host *, fc_port_t *, u8); + int qla24xx_async_prli(struct scsi_qla_host *, fc_port_t *); + int qla24xx_async_notify_ack(scsi_qla_host_t *, fc_port_t *, +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 38c7fb787d80..592ae70a4abd 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3069,11 +3069,10 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + be16_to_cpu(ct_rsp->rsp.gpsc.speed)); + } + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_GPSC_DONE; + ea.rc = res; + ea.fcport = fcport; + ea.sp = sp; +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gpsc_event(vha, &ea); + + done: + sp->free(sp); +@@ -3324,7 +3323,6 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) + ea.id.b.area = ct_req->req.port_id.port_id[1]; + ea.id.b.al_pa = ct_req->req.port_id.port_id[2]; + ea.rc = res; +- ea.event = FCME_GPNID_DONE; + + spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); + list_del(&sp->elem); +@@ -3343,7 +3341,7 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) + return; + } + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gpnid_event(vha, &ea); + + e = qla2x00_alloc_work(vha, QLA_EVT_UNMAP); + if (!e) { +@@ -3528,9 +3526,8 @@ void qla24xx_async_gffid_sp_done(void *s, int res) + ea.sp = sp; + ea.fcport = sp->fcport; + ea.rc = res; +- ea.event = FCME_GFFID_DONE; + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gffid_event(vha, &ea); + sp->free(sp); + } + +@@ -4294,13 +4291,12 @@ static void qla2x00_async_gnnid_sp_done(void *s, int res) + ea.fcport = fcport; + ea.sp = sp; + ea.rc = res; +- ea.event = FCME_GNNID_DONE; + + ql_dbg(ql_dbg_disc, vha, 0x204f, + "Async done-%s res %x, WWPN %8phC %8phC\n", + sp->name, res, fcport->port_name, fcport->node_name); + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gnnid_event(vha, &ea); + + sp->free(sp); + } +@@ -4428,13 +4424,12 @@ static void qla2x00_async_gfpnid_sp_done(void *s, int res) + ea.fcport = fcport; + ea.sp = sp; + ea.rc = res; +- ea.event = FCME_GFPNID_DONE; + + ql_dbg(ql_dbg_disc, vha, 0x204f, + "Async done-%s res %x, WWPN %8phC %8phC\n", + sp->name, res, fcport->port_name, fcport->fabric_port_name); + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gfpnid_event(vha, &ea); + + sp->free(sp); + } +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 0b694da58017..9584da53e715 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -37,8 +37,8 @@ static struct qla_chip_state_84xx *qla84xx_get_chip(struct scsi_qla_host *); + static int qla84xx_init_chip(scsi_qla_host_t *); + static int qla25xx_init_queues(struct qla_hw_data *); + static int qla24xx_post_prli_work(struct scsi_qla_host*, fc_port_t *); +-static void qla24xx_handle_plogi_done_event(struct scsi_qla_host *, +- struct event_arg *); ++static void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, ++ struct event_arg *ea); + static void qla24xx_handle_prli_done_event(struct scsi_qla_host *, + struct event_arg *); + static void __qla24xx_handle_gpdb_event(scsi_qla_host_t *, struct event_arg *); +@@ -266,14 +266,13 @@ qla2x00_async_login_sp_done(void *ptr, int res) + + if (!test_bit(UNLOADING, &vha->dpc_flags)) { + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_PLOGI_DONE; + ea.fcport = sp->fcport; + ea.data[0] = lio->u.logio.data[0]; + ea.data[1] = lio->u.logio.data[1]; + ea.iop[0] = lio->u.logio.iop[0]; + ea.iop[1] = lio->u.logio.iop[1]; + ea.sp = sp; +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_plogi_done_event(vha, &ea); + } + + sp->free(sp); +@@ -542,7 +541,6 @@ qla2x00_async_adisc_sp_done(void *ptr, int res) + sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); + + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_ADISC_DONE; + ea.rc = res; + ea.data[0] = lio->u.logio.data[0]; + ea.data[1] = lio->u.logio.data[1]; +@@ -551,7 +549,7 @@ qla2x00_async_adisc_sp_done(void *ptr, int res) + ea.fcport = sp->fcport; + ea.sp = sp; + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_adisc_event(vha, &ea); + + sp->free(sp); + } +@@ -971,7 +969,6 @@ qla24xx_async_gnl_sp_done(void *s, int res) + memset(&ea, 0, sizeof(ea)); + ea.sp = sp; + ea.rc = res; +- ea.event = FCME_GNL_DONE; + + if (sp->u.iocb_cmd.u.mbx.in_mb[1] >= + sizeof(struct get_name_list_extended)) { +@@ -1010,7 +1007,7 @@ qla24xx_async_gnl_sp_done(void *s, int res) + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); + ea.fcport = fcport; + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gnl_done_event(vha, &ea); + } + + /* create new fcport if fw has knowledge of new sessions */ +@@ -1157,11 +1154,10 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) + + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_GPDB_DONE; + ea.fcport = fcport; + ea.sp = sp; + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_gpdb_event(vha, &ea); + + dma_pool_free(ha->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, + sp->u.iocb_cmd.u.mbx.in_dma); +@@ -1198,7 +1194,6 @@ qla2x00_async_prli_sp_done(void *ptr, int res) + + if (!test_bit(UNLOADING, &vha->dpc_flags)) { + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_PRLI_DONE; + ea.fcport = sp->fcport; + ea.data[0] = lio->u.logio.data[0]; + ea.data[1] = lio->u.logio.data[1]; +@@ -1206,7 +1201,7 @@ qla2x00_async_prli_sp_done(void *ptr, int res) + ea.iop[1] = lio->u.logio.iop[1]; + ea.sp = sp; + +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_prli_done_event(vha, &ea); + } + + sp->free(sp); +@@ -1673,12 +1668,34 @@ int qla24xx_post_newsess_work(struct scsi_qla_host *vha, port_id_t *id, + return qla2x00_post_work(vha, e); + } + +-static ++void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea) ++{ ++ fc_port_t *fcport; ++ unsigned long flags; ++ ++ fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1); ++ if (fcport) { ++ fcport->scan_needed = 1; ++ fcport->rscn_gen++; ++ } ++ ++ spin_lock_irqsave(&vha->work_lock, flags); ++ if (vha->scan.scan_flags == 0) { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, "%s: schedule\n", __func__); ++ vha->scan.scan_flags |= SF_QUEUED; ++ schedule_delayed_work(&vha->scan.scan_work, 5); ++ } ++ spin_unlock_irqrestore(&vha->work_lock, flags); ++} ++ + void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, + struct event_arg *ea) + { + fc_port_t *fcport = ea->fcport; + ++ if (test_bit(UNLOADING, &vha->dpc_flags)) ++ return; ++ + ql_dbg(ql_dbg_disc, vha, 0x2102, + "%s %8phC DS %d LS %d P %d del %d cnfl %p rscn %d|%d login %d|%d fl %x\n", + __func__, fcport->port_name, fcport->disc_state, +@@ -1698,89 +1715,6 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, + qla24xx_fcport_handle_login(vha, fcport); + } + +- +-static void qla_handle_els_plogi_done(scsi_qla_host_t *vha, +- struct event_arg *ea) +-{ +- ql_dbg(ql_dbg_disc, vha, 0x2118, +- "%s %d %8phC post PRLI\n", +- __func__, __LINE__, ea->fcport->port_name); +- qla24xx_post_prli_work(vha, ea->fcport); +-} +- +-void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea) +-{ +- fc_port_t *fcport; +- +- switch (ea->event) { +- case FCME_RELOGIN: +- if (test_bit(UNLOADING, &vha->dpc_flags)) +- return; +- +- qla24xx_handle_relogin_event(vha, ea); +- break; +- case FCME_RSCN: +- if (test_bit(UNLOADING, &vha->dpc_flags)) +- return; +- { +- unsigned long flags; +- +- fcport = qla2x00_find_fcport_by_nportid +- (vha, &ea->id, 1); +- if (fcport) { +- fcport->scan_needed = 1; +- fcport->rscn_gen++; +- } +- +- spin_lock_irqsave(&vha->work_lock, flags); +- if (vha->scan.scan_flags == 0) { +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "%s: schedule\n", __func__); +- vha->scan.scan_flags |= SF_QUEUED; +- schedule_delayed_work(&vha->scan.scan_work, 5); +- } +- spin_unlock_irqrestore(&vha->work_lock, flags); +- } +- break; +- case FCME_GNL_DONE: +- qla24xx_handle_gnl_done_event(vha, ea); +- break; +- case FCME_GPSC_DONE: +- qla24xx_handle_gpsc_event(vha, ea); +- break; +- case FCME_PLOGI_DONE: /* Initiator side sent LLIOCB */ +- qla24xx_handle_plogi_done_event(vha, ea); +- break; +- case FCME_PRLI_DONE: +- qla24xx_handle_prli_done_event(vha, ea); +- break; +- case FCME_GPDB_DONE: +- qla24xx_handle_gpdb_event(vha, ea); +- break; +- case FCME_GPNID_DONE: +- qla24xx_handle_gpnid_event(vha, ea); +- break; +- case FCME_GFFID_DONE: +- qla24xx_handle_gffid_event(vha, ea); +- break; +- case FCME_ADISC_DONE: +- qla24xx_handle_adisc_event(vha, ea); +- break; +- case FCME_GNNID_DONE: +- qla24xx_handle_gnnid_event(vha, ea); +- break; +- case FCME_GFPNID_DONE: +- qla24xx_handle_gfpnid_event(vha, ea); +- break; +- case FCME_ELS_PLOGI_DONE: +- qla_handle_els_plogi_done(vha, ea); +- break; +- default: +- BUG_ON(1); +- break; +- } +-} +- + /* + * RSCN(s) came in for this fcport, but the RSCN(s) was not able + * to be consumed by the fcport +@@ -1798,10 +1732,9 @@ void qla_rscn_replay(fc_port_t *fcport) + + if (fcport->scan_needed) { + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_RSCN; + ea.id = fcport->d_id; + ea.id.b.rsvd_1 = RSCN_PORT_ADDR; +- qla2x00_fcport_event_handler(fcport->vha, &ea); ++ qla2x00_handle_rscn(fcport->vha, &ea); + } + } + +@@ -1985,7 +1918,7 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea) + } + } + +-static void ++void + qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) + { + port_id_t cid; /* conflict Nport id */ +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 4498cf78e156..702c72fe439b 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2853,8 +2853,7 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + memset(&ea, 0, sizeof(ea)); + ea.fcport = fcport; + ea.rc = res; +- ea.event = FCME_ELS_PLOGI_DONE; +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_plogi_done_event(vha, &ea); + } + + e = qla2x00_alloc_work(vha, QLA_EVT_UNMAP); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 7c58e04c5d70..873fcffb5dd7 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1118,10 +1118,9 @@ global_port_update: + struct event_arg ea; + + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_RSCN; + ea.id.b24 = rscn_entry; + ea.id.b.rsvd_1 = rscn_entry >> 24; +- qla2x00_fcport_event_handler(vha, &ea); ++ qla2x00_handle_rscn(vha, &ea); + qla2x00_post_aen_work(vha, FCH_EVT_RSCN, rscn_entry); + } + break; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 371070eea2d1..95d54bbc48c0 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5434,9 +5434,8 @@ void qla2x00_relogin(struct scsi_qla_host *vha) + } else { + if (vha->hw->current_topology != ISP_CFG_NL) { + memset(&ea, 0, sizeof(ea)); +- ea.event = FCME_RELOGIN; + ea.fcport = fcport; +- qla2x00_fcport_event_handler(vha, &ea); ++ qla24xx_handle_relogin_event(vha, &ea); + } else if (vha->hw->current_topology == + ISP_CFG_NL) { + fcport->login_retry--; +-- +2.13.6 + diff --git a/SOURCES/0139-scsi-scsi-qla2xxx-Add-error-handling-for-PLOGI-ELS-p.patch b/SOURCES/0139-scsi-scsi-qla2xxx-Add-error-handling-for-PLOGI-ELS-p.patch new file mode 100644 index 0000000..fa9a2a3 --- /dev/null +++ b/SOURCES/0139-scsi-scsi-qla2xxx-Add-error-handling-for-PLOGI-ELS-p.patch @@ -0,0 +1,154 @@ +From a75371a656c9aeefb142767e514635737ebbf8df Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:49 -0500 +Subject: [PATCH 139/155] [scsi] scsi: qla2xxx: Add error handling for PLOGI + ELS passthrough + +Message-id: <20191121163701.43688-15-hmadhani@redhat.com> +Patchwork-id: 287868 +O-Subject: [RHLE 7.8 e-stor PATCH v3 14/26] scsi: qla2xxx: Add error handling for PLOGI ELS passthrough +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +Add error handling logic to ELS Passthrough relating to NVME devices. +Current code does not parse error code to take proper recovery action, +instead it re-logins with the same login parameters that encountered the +error. Ex: nport handle collision. + +Link: https://lore.kernel.org/r/20190912180918.6436-10-hmadhani@marvell.com +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit c76ae845ea836d6128982dcbd41ac35c81e2de63) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_iocb.c | 95 +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 92 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 702c72fe439b..52673965ca37 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2836,6 +2836,10 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + struct scsi_qla_host *vha = sp->vha; + struct event_arg ea; + struct qla_work_evt *e; ++ struct fc_port *conflict_fcport; ++ port_id_t cid; /* conflict Nport id */ ++ u32 *fw_status = sp->u.iocb_cmd.u.els_plogi.fw_status; ++ u16 lid; + + ql_dbg(ql_dbg_disc, vha, 0x3072, + "%s ELS done rc %d hdl=%x, portid=%06x %8phC\n", +@@ -2847,13 +2851,98 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + if (sp->flags & SRB_WAKEUP_ON_COMP) + complete(&lio->u.els_plogi.comp); + else { +- if (res) { +- set_bit(RELOGIN_NEEDED, &vha->dpc_flags); +- } else { ++ switch (fw_status[0]) { ++ case CS_DATA_UNDERRUN: ++ case CS_COMPLETE: + memset(&ea, 0, sizeof(ea)); + ea.fcport = fcport; + ea.rc = res; + qla24xx_handle_plogi_done_event(vha, &ea); ++ break; ++ case CS_IOCB_ERROR: ++ switch (fw_status[1]) { ++ case LSC_SCODE_PORTID_USED: ++ lid = fw_status[2] & 0xffff; ++ qlt_find_sess_invalidate_other(vha, ++ wwn_to_u64(fcport->port_name), ++ fcport->d_id, lid, &conflict_fcport); ++ if (conflict_fcport) { ++ /* ++ * Another fcport shares the same ++ * loop_id & nport id; conflict ++ * fcport needs to finish cleanup ++ * before this fcport can proceed ++ * to login. ++ */ ++ conflict_fcport->conflict = fcport; ++ fcport->login_pause = 1; ++ ql_dbg(ql_dbg_disc, vha, 0x20ed, ++ "%s %d %8phC pid %06x inuse with lid %#x post gidpn\n", ++ __func__, __LINE__, ++ fcport->port_name, ++ fcport->d_id.b24, lid); ++ } else { ++ ql_dbg(ql_dbg_disc, vha, 0x20ed, ++ "%s %d %8phC pid %06x inuse with lid %#x sched del\n", ++ __func__, __LINE__, ++ fcport->port_name, ++ fcport->d_id.b24, lid); ++ qla2x00_clear_loop_id(fcport); ++ set_bit(lid, vha->hw->loop_id_map); ++ fcport->loop_id = lid; ++ fcport->keep_nport_handle = 0; ++ qlt_schedule_sess_for_deletion(fcport); ++ } ++ break; ++ ++ case LSC_SCODE_NPORT_USED: ++ cid.b.domain = (fw_status[2] >> 16) & 0xff; ++ cid.b.area = (fw_status[2] >> 8) & 0xff; ++ cid.b.al_pa = fw_status[2] & 0xff; ++ cid.b.rsvd_1 = 0; ++ ++ ql_dbg(ql_dbg_disc, vha, 0x20ec, ++ "%s %d %8phC lid %#x in use with pid %06x post gnl\n", ++ __func__, __LINE__, fcport->port_name, ++ fcport->loop_id, cid.b24); ++ set_bit(fcport->loop_id, ++ vha->hw->loop_id_map); ++ fcport->loop_id = FC_NO_LOOP_ID; ++ qla24xx_post_gnl_work(vha, fcport); ++ break; ++ ++ case LSC_SCODE_NOXCB: ++ vha->hw->exch_starvation++; ++ if (vha->hw->exch_starvation > 5) { ++ ql_log(ql_log_warn, vha, 0xd046, ++ "Exchange starvation. Resetting RISC\n"); ++ vha->hw->exch_starvation = 0; ++ set_bit(ISP_ABORT_NEEDED, ++ &vha->dpc_flags); ++ qla2xxx_wake_dpc(vha); ++ } ++ /* fall through */ ++ default: ++ ql_dbg(ql_dbg_disc, vha, 0x20eb, ++ "%s %8phC cmd error fw_status 0x%x 0x%x 0x%x\n", ++ __func__, sp->fcport->port_name, ++ fw_status[0], fw_status[1], fw_status[2]); ++ ++ fcport->flags &= ~FCF_ASYNC_SENT; ++ set_bit(RELOGIN_NEEDED, &vha->dpc_flags); ++ break; ++ } ++ break; ++ ++ default: ++ ql_dbg(ql_dbg_disc, vha, 0x20eb, ++ "%s %8phC cmd error 2 fw_status 0x%x 0x%x 0x%x\n", ++ __func__, sp->fcport->port_name, ++ fw_status[0], fw_status[1], fw_status[2]); ++ ++ sp->fcport->flags &= ~FCF_ASYNC_SENT; ++ set_bit(RELOGIN_NEEDED, &vha->dpc_flags); ++ break; + } + + e = qla2x00_alloc_work(vha, QLA_EVT_UNMAP); +-- +2.13.6 + diff --git a/SOURCES/0140-scsi-scsi-qla2xxx-Retry-PLOGI-on-FC-NVMe-PRLI-failur.patch b/SOURCES/0140-scsi-scsi-qla2xxx-Retry-PLOGI-on-FC-NVMe-PRLI-failur.patch new file mode 100644 index 0000000..c5395bb --- /dev/null +++ b/SOURCES/0140-scsi-scsi-qla2xxx-Retry-PLOGI-on-FC-NVMe-PRLI-failur.patch @@ -0,0 +1,139 @@ +From 763456ffa66380cd4591c58d5b50ae04103166a2 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:50 -0500 +Subject: [PATCH 140/155] [scsi] scsi: qla2xxx: Retry PLOGI on FC-NVMe PRLI + failure + +Message-id: <20191121163701.43688-16-hmadhani@redhat.com> +Patchwork-id: 287858 +O-Subject: [RHLE 7.8 e-stor PATCH v3 15/26] scsi: qla2xxx: Retry PLOGI on FC-NVMe PRLI failure +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +Current code will send PRLI with FC-NVMe bit set for the targets which +support only FCP. This may result into issue with targets which do not +understand NVMe and will go into a strange state. This patch would restart +the login process by going back to PLOGI state. The PLOGI state will force +the target to respond to correct PRLI request. + +Fixes: c76ae845ea836 ("scsi: qla2xxx: Add error handling for PLOGI ELS passthrough") +Cc: stable@vger.kernel.org # 5.4 +Link: https://lore.kernel.org/r/20191105150657.8092-2-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 983f127603fac650fa34ee69db363e4615eaf9e7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 37 ++++++++----------------------------- + drivers/scsi/qla2xxx/qla_iocb.c | 6 +++++- + 2 files changed, 13 insertions(+), 30 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9584da53e715..10a1690a802d 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1878,42 +1878,21 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea) + * FCP/NVMe port + */ + if (NVME_FCP_TARGET(ea->fcport)) { +- if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME) +- ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME; +- else +- ea->fcport->fc4_type &= ~FS_FC4TYPE_FCP; + ql_dbg(ql_dbg_disc, vha, 0x2118, + "%s %d %8phC post %s prli\n", + __func__, __LINE__, ea->fcport->port_name, + (ea->fcport->fc4_type & FS_FC4TYPE_NVME) ? + "NVMe" : "FCP"); +- qla24xx_post_prli_work(vha, ea->fcport); +- break; ++ if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME) ++ ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME; ++ else ++ ea->fcport->fc4_type &= ~FS_FC4TYPE_FCP; + } + +- /* at this point both PRLI NVME & PRLI FCP failed */ +- if (N2N_TOPO(vha->hw)) { +- if (ea->fcport->n2n_link_reset_cnt < 3) { +- ea->fcport->n2n_link_reset_cnt++; +- /* +- * remote port is not sending Plogi. Reset +- * link to kick start his state machine +- */ +- set_bit(N2N_LINK_RESET, &vha->dpc_flags); +- } else { +- ql_log(ql_log_warn, vha, 0x2119, +- "%s %d %8phC Unable to reconnect\n", +- __func__, __LINE__, ea->fcport->port_name); +- } +- } else { +- /* +- * switch connect. login failed. Take connection +- * down and allow relogin to retrigger +- */ +- ea->fcport->flags &= ~FCF_ASYNC_SENT; +- ea->fcport->keep_nport_handle = 0; +- qlt_schedule_sess_for_deletion(ea->fcport); +- } ++ ea->fcport->flags &= ~FCF_ASYNC_SENT; ++ ea->fcport->keep_nport_handle = 0; ++ ea->fcport->logout_on_delete = 1; ++ qlt_schedule_sess_for_deletion(ea->fcport); + break; + } + } +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 52673965ca37..186ee5825651 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2859,6 +2859,7 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + ea.rc = res; + qla24xx_handle_plogi_done_event(vha, &ea); + break; ++ + case CS_IOCB_ERROR: + switch (fw_status[1]) { + case LSC_SCODE_PORTID_USED: +@@ -2929,6 +2930,7 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + fw_status[0], fw_status[1], fw_status[2]); + + fcport->flags &= ~FCF_ASYNC_SENT; ++ fcport->disc_state = DSC_LOGIN_FAILED; + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); + break; + } +@@ -2941,6 +2943,7 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + fw_status[0], fw_status[1], fw_status[2]); + + sp->fcport->flags &= ~FCF_ASYNC_SENT; ++ sp->fcport->disc_state = DSC_LOGIN_FAILED; + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); + break; + } +@@ -2985,11 +2988,12 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode, + return -ENOMEM; + } + ++ fcport->flags |= FCF_ASYNC_SENT; ++ fcport->disc_state = DSC_LOGIN_PEND; + elsio = &sp->u.iocb_cmd; + ql_dbg(ql_dbg_io, vha, 0x3073, + "Enter: PLOGI portid=%06x\n", fcport->d_id.b24); + +- fcport->flags |= FCF_ASYNC_SENT; + sp->type = SRB_ELS_DCMD; + sp->name = "ELS_DCMD"; + sp->fcport = fcport; +-- +2.13.6 + diff --git a/SOURCES/0141-scsi-scsi-qla2xxx-Do-command-completion-on-abort-tim.patch b/SOURCES/0141-scsi-scsi-qla2xxx-Do-command-completion-on-abort-tim.patch new file mode 100644 index 0000000..34a498f --- /dev/null +++ b/SOURCES/0141-scsi-scsi-qla2xxx-Do-command-completion-on-abort-tim.patch @@ -0,0 +1,97 @@ +From f7760f66fe00084dc1bb92a003e1dd7c915c44e9 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:51 -0500 +Subject: [PATCH 141/155] [scsi] scsi: qla2xxx: Do command completion on abort + timeout + +Message-id: <20191121163701.43688-17-hmadhani@redhat.com> +Patchwork-id: 287854 +O-Subject: [RHLE 7.8 e-stor PATCH v3 16/26] scsi: qla2xxx: Do command completion on abort timeout +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +On switch, fabric and mgt command timeout, driver send Abort to tell FW to +return the original command. If abort is timeout, then return both Abort +and original command for cleanup. + +Fixes: 219d27d7147e0 ("scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands") +Cc: stable@vger.kernel.org # 5.2 +Link: https://lore.kernel.org/r/20191105150657.8092-3-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 71c80b75ce8f08c0978ce9a9816b81b5c3ce5e12) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 61c67c99e0c3..980e9a914d80 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -552,6 +552,7 @@ typedef struct srb { + const char *name; + int iocbs; + struct qla_qpair *qpair; ++ struct srb *cmd_sp; + struct list_head elem; + u32 gen1; /* scratch */ + u32 gen2; /* scratch */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 10a1690a802d..d6feda133149 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -103,8 +103,22 @@ static void qla24xx_abort_iocb_timeout(void *data) + u32 handle; + unsigned long flags; + ++ if (sp->cmd_sp) ++ ql_dbg(ql_dbg_async, sp->vha, 0x507c, ++ "Abort timeout - cmd hdl=%x, cmd type=%x hdl=%x, type=%x\n", ++ sp->cmd_sp->handle, sp->cmd_sp->type, ++ sp->handle, sp->type); ++ else ++ ql_dbg(ql_dbg_async, sp->vha, 0x507c, ++ "Abort timeout 2 - hdl=%x, type=%x\n", ++ sp->handle, sp->type); ++ + spin_lock_irqsave(qpair->qp_lock_ptr, flags); + for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) { ++ if (sp->cmd_sp && (qpair->req->outstanding_cmds[handle] == ++ sp->cmd_sp)) ++ qpair->req->outstanding_cmds[handle] = NULL; ++ + /* removing the abort */ + if (qpair->req->outstanding_cmds[handle] == sp) { + qpair->req->outstanding_cmds[handle] = NULL; +@@ -113,6 +127,9 @@ static void qla24xx_abort_iocb_timeout(void *data) + } + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + ++ if (sp->cmd_sp) ++ sp->cmd_sp->done(sp->cmd_sp, QLA_OS_TIMER_EXPIRED); ++ + abt->u.abt.comp_status = CS_TIMEOUT; + sp->done(sp, QLA_OS_TIMER_EXPIRED); + } +@@ -147,6 +164,7 @@ static int qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) + sp->type = SRB_ABT_CMD; + sp->name = "abort"; + sp->qpair = cmd_sp->qpair; ++ sp->cmd_sp = cmd_sp; + if (wait) + sp->flags = SRB_WAKEUP_ON_COMP; + +-- +2.13.6 + diff --git a/SOURCES/0142-scsi-scsi-qla2xxx-Uninline-qla2x00_init_timer.patch b/SOURCES/0142-scsi-scsi-qla2xxx-Uninline-qla2x00_init_timer.patch new file mode 100644 index 0000000..39aebf4 --- /dev/null +++ b/SOURCES/0142-scsi-scsi-qla2xxx-Uninline-qla2x00_init_timer.patch @@ -0,0 +1,105 @@ +From 70d8d932d3b4fdd4da49090830fe3de192d9ff49 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:52 -0500 +Subject: [PATCH 142/155] [scsi] scsi: qla2xxx: Uninline qla2x00_init_timer() + +Message-id: <20191121163701.43688-18-hmadhani@redhat.com> +Patchwork-id: 287867 +O-Subject: [RHLE 7.8 e-stor PATCH v3 17/26] scsi: qla2xxx: Uninline qla2x00_init_timer() +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Since qla2x00_init_timer() is not used for I/O commands there is no need to +inline this function. Hence uninline this function. + +Cc: Himanshu Madhani +Cc: Giridhar Malavali +Signed-off-by: Bart Van Assche +Acked-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 12975426d8889ce42821e9e0348f9a2da343779a) +Signed-off-by: Himanshu Madhani + +[ hmadhani: RH src uses older API for timer intilialization. ] +[ This patches preserves older APIs while moving code from ] +[ qla_inline.h to qla_iocb.c ] + +Conflicts: + drivers/scsi/qla2xxx/qla_inline.h + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 1 + + drivers/scsi/qla2xxx/qla_inline.h | 13 ------------- + drivers/scsi/qla2xxx/qla_iocb.c | 12 ++++++++++++ + 3 files changed, 13 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index e0b1f0652403..6d46518f4e9a 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -283,6 +283,7 @@ 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); + extern int qla2xxx_dif_start_scsi_mq(srb_t *); ++extern void qla2x00_init_timer(srb_t *sp, unsigned long tmo); + extern unsigned long qla2x00_get_async_timeout(struct scsi_qla_host *); + + extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *); +diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h +index 9312bc4053c1..d728b179e347 100644 +--- a/drivers/scsi/qla2xxx/qla_inline.h ++++ b/drivers/scsi/qla2xxx/qla_inline.h +@@ -221,19 +221,6 @@ qla2x00_rel_sp(srb_t *sp) + qla2xxx_rel_qpair_sp(sp->qpair, sp); + } + +-static inline void +-qla2x00_init_timer(srb_t *sp, unsigned long tmo) +-{ +- init_timer(&sp->u.iocb_cmd.timer); +- sp->u.iocb_cmd.timer.expires = jiffies + tmo * HZ; +- sp->u.iocb_cmd.timer.data = (unsigned long)sp; +- sp->u.iocb_cmd.timer.function = qla2x00_sp_timeout; +- sp->free = qla2x00_sp_free; +- if (IS_QLAFX00(sp->vha->hw) && (sp->type == SRB_FXIOCB_DCMD)) +- init_completion(&sp->u.iocb_cmd.u.fxiocb.fxiocb_comp); +- add_timer(&sp->u.iocb_cmd.timer); +-} +- + static inline int + qla2x00_gid_list_size(struct qla_hw_data *ha) + { +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 186ee5825651..c1f3b7a0f950 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2607,6 +2607,18 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk) + } + } + ++void qla2x00_init_timer(srb_t *sp, unsigned long tmo) ++{ ++ init_timer(&sp->u.iocb_cmd.timer); ++ sp->u.iocb_cmd.timer.expires = jiffies + tmo * HZ; ++ sp->u.iocb_cmd.timer.data = (unsigned long)sp; ++ sp->u.iocb_cmd.timer.function = qla2x00_sp_timeout; ++ sp->free = qla2x00_sp_free; ++ if (IS_QLAFX00(sp->vha->hw) && (sp->type == SRB_FXIOCB_DCMD)) ++ init_completion(&sp->u.iocb_cmd.u.fxiocb.fxiocb_comp); ++ add_timer(&sp->u.iocb_cmd.timer); ++} ++ + static void + qla2x00_els_dcmd_sp_free(void *data) + { +-- +2.13.6 + diff --git a/SOURCES/0143-scsi-scsi-qla2xxx-Fix-premature-timer-expiration.patch b/SOURCES/0143-scsi-scsi-qla2xxx-Fix-premature-timer-expiration.patch new file mode 100644 index 0000000..7c116be --- /dev/null +++ b/SOURCES/0143-scsi-scsi-qla2xxx-Fix-premature-timer-expiration.patch @@ -0,0 +1,126 @@ +From d03e239cf7d9d07d5ad186e66164625190fe1f80 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:53 -0500 +Subject: [PATCH 143/155] [scsi] scsi: qla2xxx: Fix premature timer expiration + +Message-id: <20191121163701.43688-19-hmadhani@redhat.com> +Patchwork-id: 287853 +O-Subject: [RHLE 7.8 e-stor PATCH v3 18/26] scsi: qla2xxx: Fix premature timer expiration +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +For any qla2xxx async command, the SRB buffer is used to send it. In +setting up the SRB buffer, the timer for this command is started before all +memory allocation has finished. Under low memory pressure, memory alloc +can go to sleep and not wake up before the timer expires. Once timer has +expired, the timer thread will access uninitialize fields resulting into +NULL pointer crash. + +This patch fixes this crash by moving the start of timer after everything +is setup. + +backtrace shows following + +PID: 3720 TASK: ffff996928401040 CPU: 0 COMMAND: "qla2xxx_1_dpc" +0 [ffff99652751b698] __schedule at ffffffff965676c7 +1 [ffff99652751b728] schedule at ffffffff96567bc9 +2 [ffff99652751b738] schedule_timeout at ffffffff965655e8 +3 [ffff99652751b7e0] io_schedule_timeout at ffffffff9656726d +4 [ffff99652751b810] congestion_wait at ffffffff95fd8d12 +5 [ffff99652751b870] isolate_migratepages_range at ffffffff95fddaf3 +6 [ffff99652751b930] compact_zone at ffffffff95fdde96 +7 [ffff99652751b980] compact_zone_order at ffffffff95fde0bc +8 [ffff99652751ba20] try_to_compact_pages at ffffffff95fde481 +9 [ffff99652751ba80] __alloc_pages_direct_compact at ffffffff9655cc31 +10 [ffff99652751bae0] __alloc_pages_slowpath at ffffffff9655d101 +11 [ffff99652751bbd0] __alloc_pages_nodemask at ffffffff95fc0e95 +12 [ffff99652751bc80] dma_generic_alloc_coherent at ffffffff95e3217f +13 [ffff99652751bcc8] x86_swiotlb_alloc_coherent at ffffffff95e6b7a1 +14 [ffff99652751bcf8] qla2x00_rft_id at ffffffffc055b5e0 [qla2xxx] +15 [ffff99652751bd50] qla2x00_loop_resync at ffffffffc0533e71 [qla2xxx] +16 [ffff99652751be68] qla2x00_do_dpc at ffffffffc05210ca [qla2xxx] + +PID: 0 TASK: ffffffff96a18480 CPU: 0 COMMAND: "swapper/0" + 0 [ffff99652fc03ae0] machine_kexec at ffffffff95e63674 + 1 [ffff99652fc03b40] __crash_kexec at ffffffff95f1ce12 + 2 [ffff99652fc03c10] crash_kexec at ffffffff95f1cf00 + 3 [ffff99652fc03c28] oops_end at ffffffff9656c758 + 4 [ffff99652fc03c50] no_context at ffffffff9655aa7e + 5 [ffff99652fc03ca0] __bad_area_nosemaphore at ffffffff9655ab15 + 6 [ffff99652fc03cf0] bad_area_nosemaphore at ffffffff9655ac86 + 7 [ffff99652fc03d00] __do_page_fault at ffffffff9656f6b0 + 8 [ffff99652fc03d70] do_page_fault at ffffffff9656f915 + 9 [ffff99652fc03da0] page_fault at ffffffff9656b758 + [exception RIP: unknown or invalid address] + RIP: 0000000000000000 RSP: ffff99652fc03e50 RFLAGS: 00010202 + RAX: 0000000000000000 RBX: ffff99652b79a600 RCX: ffff99652b79a760 + RDX: ffff99652b79a600 RSI: ffffffffc0525ad0 RDI: ffff99652b79a600 + RBP: ffff99652fc03e60 R8: ffffffff96a18a18 R9: ffffffff96ee3c00 + R10: 0000000000000002 R11: ffff99652fc03de8 R12: ffff99652b79a760 + R13: 0000000000000100 R14: ffffffffc0525ad0 R15: ffff99652b79a600 + ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 +10 [ffff99652fc03e50] qla2x00_sp_timeout at ffffffffc0525af8 [qla2xxx] +11 [ffff99652fc03e68] call_timer_fn at ffffffff95ea7f58 +12 [ffff99652fc03ea0] run_timer_softirq at ffffffff95eaa3bd +13 [ffff99652fc03f18] __do_softirq at ffffffff95ea0f05 +14 [ffff99652fc03f88] call_softirq at ffffffff9657832c +15 [ffff99652fc03fa0] do_softirq at ffffffff95e2e675 +16 [ffff99652fc03fc0] irq_exit at ffffffff95ea1285 +17 [ffff99652fc03fd8] smp_apic_timer_interrupt at ffffffff965796c8 +18 [ffff99652fc03ff0] apic_timer_interrupt at ffffffff96575df2 + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 3a4b6cc7332130ac5cbf3b505d8cddf0aa2ea745) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 1 + + drivers/scsi/qla2xxx/qla_iocb.c | 5 ++++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 980e9a914d80..24a4a2bdf6a7 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -546,6 +546,7 @@ typedef struct srb { + wait_queue_head_t nvme_ls_waitq; + struct fc_port *fcport; + struct scsi_qla_host *vha; ++ unsigned int start_timer:1; + uint32_t handle; + uint16_t flags; + uint16_t type; +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index c1f3b7a0f950..05acf2f85895 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2616,7 +2616,7 @@ void qla2x00_init_timer(srb_t *sp, unsigned long tmo) + sp->free = qla2x00_sp_free; + if (IS_QLAFX00(sp->vha->hw) && (sp->type == SRB_FXIOCB_DCMD)) + init_completion(&sp->u.iocb_cmd.u.fxiocb.fxiocb_comp); +- add_timer(&sp->u.iocb_cmd.timer); ++ sp->start_timer = 1; + } + + static void +@@ -3899,6 +3899,9 @@ qla2x00_start_sp(srb_t *sp) + break; + } + ++ if (sp->start_timer) ++ add_timer(&sp->u.iocb_cmd.timer); ++ + wmb(); + qla2x00_start_iocbs(vha, qp->req); + done: +-- +2.13.6 + diff --git a/SOURCES/0144-scsi-scsi-qla2xxx-Fix-SRB-leak-on-switch-command-tim.patch b/SOURCES/0144-scsi-scsi-qla2xxx-Fix-SRB-leak-on-switch-command-tim.patch new file mode 100644 index 0000000..ca7a833 --- /dev/null +++ b/SOURCES/0144-scsi-scsi-qla2xxx-Fix-SRB-leak-on-switch-command-tim.patch @@ -0,0 +1,171 @@ +From 1b8fc153103d4830579b8675af6318855e26ab03 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:54 -0500 +Subject: [PATCH 144/155] [scsi] scsi: qla2xxx: Fix SRB leak on switch command + timeout + +Message-id: <20191121163701.43688-20-hmadhani@redhat.com> +Patchwork-id: 287864 +O-Subject: [RHLE 7.8 e-stor PATCH v3 19/26] scsi: qla2xxx: Fix SRB leak on switch command timeout +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +when GPSC/GPDB switch command fails, driver just returns without doing a +proper cleanup. This patch fixes this memory leak by calling sp->free() in +the error path. + +Link: https://lore.kernel.org/r/20191105150657.8092-4-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit af2a0c51b1205327f55a7e82e530403ae1d42cbb) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gs.c | 2 +- + drivers/scsi/qla2xxx/qla_init.c | 11 +++++------ + drivers/scsi/qla2xxx/qla_mbx.c | 4 ---- + drivers/scsi/qla2xxx/qla_mid.c | 11 ++++------- + drivers/scsi/qla2xxx/qla_os.c | 7 ++++++- + 5 files changed, 16 insertions(+), 19 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 592ae70a4abd..295f856cb8b7 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3043,7 +3043,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); + + if (res == QLA_FUNCTION_TIMEOUT) +- return; ++ goto done; + + if (res == (DID_ERROR << 16)) { + /* entry status error */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index d6feda133149..16ad80836fb7 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1164,19 +1164,18 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) + "Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n", + sp->name, res, fcport->port_name, mb[1], mb[2]); + +- if (res == QLA_FUNCTION_TIMEOUT) { +- dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, +- sp->u.iocb_cmd.u.mbx.in_dma); +- return; +- } +- + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); ++ ++ if (res == QLA_FUNCTION_TIMEOUT) ++ goto done; ++ + memset(&ea, 0, sizeof(ea)); + ea.fcport = fcport; + ea.sp = sp; + + qla24xx_handle_gpdb_event(vha, &ea); + ++done: + dma_pool_free(ha->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, + sp->u.iocb_cmd.u.mbx.in_dma); + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index d66577789cce..bf7c8d2bb52c 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -6288,17 +6288,13 @@ int qla24xx_send_mb_cmd(struct scsi_qla_host *vha, mbx_cmd_t *mcp) + case QLA_SUCCESS: + ql_dbg(ql_dbg_mbx, vha, 0x119d, "%s: %s done.\n", + __func__, sp->name); +- sp->free(sp); + break; + default: + ql_dbg(ql_dbg_mbx, vha, 0x119e, "%s: %s Failed. %x.\n", + __func__, sp->name, rval); +- sp->free(sp); + break; + } + +- return rval; +- + done_free_sp: + sp->free(sp); + done: +diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c +index 203188563735..55276b65ddae 100644 +--- a/drivers/scsi/qla2xxx/qla_mid.c ++++ b/drivers/scsi/qla2xxx/qla_mid.c +@@ -933,7 +933,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + + sp = qla2x00_get_sp(base_vha, NULL, GFP_KERNEL); + if (!sp) +- goto done; ++ return rval; + + sp->type = SRB_CTRL_VP; + sp->name = "ctrl_vp"; +@@ -949,7 +949,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + ql_dbg(ql_dbg_async, vha, 0xffff, + "%s: %s Failed submission. %x.\n", + __func__, sp->name, rval); +- goto done_free_sp; ++ goto done; + } + + ql_dbg(ql_dbg_vport, vha, 0x113f, "%s hndl %x submitted\n", +@@ -967,16 +967,13 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + case QLA_SUCCESS: + ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s done.\n", + __func__, sp->name); +- goto done_free_sp; ++ break; + default: + ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s Failed. %x.\n", + __func__, sp->name, rval); +- goto done_free_sp; ++ break; + } + done: +- return rval; +- +-done_free_sp: + sp->free(sp); + return rval; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 95d54bbc48c0..4155b45d118e 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1023,7 +1023,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3078, + "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd); + if (rval == QLA_INTERFACE_ERROR) +- goto qc24_fail_command; ++ goto qc24_free_sp_fail_command; + goto qc24_host_busy_free_sp; + } + +@@ -1035,6 +1035,11 @@ qc24_host_busy_free_sp: + qc24_target_busy: + return SCSI_MLQUEUE_TARGET_BUSY; + ++qc24_free_sp_fail_command: ++ sp->free(sp); ++ CMD_SP(cmd) = NULL; ++ qla2xxx_rel_qpair_sp(sp->qpair, sp); ++ + qc24_fail_command: + cmd->scsi_done(cmd); + +-- +2.13.6 + diff --git a/SOURCES/0145-scsi-scsi-qla2xxx-Fix-driver-unload-hang.patch b/SOURCES/0145-scsi-scsi-qla2xxx-Fix-driver-unload-hang.patch new file mode 100644 index 0000000..641092f --- /dev/null +++ b/SOURCES/0145-scsi-scsi-qla2xxx-Fix-driver-unload-hang.patch @@ -0,0 +1,49 @@ +From 60a49e3f247ae43a0a4581fc73ef51b05c819181 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:55 -0500 +Subject: [PATCH 145/155] [scsi] scsi: qla2xxx: Fix driver unload hang + +Message-id: <20191121163701.43688-21-hmadhani@redhat.com> +Patchwork-id: 287849 +O-Subject: [RHLE 7.8 e-stor PATCH v3 20/26] scsi: qla2xxx: Fix driver unload hang +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +This patch fixes driver unload hang by removing msleep() + +Fixes: d74595278f4ab ("scsi: qla2xxx: Add multiple queue pair functionality.") +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20191105150657.8092-5-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit dd322b7f3efc8cda085bb60eadc4aee6324eadd8) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_init.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 16ad80836fb7..3344f149e1c2 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -9057,8 +9057,6 @@ int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair) + struct qla_hw_data *ha = qpair->hw; + + qpair->delete_in_progress = 1; +- while (atomic_read(&qpair->ref_count)) +- msleep(500); + + ret = qla25xx_delete_req_que(vha, qpair->req); + if (ret != QLA_SUCCESS) +-- +2.13.6 + diff --git a/SOURCES/0146-scsi-scsi-qla2xxx-Make-qla2x00_abort_srb-again-decre.patch b/SOURCES/0146-scsi-scsi-qla2xxx-Make-qla2x00_abort_srb-again-decre.patch new file mode 100644 index 0000000..04e9001 --- /dev/null +++ b/SOURCES/0146-scsi-scsi-qla2xxx-Make-qla2x00_abort_srb-again-decre.patch @@ -0,0 +1,50 @@ +From d17cb18a109f707ccc4349b8f9d1bc711181ec46 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:56 -0500 +Subject: [PATCH 146/155] [scsi] scsi: qla2xxx: Make qla2x00_abort_srb() again + decrease the sp reference count + +Message-id: <20191121163701.43688-22-hmadhani@redhat.com> +Patchwork-id: 287866 +O-Subject: [RHLE 7.8 e-stor PATCH v3 21/26] scsi: qla2xxx: Make qla2x00_abort_srb() again decrease the sp reference count +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +Since qla2x00_abort_srb() starts with increasing the reference count of +@sp, decrease that same reference count before returning. + +Cc: Himanshu Madhani +Fixes: 219d27d7147e ("scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands") # v5.2. +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit d2d2b5a5741d317bed1fa38211f1f3b142d8cf7a) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_os.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 4155b45d118e..f44d1617cbcb 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1750,6 +1750,8 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + spin_lock_irqsave(qp->qp_lock_ptr, *flags); + sp->comp = NULL; + } ++ ++ atomic_dec(&sp->ref_count); + } + + static void +-- +2.13.6 + diff --git a/SOURCES/0147-scsi-scsi-qla2xxx-Fix-double-scsi_done-for-abort-pat.patch b/SOURCES/0147-scsi-scsi-qla2xxx-Fix-double-scsi_done-for-abort-pat.patch new file mode 100644 index 0000000..87fe42c --- /dev/null +++ b/SOURCES/0147-scsi-scsi-qla2xxx-Fix-double-scsi_done-for-abort-pat.patch @@ -0,0 +1,345 @@ +From e3771a20877e59aa665131a10beb2618d917091a Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:57 -0500 +Subject: [PATCH 147/155] [scsi] scsi: qla2xxx: Fix double scsi_done for abort + path + +Message-id: <20191121163701.43688-23-hmadhani@redhat.com> +Patchwork-id: 287852 +O-Subject: [RHLE 7.8 e-stor PATCH v3 22/26] scsi: qla2xxx: Fix double scsi_done for abort path +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +Current code assumes abort will remove the original command from the active +list where scsi_done will not be called. Instead, the eh_abort thread will +do the scsi_done. That is not the case. Instead, we have a double +scsi_done calls triggering use after free. + +Abort will tell FW to release the command from FW possesion. The original +command will return to ULP with error in its normal fashion via scsi_done. +eh_abort path would wait for the original command completion before +returning. eh_abort path will not perform the scsi_done call. + +Fixes: 219d27d7147e0 ("scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands") +Cc: stable@vger.kernel.org # 5.2 +Link: https://lore.kernel.org/r/20191105150657.8092-6-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Arun Easi +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit f45bca8c5052e8c59bab64ee90c44441678b9a52) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_def.h | 5 +- + drivers/scsi/qla2xxx/qla_isr.c | 5 ++ + drivers/scsi/qla2xxx/qla_nvme.c | 4 +- + drivers/scsi/qla2xxx/qla_os.c | 117 +++++++++++++++++++++------------------- + 4 files changed, 72 insertions(+), 59 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 24a4a2bdf6a7..f0eeda17e1d9 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -540,13 +540,16 @@ typedef struct srb { + */ + uint8_t cmd_type; + uint8_t pad[3]; +- atomic_t ref_count; + struct kref cmd_kref; /* need to migrate ref_count over to this */ + void *priv; + wait_queue_head_t nvme_ls_waitq; + struct fc_port *fcport; + struct scsi_qla_host *vha; + unsigned int start_timer:1; ++ unsigned int abort:1; ++ unsigned int aborted:1; ++ unsigned int completed:1; ++ + uint32_t handle; + uint16_t flags; + uint16_t type; +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 873fcffb5dd7..1cc0d58a4ae8 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -2469,6 +2469,11 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) + return; + } + ++ if (sp->abort) ++ sp->aborted = 1; ++ else ++ sp->completed = 1; ++ + if (sp->cmd_type != TYPE_SRB) { + req->outstanding_cmds[handle] = NULL; + ql_dbg(ql_dbg_io, vha, 0x3015, +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index ad406511f2ec..62d7c7032b27 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -227,8 +227,8 @@ static void qla_nvme_abort_work(struct work_struct *work) + + if (ha->flags.host_shutting_down) { + ql_log(ql_log_info, sp->fcport->vha, 0xffff, +- "%s Calling done on sp: %p, type: 0x%x, sp->ref_count: 0x%x\n", +- __func__, sp, sp->type, atomic_read(&sp->ref_count)); ++ "%s Calling done on sp: %p, type: 0x%x\n", ++ __func__, sp, sp->type); + sp->done(sp, 0); + goto out; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index f44d1617cbcb..b6160b2a5405 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -715,11 +715,6 @@ qla2x00_sp_compl(void *ptr, int res) + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct completion *comp = sp->comp; + +- if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) +- return; +- +- atomic_dec(&sp->ref_count); +- + sp->free(sp); + cmd->result = res; + cmd->scsi_done(cmd); +@@ -818,11 +813,6 @@ qla2xxx_qpair_sp_compl(void *ptr, int res) + struct scsi_cmnd *cmd = GET_CMD_SP(sp); + struct completion *comp = sp->comp; + +- if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) +- return; +- +- atomic_dec(&sp->ref_count); +- + sp->free(sp); + cmd->result = res; + CMD_SP(cmd) = NULL; +@@ -930,7 +920,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) + + sp->u.scmd.cmd = cmd; + sp->type = SRB_SCSI_CMD; +- atomic_set(&sp->ref_count, 1); ++ + CMD_SP(cmd) = (void *)sp; + sp->free = qla2x00_sp_free_dma; + sp->done = qla2x00_sp_compl; +@@ -1012,11 +1002,9 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + + sp->u.scmd.cmd = cmd; + sp->type = SRB_SCSI_CMD; +- atomic_set(&sp->ref_count, 1); + CMD_SP(cmd) = (void *)sp; + sp->free = qla2xxx_qpair_sp_free_dma; + sp->done = qla2xxx_qpair_sp_compl; +- sp->qpair = qpair; + + rval = ha->isp_ops->start_scsi_mq(sp); + if (rval != QLA_SUCCESS) { +@@ -1208,16 +1196,6 @@ qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha) + return return_status; + } + +-static int +-sp_get(struct srb *sp) +-{ +- if (!refcount_inc_not_zero((refcount_t *)&sp->ref_count)) +- /* kref get fail */ +- return ENXIO; +- else +- return 0; +-} +- + #define ISP_REG_DISCONNECT 0xffffffffU + /************************************************************************** + * qla2x00_isp_reg_stat +@@ -1272,6 +1250,9 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + unsigned int id, lun; + int rval; + struct qla_hw_data *ha = vha->hw; ++ uint32_t ratov_j; ++ struct qla_qpair *qpair; ++ unsigned long flags; + + if (qla2x00_isp_reg_stat(ha)) { + ql_log(ql_log_info, vha, 0x8042, +@@ -1284,13 +1265,26 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + return ret; + + sp = scsi_cmd_priv(cmd); ++ qpair = sp->qpair; + +- if (sp->fcport && sp->fcport->deleted) ++ if ((sp->fcport && sp->fcport->deleted) || !qpair) + return SUCCESS; + +- /* Return if the command has already finished. */ +- if (sp_get(sp)) ++ spin_lock_irqsave(qpair->qp_lock_ptr, flags); ++ if (sp->completed) { ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + return SUCCESS; ++ } ++ ++ if (sp->abort || sp->aborted) { ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); ++ return FAILED; ++ } ++ ++ sp->abort = 1; ++ sp->comp = ∁ ++ spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); ++ + + id = cmd->device->id; + lun = cmd->device->lun; +@@ -1299,47 +1293,37 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) + "Aborting from RISC nexus=%ld:%d:%u sp=%p cmd=%p handle=%x\n", + vha->host_no, id, lun, sp, cmd, sp->handle); + ++ /* ++ * Abort will release the original Command/sp from FW. Let the ++ * original command call scsi_done. In return, he will wakeup ++ * this sleeping thread. ++ */ + rval = ha->isp_ops->abort_command(sp); ++ + ql_dbg(ql_dbg_taskm, vha, 0x8003, + "Abort command mbx cmd=%p, rval=%x.\n", cmd, rval); + ++ /* Wait for the command completion. */ ++ ratov_j = ha->r_a_tov/10 * 4 * 1000; ++ ratov_j = msecs_to_jiffies(ratov_j); + switch (rval) { + case QLA_SUCCESS: +- /* +- * The command has been aborted. That means that the firmware +- * won't report a completion. +- */ +- sp->done(sp, DID_ABORT << 16); +- ret = SUCCESS; +- break; +- case QLA_FUNCTION_PARAMETER_ERROR: { +- /* Wait for the command completion. */ +- uint32_t ratov = ha->r_a_tov/10; +- uint32_t ratov_j = msecs_to_jiffies(4 * ratov * 1000); +- +- WARN_ON_ONCE(sp->comp); +- sp->comp = ∁ + if (!wait_for_completion_timeout(&comp, ratov_j)) { + ql_dbg(ql_dbg_taskm, vha, 0xffff, + "%s: Abort wait timer (4 * R_A_TOV[%d]) expired\n", +- __func__, ha->r_a_tov); ++ __func__, ha->r_a_tov/10); + ret = FAILED; + } else { + ret = SUCCESS; + } + break; +- } + default: +- /* +- * Either abort failed or abort and completion raced. Let +- * the SCSI core retry the abort in the former case. +- */ + ret = FAILED; + break; + } + + sp->comp = NULL; +- atomic_dec(&sp->ref_count); ++ + ql_log(ql_log_info, vha, 0x801c, + "Abort command issued nexus=%ld:%d:%d -- %x.\n", + vha->host_no, id, lun, ret); +@@ -1726,32 +1710,53 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + scsi_qla_host_t *vha = qp->vha; + struct qla_hw_data *ha = vha->hw; + int rval; ++ bool ret_cmd; ++ uint32_t ratov_j; + +- if (sp_get(sp)) ++ if (qla2x00_chip_is_down(vha)) { ++ sp->done(sp, res); + return; ++ } + + if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS || + (sp->type == SRB_SCSI_CMD && !ha->flags.eeh_busy && + !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && + !qla2x00_isp_reg_stat(ha))) { ++ if (sp->comp) { ++ sp->done(sp, res); ++ return; ++ } ++ + sp->comp = ∁ ++ sp->abort = 1; + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); +- rval = ha->isp_ops->abort_command(sp); + ++ rval = ha->isp_ops->abort_command(sp); ++ /* Wait for command completion. */ ++ ret_cmd = false; ++ ratov_j = ha->r_a_tov/10 * 4 * 1000; ++ ratov_j = msecs_to_jiffies(ratov_j); + switch (rval) { + case QLA_SUCCESS: +- sp->done(sp, res); ++ if (wait_for_completion_timeout(&comp, ratov_j)) { ++ ql_dbg(ql_dbg_taskm, vha, 0xffff, ++ "%s: Abort wait timer (4 * R_A_TOV[%d]) expired\n", ++ __func__, ha->r_a_tov/10); ++ ret_cmd = true; ++ } ++ /* else FW return SP to driver */ + break; +- case QLA_FUNCTION_PARAMETER_ERROR: +- wait_for_completion(&comp); ++ default: ++ ret_cmd = true; + break; + } + + spin_lock_irqsave(qp->qp_lock_ptr, *flags); +- sp->comp = NULL; ++ if (ret_cmd && (!sp->completed || !sp->aborted)) ++ sp->done(sp, res); ++ } else { ++ sp->done(sp, res); + } +- +- atomic_dec(&sp->ref_count); + } + + static void +@@ -1773,7 +1778,6 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) { + sp = req->outstanding_cmds[cnt]; + if (sp) { +- req->outstanding_cmds[cnt] = NULL; + switch (sp->cmd_type) { + case TYPE_SRB: + qla2x00_abort_srb(qp, sp, res, &flags); +@@ -1800,6 +1804,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + default: + break; + } ++ req->outstanding_cmds[cnt] = NULL; + } + } + spin_unlock_irqrestore(qp->qp_lock_ptr, flags); +-- +2.13.6 + diff --git a/SOURCES/0148-scsi-scsi-qla2xxx-Fix-a-NULL-pointer-dereference.patch b/SOURCES/0148-scsi-scsi-qla2xxx-Fix-a-NULL-pointer-dereference.patch new file mode 100644 index 0000000..84af1a3 --- /dev/null +++ b/SOURCES/0148-scsi-scsi-qla2xxx-Fix-a-NULL-pointer-dereference.patch @@ -0,0 +1,73 @@ +From cf6f6cf41f56ff4c996323ed4c3a913ed7e0d374 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:58 -0500 +Subject: [PATCH 148/155] [scsi] scsi: qla2xxx: Fix a NULL pointer dereference + +Message-id: <20191121163701.43688-24-hmadhani@redhat.com> +Patchwork-id: 287865 +O-Subject: [RHLE 7.8 e-stor PATCH v3 23/26] scsi: qla2xxx: Fix a NULL pointer dereference +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Bart Van Assche + +Bugzilla 1731581 + +BUG: KASAN: null-ptr-deref in qla24xx_handle_plogi_done_event+0x134/0x9f0 [qla2xxx] +Read of size 4 at addr 00000000000000a0 by task swapper/2/0 + +CPU: 2 PID: 0 Comm: swapper/2 Not tainted 5.2.0-dbg+ #1 +Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 +Call Trace: + + dump_stack+0x8a/0xd6 + __kasan_report.cold+0x5/0x41 + kasan_report+0x16/0x20 + __asan_load4+0x7e/0x80 + qla24xx_handle_plogi_done_event+0x134/0x9f0 [qla2xxx] + qla2x00_els_dcmd2_sp_done+0x15f/0x230 [qla2xxx] + qla24xx_els_ct_entry+0x3b3/0x610 [qla2xxx] + qla24xx_process_response_queue+0x514/0x10e0 [qla2xxx] + qla24xx_msix_rsp_q+0x80/0x100 [qla2xxx] + __handle_irq_event_percpu+0x72/0x450 + handle_irq_event_percpu+0x74/0xf0 + handle_irq_event+0x5e/0x8f + handle_edge_irq+0x13a/0x320 + handle_irq+0x30/0x40 + do_IRQ+0x91/0x190 + common_interrupt+0xf/0xf + +RIP: 0010:default_idle+0x31/0x230 + +Fixes: 8777e4314d39 ("scsi: qla2xxx: Migrate NVME N2N handling into state machine") # v4.19. +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit d1436e456b840162eb4d162f99055d2adb79a566) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_iocb.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 05acf2f85895..918b18d53599 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2868,7 +2868,8 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + case CS_COMPLETE: + memset(&ea, 0, sizeof(ea)); + ea.fcport = fcport; +- ea.rc = res; ++ ea.data[0] = MBS_COMMAND_COMPLETE; ++ ea.sp = sp; + qla24xx_handle_plogi_done_event(vha, &ea); + break; + +-- +2.13.6 + diff --git a/SOURCES/0149-scsi-scsi-qla2xxx-Fix-device-connect-issues-in-P2P-c.patch b/SOURCES/0149-scsi-scsi-qla2xxx-Fix-device-connect-issues-in-P2P-c.patch new file mode 100644 index 0000000..b9af1c6 --- /dev/null +++ b/SOURCES/0149-scsi-scsi-qla2xxx-Fix-device-connect-issues-in-P2P-c.patch @@ -0,0 +1,83 @@ +From b338d44a8648a0e015780d73fc806dedbc78b59f Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:36:59 -0500 +Subject: [PATCH 149/155] [scsi] scsi: qla2xxx: Fix device connect issues in + P2P configuration + +Message-id: <20191121163701.43688-25-hmadhani@redhat.com> +Patchwork-id: 287856 +O-Subject: [RHLE 7.8 e-stor PATCH v3 24/26] scsi: qla2xxx: Fix device connect issues in P2P configuration +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Arun Easi + +Bugzilla 1731581 + +P2P needs to take the alternate plogi route. + +Link: https://lore.kernel.org/r/20191105150657.8092-8-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Arun Easi +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 65e9200938052ce90f24421bb057e1be1d6147c7) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_gbl.h | 1 + + drivers/scsi/qla2xxx/qla_init.c | 9 +++++++++ + drivers/scsi/qla2xxx/qla_iocb.c | 5 ++--- + 3 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index 6d46518f4e9a..69faea46da73 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -912,4 +912,5 @@ int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode); + + /* nvme.c */ + void qla_nvme_unregister_remote_port(struct fc_port *fcport); ++void qla_handle_els_plogi_done(scsi_qla_host_t *vha, struct event_arg *ea); + #endif /* _QLA_GBL_H */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 3344f149e1c2..c327139a9ced 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1732,6 +1732,15 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha, + qla24xx_fcport_handle_login(vha, fcport); + } + ++void qla_handle_els_plogi_done(scsi_qla_host_t *vha, ++ struct event_arg *ea) ++{ ++ ql_dbg(ql_dbg_disc, vha, 0x2118, ++ "%s %d %8phC post PRLI\n", ++ __func__, __LINE__, ea->fcport->port_name); ++ qla24xx_post_prli_work(vha, ea->fcport); ++} ++ + /* + * RSCN(s) came in for this fcport, but the RSCN(s) was not able + * to be consumed by the fcport +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 918b18d53599..337fcd555ae5 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -2868,9 +2868,8 @@ qla2x00_els_dcmd2_sp_done(void *ptr, int res) + case CS_COMPLETE: + memset(&ea, 0, sizeof(ea)); + ea.fcport = fcport; +- ea.data[0] = MBS_COMMAND_COMPLETE; +- ea.sp = sp; +- qla24xx_handle_plogi_done_event(vha, &ea); ++ ea.rc = res; ++ qla_handle_els_plogi_done(vha, &ea); + break; + + case CS_IOCB_ERROR: +-- +2.13.6 + diff --git a/SOURCES/0150-scsi-scsi-qla2xxx-Fix-partial-flash-write-of-MBI.patch b/SOURCES/0150-scsi-scsi-qla2xxx-Fix-partial-flash-write-of-MBI.patch new file mode 100644 index 0000000..bd30d02 --- /dev/null +++ b/SOURCES/0150-scsi-scsi-qla2xxx-Fix-partial-flash-write-of-MBI.patch @@ -0,0 +1,64 @@ +From e07773c931540bdd3668bf8210e44ffb03febfb5 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:37:00 -0500 +Subject: [PATCH 150/155] [scsi] scsi: qla2xxx: Fix partial flash write of MBI + +Message-id: <20191121163701.43688-26-hmadhani@redhat.com> +Patchwork-id: 287862 +O-Subject: [RHLE 7.8 e-stor PATCH v3 25/26] scsi: qla2xxx: Fix partial flash write of MBI +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +From: Quinn Tran + +Bugzilla 1731581 + +For new adapters with multiple flash regions to write to, current code +allows FW & Boot regions to be written, while other regions are blocked via +sysfs. The fix is to block all flash read/write through sysfs interface. + +Fixes: e81d1bcbde06 ("scsi: qla2xxx: Further limit FLASH region write access from SysFS") +Cc: stable@vger.kernel.org # 5.2 +Link: https://lore.kernel.org/r/20191022193643.7076-3-hmadhani@marvell.com +Signed-off-by: Quinn Tran +Signed-off-by: Girish Basrur +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 8d8b83f5be2a3bdac3695a94e6cb5e50bd114869) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index a1fbf1af9ea0..21c18702010f 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -440,9 +440,6 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + valid = 0; + if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0) + valid = 1; +- else if (start == (ha->flt_region_boot * 4) || +- start == (ha->flt_region_fw * 4)) +- valid = 1; + else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)) + valid = 1; + if (!valid) { +@@ -489,8 +486,10 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, + "Writing flash region -- 0x%x/0x%x.\n", + ha->optrom_region_start, ha->optrom_region_size); + +- ha->isp_ops->write_optrom(vha, ha->optrom_buffer, ++ rval = ha->isp_ops->write_optrom(vha, ha->optrom_buffer, + ha->optrom_region_start, ha->optrom_region_size); ++ if (rval) ++ rval = -EIO; + break; + default: + rval = -EINVAL; +-- +2.13.6 + diff --git a/SOURCES/0151-scsi-qla2xxx-Update-driver-version.patch b/SOURCES/0151-scsi-qla2xxx-Update-driver-version.patch new file mode 100644 index 0000000..69840de --- /dev/null +++ b/SOURCES/0151-scsi-qla2xxx-Update-driver-version.patch @@ -0,0 +1,41 @@ +From b6c01f2f54dd906c74e58abc722c8af7e42f9308 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Thu, 21 Nov 2019 16:37:01 -0500 +Subject: [PATCH 151/155] [scsi] qla2xxx: Update driver version + +Message-id: <20191121163701.43688-27-hmadhani@redhat.com> +Patchwork-id: 287860 +O-Subject: [RHLE 7.8 e-stor PATCH v3 26/26] qla2xxx: Update driver version +Bugzilla: 1731581 +RH-Acked-by: Jarod Wilson +RH-Acked-by: Ewan Milne +RH-Acked-by: Tony Camuso + +Bugzilla 1731581 + +Bugzilla 1731581 + +Upstream Status: RHEL-only + +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + 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 3c5c94460aa0..eabb98e7b735 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.01.00.18.07.8-k" ++#define QLA2XXX_VERSION "10.01.00.20.07.8-k" + + #define QLA_DRIVER_MAJOR_VER 10 + #define QLA_DRIVER_MINOR_VER 1 +-- +2.13.6 + diff --git a/SOURCES/0153-scsi-scsi-qla2xxx-Correctly-retrieve-and-interpret-a.patch b/SOURCES/0153-scsi-scsi-qla2xxx-Correctly-retrieve-and-interpret-a.patch new file mode 100644 index 0000000..a991cac --- /dev/null +++ b/SOURCES/0153-scsi-scsi-qla2xxx-Correctly-retrieve-and-interpret-a.patch @@ -0,0 +1,91 @@ +From 0077e04435309e3923c2a39b6cd3979b7360a110 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Mon, 16 Dec 2019 17:58:31 -0500 +Subject: [PATCH 153/155] [scsi] scsi: qla2xxx: Correctly retrieve and + interpret active flash region + +Message-id: <20191216175833.14530-2-hmadhani@redhat.com> +Patchwork-id: 292028 +Patchwork-instance: patchwork +O-Subject: [RHEL 7.8 e-stor PATCH 1/3] scsi: qla2xxx: Correctly retrieve and interpret active flash region +Bugzilla: 1783016 +RH-Acked-by: Tony Camuso +RH-Acked-by: Ewan Milne +RH-Acked-by: Jarod Wilson + +From: Himanshu Madhani + +Bugzilla 1783016 + +ISP27XX/28XX supports multiple flash regions. This patch fixes issue where +active flash region was not interpreted correctly during secure flash +update process. + +[mkp: typo] + +Fixes: 5fa8774c7f38c ("scsi: qla2xxx: Add 28xx flash primary/secondary status/image mechanism") +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20191203223657.22109-2-hmadhani@marvell.com +Signed-off-by: Michael Hernandez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit 4e71dcae0c4cd1e9d19b8b3d80214a4bcdca5a42) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_attr.c | 1 + + drivers/scsi/qla2xxx/qla_bsg.c | 2 +- + drivers/scsi/qla2xxx/qla_sup.c | 6 +++--- + 3 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 21c18702010f..d25a5040cc91 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -176,6 +176,7 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj, + + faddr = ha->flt_region_nvram; + if (IS_QLA28XX(ha)) { ++ qla28xx_get_aux_images(vha, &active_regions); + if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE) + faddr = ha->flt_region_nvram_sec; + } +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index c59a56aa626b..1f7199468933 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -2349,7 +2349,7 @@ qla2x00_get_flash_image_status(struct fc_bsg_job *bsg_job) + struct qla_active_regions regions = { }; + struct active_regions active_regions = { }; + +- qla28xx_get_aux_images(vha, &active_regions); ++ qla27xx_get_active_image(vha, &active_regions); + regions.global_image = active_regions.global; + + if (IS_QLA28XX(ha)) { +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index 40ed07fc1fa6..a7d69a0b3436 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -845,15 +845,15 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) + ha->flt_region_img_status_pri = start; + break; + case FLT_REG_IMG_SEC_27XX: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + ha->flt_region_img_status_sec = start; + break; + case FLT_REG_FW_SEC_27XX: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + ha->flt_region_fw_sec = start; + break; + case FLT_REG_BOOTLOAD_SEC_27XX: +- if (IS_QLA27XX(ha) && !IS_QLA28XX(ha)) ++ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) + ha->flt_region_boot_sec = start; + break; + case FLT_REG_AUX_IMG_PRI_28XX: +-- +2.13.6 + diff --git a/SOURCES/0154-scsi-scsi-qla2xxx-Added-support-for-MPI-and-PEP-regi.patch b/SOURCES/0154-scsi-scsi-qla2xxx-Added-support-for-MPI-and-PEP-regi.patch new file mode 100644 index 0000000..ae78b94 --- /dev/null +++ b/SOURCES/0154-scsi-scsi-qla2xxx-Added-support-for-MPI-and-PEP-regi.patch @@ -0,0 +1,99 @@ +From 24f2b9e89af864a9a7fb53678ec046383e37db31 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Mon, 16 Dec 2019 17:58:32 -0500 +Subject: [PATCH 154/155] [scsi] scsi: qla2xxx: Added support for MPI and PEP + regions for ISP28XX + +Message-id: <20191216175833.14530-3-hmadhani@redhat.com> +Patchwork-id: 292027 +Patchwork-instance: patchwork +O-Subject: [RHEL 7.8 e-stor PATCH 2/3] scsi: qla2xxx: Added support for MPI and PEP regions for ISP28XX +Bugzilla: 1783016 +RH-Acked-by: Tony Camuso +RH-Acked-by: Ewan Milne +RH-Acked-by: Jarod Wilson + +From: Michael Hernandez + +Bugzilla 1783016 + +This patch adds support for MPI/PEP region updates which is required with +secure flash updates for ISP28XX. + +Fixes: 3f006ac342c0 ("scsi: qla2xxx: Secure flash update support for ISP28XX") +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20191203223657.22109-3-hmadhani@marvell.com +Signed-off-by: Michael Hernandez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit a530bf691f0e4691214562c165e6c8889dc51e57) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_fw.h | 4 ++++ + drivers/scsi/qla2xxx/qla_sup.c | 27 ++++++++++++++++++++++----- + 2 files changed, 26 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h +index d2bf3a7fd643..f0bb335aa91a 100644 +--- a/drivers/scsi/qla2xxx/qla_fw.h ++++ b/drivers/scsi/qla2xxx/qla_fw.h +@@ -1526,6 +1526,10 @@ struct qla_flt_header { + #define FLT_REG_NVRAM_SEC_28XX_1 0x10F + #define FLT_REG_NVRAM_SEC_28XX_2 0x111 + #define FLT_REG_NVRAM_SEC_28XX_3 0x113 ++#define FLT_REG_MPI_PRI_28XX 0xD3 ++#define FLT_REG_MPI_SEC_28XX 0xF0 ++#define FLT_REG_PEP_PRI_28XX 0xD1 ++#define FLT_REG_PEP_SEC_28XX 0xF1 + + struct qla_flt_region { + uint16_t code; +diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c +index a7d69a0b3436..d65a34007271 100644 +--- a/drivers/scsi/qla2xxx/qla_sup.c ++++ b/drivers/scsi/qla2xxx/qla_sup.c +@@ -2723,8 +2723,11 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, + "Region %x is secure\n", region.code); + +- if (region.code == FLT_REG_FW || +- region.code == FLT_REG_FW_SEC_27XX) { ++ switch (region.code) { ++ case FLT_REG_FW: ++ case FLT_REG_FW_SEC_27XX: ++ case FLT_REG_MPI_PRI_28XX: ++ case FLT_REG_MPI_SEC_28XX: + fw_array = dwptr; + + /* 1st fw array */ +@@ -2755,9 +2758,23 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, + buf_size_without_sfub += risc_size; + fw_array += risc_size; + } +- } else { +- ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff, +- "Secure region %x not supported\n", ++ break; ++ ++ case FLT_REG_PEP_PRI_28XX: ++ case FLT_REG_PEP_SEC_28XX: ++ fw_array = dwptr; ++ ++ /* 1st fw array */ ++ risc_size = be32_to_cpu(fw_array[3]); ++ risc_attr = be32_to_cpu(fw_array[9]); ++ ++ buf_size_without_sfub = risc_size; ++ fw_array += risc_size; ++ break; ++ ++ default: ++ ql_log(ql_log_warn + ql_dbg_verbose, vha, ++ 0xffff, "Secure region %x not supported\n", + region.code); + rval = QLA_COMMAND_ERROR; + goto done; +-- +2.13.6 + diff --git a/SOURCES/0155-scsi-scsi-qla2xxx-Fix-incorrect-SFUB-length-used-for.patch b/SOURCES/0155-scsi-scsi-qla2xxx-Fix-incorrect-SFUB-length-used-for.patch new file mode 100644 index 0000000..ff9b5bd --- /dev/null +++ b/SOURCES/0155-scsi-scsi-qla2xxx-Fix-incorrect-SFUB-length-used-for.patch @@ -0,0 +1,47 @@ +From 6931d007fcdf9d26ef886a316c43296143717ea9 Mon Sep 17 00:00:00 2001 +From: Himanshu Madhani +Date: Mon, 16 Dec 2019 17:58:33 -0500 +Subject: [PATCH 155/155] [scsi] scsi: qla2xxx: Fix incorrect SFUB length used + for Secure Flash Update MB Cmd + +Message-id: <20191216175833.14530-4-hmadhani@redhat.com> +Patchwork-id: 292029 +Patchwork-instance: patchwork +O-Subject: [RHEL 7.8 e-stor PATCH 3/3] scsi: qla2xxx: Fix incorrect SFUB length used for Secure Flash Update MB Cmd +Bugzilla: 1783016 +RH-Acked-by: Tony Camuso +RH-Acked-by: Ewan Milne +RH-Acked-by: Jarod Wilson + +From: Michael Hernandez + +Bugzilla 1783016 + +SFUB length should be in DWORDs when passed to FW. + +Fixes: 3f006ac342c03 ("scsi: qla2xxx: Secure flash update support for ISP28XX") +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20191203223657.22109-4-hmadhani@marvell.com +Signed-off-by: Michael Hernandez +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +(cherry picked from commit c868907e1ac6a08a17f8fa9ce482c0a496896e9e) +Signed-off-by: Himanshu Madhani +Signed-off-by: Jan Stancek +--- + drivers/scsi/qla2xxx/qla_sup.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/scsi/qla2xxx/qla_sup.c +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_sup.c 2019-12-20 19:07:21.283593212 +0100 ++++ src/drivers/scsi/qla2xxx/qla_sup.c 2019-12-20 19:07:21.297593089 +0100 +@@ -2895,7 +2895,7 @@ + "Sending Secure Flash MB Cmd\n"); + rval = qla28xx_secure_flash_update(vha, 0, region.code, + buf_size_without_sfub, sfub_dma, +- sizeof(struct secure_flash_update_block)); ++ sizeof(struct secure_flash_update_block) >> 2); + if (rval != QLA_SUCCESS) { + ql_log(ql_log_warn, vha, 0xffff, + "Secure Flash MB Cmd failed %x.", rval); diff --git a/SOURCES/9000-bump-kmod-version.patch b/SOURCES/9000-bump-kmod-version.patch new file mode 100644 index 0000000..9eeeba0 --- /dev/null +++ b/SOURCES/9000-bump-kmod-version.patch @@ -0,0 +1,13 @@ +Index: src/drivers/scsi/qla2xxx/qla_version.h +=================================================================== +--- src.orig/drivers/scsi/qla2xxx/qla_version.h 2019-12-20 19:08:10.355160324 +0100 ++++ src/drivers/scsi/qla2xxx/qla_version.h 2019-12-20 19:08:16.035110218 +0100 +@@ -7,7 +7,7 @@ + /* + * Driver version + */ +-#define QLA2XXX_VERSION "10.01.00.20.07.8-k" ++#define QLA2XXX_VERSION "10.01.00.20.07.8-k_dup7.7" + + #define QLA_DRIVER_MAJOR_VER 10 + #define QLA_DRIVER_MINOR_VER 1 diff --git a/SPECS/qla2xxx.spec b/SPECS/qla2xxx.spec new file mode 100644 index 0000000..9d71021 --- /dev/null +++ b/SPECS/qla2xxx.spec @@ -0,0 +1,589 @@ +%define kmod_name qla2xxx +%define kmod_vendor redhat +%define kmod_driver_version 10.01.00.20.07.8_k_dup7.7 +%define kmod_driver_epoch %{nil} +%define kmod_rpm_release 2 +%define kmod_kernel_version 3.10.0-1062.el7 +%define kmod_kernel_version_min %{nil} +%define kmod_kernel_version_dep %{nil} +%define kmod_kbuild_dir drivers/scsi/qla2xxx +%define kmod_dependencies %{nil} +%define kmod_dist_build_deps %{nil} +%define kmod_build_dependencies %{nil} +%define kmod_devel_package 1 +%define kmod_install_path extra/kmod-redhat-qla2xxx +%define kernel_pkg kernel +%define kernel_devel_pkg kernel-devel +%define kernel_modules_pkg kernel-modules + +%{!?dist: %define dist .el7_7} +%{!?make_build: %define make_build make} + +%if "%{kmod_kernel_version_dep}" == "" +%define kmod_kernel_version_dep %{kmod_kernel_version} +%endif + +%if "%{kmod_dist_build_deps}" == "" +%if (0%{?rhel} > 7) || (0%{?centos} > 7) +%define kmod_dist_build_deps redhat-rpm-config kernel-abi-whitelists elfutils-libelf-devel kernel-rpm-macros kmod +%else +%define kmod_dist_build_deps redhat-rpm-config kernel-abi-whitelists +%endif +%endif + +Source0: %{kmod_name}-%{kmod_vendor}-%{kmod_driver_version}.tar.bz2 +# Source code patches +Patch0: 0001-scsi-scsi-qla2xxx-Add-protection-mask-module-paramet.patch +Patch1: 0002-scsi-scsi-qla2xxx-Fix-DMA-error-when-the-DIF-sg-buff.patch +Patch2: 0003-scsi-scsi-qla2xxx-no-need-to-check-return-value-of-d.patch +Patch3: 0004-scsi-scsi-qla2xxx-Fix-N2N-target-discovery-with-Loca.patch +Patch4: 0005-scsi-scsi-qla2xxx-Change-default-ZIO-threshold.patch +Patch5: 0006-scsi-scsi-qla2xxx-Fix-session-cleanup-hang.patch +Patch6: 0007-scsi-scsi-qla2xxx-flush-IO-on-chip-reset-or-sess-del.patch +Patch7: 0008-scsi-scsi-qla2xxx-fix-fcport-null-pointer-access.patch +Patch8: 0009-scsi-scsi-qla2xxx-allow-session-delete-to-finish-bef.patch +Patch9: 0010-scsi-scsi-qla2xxx-Fix-SRB-allocation-flag-to-avoid-s.patch +Patch10: 0011-scsi-scsi-qla2xxx-Prevent-memory-leak-for-CT-req-rsp.patch +Patch11: 0012-scsi-scsi-qla2xxx-Restore-FAWWPN-of-Physical-Port-on.patch +Patch12: 0013-scsi-scsi-qla2xxx-Fix-fw-options-handle-eh_bus_reset.patch +Patch13: 0014-scsi-scsi-qla2xxx-Move-debug-messages-before-sending.patch +Patch14: 0015-scsi-scsi-qla2xxx-remove-redundant-null-check-on-poi.patch +Patch15: 0016-scsi-scsi-qla2xxx-Fix-LUN-discovery-if-loop-id-is-no.patch +Patch16: 0017-scsi-scsi-qla2xxx-Add-First-Burst-support-for-FC-NVM.patch +Patch17: 0018-scsi-scsi-qla2xxx-Fix-unload-when-NVMe-devices-are-c.patch +Patch18: 0019-scsi-scsi-qla2xxx-Check-for-FW-started-flag-before-a.patch +Patch19: 0020-scsi-scsi-qla2xxx-Prevent-multiple-ADISC-commands-pe.patch +Patch20: 0021-scsi-scsi-qla2xxx-Add-support-for-setting-port-speed.patch +Patch21: 0022-scsi-scsi-qla2xxx-Prevent-SysFS-access-when-chip-is-.patch +Patch22: 0023-scsi-scsi-qla2xxx-Move-marker-request-behind-QPair.patch +Patch23: 0024-scsi-scsi-qla2xxx-Fix-code-indentation-for-qla27xx_f.patch +Patch24: 0025-scsi-scsi-qla2xxx-Add-new-FW-dump-template-entry-typ.patch +Patch25: 0026-scsi-scsi-qla2xxx-Fix-panic-in-qla_dfs_tgt_counters_.patch +Patch26: 0027-scsi-scsi-qla2xxx-avoid-printf-format-warning.patch +Patch27: 0028-scsi-scsi-qla2xxx-check-for-kstrtol-failure.patch +Patch28: 0029-scsi-scsi-qla2xxx-Add-fw_attr-and-port_no-SysFS-node.patch +Patch29: 0030-scsi-scsi-qla2xxx-Remove-FW-default-template.patch +Patch30: 0031-scsi-scsi-qla2xxx-Fix-routine-qla27xx_dump_-mpi-ram.patch +Patch31: 0032-scsi-scsi-qla2xxx-Add-Device-ID-for-ISP28XX.patch +Patch32: 0033-scsi-scsi-qla2xxx-Add-Serdes-support-for-ISP28XX.patch +Patch33: 0034-scsi-scsi-qla2xxx-Correctly-report-max-min-supported.patch +Patch34: 0035-scsi-scsi-qla2xxx-Cleanups-for-NVRAM-Flash-read-writ.patch +Patch35: 0036-scsi-scsi-qla2xxx-Add-support-for-multiple-fwdump-te.patch +Patch36: 0037-scsi-scsi-qla2xxx-Update-flash-read-write-routine.patch +Patch37: 0038-scsi-scsi-qla2xxx-Correction-and-improvement-to-fwdt.patch +Patch38: 0039-scsi-scsi-qla2xxx-Simplification-of-register-address.patch +Patch39: 0040-scsi-scsi-qla2xxx-Add-28xx-flash-primary-secondary-s.patch +Patch40: 0041-scsi-scsi-qla2xxx-Secure-flash-update-support-for-IS.patch +Patch41: 0042-scsi-scsi-qla2xxx-Fix-a-small-typo-in-qla_bsg.c.patch +Patch42: 0043-scsi-scsi-qla2xxx-Simplify-conditional-check-again.patch +Patch43: 0044-scsi-scsi-qla2xxx-Set-the-SCSI-command-result-before.patch +Patch44: 0045-scsi-scsi-qla2xxx-Set-the-qpair-in-SRB-to-NULL-when-.patch +Patch45: 0046-scsi-scsi-qla2xxx-Reset-the-FCF_ASYNC_-SENT-ACTIVE-f.patch +Patch46: 0047-scsi-scsi-qla2xxx-Increase-the-max_sgl_segments-to-1.patch +Patch47: 0048-scsi-scsi-qla2xxx-Disable-T10-DIF-feature-with-FC-NV.patch +Patch48: 0049-scsi-scsi-qla2xxx-Fix-incorrect-region-size-setting-.patch +Patch49: 0050-scsi-scsi-qla2xxx-Further-limit-FLASH-region-write-a.patch +Patch50: 0051-scsi-scsi-qla2xxx-Fix-fw-dump-corruption.patch +Patch51: 0052-scsi-scsi-qla2xxx-Use-mutex-protection-during-qla2x0.patch +Patch52: 0053-scsi-scsi-qla2xxx-Cleanup-fcport-memory-to-prevent-l.patch +Patch53: 0054-scsi-scsi-qla2xxx-Set-remote-port-devloss-timeout-to.patch +Patch54: 0055-scsi-scsi-qla2xxx-Cleanup-redundant-qla2x00_abort_al.patch +Patch55: 0056-scsi-scsi-qla2xxx-Fix-driver-unload-when-FC-NVMe-LUN.patch +Patch56: 0057-scsi-scsi-qla2xxx-Remove-useless-set-memory-to-zero-.patch +Patch57: 0058-scsi-scsi-qla2xxx-fix-spelling-mistake-alredy-alread.patch +Patch58: 0059-scsi-scsi-qla2xxx-Remove-a-comment-that-refers-to-th.patch +Patch59: 0060-scsi-scsi-qla2xxx-Use-ARRAY_SIZE-in-the-definition-o.patch +Patch60: 0061-scsi-scsi-qla2xxx-Declare-local-symbols-static.patch +Patch61: 0062-scsi-scsi-qla2xxx-Make-qla2x00_process_response_queu.patch +Patch62: 0063-scsi-scsi-qla2xxx-Use-get-put_unaligned-where-approp.patch +Patch63: 0064-scsi-scsi-qla2xxx-Unregister-chrdev-if-module-initia.patch +Patch64: 0065-scsi-scsi-tcm_qla2xxx-Minimize-include-directives.patch +Patch65: 0066-scsi-scsi-qla2xxx-Fix-FC-AL-connection-target-discov.patch +Patch66: 0067-scsi-scsi-qla2xxx-Use-tabs-to-indent-code.patch +Patch67: 0068-scsi-scsi-qla2xxx-Leave-a-blank-line-after-declarati.patch +Patch68: 0069-scsi-scsi-qla2xxx-Fix-formatting-of-pointer-types.patch +Patch69: 0070-scsi-scsi-qla2xxx-Insert-spaces-where-required.patch +Patch70: 0071-scsi-scsi-qla2xxx-Move-the-port_state_strdefinition-.patch +Patch71: 0072-scsi-scsi-qla2xxx-Declare-qla24xx_build_scsi_crc_2_i.patch +Patch72: 0073-scsi-scsi-qla2xxx-Remove-qla_tgt_cmd.data_work-and-q.patch +Patch73: 0074-scsi-scsi-qla2xxx-Remove-two-superfluous-casts.patch +Patch74: 0075-scsi-scsi-qla2xxx-Move-qla2x00_set_fcport_state-from.patch +Patch75: 0076-scsi-scsi-qla2xxx-Fix-read-offset-in-qla24xx_load_ri.patch +Patch76: 0077-scsi-scsi-qla2xxx-Update-two-source-code-comments.patch +Patch77: 0078-scsi-scsi-qla2xxx-Fix-a-format-specifier.patch +Patch78: 0079-scsi-scsi-qla2xxx-Move-qla2x00_set_reserved_loop_ids.patch +Patch79: 0080-scsi-scsi-qla2xxx-Declare-qla2x00_find_new_loop_id-s.patch +Patch80: 0081-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch +Patch81: 0082-scsi-scsi-qla2xxx-Move-qla2x00_clear_loop_id-from-ql.patch +Patch82: 0083-scsi-scsi-qla2xxx-Move-qla2x00_is_reserved_id-from-q.patch +Patch83: 0084-scsi-scsi-qla2xxx-Remove-the-fcport-test-from-qla_nv.patch +Patch84: 0085-scsi-scsi-qla2xxx-NULL-check-before-some-freeing-fun.patch +Patch85: 0086-scsi-scsi-qla2xxx-Make-qla2x00_mem_free-easier-to-ve.patch +Patch86: 0087-scsi-scsi-qla2xxx-Avoid-that-qla2x00_mem_free-crashe.patch +Patch87: 0088-scsi-scsi-qla2xxx-Avoid-that-Coverity-complains-abou.patch +Patch88: 0089-scsi-scsi-qla2xxx-Log-the-status-code-if-a-firmware-.patch +Patch89: 0090-scsi-scsi-qla2xxx-Fix-a-qla24xx_enable_msix-error-pa.patch +Patch90: 0091-scsi-scsi-qla2xxx-Fix-use-after-free-issues-in-qla2x.patch +Patch91: 0092-scsi-scsi-qla2xxx-Pass-little-endian-values-to-the-f.patch +Patch92: 0093-scsi-scsi-qla2xxx-Check-the-size-of-firmware-data-st.patch +Patch93: 0094-scsi-scsi-qla2xxx-Use-an-on-stack-completion-in-qla2.patch +Patch94: 0095-scsi-scsi-qla2xxx-Remove-a-set-but-not-used-variable.patch +Patch95: 0096-scsi-scsi-qla2xxx-Split-the-__qla2x00_abort_all_cmds.patch +Patch96: 0097-scsi-scsi-qla2xxx-Fix-race-conditions-in-the-code-fo.patch +Patch97: 0098-scsi-scsi-qla2xxx-Complain-loudly-about-reference-co.patch +Patch98: 0099-scsi-scsi-qla2xxx-Avoid-that-qlt_send_resp_ctio-corr.patch +Patch99: 0100-scsi-scsi-qla2xxx-Fix-hardlockup-in-abort-command-du.patch +Patch100: 0101-scsi-scsi-qla2xxx-remove-double-assignment-in-qla2x0.patch +Patch101: 0102-scsi-scsi-qla2xxx-Fix-kernel-crash-after-disconnecti.patch +Patch102: 0103-scsi-scsi-qla2xxx-on-session-delete-return-nvme-cmd.patch +Patch103: 0104-scsi-scsi-qla2xxx-Fix-NVME-cmd-and-LS-cmd-timeout-ra.patch +Patch104: 0105-scsi-scsi-qla2xxx-move-IO-flush-to-the-front-of-NVME.patch +Patch105: 0106-scsi-scsi-qla2xxx-Remove-unnecessary-null-check.patch +Patch106: 0107-scsi-scsi-qla2xxx-Replace-vmalloc-memset-with-vzallo.patch +Patch107: 0108-scsi-scsi-qla2xxx-Fix-DMA-unmap-leak.patch +Patch108: 0109-scsi-scsi-qla2xxx-Fix-different-size-DMA-Alloc-Unmap.patch +Patch109: 0110-scsi-scsi-qla2xxx-Fix-abort-timeout-race-condition.patch +Patch110: 0111-scsi-scsi-qla2xxx-Allow-NVMe-IO-to-resume-with-short.patch +Patch111: 0112-scsi-scsi-qla2xxx-Fix-hang-in-fcport-delete-path.patch +Patch112: 0113-scsi-scsi-qla2xxx-Use-common-update-firmware-options.patch +Patch113: 0114-scsi-scsi-qla2xxx-Fix-NVMe-port-discovery-after-a-sh.patch +Patch114: 0115-scsi-scsi-qla2xxx-Correct-error-handling-during-init.patch +Patch115: 0116-scsi-scsi-qla2xxx-Fix-Relogin-to-prevent-modifying-s.patch +Patch116: 0117-scsi-scsi-qla2xxx-Reject-EH_-abort-device_reset-targ.patch +Patch117: 0118-scsi-qla2xxx-Update-driver-version-to-10.01.00.18.07.patch +Patch118: 0120-scsi-scsi-qla2xxx-qla2x00_alloc_fw_dump-set-ha-eft.patch +Patch119: 0121-scsi-scsi-qla2xxx-cleanup-trace-buffer-initializatio.patch +Patch120: 0122-scsi-scsi-qla2xxx-Fix-flash-read-for-Qlogic-ISPs.patch +Patch121: 0123-scsi-scsi-qla2xxx-Fix-driver-reload-for-ISP82xx.patch +Patch122: 0124-scsi-scsi-qla2xxx-Use-correct-size-in-call-to-dma_fr.patch +Patch123: 0125-scsi-scsi-qla2xxx-Initialized-mailbox-to-prevent-dri.patch +Patch124: 0126-scsi-scsi-qla2xxx-Fix-panic-from-use-after-free-in-q.patch +Patch125: 0127-scsi-scsi-qla2xxx-Fix-stuck-login-session.patch +Patch126: 0128-scsi-scsi-qla2xxx-Remove-a-superfluous-forward-decla.patch +Patch127: 0129-scsi-scsi-qla2xxx-Reduce-the-number-of-forward-decla.patch +Patch128: 0130-scsi-scsi-qla2xxx-Make-qla24xx_async_abort_cmd-stati.patch +Patch129: 0131-scsi-scsi-qla2xxx-Really-fix-qla2xxx_eh_abort.patch +Patch130: 0132-scsi-scsi-qla2xxx-Introduce-the-function-qla2xxx_ini.patch +Patch131: 0133-scsi-scsi-qla2xxx-Fix-a-race-condition-between-abort.patch +Patch132: 0134-scsi-scsi-qla2xxx-Fix-N2N-link-reset.patch +Patch133: 0135-scsi-scsi-qla2xxx-Fix-N2N-link-up-fail.patch +Patch134: 0136-scsi-scsi-qla2xxx-Use-tabs-instead-of-spaces-for-ind.patch +Patch135: 0137-scsi-scsi-qla2xxx-Dual-FCP-NVMe-target-port-support.patch +Patch136: 0138-scsi-scsi-qla2xxx-Inline-the-qla2x00_fcport_event_ha.patch +Patch137: 0139-scsi-scsi-qla2xxx-Add-error-handling-for-PLOGI-ELS-p.patch +Patch138: 0140-scsi-scsi-qla2xxx-Retry-PLOGI-on-FC-NVMe-PRLI-failur.patch +Patch139: 0141-scsi-scsi-qla2xxx-Do-command-completion-on-abort-tim.patch +Patch140: 0142-scsi-scsi-qla2xxx-Uninline-qla2x00_init_timer.patch +Patch141: 0143-scsi-scsi-qla2xxx-Fix-premature-timer-expiration.patch +Patch142: 0144-scsi-scsi-qla2xxx-Fix-SRB-leak-on-switch-command-tim.patch +Patch143: 0145-scsi-scsi-qla2xxx-Fix-driver-unload-hang.patch +Patch144: 0146-scsi-scsi-qla2xxx-Make-qla2x00_abort_srb-again-decre.patch +Patch145: 0147-scsi-scsi-qla2xxx-Fix-double-scsi_done-for-abort-pat.patch +Patch146: 0148-scsi-scsi-qla2xxx-Fix-a-NULL-pointer-dereference.patch +Patch147: 0149-scsi-scsi-qla2xxx-Fix-device-connect-issues-in-P2P-c.patch +Patch148: 0150-scsi-scsi-qla2xxx-Fix-partial-flash-write-of-MBI.patch +Patch149: 0151-scsi-qla2xxx-Update-driver-version.patch +Patch150: 0153-scsi-scsi-qla2xxx-Correctly-retrieve-and-interpret-a.patch +Patch151: 0154-scsi-scsi-qla2xxx-Added-support-for-MPI-and-PEP-regi.patch +Patch152: 0155-scsi-scsi-qla2xxx-Fix-incorrect-SFUB-length-used-for.patch +Patch153: 9000-bump-kmod-version.patch + +%define findpat %( echo "%""P" ) +%define __find_requires /usr/lib/rpm/redhat/find-requires.ksyms +%define __find_provides /usr/lib/rpm/redhat/find-provides.ksyms %{kmod_name} %{?epoch:%{epoch}:}%{version}-%{release} +%define sbindir %( if [ -d "/sbin" -a \! -h "/sbin" ]; then echo "/sbin"; else echo %{_sbindir}; fi ) +%define dup_state_dir %{_localstatedir}/lib/rpm-state/kmod-dups +%define kver_state_dir %{dup_state_dir}/kver +%define kver_state_file %{kver_state_dir}/%{kmod_kernel_version}.%(arch) +%define dup_module_list %{dup_state_dir}/rpm-kmod-%{kmod_name}-modules + +Name: kmod-redhat-qla2xxx +Version: %{kmod_driver_version} +Release: %{kmod_rpm_release}%{?dist} +%if "%{kmod_driver_epoch}" != "" +Epoch: %{kmod_driver_epoch} +%endif +Summary: qla2xxx kernel module for Driver Update Program +Group: System/Kernel +License: GPLv2 +URL: https://www.kernel.org/ +BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) +BuildRequires: %kernel_devel_pkg = %kmod_kernel_version +%if "%{kmod_dist_build_deps}" != "" +BuildRequires: %{kmod_dist_build_deps} +%endif +ExclusiveArch: x86_64 +%global kernel_source() /usr/src/kernels/%{kmod_kernel_version}.$(arch) + +%global _use_internal_dependency_generator 0 +%if "%{?kmod_kernel_version_min}" != "" +Provides: %kernel_modules_pkg >= %{kmod_kernel_version_min}.%{_target_cpu} +%else +Provides: %kernel_modules_pkg = %{kmod_kernel_version_dep}.%{_target_cpu} +%endif +Provides: kmod-%{kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires(post): %{sbindir}/weak-modules +Requires(postun): %{sbindir}/weak-modules +Requires: kernel >= 3.10.0-1062.el7 + +Requires: kernel < 3.10.0-1063.el7 +%if 0 +Requires: firmware(%{kmod_name}) = ENTER_FIRMWARE_VERSION +%endif +%if "%{kmod_build_dependencies}" != "" +BuildRequires: %{kmod_build_dependencies} +%endif +%if "%{kmod_dependencies}" != "" +Requires: %{kmod_dependencies} +%endif +# if there are multiple kmods for the same driver from different vendors, +# they should conflict with each other. +Conflicts: kmod-%{kmod_name} + +%description +qla2xxx kernel module for Driver Update Program + +%if 0 + +%package -n kmod-redhat-qla2xxx-firmware +Version: ENTER_FIRMWARE_VERSION +Summary: qla2xxx firmware for Driver Update Program +Provides: firmware(%{kmod_name}) = ENTER_FIRMWARE_VERSION +%if "%{kmod_kernel_version_min}" != "" +Provides: %kernel_modules_pkg >= %{kmod_kernel_version_min}.%{_target_cpu} +%else +Provides: %kernel_modules_pkg = %{kmod_kernel_version_dep}.%{_target_cpu} +%endif +%description -n kmod-redhat-qla2xxx-firmware +qla2xxx firmware for Driver Update Program + + +%files -n kmod-redhat-qla2xxx-firmware +%defattr(644,root,root,755) +%{FIRMWARE_FILES} + +%endif + +# Development package +%if 0%{kmod_devel_package} +%package -n kmod-redhat-qla2xxx-devel +Version: %{kmod_driver_version} +Requires: kernel >= 3.10.0-1062.el7 + +Requires: kernel < 3.10.0-1063.el7 +Summary: qla2xxx development files for Driver Update Program + +%description -n kmod-redhat-qla2xxx-devel +qla2xxx development files for Driver Update Program + + +%files -n kmod-redhat-qla2xxx-devel +%defattr(644,root,root,755) +/usr/share/kmod-%{kmod_vendor}-%{kmod_name}/Module.symvers +%endif + +%post +modules=( $(find /lib/modules/%{kmod_kernel_version}.%(arch)/%{kmod_install_path} | grep '\.ko$') ) +printf '%s\n' "${modules[@]}" | %{sbindir}/weak-modules --add-modules --no-initramfs + +mkdir -p "%{kver_state_dir}" +touch "%{kver_state_file}" + +exit 0 + +%posttrans +# We have to re-implement part of weak-modules here because it doesn't allow +# calling initramfs regeneration separately +if [ -f "%{kver_state_file}" ]; then + kver_base="%{kmod_kernel_version_dep}" + kvers=$(ls -d "/lib/modules/${kver_base%%.*}"*) + + for k_dir in $kvers; do + k="${k_dir#/lib/modules/}" + + tmp_initramfs="/boot/initramfs-$k.tmp" + dst_initramfs="/boot/initramfs-$k.img" + + # The same check as in weak-modules: we assume that the kernel present + # if the symvers file exists. + if [ -e "/boot/symvers-$k.gz" ]; then + /usr/bin/dracut -f "$tmp_initramfs" "$k" || exit 1 + cmp -s "$tmp_initramfs" "$dst_initramfs" + if [ "$?" = 1 ]; then + mv "$tmp_initramfs" "$dst_initramfs" + else + rm -f "$tmp_initramfs" + fi + fi + done + + rm -f "%{kver_state_file}" + rmdir "%{kver_state_dir}" 2> /dev/null +fi + +rmdir "%{dup_state_dir}" 2> /dev/null + +exit 0 + +%preun +if rpm -q --filetriggers kmod 2> /dev/null| grep -q "Trigger for weak-modules call on kmod removal"; then + mkdir -p "%{kver_state_dir}" + touch "%{kver_state_file}" +fi + +mkdir -p "%{dup_state_dir}" +rpm -ql kmod-redhat-qla2xxx-%{kmod_driver_version}-%{kmod_rpm_release}%{?dist}.$(arch) | \ + grep '\.ko$' > "%{dup_module_list}" + +%postun +if rpm -q --filetriggers kmod 2> /dev/null| grep -q "Trigger for weak-modules call on kmod removal"; then + initramfs_opt="--no-initramfs" +else + initramfs_opt="" +fi + +modules=( $(cat "%{dup_module_list}") ) +rm -f "%{dup_module_list}" +printf '%s\n' "${modules[@]}" | %{sbindir}/weak-modules --remove-modules $initramfs_opt + +rmdir "%{dup_state_dir}" 2> /dev/null + +exit 0 + +%files +%defattr(644,root,root,755) +/lib/modules/%{kmod_kernel_version}.%(arch) +/etc/depmod.d/%{kmod_name}.conf +/usr/share/doc/kmod-%{kmod_name}/greylist.txt + +%prep +%setup -n %{kmod_name}-%{kmod_vendor}-%{kmod_driver_version} + +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch30 -p1 +%patch31 -p1 +%patch32 -p1 +%patch33 -p1 +%patch34 -p1 +%patch35 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 +%patch39 -p1 +%patch40 -p1 +%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 +%patch46 -p1 +%patch47 -p1 +%patch48 -p1 +%patch49 -p1 +%patch50 -p1 +%patch51 -p1 +%patch52 -p1 +%patch53 -p1 +%patch54 -p1 +%patch55 -p1 +%patch56 -p1 +%patch57 -p1 +%patch58 -p1 +%patch59 -p1 +%patch60 -p1 +%patch61 -p1 +%patch62 -p1 +%patch63 -p1 +%patch64 -p1 +%patch65 -p1 +%patch66 -p1 +%patch67 -p1 +%patch68 -p1 +%patch69 -p1 +%patch70 -p1 +%patch71 -p1 +%patch72 -p1 +%patch73 -p1 +%patch74 -p1 +%patch75 -p1 +%patch76 -p1 +%patch77 -p1 +%patch78 -p1 +%patch79 -p1 +%patch80 -p1 +%patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +%patch93 -p1 +%patch94 -p1 +%patch95 -p1 +%patch96 -p1 +%patch97 -p1 +%patch98 -p1 +%patch99 -p1 +%patch100 -p1 +%patch101 -p1 +%patch102 -p1 +%patch103 -p1 +%patch104 -p1 +%patch105 -p1 +%patch106 -p1 +%patch107 -p1 +%patch108 -p1 +%patch109 -p1 +%patch110 -p1 +%patch111 -p1 +%patch112 -p1 +%patch113 -p1 +%patch114 -p1 +%patch115 -p1 +%patch116 -p1 +%patch117 -p1 +%patch118 -p1 +%patch119 -p1 +%patch120 -p1 +%patch121 -p1 +%patch122 -p1 +%patch123 -p1 +%patch124 -p1 +%patch125 -p1 +%patch126 -p1 +%patch127 -p1 +%patch128 -p1 +%patch129 -p1 +%patch130 -p1 +%patch131 -p1 +%patch132 -p1 +%patch133 -p1 +%patch134 -p1 +%patch135 -p1 +%patch136 -p1 +%patch137 -p1 +%patch138 -p1 +%patch139 -p1 +%patch140 -p1 +%patch141 -p1 +%patch142 -p1 +%patch143 -p1 +%patch144 -p1 +%patch145 -p1 +%patch146 -p1 +%patch147 -p1 +%patch148 -p1 +%patch149 -p1 +%patch150 -p1 +%patch151 -p1 +%patch152 -p1 +%patch153 -p1 +set -- * +mkdir source +mv "$@" source/ +mkdir obj + +%build +rm -rf obj +cp -r source obj + +PWD_PATH="$PWD" +%if "%{workaround_no_pwd_rel_path}" != "1" +PWD_PATH=$(realpath --relative-to="%{kernel_source}" . 2>/dev/null || echo "$PWD") +%endif +%{make_build} -C %{kernel_source} V=1 M="$PWD_PATH/obj/%{kmod_kbuild_dir}" \ + NOSTDINC_FLAGS="-I$PWD_PATH/obj/include -I$PWD_PATH/obj/include/uapi" \ + EXTRA_CFLAGS="%{nil}" \ + %{nil} +# mark modules executable so that strip-to-file can strip them +find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -exec chmod u+x '{}' + + +whitelist="/lib/modules/kabi-current/kabi_whitelist_%{_target_cpu}" +for modules in $( find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -printf "%{findpat}\n" | sed 's|\.ko$||' | sort -u ) ; do + # update depmod.conf + module_weak_path=$(echo "$modules" | sed 's/[\/]*[^\/]*$//') + if [ -z "$module_weak_path" ]; then + module_weak_path=%{name} + else + module_weak_path=%{name}/$module_weak_path + fi + echo "override $(echo $modules | sed 's/.*\///')" \ + "$(echo "%{kmod_kernel_version_dep}" | + sed 's/\.[^\.]*$//; + s/\([.+?^$\/\\|()\[]\|\]\)/\\\0/g').*" \ + "weak-updates/$module_weak_path" >> source/depmod.conf + + # update greylist + nm -u obj/%{kmod_kbuild_dir}/$modules.ko | sed 's/.*U //' | sed 's/^\.//' | sort -u | while read -r symbol; do + grep -q "^\s*$symbol\$" $whitelist || echo "$symbol" >> source/greylist + done +done +sort -u source/greylist | uniq > source/greylist.txt + +%install +export INSTALL_MOD_PATH=$RPM_BUILD_ROOT +export INSTALL_MOD_DIR=%{kmod_install_path} +PWD_PATH="$PWD" +%if "%{workaround_no_pwd_rel_path}" != "1" +PWD_PATH=$(realpath --relative-to="%{kernel_source}" . 2>/dev/null || echo "$PWD") +%endif +make -C %{kernel_source} modules_install \ + M=$PWD_PATH/obj/%{kmod_kbuild_dir} +# Cleanup unnecessary kernel-generated module dependency files. +find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \; + +install -m 644 -D source/depmod.conf $RPM_BUILD_ROOT/etc/depmod.d/%{kmod_name}.conf +install -m 644 -D source/greylist.txt $RPM_BUILD_ROOT/usr/share/doc/kmod-%{kmod_name}/greylist.txt +%if 0 +%{FIRMWARE_FILES_INSTALL} +%endif +%if 0%{kmod_devel_package} +install -m 644 -D $PWD/obj/%{kmod_kbuild_dir}/Module.symvers $RPM_BUILD_ROOT/usr/share/kmod-%{kmod_vendor}-%{kmod_name}/Module.symvers +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%changelog +* Tue Jan 07 2020 Eugene Syromiatnikov 10.01.00.20.07.8_k_dup7.7-2 +- Rebuild due to issues with brew environment + +* Mon Jan 06 2020 Eugene Syromiatnikov 10.01.00.20.07.8_k_dup7.7-1 +- c45db7d2f34d6fad924c20443f73147dca7f6e29 +- qla2xxx kernel module for Driver Update Program +- Resolves: #bz1784769