scsi: lpfc: Define types in a union for generic void *context3 ptr
authorJustin Tee <justin.tee@broadcom.com>
Tue, 5 Mar 2024 20:05:01 +0000 (12:05 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sun, 10 Mar 2024 22:56:44 +0000 (18:56 -0400)
In LPFC_MBOXQ_t, the void *context3 ptr is used for various paths.  It is
treated as a generic pointer, and is type casted during its usage.

The issue with this is that it can sometimes get confusing when reading
code as to what the context3 ptr is being used for and mistakenly be reused
in a different context.

Rename context3 to ctx_u, and declare it as a union of defined ptr types.
From now on, the ctx_u ptr may be used only if users define the use case
type.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240305200503.57317-11-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_bsg.c
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_mbox.c
drivers/scsi/lpfc/lpfc_nportdisc.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_sli.h
drivers/scsi/lpfc/lpfc_sli4.h

index f784dc9b602a0cf745a158ea9f4a9dee8046e68d..bfa63091902bbefc72a7e8d6181146ef6597b57f 100644 (file)
@@ -3376,7 +3376,7 @@ lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
        unsigned long flags;
        uint8_t *pmb, *pmb_buf;
 
-       dd_data = pmboxq->context3;
+       dd_data = pmboxq->ctx_u.dd_data;
 
        /*
         * The outgoing buffer is readily referred from the dma buffer,
@@ -3553,7 +3553,7 @@ lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
        struct lpfc_sli_config_mbox *sli_cfg_mbx;
        uint8_t *pmbx;
 
-       dd_data = pmboxq->context3;
+       dd_data = pmboxq->ctx_u.dd_data;
 
        /* Determine if job has been aborted */
        spin_lock_irqsave(&phba->ct_ev_lock, flags);
@@ -3940,7 +3940,7 @@ lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
        pmboxq->mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl;
 
        /* context fields to callback function */
-       pmboxq->context3 = dd_data;
+       pmboxq->ctx_u.dd_data = dd_data;
        dd_data->type = TYPE_MBOX;
        dd_data->set_job = job;
        dd_data->context_un.mbox.pmboxq = pmboxq;
@@ -4112,7 +4112,7 @@ lpfc_bsg_sli_cfg_write_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
                pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
 
                /* context fields to callback function */
-               pmboxq->context3 = dd_data;
+               pmboxq->ctx_u.dd_data = dd_data;
                dd_data->type = TYPE_MBOX;
                dd_data->set_job = job;
                dd_data->context_un.mbox.pmboxq = pmboxq;
@@ -4460,7 +4460,7 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
                pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
 
                /* context fields to callback function */
-               pmboxq->context3 = dd_data;
+               pmboxq->ctx_u.dd_data = dd_data;
                dd_data->type = TYPE_MBOX;
                dd_data->set_job = job;
                dd_data->context_un.mbox.pmboxq = pmboxq;
@@ -4875,7 +4875,7 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
        pmboxq->mbox_cmpl = lpfc_bsg_issue_mbox_cmpl;
 
        /* setup context field to pass wait_queue pointer to wake function */
-       pmboxq->context3 = dd_data;
+       pmboxq->ctx_u.dd_data = dd_data;
        dd_data->type = TYPE_MBOX;
        dd_data->set_job = job;
        dd_data->context_un.mbox.pmboxq = pmboxq;
index fdb0540fa492a3caa6b04e735184765dda7c666f..f7c28dc73bf67d86ea87098c1cc7cf8b53cc6604 100644 (file)
@@ -7238,7 +7238,7 @@ lpfc_get_rdp_info(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context)
                goto rdp_fail;
        mbox->vport = rdp_context->ndlp->vport;
        mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0;
-       mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
+       mbox->ctx_u.rdp = rdp_context;
        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
        if (rc == MBX_NOT_FINISHED) {
                lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
@@ -7498,9 +7498,9 @@ lpfc_els_lcb_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        int rc;
 
        mb = &pmb->u.mb;
-       lcb_context = (struct lpfc_lcb_context *)pmb->context3;
+       lcb_context = pmb->ctx_u.lcb;
        ndlp = lcb_context->ndlp;
-       pmb->context3 = NULL;
+       memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u));
        pmb->ctx_buf = NULL;
 
        shdr = (union lpfc_sli4_cfg_shdr *)
@@ -7640,7 +7640,7 @@ lpfc_sli4_set_beacon(struct lpfc_vport *vport,
        lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
                         LPFC_MBOX_OPCODE_SET_BEACON_CONFIG, len,
                         LPFC_SLI4_MBX_EMBED);
-       mbox->context3 = (void *)lcb_context;
+       mbox->ctx_u.lcb = lcb_context;
        mbox->vport = phba->pport;
        mbox->mbox_cmpl = lpfc_els_lcb_rsp;
        bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config,
@@ -8637,9 +8637,9 @@ lpfc_els_rsp_rls_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        mb = &pmb->u.mb;
 
        ndlp = pmb->ctx_ndlp;
-       rxid = (uint16_t)((unsigned long)(pmb->context3) & 0xffff);
-       oxid = (uint16_t)(((unsigned long)(pmb->context3) >> 16) & 0xffff);
-       pmb->context3 = NULL;
+       rxid = (uint16_t)(pmb->ctx_u.ox_rx_id & 0xffff);
+       oxid = (uint16_t)((pmb->ctx_u.ox_rx_id >> 16) & 0xffff);
+       memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u));
        pmb->ctx_ndlp = NULL;
 
        if (mb->mbxStatus) {
@@ -8743,8 +8743,7 @@ lpfc_els_rcv_rls(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC);
        if (mbox) {
                lpfc_read_lnk_stat(phba, mbox);
-               mbox->context3 = (void *)((unsigned long)
-                                        (ox_id << 16 | ctx));
+               mbox->ctx_u.ox_rx_id = ox_id << 16 | ctx;
                mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
                if (!mbox->ctx_ndlp)
                        goto node_err;
index eaa3f89458ec99cd052cf18ebd53f06cdb1d924c..e98f1c2b22202e9e104c8efee3a5b4cd0be364e8 100644 (file)
@@ -1809,7 +1809,7 @@ lpfc_sli4_mbox_cmd_free(struct lpfc_hba *phba, struct lpfcMboxq *mbox)
        }
        /* Reinitialize the context pointers to avoid stale usage. */
        mbox->ctx_buf = NULL;
-       mbox->context3 = NULL;
+       memset(&mbox->ctx_u, 0, sizeof(mbox->ctx_u));
        kfree(mbox->sge_array);
        /* Finally, free the mailbox command itself */
        mempool_free(mbox, phba->mbox_mem_pool);
@@ -2359,8 +2359,7 @@ lpfc_mbx_cmpl_rdp_link_stat(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
 {
        MAILBOX_t *mb;
        int rc = FAILURE;
-       struct lpfc_rdp_context *rdp_context =
-                       (struct lpfc_rdp_context *)(mboxq->context3);
+       struct lpfc_rdp_context *rdp_context = mboxq->ctx_u.rdp;
 
        mb = &mboxq->u.mb;
        if (mb->mbxStatus)
@@ -2379,8 +2378,7 @@ static void
 lpfc_mbx_cmpl_rdp_page_a2(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
 {
        struct lpfc_dmabuf *mp = mbox->ctx_buf;
-       struct lpfc_rdp_context *rdp_context =
-                       (struct lpfc_rdp_context *)(mbox->context3);
+       struct lpfc_rdp_context *rdp_context = mbox->ctx_u.rdp;
 
        if (bf_get(lpfc_mqe_status, &mbox->u.mqe))
                goto error_mbox_free;
@@ -2394,7 +2392,7 @@ lpfc_mbx_cmpl_rdp_page_a2(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
        /* Save the dma buffer for cleanup in the final completion. */
        mbox->ctx_buf = mp;
        mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_link_stat;
-       mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
+       mbox->ctx_u.rdp = rdp_context;
        if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) == MBX_NOT_FINISHED)
                goto error_mbox_free;
 
@@ -2410,8 +2408,7 @@ lpfc_mbx_cmpl_rdp_page_a0(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
 {
        int rc;
        struct lpfc_dmabuf *mp = mbox->ctx_buf;
-       struct lpfc_rdp_context *rdp_context =
-                       (struct lpfc_rdp_context *)(mbox->context3);
+       struct lpfc_rdp_context *rdp_context = mbox->ctx_u.rdp;
 
        if (bf_get(lpfc_mqe_status, &mbox->u.mqe))
                goto error;
@@ -2441,7 +2438,7 @@ lpfc_mbx_cmpl_rdp_page_a0(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
        mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys);
 
        mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a2;
-       mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
+       mbox->ctx_u.rdp = rdp_context;
        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
        if (rc == MBX_NOT_FINISHED)
                goto error;
index c6b76c3d0f707253da5385fc81db9b03e8da6d55..c4172791c267511742a1e68a152abe00d2dfd7cc 100644 (file)
@@ -300,7 +300,7 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox)
        int rc;
 
        ndlp = login_mbox->ctx_ndlp;
-       save_iocb = login_mbox->context3;
+       save_iocb = login_mbox->ctx_u.save_iocb;
 
        if (mb->mbxStatus == MBX_SUCCESS) {
                /* Now that REG_RPI completed successfully,
@@ -640,7 +640,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
        if (!login_mbox->ctx_ndlp)
                goto out;
 
-       login_mbox->context3 = save_iocb; /* For PLOGI ACC */
+       login_mbox->ctx_u.save_iocb = save_iocb; /* For PLOGI ACC */
 
        spin_lock_irq(&ndlp->lock);
        ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI);
@@ -682,7 +682,7 @@ lpfc_mbx_cmpl_resume_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
        struct lpfc_nodelist *ndlp;
        uint32_t cmd;
 
-       elsiocb = mboxq->context3;
+       elsiocb = mboxq->ctx_u.save_iocb;
        ndlp = mboxq->ctx_ndlp;
        vport = mboxq->vport;
        cmd = elsiocb->drvrTimeout;
index aa746cb0884181541b509a111e73739005dac6ab..a028e008dd1ee8937e448b13db3394be2d562d41 100644 (file)
@@ -2830,7 +2830,7 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
         */
        pmboxq->mbox_flag |= LPFC_MBX_WAKE;
        spin_lock_irqsave(&phba->hbalock, drvr_flag);
-       pmbox_done = (struct completion *)pmboxq->context3;
+       pmbox_done = pmboxq->ctx_u.mbox_wait;
        if (pmbox_done)
                complete(pmbox_done);
        spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
@@ -13262,9 +13262,9 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
        /* setup wake call as IOCB callback */
        pmboxq->mbox_cmpl = lpfc_sli_wake_mbox_wait;
 
-       /* setup context3 field to pass wait_queue pointer to wake function  */
+       /* setup ctx_u field to pass wait_queue pointer to wake function  */
        init_completion(&mbox_done);
-       pmboxq->context3 = &mbox_done;
+       pmboxq->ctx_u.mbox_wait = &mbox_done;
        /* now issue the command */
        retval = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
        if (retval == MBX_BUSY || retval == MBX_SUCCESS) {
@@ -13272,7 +13272,7 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
                                            msecs_to_jiffies(timeout * 1000));
 
                spin_lock_irqsave(&phba->hbalock, flag);
-               pmboxq->context3 = NULL;
+               pmboxq->ctx_u.mbox_wait = NULL;
                /*
                 * if LPFC_MBX_WAKE flag is set the mailbox is completed
                 * else do not free the resources.
@@ -19821,14 +19821,15 @@ lpfc_sli4_remove_rpis(struct lpfc_hba *phba)
  * lpfc_sli4_resume_rpi - Remove the rpi bitmask region
  * @ndlp: pointer to lpfc nodelist data structure.
  * @cmpl: completion call-back.
- * @arg: data to load as MBox 'caller buffer information'
+ * @iocbq: data to load as mbox ctx_u information
  *
  * This routine is invoked to remove the memory region that
  * provided rpi via a bitmask.
  **/
 int
 lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
-       void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *arg)
+                    void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *),
+                    struct lpfc_iocbq *iocbq)
 {
        LPFC_MBOXQ_t *mboxq;
        struct lpfc_hba *phba = ndlp->phba;
@@ -19857,7 +19858,7 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
        lpfc_resume_rpi(mboxq, ndlp);
        if (cmpl) {
                mboxq->mbox_cmpl = cmpl;
-               mboxq->context3 = arg;
+               mboxq->ctx_u.save_iocb = iocbq;
        } else
                mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
        mboxq->ctx_ndlp = ndlp;
index 29fdccd689af0970a13cb1438676585a4051f0b5..39f78ef291f76c414c89937be713dc25bc29297b 100644 (file)
@@ -188,9 +188,23 @@ typedef struct lpfcMboxq {
                                         * cmds.  Not a generic pointer.
                                         * Use for storing virtual address.
                                         */
-       void *context3;                 /* a generic pointer.  Code must
-                                        * accommodate the actual datatype.
-                                        */
+
+       /* Pointers that are seldom used during mbox execution, but require
+        * a saved context.
+        */
+       union {
+               unsigned long ox_rx_id;         /* Used in els_rsp_rls_acc */
+               struct lpfc_rdp_context *rdp;   /* Used in get_rdp_info */
+               struct lpfc_lcb_context *lcb;   /* Used in set_beacon */
+               struct completion *mbox_wait;   /* Used in issue_mbox_wait */
+               struct bsg_job_data *dd_data;   /* Used in bsg_issue_mbox_cmpl
+                                                * and
+                                                * bsg_issue_mbox_ext_handle_job
+                                                */
+               struct lpfc_iocbq *save_iocb;   /* Used in defer_plogi_acc and
+                                                * lpfc_mbx_cmpl_resume_rpi
+                                                */
+       } ctx_u;
 
        void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
        uint8_t mbox_flag;
index 2541a8fba093fa0e0263b211fa7cd29c183d8f65..37d9ead7a7c0bfa6923dea5efee7cd4edee286e2 100644 (file)
@@ -1118,8 +1118,9 @@ void lpfc_sli4_free_rpi(struct lpfc_hba *, int);
 void lpfc_sli4_remove_rpis(struct lpfc_hba *);
 void lpfc_sli4_async_event_proc(struct lpfc_hba *);
 void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *);
-int lpfc_sli4_resume_rpi(struct lpfc_nodelist *,
-                       void (*)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *);
+int lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
+                        void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *),
+                        struct lpfc_iocbq *iocbq);
 void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *phba);
 void lpfc_sli4_nvme_pci_offline_aborted(struct lpfc_hba *phba,
                                        struct lpfc_io_buf *lpfc_ncmd);