The driver is very sloppy about the WQE structure passed between
routines. The base struct type is a 64byte wqe. But in many routines
they typecast and access 128byte wqes. There were a couple of cases
in the past (corrected already) where the typecasts were incorrectly
done and the 64byte buffer was accessed as a 128 byte buffer.

Clean this up by properly declaring wqe's as 128byte wqe's and removing
the typecasts. 64byte wqes are considered a subset of the 128byte wqes.

Signed-off-by: Dick Kennedy <dick.kenn...@broadcom.com>
Signed-off-by: James Smart <james.sm...@broadcom.com>
---
 drivers/scsi/lpfc/lpfc_hw4.h   | 11 +++++--
 drivers/scsi/lpfc/lpfc_nvme.c  | 25 +++++++-------
 drivers/scsi/lpfc/lpfc_nvmet.c | 12 +++----
 drivers/scsi/lpfc/lpfc_sli.c   | 74 ++++++++++++++++++------------------------
 drivers/scsi/lpfc/lpfc_sli.h   |  5 ++-
 5 files changed, 61 insertions(+), 66 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index 37c547b4bc78..a2f372d14eaa 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -4601,11 +4601,18 @@ union lpfc_wqe128 {
        struct fcp_icmnd64_wqe fcp_icmd;
        struct fcp_iread64_wqe fcp_iread;
        struct fcp_iwrite64_wqe fcp_iwrite;
+       struct abort_cmd_wqe abort_cmd;
+       struct create_xri_wqe create_xri;
+       struct xmit_bcast64_wqe xmit_bcast64;
+       struct xmit_seq64_wqe xmit_sequence;
+       struct xmit_bls_rsp64_wqe xmit_bls_rsp;
+       struct xmit_els_rsp64_wqe xmit_els_rsp;
+       struct els_request64_wqe els_req;
+       struct gen_req64_wqe gen_req;
        struct fcp_trsp64_wqe fcp_trsp;
        struct fcp_tsend64_wqe fcp_tsend;
        struct fcp_treceive64_wqe fcp_treceive;
-       struct xmit_seq64_wqe xmit_sequence;
-       struct gen_req64_wqe gen_req;
+       struct send_frame_wqe send_frame;
 };
 
 struct lpfc_grp_hdr {
diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c
index 6ea6cc372647..6d215f27448f 100644
--- a/drivers/scsi/lpfc/lpfc_nvme.c
+++ b/drivers/scsi/lpfc/lpfc_nvme.c
@@ -275,14 +275,14 @@ lpfc_nvme_cmpl_gen_req(struct lpfc_hba *phba, struct 
lpfc_iocbq *cmdwqe,
 static int
 lpfc_nvme_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
                  struct lpfc_dmabuf *inp,
-                struct nvmefc_ls_req *pnvme_lsreq,
-            void (*cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
-                          struct lpfc_wcqe_complete *),
-            struct lpfc_nodelist *ndlp, uint32_t num_entry,
-            uint32_t tmo, uint8_t retry)
+                 struct nvmefc_ls_req *pnvme_lsreq,
+                 void (*cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
+                              struct lpfc_wcqe_complete *),
+                 struct lpfc_nodelist *ndlp, uint32_t num_entry,
+                 uint32_t tmo, uint8_t retry)
 {
-       struct lpfc_hba  *phba = vport->phba;
-       union lpfc_wqe *wqe;
+       struct lpfc_hba *phba = vport->phba;
+       union lpfc_wqe128 *wqe;
        struct lpfc_iocbq *genwqe;
        struct ulp_bde64 *bpl;
        struct ulp_bde64 bde;
@@ -628,8 +628,7 @@ lpfc_nvme_adj_fcp_sgls(struct lpfc_vport *vport,
         * the dma address.
         */
 
-       /* 128 byte wqe support here */
-       wqe = (union lpfc_wqe128 *)&lpfc_ncmd->cur_iocbq.wqe;
+       wqe = &lpfc_ncmd->cur_iocbq.wqe;
 
        /*
         * Adjust the FCP_CMD and FCP_RSP DMA data and sge_len to
@@ -1048,7 +1047,7 @@ lpfc_nvme_prep_io_cmd(struct lpfc_vport *vport,
        struct lpfc_hba *phba = vport->phba;
        struct nvmefc_fcp_req *nCmd = lpfc_ncmd->nvmeCmd;
        struct lpfc_iocbq *pwqeq = &(lpfc_ncmd->cur_iocbq);
-       union lpfc_wqe128 *wqe = (union lpfc_wqe128 *)&pwqeq->wqe;
+       union lpfc_wqe128 *wqe = &pwqeq->wqe;
        uint32_t req_len;
 
        if (!pnode || !NLP_CHK_NODE_ACT(pnode))
@@ -1187,7 +1186,7 @@ lpfc_nvme_prep_io_dma(struct lpfc_vport *vport,
 {
        struct lpfc_hba *phba = vport->phba;
        struct nvmefc_fcp_req *nCmd = lpfc_ncmd->nvmeCmd;
-       union lpfc_wqe128 *wqe = (union lpfc_wqe128 *)&lpfc_ncmd->cur_iocbq.wqe;
+       union lpfc_wqe128 *wqe = &lpfc_ncmd->cur_iocbq.wqe;
        struct sli4_sge *sgl = lpfc_ncmd->nvme_sgl;
        struct scatterlist *data_sg;
        struct sli4_sge *first_data_sgl;
@@ -1595,7 +1594,7 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port 
*pnvme_lport,
        struct lpfc_iocbq *abts_buf;
        struct lpfc_iocbq *nvmereq_wqe;
        struct lpfc_nvme_fcpreq_priv *freqpriv;
-       union lpfc_wqe *abts_wqe;
+       union lpfc_wqe128 *abts_wqe;
        unsigned long flags;
        int ret_val;
 
@@ -2139,7 +2138,7 @@ lpfc_new_nvme_buf(struct lpfc_vport *vport, int 
num_to_alloc)
                        break;
                }
                pwqeq = &(lpfc_ncmd->cur_iocbq);
-               wqe = (union lpfc_wqe128 *)&pwqeq->wqe;
+               wqe = &pwqeq->wqe;
 
                /* Allocate iotag for lpfc_ncmd->cur_iocbq. */
                iotag = lpfc_sli_next_iotag(phba, pwqeq);
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index a4a32d7ec248..a17583ce1b06 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -1150,7 +1150,7 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba)
                }
                ctx_buf->iocbq->iocb_flag = LPFC_IO_NVMET;
                nvmewqe = ctx_buf->iocbq;
-               wqe = (union lpfc_wqe128 *)&nvmewqe->wqe;
+               wqe = &nvmewqe->wqe;
                /* Initialize WQE */
                memset(wqe, 0, sizeof(union lpfc_wqe));
                /* Word 7 */
@@ -2024,7 +2024,7 @@ lpfc_nvmet_prep_ls_wqe(struct lpfc_hba *phba,
 {
        struct lpfc_nodelist *ndlp;
        struct lpfc_iocbq *nvmewqe;
-       union lpfc_wqe *wqe;
+       union lpfc_wqe128 *wqe;
 
        if (!lpfc_is_link_up(phba)) {
                lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
@@ -2207,7 +2207,7 @@ lpfc_nvmet_prep_fcp_wqe(struct lpfc_hba *phba,
        if (((ctxp->state == LPFC_NVMET_STE_RCV) &&
            (ctxp->entry_cnt == 1)) ||
            (ctxp->state == LPFC_NVMET_STE_DATA)) {
-               wqe = (union lpfc_wqe128 *)&nvmewqe->wqe;
+               wqe = &nvmewqe->wqe;
        } else {
                lpfc_printf_log(phba, KERN_ERR, LOG_NVME_IOERR,
                                "6111 Wrong state NVMET FCP: %d  cnt %d\n",
@@ -2749,7 +2749,7 @@ lpfc_nvmet_unsol_issue_abort(struct lpfc_hba *phba,
 {
        struct lpfc_nvmet_tgtport *tgtp;
        struct lpfc_iocbq *abts_wqeq;
-       union lpfc_wqe *wqe_abts;
+       union lpfc_wqe128 *wqe_abts;
        struct lpfc_nodelist *ndlp;
 
        lpfc_printf_log(phba, KERN_INFO, LOG_NVME_ABTS,
@@ -2844,7 +2844,7 @@ lpfc_nvmet_sol_fcp_issue_abort(struct lpfc_hba *phba,
 {
        struct lpfc_nvmet_tgtport *tgtp;
        struct lpfc_iocbq *abts_wqeq;
-       union lpfc_wqe *abts_wqe;
+       union lpfc_wqe128 *abts_wqe;
        struct lpfc_nodelist *ndlp;
        unsigned long flags;
        int rc;
@@ -3034,7 +3034,7 @@ lpfc_nvmet_unsol_ls_issue_abort(struct lpfc_hba *phba,
 {
        struct lpfc_nvmet_tgtport *tgtp;
        struct lpfc_iocbq *abts_wqeq;
-       union lpfc_wqe *wqe_abts;
+       union lpfc_wqe128 *wqe_abts;
        unsigned long flags;
        int rc;
 
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index d20cf51ca15d..7999a40e1370 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -109,7 +109,7 @@ lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq)
  * The caller is expected to hold the hbalock when calling this routine.
  **/
 static int
-lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe)
+lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe128 *wqe)
 {
        union lpfc_wqe *temp_wqe;
        struct lpfc_register doorbell;
@@ -8881,7 +8881,7 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct 
lpfc_iocbq *piocbq,
  **/
 static int
 lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
-               union lpfc_wqe *wqe)
+               union lpfc_wqe128 *wqe)
 {
        uint32_t xmit_len = 0, total_len = 0;
        uint8_t ct = 0;
@@ -9096,29 +9096,27 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct 
lpfc_iocbq *iocbq,
                if (phba->fcp_embed_io) {
                        struct lpfc_scsi_buf *lpfc_cmd;
                        struct sli4_sge *sgl;
-                       union lpfc_wqe128 *wqe128;
                        struct fcp_cmnd *fcp_cmnd;
                        uint32_t *ptr;
 
                        /* 128 byte wqe support here */
-                       wqe128 = (union lpfc_wqe128 *)wqe;
 
                        lpfc_cmd = iocbq->context1;
                        sgl = (struct sli4_sge *)lpfc_cmd->fcp_bpl;
                        fcp_cmnd = lpfc_cmd->fcp_cmnd;
 
                        /* Word 0-2 - FCP_CMND */
-                       wqe128->generic.bde.tus.f.bdeFlags =
+                       wqe->generic.bde.tus.f.bdeFlags =
                                BUFF_TYPE_BDE_IMMED;
-                       wqe128->generic.bde.tus.f.bdeSize = sgl->sge_len;
-                       wqe128->generic.bde.addrHigh = 0;
-                       wqe128->generic.bde.addrLow =  88;  /* Word 22 */
+                       wqe->generic.bde.tus.f.bdeSize = sgl->sge_len;
+                       wqe->generic.bde.addrHigh = 0;
+                       wqe->generic.bde.addrLow =  88;  /* Word 22 */
 
-                       bf_set(wqe_wqes, &wqe128->fcp_iwrite.wqe_com, 1);
-                       bf_set(wqe_dbde, &wqe128->fcp_iwrite.wqe_com, 0);
+                       bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1);
+                       bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 0);
 
                        /* Word 22-29  FCP CMND Payload */
-                       ptr = &wqe128->words[22];
+                       ptr = &wqe->words[22];
                        memcpy(ptr, fcp_cmnd, sizeof(struct fcp_cmnd));
                }
                break;
@@ -9162,29 +9160,27 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct 
lpfc_iocbq *iocbq,
                if (phba->fcp_embed_io) {
                        struct lpfc_scsi_buf *lpfc_cmd;
                        struct sli4_sge *sgl;
-                       union lpfc_wqe128 *wqe128;
                        struct fcp_cmnd *fcp_cmnd;
                        uint32_t *ptr;
 
                        /* 128 byte wqe support here */
-                       wqe128 = (union lpfc_wqe128 *)wqe;
 
                        lpfc_cmd = iocbq->context1;
                        sgl = (struct sli4_sge *)lpfc_cmd->fcp_bpl;
                        fcp_cmnd = lpfc_cmd->fcp_cmnd;
 
                        /* Word 0-2 - FCP_CMND */
-                       wqe128->generic.bde.tus.f.bdeFlags =
+                       wqe->generic.bde.tus.f.bdeFlags =
                                BUFF_TYPE_BDE_IMMED;
-                       wqe128->generic.bde.tus.f.bdeSize = sgl->sge_len;
-                       wqe128->generic.bde.addrHigh = 0;
-                       wqe128->generic.bde.addrLow =  88;  /* Word 22 */
+                       wqe->generic.bde.tus.f.bdeSize = sgl->sge_len;
+                       wqe->generic.bde.addrHigh = 0;
+                       wqe->generic.bde.addrLow =  88;  /* Word 22 */
 
-                       bf_set(wqe_wqes, &wqe128->fcp_iread.wqe_com, 1);
-                       bf_set(wqe_dbde, &wqe128->fcp_iread.wqe_com, 0);
+                       bf_set(wqe_wqes, &wqe->fcp_iread.wqe_com, 1);
+                       bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 0);
 
                        /* Word 22-29  FCP CMND Payload */
-                       ptr = &wqe128->words[22];
+                       ptr = &wqe->words[22];
                        memcpy(ptr, fcp_cmnd, sizeof(struct fcp_cmnd));
                }
                break;
@@ -9221,29 +9217,27 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct 
lpfc_iocbq *iocbq,
                if (phba->fcp_embed_io) {
                        struct lpfc_scsi_buf *lpfc_cmd;
                        struct sli4_sge *sgl;
-                       union lpfc_wqe128 *wqe128;
                        struct fcp_cmnd *fcp_cmnd;
                        uint32_t *ptr;
 
                        /* 128 byte wqe support here */
-                       wqe128 = (union lpfc_wqe128 *)wqe;
 
                        lpfc_cmd = iocbq->context1;
                        sgl = (struct sli4_sge *)lpfc_cmd->fcp_bpl;
                        fcp_cmnd = lpfc_cmd->fcp_cmnd;
 
                        /* Word 0-2 - FCP_CMND */
-                       wqe128->generic.bde.tus.f.bdeFlags =
+                       wqe->generic.bde.tus.f.bdeFlags =
                                BUFF_TYPE_BDE_IMMED;
-                       wqe128->generic.bde.tus.f.bdeSize = sgl->sge_len;
-                       wqe128->generic.bde.addrHigh = 0;
-                       wqe128->generic.bde.addrLow =  88;  /* Word 22 */
+                       wqe->generic.bde.tus.f.bdeSize = sgl->sge_len;
+                       wqe->generic.bde.addrHigh = 0;
+                       wqe->generic.bde.addrLow =  88;  /* Word 22 */
 
-                       bf_set(wqe_wqes, &wqe128->fcp_icmd.wqe_com, 1);
-                       bf_set(wqe_dbde, &wqe128->fcp_icmd.wqe_com, 0);
+                       bf_set(wqe_wqes, &wqe->fcp_icmd.wqe_com, 1);
+                       bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 0);
 
                        /* Word 22-29  FCP CMND Payload */
-                       ptr = &wqe128->words[22];
+                       ptr = &wqe->words[22];
                        memcpy(ptr, fcp_cmnd, sizeof(struct fcp_cmnd));
                }
                break;
@@ -9481,8 +9475,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t 
ring_number,
                         struct lpfc_iocbq *piocb, uint32_t flag)
 {
        struct lpfc_sglq *sglq;
-       union lpfc_wqe *wqe;
-       union lpfc_wqe128 wqe128;
+       union lpfc_wqe128 wqe;
        struct lpfc_queue *wq;
        struct lpfc_sli_ring *pring;
 
@@ -9502,9 +9495,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t 
ring_number,
 
        /*
         * The WQE can be either 64 or 128 bytes,
-        * so allocate space on the stack assuming the largest.
         */
-       wqe = (union lpfc_wqe *)&wqe128;
 
        lockdep_assert_held(&phba->hbalock);
 
@@ -9554,10 +9545,10 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, 
uint32_t ring_number,
                        return IOCB_ERROR;
        }
 
-       if (lpfc_sli4_iocb2wqe(phba, piocb, wqe))
+       if (lpfc_sli4_iocb2wqe(phba, piocb, &wqe))
                return IOCB_ERROR;
 
-       if (lpfc_sli4_wq_put(wq, wqe))
+       if (lpfc_sli4_wq_put(wq, &wqe))
                return IOCB_ERROR;
        lpfc_sli_ringtxcmpl_put(phba, pring, piocb);
 
@@ -10927,7 +10918,7 @@ lpfc_sli4_abort_nvme_io(struct lpfc_hba *phba, struct 
lpfc_sli_ring *pring,
 {
        struct lpfc_vport *vport = cmdiocb->vport;
        struct lpfc_iocbq *abtsiocbp;
-       union lpfc_wqe *abts_wqe;
+       union lpfc_wqe128 *abts_wqe;
        int retval;
 
        /*
@@ -19048,8 +19039,7 @@ lpfc_drain_txq(struct lpfc_hba *phba)
        unsigned long iflags = 0;
        char *fail_msg = NULL;
        struct lpfc_sglq *sglq;
-       union lpfc_wqe128 wqe128;
-       union lpfc_wqe *wqe = (union lpfc_wqe *) &wqe128;
+       union lpfc_wqe128 wqe;
        uint32_t txq_cnt = 0;
 
        pring = lpfc_phba_elsring(phba);
@@ -19092,9 +19082,9 @@ lpfc_drain_txq(struct lpfc_hba *phba)
                piocbq->sli4_xritag = sglq->sli4_xritag;
                if (NO_XRI == lpfc_sli4_bpl2sgl(phba, piocbq, sglq))
                        fail_msg = "to convert bpl to sgl";
-               else if (lpfc_sli4_iocb2wqe(phba, piocbq, wqe))
+               else if (lpfc_sli4_iocb2wqe(phba, piocbq, &wqe))
                        fail_msg = "to convert iocb to wqe";
-               else if (lpfc_sli4_wq_put(phba->sli4_hba.els_wq, wqe))
+               else if (lpfc_sli4_wq_put(phba->sli4_hba.els_wq, &wqe))
                        fail_msg = " - Wq is full";
                else
                        lpfc_sli_ringtxcmpl_put(phba, pring, piocbq);
@@ -19144,7 +19134,7 @@ lpfc_wqe_bpl2sgl(struct lpfc_hba *phba, struct 
lpfc_iocbq *pwqeq,
        struct ulp_bde64 bde;
        struct sli4_sge *sgl  = NULL;
        struct lpfc_dmabuf *dmabuf;
-       union lpfc_wqe *wqe;
+       union lpfc_wqe128 *wqe;
        int numBdes = 0;
        int i = 0;
        uint32_t offset = 0; /* accumulated offset in the sg request list */
@@ -19253,7 +19243,7 @@ int
 lpfc_sli4_issue_wqe(struct lpfc_hba *phba, uint32_t ring_number,
                    struct lpfc_iocbq *pwqe)
 {
-       union lpfc_wqe *wqe = &pwqe->wqe;
+       union lpfc_wqe128 *wqe = &pwqe->wqe;
        struct lpfc_nvmet_rcv_ctx *ctxp;
        struct lpfc_queue *wq;
        struct lpfc_sglq *sglq;
diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h
index a3b1b5145d2b..ad7b2e0a2018 100644
--- a/drivers/scsi/lpfc/lpfc_sli.h
+++ b/drivers/scsi/lpfc/lpfc_sli.h
@@ -61,9 +61,8 @@ struct lpfc_iocbq {
        struct lpfc_wcqe_complete wcqe_cmpl;    /* WQE cmpl */
        uint64_t isr_timestamp;
 
-       /* Be careful here */
-       union lpfc_wqe wqe;     /* WQE cmd */
-       IOCB_t iocb;            /* For IOCB cmd or if we want 128 byte WQE */
+       union lpfc_wqe128 wqe;  /* SLI-4 */
+       IOCB_t iocb;            /* SLI-3 */
 
        uint8_t rsvd2;
        uint8_t priority;       /* OAS priority */
-- 
2.13.1

Reply via email to