Skip to content

Commit 85d77f9

Browse files
Justin Teemartinkpetersen
authored andcommitted
scsi: lpfc: Define types in a union for generic void *context3 ptr
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 115d137 commit 85d77f9

File tree

7 files changed

+51
-39
lines changed

7 files changed

+51
-39
lines changed

drivers/scsi/lpfc/lpfc_bsg.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3376,7 +3376,7 @@ lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
33763376
unsigned long flags;
33773377
uint8_t *pmb, *pmb_buf;
33783378

3379-
dd_data = pmboxq->context3;
3379+
dd_data = pmboxq->ctx_u.dd_data;
33803380

33813381
/*
33823382
* 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)
35533553
struct lpfc_sli_config_mbox *sli_cfg_mbx;
35543554
uint8_t *pmbx;
35553555

3556-
dd_data = pmboxq->context3;
3556+
dd_data = pmboxq->ctx_u.dd_data;
35573557

35583558
/* Determine if job has been aborted */
35593559
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,
39403940
pmboxq->mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl;
39413941

39423942
/* context fields to callback function */
3943-
pmboxq->context3 = dd_data;
3943+
pmboxq->ctx_u.dd_data = dd_data;
39443944
dd_data->type = TYPE_MBOX;
39453945
dd_data->set_job = job;
39463946
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,
41124112
pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
41134113

41144114
/* context fields to callback function */
4115-
pmboxq->context3 = dd_data;
4115+
pmboxq->ctx_u.dd_data = dd_data;
41164116
dd_data->type = TYPE_MBOX;
41174117
dd_data->set_job = job;
41184118
dd_data->context_un.mbox.pmboxq = pmboxq;
@@ -4460,7 +4460,7 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
44604460
pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
44614461

44624462
/* context fields to callback function */
4463-
pmboxq->context3 = dd_data;
4463+
pmboxq->ctx_u.dd_data = dd_data;
44644464
dd_data->type = TYPE_MBOX;
44654465
dd_data->set_job = job;
44664466
dd_data->context_un.mbox.pmboxq = pmboxq;
@@ -4875,7 +4875,7 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
48754875
pmboxq->mbox_cmpl = lpfc_bsg_issue_mbox_cmpl;
48764876

48774877
/* setup context field to pass wait_queue pointer to wake function */
4878-
pmboxq->context3 = dd_data;
4878+
pmboxq->ctx_u.dd_data = dd_data;
48794879
dd_data->type = TYPE_MBOX;
48804880
dd_data->set_job = job;
48814881
dd_data->context_un.mbox.pmboxq = pmboxq;

drivers/scsi/lpfc/lpfc_els.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7238,7 +7238,7 @@ lpfc_get_rdp_info(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context)
72387238
goto rdp_fail;
72397239
mbox->vport = rdp_context->ndlp->vport;
72407240
mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0;
7241-
mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
7241+
mbox->ctx_u.rdp = rdp_context;
72427242
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
72437243
if (rc == MBX_NOT_FINISHED) {
72447244
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)
74987498
int rc;
74997499

75007500
mb = &pmb->u.mb;
7501-
lcb_context = (struct lpfc_lcb_context *)pmb->context3;
7501+
lcb_context = pmb->ctx_u.lcb;
75027502
ndlp = lcb_context->ndlp;
7503-
pmb->context3 = NULL;
7503+
memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u));
75047504
pmb->ctx_buf = NULL;
75057505

75067506
shdr = (union lpfc_sli4_cfg_shdr *)
@@ -7640,7 +7640,7 @@ lpfc_sli4_set_beacon(struct lpfc_vport *vport,
76407640
lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
76417641
LPFC_MBOX_OPCODE_SET_BEACON_CONFIG, len,
76427642
LPFC_SLI4_MBX_EMBED);
7643-
mbox->context3 = (void *)lcb_context;
7643+
mbox->ctx_u.lcb = lcb_context;
76447644
mbox->vport = phba->pport;
76457645
mbox->mbox_cmpl = lpfc_els_lcb_rsp;
76467646
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)
86378637
mb = &pmb->u.mb;
86388638

86398639
ndlp = pmb->ctx_ndlp;
8640-
rxid = (uint16_t)((unsigned long)(pmb->context3) & 0xffff);
8641-
oxid = (uint16_t)(((unsigned long)(pmb->context3) >> 16) & 0xffff);
8642-
pmb->context3 = NULL;
8640+
rxid = (uint16_t)(pmb->ctx_u.ox_rx_id & 0xffff);
8641+
oxid = (uint16_t)((pmb->ctx_u.ox_rx_id >> 16) & 0xffff);
8642+
memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u));
86438643
pmb->ctx_ndlp = NULL;
86448644

86458645
if (mb->mbxStatus) {
@@ -8743,8 +8743,7 @@ lpfc_els_rcv_rls(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
87438743
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC);
87448744
if (mbox) {
87458745
lpfc_read_lnk_stat(phba, mbox);
8746-
mbox->context3 = (void *)((unsigned long)
8747-
(ox_id << 16 | ctx));
8746+
mbox->ctx_u.ox_rx_id = ox_id << 16 | ctx;
87488747
mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
87498748
if (!mbox->ctx_ndlp)
87508749
goto node_err;

drivers/scsi/lpfc/lpfc_mbox.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,7 +1809,7 @@ lpfc_sli4_mbox_cmd_free(struct lpfc_hba *phba, struct lpfcMboxq *mbox)
18091809
}
18101810
/* Reinitialize the context pointers to avoid stale usage. */
18111811
mbox->ctx_buf = NULL;
1812-
mbox->context3 = NULL;
1812+
memset(&mbox->ctx_u, 0, sizeof(mbox->ctx_u));
18131813
kfree(mbox->sge_array);
18141814
/* Finally, free the mailbox command itself */
18151815
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)
23592359
{
23602360
MAILBOX_t *mb;
23612361
int rc = FAILURE;
2362-
struct lpfc_rdp_context *rdp_context =
2363-
(struct lpfc_rdp_context *)(mboxq->context3);
2362+
struct lpfc_rdp_context *rdp_context = mboxq->ctx_u.rdp;
23642363

23652364
mb = &mboxq->u.mb;
23662365
if (mb->mbxStatus)
@@ -2379,8 +2378,7 @@ static void
23792378
lpfc_mbx_cmpl_rdp_page_a2(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
23802379
{
23812380
struct lpfc_dmabuf *mp = mbox->ctx_buf;
2382-
struct lpfc_rdp_context *rdp_context =
2383-
(struct lpfc_rdp_context *)(mbox->context3);
2381+
struct lpfc_rdp_context *rdp_context = mbox->ctx_u.rdp;
23842382

23852383
if (bf_get(lpfc_mqe_status, &mbox->u.mqe))
23862384
goto error_mbox_free;
@@ -2394,7 +2392,7 @@ lpfc_mbx_cmpl_rdp_page_a2(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
23942392
/* Save the dma buffer for cleanup in the final completion. */
23952393
mbox->ctx_buf = mp;
23962394
mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_link_stat;
2397-
mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
2395+
mbox->ctx_u.rdp = rdp_context;
23982396
if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) == MBX_NOT_FINISHED)
23992397
goto error_mbox_free;
24002398

@@ -2410,8 +2408,7 @@ lpfc_mbx_cmpl_rdp_page_a0(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
24102408
{
24112409
int rc;
24122410
struct lpfc_dmabuf *mp = mbox->ctx_buf;
2413-
struct lpfc_rdp_context *rdp_context =
2414-
(struct lpfc_rdp_context *)(mbox->context3);
2411+
struct lpfc_rdp_context *rdp_context = mbox->ctx_u.rdp;
24152412

24162413
if (bf_get(lpfc_mqe_status, &mbox->u.mqe))
24172414
goto error;
@@ -2441,7 +2438,7 @@ lpfc_mbx_cmpl_rdp_page_a0(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
24412438
mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys);
24422439

24432440
mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a2;
2444-
mbox->context3 = (struct lpfc_rdp_context *)rdp_context;
2441+
mbox->ctx_u.rdp = rdp_context;
24452442
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
24462443
if (rc == MBX_NOT_FINISHED)
24472444
goto error;

drivers/scsi/lpfc/lpfc_nportdisc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox)
300300
int rc;
301301

302302
ndlp = login_mbox->ctx_ndlp;
303-
save_iocb = login_mbox->context3;
303+
save_iocb = login_mbox->ctx_u.save_iocb;
304304

305305
if (mb->mbxStatus == MBX_SUCCESS) {
306306
/* Now that REG_RPI completed successfully,
@@ -640,7 +640,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
640640
if (!login_mbox->ctx_ndlp)
641641
goto out;
642642

643-
login_mbox->context3 = save_iocb; /* For PLOGI ACC */
643+
login_mbox->ctx_u.save_iocb = save_iocb; /* For PLOGI ACC */
644644

645645
spin_lock_irq(&ndlp->lock);
646646
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)
682682
struct lpfc_nodelist *ndlp;
683683
uint32_t cmd;
684684

685-
elsiocb = mboxq->context3;
685+
elsiocb = mboxq->ctx_u.save_iocb;
686686
ndlp = mboxq->ctx_ndlp;
687687
vport = mboxq->vport;
688688
cmd = elsiocb->drvrTimeout;

drivers/scsi/lpfc/lpfc_sli.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2830,7 +2830,7 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
28302830
*/
28312831
pmboxq->mbox_flag |= LPFC_MBX_WAKE;
28322832
spin_lock_irqsave(&phba->hbalock, drvr_flag);
2833-
pmbox_done = (struct completion *)pmboxq->context3;
2833+
pmbox_done = pmboxq->ctx_u.mbox_wait;
28342834
if (pmbox_done)
28352835
complete(pmbox_done);
28362836
spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
@@ -13262,17 +13262,17 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
1326213262
/* setup wake call as IOCB callback */
1326313263
pmboxq->mbox_cmpl = lpfc_sli_wake_mbox_wait;
1326413264

13265-
/* setup context3 field to pass wait_queue pointer to wake function */
13265+
/* setup ctx_u field to pass wait_queue pointer to wake function */
1326613266
init_completion(&mbox_done);
13267-
pmboxq->context3 = &mbox_done;
13267+
pmboxq->ctx_u.mbox_wait = &mbox_done;
1326813268
/* now issue the command */
1326913269
retval = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
1327013270
if (retval == MBX_BUSY || retval == MBX_SUCCESS) {
1327113271
wait_for_completion_timeout(&mbox_done,
1327213272
msecs_to_jiffies(timeout * 1000));
1327313273

1327413274
spin_lock_irqsave(&phba->hbalock, flag);
13275-
pmboxq->context3 = NULL;
13275+
pmboxq->ctx_u.mbox_wait = NULL;
1327613276
/*
1327713277
* if LPFC_MBX_WAKE flag is set the mailbox is completed
1327813278
* else do not free the resources.
@@ -19821,14 +19821,15 @@ lpfc_sli4_remove_rpis(struct lpfc_hba *phba)
1982119821
* lpfc_sli4_resume_rpi - Remove the rpi bitmask region
1982219822
* @ndlp: pointer to lpfc nodelist data structure.
1982319823
* @cmpl: completion call-back.
19824-
* @arg: data to load as MBox 'caller buffer information'
19824+
* @iocbq: data to load as mbox ctx_u information
1982519825
*
1982619826
* This routine is invoked to remove the memory region that
1982719827
* provided rpi via a bitmask.
1982819828
**/
1982919829
int
1983019830
lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
19831-
void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *arg)
19831+
void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *),
19832+
struct lpfc_iocbq *iocbq)
1983219833
{
1983319834
LPFC_MBOXQ_t *mboxq;
1983419835
struct lpfc_hba *phba = ndlp->phba;
@@ -19857,7 +19858,7 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
1985719858
lpfc_resume_rpi(mboxq, ndlp);
1985819859
if (cmpl) {
1985919860
mboxq->mbox_cmpl = cmpl;
19860-
mboxq->context3 = arg;
19861+
mboxq->ctx_u.save_iocb = iocbq;
1986119862
} else
1986219863
mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
1986319864
mboxq->ctx_ndlp = ndlp;

drivers/scsi/lpfc/lpfc_sli.h

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,23 @@ typedef struct lpfcMboxq {
188188
* cmds. Not a generic pointer.
189189
* Use for storing virtual address.
190190
*/
191-
void *context3; /* a generic pointer. Code must
192-
* accommodate the actual datatype.
193-
*/
191+
192+
/* Pointers that are seldom used during mbox execution, but require
193+
* a saved context.
194+
*/
195+
union {
196+
unsigned long ox_rx_id; /* Used in els_rsp_rls_acc */
197+
struct lpfc_rdp_context *rdp; /* Used in get_rdp_info */
198+
struct lpfc_lcb_context *lcb; /* Used in set_beacon */
199+
struct completion *mbox_wait; /* Used in issue_mbox_wait */
200+
struct bsg_job_data *dd_data; /* Used in bsg_issue_mbox_cmpl
201+
* and
202+
* bsg_issue_mbox_ext_handle_job
203+
*/
204+
struct lpfc_iocbq *save_iocb; /* Used in defer_plogi_acc and
205+
* lpfc_mbx_cmpl_resume_rpi
206+
*/
207+
} ctx_u;
194208

195209
void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
196210
uint8_t mbox_flag;

drivers/scsi/lpfc/lpfc_sli4.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,8 +1118,9 @@ void lpfc_sli4_free_rpi(struct lpfc_hba *, int);
11181118
void lpfc_sli4_remove_rpis(struct lpfc_hba *);
11191119
void lpfc_sli4_async_event_proc(struct lpfc_hba *);
11201120
void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *);
1121-
int lpfc_sli4_resume_rpi(struct lpfc_nodelist *,
1122-
void (*)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *);
1121+
int lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
1122+
void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *),
1123+
struct lpfc_iocbq *iocbq);
11231124
void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *phba);
11241125
void lpfc_sli4_nvme_pci_offline_aborted(struct lpfc_hba *phba,
11251126
struct lpfc_io_buf *lpfc_ncmd);

0 commit comments

Comments
 (0)