scsi: lpfc: Fix field overload in lpfc_iocbq data structure
The lpfc_iocbq data structure has void * pointers that are overloaded to be as many as 8 different data types and the driver translates the void * by casting. This patch removes the void * pointers by declaring the specific types needed by the driver. It also expands the context_un to include more seldom used pointer types to save structure bytes. It also groups the u8 types together to pack the 8 bytes needed. This work allows the lpfc_iocbq data structure to be more strongly typed and keeps it from being allocated from the 512 byte slab. [mkp: rolled in zeroday fix] Link: https://lore.kernel.org/r/20220412222008.126521-21-jsmart2021@gmail.com Reported-by: kernel test robot <lkp@intel.com> Co-developed-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
1045592fc9
commit
d51cf5bd92
@ -310,7 +310,7 @@ lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba,
|
||||
int rc = 0;
|
||||
u32 ulp_status, ulp_word4, total_data_placed;
|
||||
|
||||
dd_data = cmdiocbq->context1;
|
||||
dd_data = cmdiocbq->context_un.dd_data;
|
||||
|
||||
/* Determine if job has been aborted */
|
||||
spin_lock_irqsave(&phba->ct_ev_lock, flags);
|
||||
@ -328,10 +328,10 @@ lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba,
|
||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||
|
||||
iocb = &dd_data->context_un.iocb;
|
||||
ndlp = iocb->cmdiocbq->context_un.ndlp;
|
||||
ndlp = iocb->cmdiocbq->ndlp;
|
||||
rmp = iocb->rmp;
|
||||
cmp = cmdiocbq->context2;
|
||||
bmp = cmdiocbq->context3;
|
||||
cmp = cmdiocbq->cmd_dmabuf;
|
||||
bmp = cmdiocbq->bpl_dmabuf;
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocbq);
|
||||
ulp_word4 = get_job_word4(phba, rspiocbq);
|
||||
total_data_placed = get_job_data_placed(phba, rspiocbq);
|
||||
@ -470,14 +470,12 @@ lpfc_bsg_send_mgmt_cmd(struct bsg_job *job)
|
||||
|
||||
cmdiocbq->num_bdes = num_entry;
|
||||
cmdiocbq->vport = phba->pport;
|
||||
cmdiocbq->context2 = cmp;
|
||||
cmdiocbq->context3 = bmp;
|
||||
cmdiocbq->cmd_dmabuf = cmp;
|
||||
cmdiocbq->bpl_dmabuf = bmp;
|
||||
cmdiocbq->cmd_flag |= LPFC_IO_LIBDFC;
|
||||
|
||||
cmdiocbq->cmd_cmpl = lpfc_bsg_send_mgmt_cmd_cmp;
|
||||
cmdiocbq->context1 = dd_data;
|
||||
cmdiocbq->context2 = cmp;
|
||||
cmdiocbq->context3 = bmp;
|
||||
cmdiocbq->context_un.dd_data = dd_data;
|
||||
|
||||
dd_data->type = TYPE_IOCB;
|
||||
dd_data->set_job = job;
|
||||
@ -495,8 +493,8 @@ lpfc_bsg_send_mgmt_cmd(struct bsg_job *job)
|
||||
readl(phba->HCregaddr); /* flush */
|
||||
}
|
||||
|
||||
cmdiocbq->context_un.ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->context_un.ndlp) {
|
||||
cmdiocbq->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->ndlp) {
|
||||
rc = -ENODEV;
|
||||
goto free_rmp;
|
||||
}
|
||||
@ -573,9 +571,9 @@ lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba,
|
||||
int rc = 0;
|
||||
u32 ulp_status, ulp_word4, total_data_placed;
|
||||
|
||||
dd_data = cmdiocbq->context1;
|
||||
dd_data = cmdiocbq->context_un.dd_data;
|
||||
ndlp = dd_data->context_un.iocb.ndlp;
|
||||
cmdiocbq->context1 = ndlp;
|
||||
cmdiocbq->ndlp = ndlp;
|
||||
|
||||
/* Determine if job has been aborted */
|
||||
spin_lock_irqsave(&phba->ct_ev_lock, flags);
|
||||
@ -595,7 +593,7 @@ lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba,
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocbq);
|
||||
ulp_word4 = get_job_word4(phba, rspiocbq);
|
||||
total_data_placed = get_job_data_placed(phba, rspiocbq);
|
||||
pcmd = (struct lpfc_dmabuf *)cmdiocbq->context2;
|
||||
pcmd = cmdiocbq->cmd_dmabuf;
|
||||
prsp = (struct lpfc_dmabuf *)pcmd->list.next;
|
||||
|
||||
/* Copy the completed job data or determine the job status if job is
|
||||
@ -711,8 +709,8 @@ lpfc_bsg_rport_els(struct bsg_job *job)
|
||||
/* Transfer the request payload to allocated command dma buffer */
|
||||
sg_copy_to_buffer(job->request_payload.sg_list,
|
||||
job->request_payload.sg_cnt,
|
||||
((struct lpfc_dmabuf *)cmdiocbq->context2)->virt,
|
||||
job->request_payload.payload_len);
|
||||
cmdiocbq->cmd_dmabuf->virt,
|
||||
cmdsize);
|
||||
|
||||
rpi = ndlp->nlp_rpi;
|
||||
|
||||
@ -722,8 +720,8 @@ lpfc_bsg_rport_els(struct bsg_job *job)
|
||||
else
|
||||
cmdiocbq->iocb.ulpContext = rpi;
|
||||
cmdiocbq->cmd_flag |= LPFC_IO_LIBDFC;
|
||||
cmdiocbq->context1 = dd_data;
|
||||
cmdiocbq->context_un.ndlp = ndlp;
|
||||
cmdiocbq->context_un.dd_data = dd_data;
|
||||
cmdiocbq->ndlp = ndlp;
|
||||
cmdiocbq->cmd_cmpl = lpfc_bsg_rport_els_cmp;
|
||||
dd_data->type = TYPE_IOCB;
|
||||
dd_data->set_job = job;
|
||||
@ -742,8 +740,8 @@ lpfc_bsg_rport_els(struct bsg_job *job)
|
||||
readl(phba->HCregaddr); /* flush */
|
||||
}
|
||||
|
||||
cmdiocbq->context1 = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->context1) {
|
||||
cmdiocbq->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->ndlp) {
|
||||
rc = -EIO;
|
||||
goto linkdown_err;
|
||||
}
|
||||
@ -917,8 +915,8 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
struct ulp_bde64 *bde;
|
||||
dma_addr_t dma_addr;
|
||||
int i;
|
||||
struct lpfc_dmabuf *bdeBuf1 = piocbq->context2;
|
||||
struct lpfc_dmabuf *bdeBuf2 = piocbq->context3;
|
||||
struct lpfc_dmabuf *bdeBuf1 = piocbq->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *bdeBuf2 = piocbq->bpl_dmabuf;
|
||||
struct lpfc_sli_ct_request *ct_req;
|
||||
struct bsg_job *job = NULL;
|
||||
struct fc_bsg_reply *bsg_reply;
|
||||
@ -985,9 +983,8 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
list_for_each_entry(iocbq, &head, list) {
|
||||
size = 0;
|
||||
if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
|
||||
bdeBuf1 = iocbq->context2;
|
||||
bdeBuf2 = iocbq->context3;
|
||||
|
||||
bdeBuf1 = iocbq->cmd_dmabuf;
|
||||
bdeBuf2 = iocbq->bpl_dmabuf;
|
||||
}
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
bde_count = iocbq->wcqe_cmpl.word3;
|
||||
@ -1384,7 +1381,7 @@ lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba,
|
||||
int rc = 0;
|
||||
u32 ulp_status, ulp_word4;
|
||||
|
||||
dd_data = cmdiocbq->context1;
|
||||
dd_data = cmdiocbq->context_un.dd_data;
|
||||
|
||||
/* Determine if job has been aborted */
|
||||
spin_lock_irqsave(&phba->ct_ev_lock, flags);
|
||||
@ -1401,8 +1398,8 @@ lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba,
|
||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||
|
||||
ndlp = dd_data->context_un.iocb.ndlp;
|
||||
cmp = cmdiocbq->context2;
|
||||
bmp = cmdiocbq->context3;
|
||||
cmp = cmdiocbq->cmd_dmabuf;
|
||||
bmp = cmdiocbq->bpl_dmabuf;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocbq);
|
||||
ulp_word4 = get_job_word4(phba, rspiocbq);
|
||||
@ -1529,10 +1526,10 @@ lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct bsg_job *job, uint32_t tag,
|
||||
|
||||
ctiocb->cmd_flag |= LPFC_IO_LIBDFC;
|
||||
ctiocb->vport = phba->pport;
|
||||
ctiocb->context1 = dd_data;
|
||||
ctiocb->context2 = cmp;
|
||||
ctiocb->context3 = bmp;
|
||||
ctiocb->context_un.ndlp = ndlp;
|
||||
ctiocb->context_un.dd_data = dd_data;
|
||||
ctiocb->cmd_dmabuf = cmp;
|
||||
ctiocb->bpl_dmabuf = bmp;
|
||||
ctiocb->ndlp = ndlp;
|
||||
ctiocb->cmd_cmpl = lpfc_issue_ct_rsp_cmp;
|
||||
|
||||
dd_data->type = TYPE_IOCB;
|
||||
@ -2671,7 +2668,7 @@ static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi,
|
||||
ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_XRI_SETUP;
|
||||
ctreq->CommandResponse.bits.Size = 0;
|
||||
|
||||
cmdiocbq->context3 = dmabuf;
|
||||
cmdiocbq->bpl_dmabuf = dmabuf;
|
||||
cmdiocbq->cmd_flag |= LPFC_IO_LIBDFC;
|
||||
cmdiocbq->vport = phba->pport;
|
||||
cmdiocbq->cmd_cmpl = NULL;
|
||||
@ -3231,7 +3228,7 @@ lpfc_bsg_diag_loopback_run(struct bsg_job *job)
|
||||
cmdiocbq->cmd_flag |= LPFC_IO_LOOPBACK;
|
||||
cmdiocbq->vport = phba->pport;
|
||||
cmdiocbq->cmd_cmpl = NULL;
|
||||
cmdiocbq->context3 = txbmp;
|
||||
cmdiocbq->bpl_dmabuf = txbmp;
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4) {
|
||||
lpfc_sli_prep_xmit_seq64(phba, cmdiocbq, txbmp, 0, txxri,
|
||||
@ -3384,7 +3381,7 @@ job_error:
|
||||
* This is completion handler function for mailbox commands issued from
|
||||
* lpfc_bsg_issue_mbox function. This function is called by the
|
||||
* mailbox event handler function with no lock held. This function
|
||||
* will wake up thread waiting on the wait queue pointed by context1
|
||||
* will wake up thread waiting on the wait queue pointed by dd_data
|
||||
* of the mailbox.
|
||||
**/
|
||||
static void
|
||||
@ -5034,9 +5031,9 @@ lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba,
|
||||
unsigned int rsp_size;
|
||||
int rc = 0;
|
||||
|
||||
dd_data = cmdiocbq->context1;
|
||||
cmp = cmdiocbq->context2;
|
||||
bmp = cmdiocbq->context3;
|
||||
dd_data = cmdiocbq->context_un.dd_data;
|
||||
cmp = cmdiocbq->cmd_dmabuf;
|
||||
bmp = cmdiocbq->bpl_dmabuf;
|
||||
menlo = &dd_data->context_un.menlo;
|
||||
rmp = menlo->rmp;
|
||||
rsp = &rspiocbq->iocb;
|
||||
@ -5233,9 +5230,9 @@ lpfc_menlo_cmd(struct bsg_job *job)
|
||||
/* We want the firmware to timeout before we do */
|
||||
cmd->ulpTimeout = MENLO_TIMEOUT - 5;
|
||||
cmdiocbq->cmd_cmpl = lpfc_bsg_menlo_cmd_cmp;
|
||||
cmdiocbq->context1 = dd_data;
|
||||
cmdiocbq->context2 = cmp;
|
||||
cmdiocbq->context3 = bmp;
|
||||
cmdiocbq->context_un.dd_data = dd_data;
|
||||
cmdiocbq->cmd_dmabuf = cmp;
|
||||
cmdiocbq->bpl_dmabuf = bmp;
|
||||
if (menlo_cmd->cmd == LPFC_BSG_VENDOR_MENLO_CMD) {
|
||||
cmd->ulpCommand = CMD_GEN_REQUEST64_CR;
|
||||
cmd->ulpPU = MENLO_PU; /* 3 */
|
||||
|
@ -118,22 +118,22 @@ lpfc_ct_unsol_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_nodelist *ndlp;
|
||||
struct lpfc_dmabuf *mp, *bmp;
|
||||
|
||||
ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
|
||||
ndlp = cmdiocb->ndlp;
|
||||
if (ndlp)
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
||||
mp = cmdiocb->context2;
|
||||
bmp = cmdiocb->context3;
|
||||
mp = cmdiocb->rsp_dmabuf;
|
||||
bmp = cmdiocb->bpl_dmabuf;
|
||||
if (mp) {
|
||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||
kfree(mp);
|
||||
cmdiocb->context2 = NULL;
|
||||
cmdiocb->rsp_dmabuf = NULL;
|
||||
}
|
||||
|
||||
if (bmp) {
|
||||
lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
|
||||
kfree(bmp);
|
||||
cmdiocb->context3 = NULL;
|
||||
cmdiocb->bpl_dmabuf = NULL;
|
||||
}
|
||||
|
||||
lpfc_sli_release_iocbq(phba, cmdiocb);
|
||||
@ -232,18 +232,17 @@ lpfc_ct_reject_event(struct lpfc_nodelist *ndlp,
|
||||
}
|
||||
|
||||
/* Save for completion so we can release these resources */
|
||||
cmdiocbq->context2 = (uint8_t *)mp;
|
||||
cmdiocbq->context3 = (uint8_t *)bmp;
|
||||
cmdiocbq->rsp_dmabuf = mp;
|
||||
cmdiocbq->bpl_dmabuf = bmp;
|
||||
cmdiocbq->cmd_cmpl = lpfc_ct_unsol_cmpl;
|
||||
tmo = (3 * phba->fc_ratov);
|
||||
|
||||
cmdiocbq->retry = 0;
|
||||
cmdiocbq->vport = vport;
|
||||
cmdiocbq->context_un.ndlp = NULL;
|
||||
cmdiocbq->drvrTimeout = tmo + LPFC_DRVR_TIMEOUT;
|
||||
|
||||
cmdiocbq->context1 = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->context1)
|
||||
cmdiocbq->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!cmdiocbq->ndlp)
|
||||
goto ct_no_ndlp;
|
||||
|
||||
rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, 0);
|
||||
@ -310,8 +309,8 @@ lpfc_ct_handle_mibreq(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocbq)
|
||||
return;
|
||||
}
|
||||
|
||||
ct_req = ((struct lpfc_sli_ct_request *)
|
||||
(((struct lpfc_dmabuf *)ctiocbq->context2)->virt));
|
||||
ct_req = (struct lpfc_sli_ct_request *)ctiocbq->cmd_dmabuf->virt;
|
||||
|
||||
mi_cmd = ct_req->CommandResponse.bits.CmdRsp;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"6442 : MI Cmd : x%x Not Supported\n", mi_cmd);
|
||||
@ -347,14 +346,14 @@ lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
uint32_t size;
|
||||
struct list_head head;
|
||||
struct lpfc_sli_ct_request *ct_req;
|
||||
struct lpfc_dmabuf *bdeBuf1 = ctiocbq->context2;
|
||||
struct lpfc_dmabuf *bdeBuf2 = ctiocbq->context3;
|
||||
struct lpfc_dmabuf *bdeBuf1 = ctiocbq->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *bdeBuf2 = ctiocbq->bpl_dmabuf;
|
||||
u32 status, parameter, bde_count = 0;
|
||||
struct lpfc_wcqe_complete *wcqe_cmpl = NULL;
|
||||
|
||||
ctiocbq->context1 = NULL;
|
||||
ctiocbq->context2 = NULL;
|
||||
ctiocbq->context3 = NULL;
|
||||
ctiocbq->cmd_dmabuf = NULL;
|
||||
ctiocbq->rsp_dmabuf = NULL;
|
||||
ctiocbq->bpl_dmabuf = NULL;
|
||||
|
||||
wcqe_cmpl = &ctiocbq->wcqe_cmpl;
|
||||
status = get_job_ulpstatus(phba, ctiocbq);
|
||||
@ -382,12 +381,11 @@ lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
if (bde_count == 0)
|
||||
return;
|
||||
|
||||
ctiocbq->context2 = bdeBuf1;
|
||||
ctiocbq->cmd_dmabuf = bdeBuf1;
|
||||
if (bde_count == 2)
|
||||
ctiocbq->context3 = bdeBuf2;
|
||||
ctiocbq->bpl_dmabuf = bdeBuf2;
|
||||
|
||||
ct_req = ((struct lpfc_sli_ct_request *)
|
||||
(((struct lpfc_dmabuf *)ctiocbq->context2)->virt));
|
||||
ct_req = (struct lpfc_sli_ct_request *)ctiocbq->cmd_dmabuf->virt;
|
||||
|
||||
if (ct_req->FsType == SLI_CT_MANAGEMENT_SERVICE &&
|
||||
ct_req->FsSubType == SLI_CT_MIB_Subtypes) {
|
||||
@ -408,8 +406,8 @@ lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
|
||||
if (!bde_count)
|
||||
continue;
|
||||
bdeBuf1 = iocb->context2;
|
||||
iocb->context2 = NULL;
|
||||
bdeBuf1 = iocb->cmd_dmabuf;
|
||||
iocb->cmd_dmabuf = NULL;
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
size = iocb->wqe.gen_req.bde.tus.f.bdeSize;
|
||||
else
|
||||
@ -417,8 +415,8 @@ lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
lpfc_ct_unsol_buffer(phba, ctiocbq, bdeBuf1, size);
|
||||
lpfc_in_buf_free(phba, bdeBuf1);
|
||||
if (bde_count == 2) {
|
||||
bdeBuf2 = iocb->context3;
|
||||
iocb->context3 = NULL;
|
||||
bdeBuf2 = iocb->bpl_dmabuf;
|
||||
iocb->bpl_dmabuf = NULL;
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
size = iocb->unsol_rcv_len;
|
||||
else
|
||||
@ -549,24 +547,25 @@ lpfc_ct_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocb)
|
||||
{
|
||||
struct lpfc_dmabuf *buf_ptr;
|
||||
|
||||
/* I/O job is complete so context is now invalid*/
|
||||
ctiocb->context_un.ndlp = NULL;
|
||||
if (ctiocb->context1) {
|
||||
buf_ptr = (struct lpfc_dmabuf *) ctiocb->context1;
|
||||
/* IOCBQ job structure gets cleaned during release. Just release
|
||||
* the dma buffers here.
|
||||
*/
|
||||
if (ctiocb->cmd_dmabuf) {
|
||||
buf_ptr = ctiocb->cmd_dmabuf;
|
||||
lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
|
||||
kfree(buf_ptr);
|
||||
ctiocb->context1 = NULL;
|
||||
ctiocb->cmd_dmabuf = NULL;
|
||||
}
|
||||
if (ctiocb->context2) {
|
||||
lpfc_free_ct_rsp(phba, (struct lpfc_dmabuf *) ctiocb->context2);
|
||||
ctiocb->context2 = NULL;
|
||||
if (ctiocb->rsp_dmabuf) {
|
||||
lpfc_free_ct_rsp(phba, ctiocb->rsp_dmabuf);
|
||||
ctiocb->rsp_dmabuf = NULL;
|
||||
}
|
||||
|
||||
if (ctiocb->context3) {
|
||||
buf_ptr = (struct lpfc_dmabuf *) ctiocb->context3;
|
||||
if (ctiocb->bpl_dmabuf) {
|
||||
buf_ptr = ctiocb->bpl_dmabuf;
|
||||
lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
|
||||
kfree(buf_ptr);
|
||||
ctiocb->context3 = NULL;
|
||||
ctiocb->bpl_dmabuf = NULL;
|
||||
}
|
||||
lpfc_sli_release_iocbq(phba, ctiocb);
|
||||
return 0;
|
||||
@ -605,11 +604,11 @@ lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
|
||||
/* Update the num_entry bde count */
|
||||
geniocb->num_bdes = num_entry;
|
||||
|
||||
geniocb->context3 = (uint8_t *) bmp;
|
||||
geniocb->bpl_dmabuf = bmp;
|
||||
|
||||
/* Save for completion so we can release these resources */
|
||||
geniocb->context1 = (uint8_t *) inp;
|
||||
geniocb->context2 = (uint8_t *) outp;
|
||||
geniocb->cmd_dmabuf = inp;
|
||||
geniocb->rsp_dmabuf = outp;
|
||||
|
||||
geniocb->event_tag = event_tag;
|
||||
|
||||
@ -635,8 +634,8 @@ lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
|
||||
geniocb->drvrTimeout = tmo + LPFC_DRVR_TIMEOUT;
|
||||
geniocb->vport = vport;
|
||||
geniocb->retry = retry;
|
||||
geniocb->context_un.ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!geniocb->context_un.ndlp)
|
||||
geniocb->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!geniocb->ndlp)
|
||||
goto out;
|
||||
|
||||
rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, geniocb, 0);
|
||||
@ -926,13 +925,12 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
int rc, type;
|
||||
|
||||
/* First save ndlp, before we overwrite it */
|
||||
ndlp = cmdiocb->context_un.ndlp;
|
||||
ndlp = cmdiocb->ndlp;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
cmdiocb->context_un.rsp_iocb = rspiocb;
|
||||
|
||||
inp = (struct lpfc_dmabuf *) cmdiocb->context1;
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
cmdiocb->rsp_iocb = rspiocb;
|
||||
inp = cmdiocb->cmd_dmabuf;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"GID_FT cmpl: status:x%x/x%x rtry:%d",
|
||||
@ -1143,12 +1141,12 @@ lpfc_cmpl_ct_cmd_gid_pt(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
int rc;
|
||||
|
||||
/* First save ndlp, before we overwrite it */
|
||||
ndlp = cmdiocb->context_un.ndlp;
|
||||
ndlp = cmdiocb->ndlp;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
cmdiocb->context_un.rsp_iocb = rspiocb;
|
||||
inp = (struct lpfc_dmabuf *)cmdiocb->context1;
|
||||
outp = (struct lpfc_dmabuf *)cmdiocb->context2;
|
||||
cmdiocb->rsp_iocb = rspiocb;
|
||||
inp = cmdiocb->cmd_dmabuf;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
|
||||
"GID_PT cmpl: status:x%x/x%x rtry:%d",
|
||||
@ -1346,8 +1344,8 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *) cmdiocb->context1;
|
||||
struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->rsp_dmabuf;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
int did, rc, retry;
|
||||
uint8_t fbits;
|
||||
@ -1426,7 +1424,7 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
cmdiocb->retry, did);
|
||||
if (rc == 0) {
|
||||
/* success */
|
||||
free_ndlp = cmdiocb->context_un.ndlp;
|
||||
free_ndlp = cmdiocb->ndlp;
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(free_ndlp);
|
||||
return;
|
||||
@ -1483,7 +1481,7 @@ out:
|
||||
}
|
||||
|
||||
iocb_free:
|
||||
free_ndlp = cmdiocb->context_un.ndlp;
|
||||
free_ndlp = cmdiocb->ndlp;
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(free_ndlp);
|
||||
return;
|
||||
@ -1494,8 +1492,8 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *)cmdiocb->context1;
|
||||
struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *)cmdiocb->context2;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->rsp_dmabuf;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
int did;
|
||||
struct lpfc_nodelist *ndlp = NULL;
|
||||
@ -1519,7 +1517,7 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
}
|
||||
|
||||
/* Preserve the nameserver node to release the reference. */
|
||||
ns_ndlp = cmdiocb->context_un.ndlp;
|
||||
ns_ndlp = cmdiocb->ndlp;
|
||||
|
||||
if (ulp_status == IOSTAT_SUCCESS) {
|
||||
/* Good status, continue checking */
|
||||
@ -1605,13 +1603,13 @@ lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
u32 ulp_word4 = get_job_word4(phba, rspiocb);
|
||||
|
||||
/* First save ndlp, before we overwrite it */
|
||||
ndlp = cmdiocb->context_un.ndlp;
|
||||
ndlp = cmdiocb->ndlp;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
cmdiocb->context_un.rsp_iocb = rspiocb;
|
||||
cmdiocb->rsp_iocb = rspiocb;
|
||||
|
||||
inp = (struct lpfc_dmabuf *) cmdiocb->context1;
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
inp = cmdiocb->cmd_dmabuf;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
|
||||
cmdcode = be16_to_cpu(((struct lpfc_sli_ct_request *) inp->virt)->
|
||||
CommandResponse.bits.CmdRsp);
|
||||
@ -1672,8 +1670,8 @@ lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
CTrsp = (struct lpfc_sli_ct_request *)outp->virt;
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
|
||||
vport->ct_flags |= FC_CT_RFT_ID;
|
||||
@ -1693,7 +1691,7 @@ lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
|
||||
@ -1714,8 +1712,8 @@ lpfc_cmpl_ct_cmd_rspn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
CTrsp = (struct lpfc_sli_ct_request *)outp->virt;
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
|
||||
vport->ct_flags |= FC_CT_RSPN_ID;
|
||||
@ -1735,7 +1733,7 @@ lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
|
||||
@ -1768,8 +1766,8 @@ lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_dmabuf *outp;
|
||||
struct lpfc_sli_ct_request *CTrsp;
|
||||
|
||||
outp = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
|
||||
outp = cmdiocb->rsp_dmabuf;
|
||||
CTrsp = (struct lpfc_sli_ct_request *)outp->virt;
|
||||
if (CTrsp->CommandResponse.bits.CmdRsp ==
|
||||
be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
|
||||
vport->ct_flags |= FC_CT_RFF_ID;
|
||||
@ -1865,7 +1863,7 @@ lpfc_get_gidft_type(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb)
|
||||
struct lpfc_dmabuf *mp;
|
||||
uint32_t type;
|
||||
|
||||
mp = cmdiocb->context1;
|
||||
mp = cmdiocb->cmd_dmabuf;
|
||||
if (mp == NULL)
|
||||
return 0;
|
||||
CtReq = (struct lpfc_sli_ct_request *)mp->virt;
|
||||
@ -2171,8 +2169,8 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->context1;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->context2;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->rsp_dmabuf;
|
||||
struct lpfc_sli_ct_request *CTcmd = inp->virt;
|
||||
struct lpfc_sli_ct_request *CTrsp = outp->virt;
|
||||
uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp;
|
||||
@ -2226,7 +2224,7 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
ulp_word4);
|
||||
}
|
||||
|
||||
free_ndlp = cmdiocb->context_un.ndlp;
|
||||
free_ndlp = cmdiocb->ndlp;
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(free_ndlp);
|
||||
|
||||
@ -3812,8 +3810,8 @@ lpfc_cmpl_ct_cmd_vmid(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_vport *vport = cmdiocb->vport;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->context1;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->context2;
|
||||
struct lpfc_dmabuf *inp = cmdiocb->cmd_dmabuf;
|
||||
struct lpfc_dmabuf *outp = cmdiocb->rsp_dmabuf;
|
||||
struct lpfc_sli_ct_request *ctcmd = inp->virt;
|
||||
struct lpfc_sli_ct_request *ctrsp = outp->virt;
|
||||
u16 rsp = ctrsp->CommandResponse.bits.CmdRsp;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5156,7 +5156,7 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba,
|
||||
if (pring->ringno == LPFC_ELS_RING) {
|
||||
switch (ulp_command) {
|
||||
case CMD_GEN_REQUEST64_CR:
|
||||
if (iocb->context_un.ndlp == ndlp)
|
||||
if (iocb->ndlp == ndlp)
|
||||
return 1;
|
||||
fallthrough;
|
||||
case CMD_ELS_REQUEST64_CR:
|
||||
@ -5164,7 +5164,7 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba,
|
||||
return 1;
|
||||
fallthrough;
|
||||
case CMD_XMIT_ELS_RSP64_CX:
|
||||
if (iocb->context1 == (uint8_t *) ndlp)
|
||||
if (iocb->ndlp == ndlp)
|
||||
return 1;
|
||||
}
|
||||
} else if (pring->ringno == LPFC_FCP_RING) {
|
||||
@ -6099,7 +6099,7 @@ lpfc_free_tx(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
|
||||
*/
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) {
|
||||
if (iocb->context1 != ndlp)
|
||||
if (iocb->ndlp != ndlp)
|
||||
continue;
|
||||
|
||||
ulp_command = get_job_cmnd(phba, iocb);
|
||||
@ -6113,7 +6113,7 @@ lpfc_free_tx(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
|
||||
|
||||
/* Next check the txcmplq */
|
||||
list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
|
||||
if (iocb->context1 != ndlp)
|
||||
if (iocb->ndlp != ndlp)
|
||||
continue;
|
||||
|
||||
ulp_command = get_job_cmnd(phba, iocb);
|
||||
|
@ -4323,9 +4323,10 @@ lpfc_sli4_io_sgl_update(struct lpfc_hba *phba)
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
||||
"6074 Current allocated XRI sgl count:%d, "
|
||||
"maximum XRI count:%d\n",
|
||||
"maximum XRI count:%d els_xri_cnt:%d\n\n",
|
||||
phba->sli4_hba.io_xri_cnt,
|
||||
phba->sli4_hba.io_xri_max);
|
||||
phba->sli4_hba.io_xri_max,
|
||||
els_xri_cnt);
|
||||
|
||||
cnt = lpfc_io_buf_flush(phba, &io_sgl_list);
|
||||
|
||||
@ -4464,12 +4465,11 @@ lpfc_new_io_buf(struct lpfc_hba *phba, int num_to_alloc)
|
||||
}
|
||||
pwqeq->sli4_lxritag = lxri;
|
||||
pwqeq->sli4_xritag = phba->sli4_hba.xri_ids[lxri];
|
||||
pwqeq->context1 = lpfc_ncmd;
|
||||
|
||||
/* Initialize local short-hand pointers. */
|
||||
lpfc_ncmd->dma_sgl = lpfc_ncmd->data;
|
||||
lpfc_ncmd->dma_phys_sgl = lpfc_ncmd->dma_handle;
|
||||
lpfc_ncmd->cur_iocbq.context1 = lpfc_ncmd;
|
||||
lpfc_ncmd->cur_iocbq.io_buf = lpfc_ncmd;
|
||||
spin_lock_init(&lpfc_ncmd->buf_lock);
|
||||
|
||||
/* add the nvme buffer to a post list */
|
||||
@ -4478,7 +4478,9 @@ lpfc_new_io_buf(struct lpfc_hba *phba, int num_to_alloc)
|
||||
}
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_NVME,
|
||||
"6114 Allocate %d out of %d requested new NVME "
|
||||
"buffers\n", bcnt, num_to_alloc);
|
||||
"buffers of size x%zu bytes\n", bcnt, num_to_alloc,
|
||||
sizeof(*lpfc_ncmd));
|
||||
|
||||
|
||||
/* post the list of nvme buffer sgls to port if available */
|
||||
if (!list_empty(&post_nblist))
|
||||
|
@ -173,9 +173,9 @@ lpfc_check_elscmpl_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
void *ptr = NULL;
|
||||
u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
pcmd = cmdiocb->cmd_dmabuf;
|
||||
|
||||
/* For lpfc_els_abort, context2 could be zero'ed to delay
|
||||
/* For lpfc_els_abort, cmd_dmabuf could be zero'ed to delay
|
||||
* freeing associated memory till after ABTS completes.
|
||||
*/
|
||||
if (pcmd) {
|
||||
@ -343,7 +343,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
u32 remote_did;
|
||||
|
||||
memset(&stat, 0, sizeof (struct ls_rjt));
|
||||
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
pcmd = cmdiocb->cmd_dmabuf;
|
||||
lp = (uint32_t *) pcmd->virt;
|
||||
sp = (struct serv_parm *) ((uint8_t *) lp + sizeof (uint32_t));
|
||||
if (wwn_to_u64(sp->portName.u.wwn) == 0) {
|
||||
@ -716,7 +716,7 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
uint32_t *lp;
|
||||
uint32_t cmd;
|
||||
|
||||
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
pcmd = cmdiocb->cmd_dmabuf;
|
||||
lp = (uint32_t *) pcmd->virt;
|
||||
|
||||
cmd = *lp++;
|
||||
@ -924,7 +924,7 @@ lpfc_rcv_prli_support_check(struct lpfc_vport *vport,
|
||||
uint32_t *payload;
|
||||
uint32_t cmd;
|
||||
|
||||
payload = ((struct lpfc_dmabuf *)cmdiocb->context2)->virt;
|
||||
payload = cmdiocb->cmd_dmabuf->virt;
|
||||
cmd = *payload;
|
||||
if (vport->phba->nvmet_support) {
|
||||
/* Must be a NVME PRLI */
|
||||
@ -961,9 +961,9 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct fc_rport *rport = ndlp->rport;
|
||||
u32 roles;
|
||||
|
||||
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
lp = (uint32_t *) pcmd->virt;
|
||||
npr = (PRLI *) ((uint8_t *) lp + sizeof (uint32_t));
|
||||
pcmd = cmdiocb->cmd_dmabuf;
|
||||
lp = (uint32_t *)pcmd->virt;
|
||||
npr = (PRLI *)((uint8_t *)lp + sizeof(uint32_t));
|
||||
|
||||
if ((npr->prliType == PRLI_FCP_TYPE) ||
|
||||
(npr->prliType == PRLI_NVME_TYPE)) {
|
||||
@ -1224,7 +1224,7 @@ lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_iocbq *cmdiocb = arg;
|
||||
struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf;
|
||||
uint32_t *lp = (uint32_t *) pcmd->virt;
|
||||
struct serv_parm *sp = (struct serv_parm *) (lp + 1);
|
||||
struct ls_rjt stat;
|
||||
@ -1345,7 +1345,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
u32 did;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
@ -1357,7 +1357,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
if (ulp_status)
|
||||
goto out;
|
||||
|
||||
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
|
||||
pcmd = cmdiocb->cmd_dmabuf;
|
||||
|
||||
prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
|
||||
if (!prsp)
|
||||
@ -1703,7 +1703,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport,
|
||||
u32 ulp_status;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
@ -2158,7 +2158,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
u32 ulp_status;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
@ -2778,7 +2778,7 @@ lpfc_cmpl_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
u32 ulp_status;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
@ -2797,7 +2797,7 @@ lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
u32 ulp_status;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
@ -2833,7 +2833,7 @@ lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
u32 ulp_status;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->context_un.rsp_iocb;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
|
@ -319,8 +319,10 @@ __lpfc_nvme_ls_req_cmp(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp;
|
||||
uint32_t status;
|
||||
|
||||
pnvme_lsreq = (struct nvmefc_ls_req *)cmdwqe->context2;
|
||||
ndlp = (struct lpfc_nodelist *)cmdwqe->context1;
|
||||
pnvme_lsreq = cmdwqe->context_un.nvme_lsreq;
|
||||
ndlp = cmdwqe->ndlp;
|
||||
buf_ptr = cmdwqe->bpl_dmabuf;
|
||||
|
||||
status = bf_get(lpfc_wcqe_c_status, wcqe) & LPFC_IOCB_STATUS_MASK;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
||||
@ -330,16 +332,16 @@ __lpfc_nvme_ls_req_cmp(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
pnvme_lsreq, ndlp ? ndlp->nlp_DID : 0,
|
||||
cmdwqe->sli4_xritag, status,
|
||||
(wcqe->parameter & 0xffff),
|
||||
cmdwqe, pnvme_lsreq, cmdwqe->context3, ndlp);
|
||||
cmdwqe, pnvme_lsreq, cmdwqe->bpl_dmabuf,
|
||||
ndlp);
|
||||
|
||||
lpfc_nvmeio_data(phba, "NVMEx LS CMPL: xri x%x stat x%x parm x%x\n",
|
||||
cmdwqe->sli4_xritag, status, wcqe->parameter);
|
||||
|
||||
if (cmdwqe->context3) {
|
||||
buf_ptr = (struct lpfc_dmabuf *)cmdwqe->context3;
|
||||
if (buf_ptr) {
|
||||
lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
|
||||
kfree(buf_ptr);
|
||||
cmdwqe->context3 = NULL;
|
||||
cmdwqe->bpl_dmabuf = NULL;
|
||||
}
|
||||
if (pnvme_lsreq->done)
|
||||
pnvme_lsreq->done(pnvme_lsreq, status);
|
||||
@ -351,7 +353,7 @@ __lpfc_nvme_ls_req_cmp(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
cmdwqe->sli4_xritag, status);
|
||||
if (ndlp) {
|
||||
lpfc_nlp_put(ndlp);
|
||||
cmdwqe->context1 = NULL;
|
||||
cmdwqe->ndlp = NULL;
|
||||
}
|
||||
lpfc_sli_release_iocbq(phba, cmdwqe);
|
||||
}
|
||||
@ -407,19 +409,19 @@ lpfc_nvme_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
|
||||
/* Initialize only 64 bytes */
|
||||
memset(wqe, 0, sizeof(union lpfc_wqe));
|
||||
|
||||
genwqe->context3 = (uint8_t *)bmp;
|
||||
genwqe->bpl_dmabuf = bmp;
|
||||
genwqe->cmd_flag |= LPFC_IO_NVME_LS;
|
||||
|
||||
/* Save for completion so we can release these resources */
|
||||
genwqe->context1 = lpfc_nlp_get(ndlp);
|
||||
if (!genwqe->context1) {
|
||||
genwqe->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!genwqe->ndlp) {
|
||||
dev_warn(&phba->pcidev->dev,
|
||||
"Warning: Failed node ref, not sending LS_REQ\n");
|
||||
lpfc_sli_release_iocbq(phba, genwqe);
|
||||
return 1;
|
||||
}
|
||||
|
||||
genwqe->context2 = (uint8_t *)pnvme_lsreq;
|
||||
genwqe->context_un.nvme_lsreq = pnvme_lsreq;
|
||||
/* Fill in payload, bp points to frame payload */
|
||||
|
||||
if (!tmo)
|
||||
@ -730,7 +732,7 @@ __lpfc_nvme_ls_abort(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
spin_lock(&pring->ring_lock);
|
||||
list_for_each_entry_safe(wqe, next_wqe, &pring->txcmplq, list) {
|
||||
if (wqe->context2 == pnvme_lsreq) {
|
||||
if (wqe->context_un.nvme_lsreq == pnvme_lsreq) {
|
||||
wqe->cmd_flag |= LPFC_DRIVER_ABORTED;
|
||||
foundit = true;
|
||||
break;
|
||||
@ -929,8 +931,7 @@ static void
|
||||
lpfc_nvme_io_cmd_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
||||
struct lpfc_iocbq *pwqeOut)
|
||||
{
|
||||
struct lpfc_io_buf *lpfc_ncmd =
|
||||
(struct lpfc_io_buf *)pwqeIn->context1;
|
||||
struct lpfc_io_buf *lpfc_ncmd = pwqeIn->io_buf;
|
||||
struct lpfc_wcqe_complete *wcqe = &pwqeOut->wcqe_cmpl;
|
||||
struct lpfc_vport *vport = pwqeIn->vport;
|
||||
struct nvmefc_fcp_req *nCmd;
|
||||
@ -2717,7 +2718,7 @@ lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
||||
struct lpfc_wcqe_complete wcqe;
|
||||
struct lpfc_wcqe_complete *wcqep = &wcqe;
|
||||
|
||||
lpfc_ncmd = (struct lpfc_io_buf *)pwqeIn->context1;
|
||||
lpfc_ncmd = pwqeIn->io_buf;
|
||||
if (!lpfc_ncmd) {
|
||||
lpfc_sli_release_iocbq(phba, pwqeIn);
|
||||
return;
|
||||
|
@ -295,7 +295,7 @@ void
|
||||
__lpfc_nvme_xmt_ls_rsp_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
struct lpfc_iocbq *rspwqe)
|
||||
{
|
||||
struct lpfc_async_xchg_ctx *axchg = cmdwqe->context2;
|
||||
struct lpfc_async_xchg_ctx *axchg = cmdwqe->context_un.axchg;
|
||||
struct lpfc_wcqe_complete *wcqe = &rspwqe->wcqe_cmpl;
|
||||
struct nvmefc_ls_rsp *ls_rsp = &axchg->ls_rsp;
|
||||
uint32_t status, result;
|
||||
@ -317,9 +317,9 @@ __lpfc_nvme_xmt_ls_rsp_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
"6038 NVMEx LS rsp cmpl: %d %d oxid x%x\n",
|
||||
status, result, axchg->oxid);
|
||||
|
||||
lpfc_nlp_put(cmdwqe->context1);
|
||||
cmdwqe->context2 = NULL;
|
||||
cmdwqe->context3 = NULL;
|
||||
lpfc_nlp_put(cmdwqe->ndlp);
|
||||
cmdwqe->context_un.axchg = NULL;
|
||||
cmdwqe->bpl_dmabuf = NULL;
|
||||
lpfc_sli_release_iocbq(phba, cmdwqe);
|
||||
ls_rsp->done(ls_rsp);
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_NVME_DISC,
|
||||
@ -728,7 +728,7 @@ lpfc_nvmet_xmt_fcp_op_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
int id;
|
||||
#endif
|
||||
|
||||
ctxp = cmdwqe->context2;
|
||||
ctxp = cmdwqe->context_un.axchg;
|
||||
ctxp->flag &= ~LPFC_NVME_IO_INP;
|
||||
|
||||
rsp = &ctxp->hdlrctx.fcp_req;
|
||||
@ -903,7 +903,7 @@ __lpfc_nvme_xmt_ls_rsp(struct lpfc_async_xchg_ctx *axchg,
|
||||
/* Save numBdes for bpl2sgl */
|
||||
nvmewqeq->num_bdes = 1;
|
||||
nvmewqeq->hba_wqidx = 0;
|
||||
nvmewqeq->context3 = &dmabuf;
|
||||
nvmewqeq->bpl_dmabuf = &dmabuf;
|
||||
dmabuf.virt = &bpl;
|
||||
bpl.addrLow = nvmewqeq->wqe.xmit_sequence.bde.addrLow;
|
||||
bpl.addrHigh = nvmewqeq->wqe.xmit_sequence.bde.addrHigh;
|
||||
@ -917,7 +917,7 @@ __lpfc_nvme_xmt_ls_rsp(struct lpfc_async_xchg_ctx *axchg,
|
||||
*/
|
||||
|
||||
nvmewqeq->cmd_cmpl = xmt_ls_rsp_cmp;
|
||||
nvmewqeq->context2 = axchg;
|
||||
nvmewqeq->context_un.axchg = axchg;
|
||||
|
||||
lpfc_nvmeio_data(phba, "NVMEx LS RSP: xri x%x wqidx x%x len x%x\n",
|
||||
axchg->oxid, nvmewqeq->hba_wqidx, ls_rsp->rsplen);
|
||||
@ -925,7 +925,7 @@ __lpfc_nvme_xmt_ls_rsp(struct lpfc_async_xchg_ctx *axchg,
|
||||
rc = lpfc_sli4_issue_wqe(phba, axchg->hdwq, nvmewqeq);
|
||||
|
||||
/* clear to be sure there's no reference */
|
||||
nvmewqeq->context3 = NULL;
|
||||
nvmewqeq->bpl_dmabuf = NULL;
|
||||
|
||||
if (rc == WQE_SUCCESS) {
|
||||
/*
|
||||
@ -942,7 +942,7 @@ __lpfc_nvme_xmt_ls_rsp(struct lpfc_async_xchg_ctx *axchg,
|
||||
|
||||
rc = -ENXIO;
|
||||
|
||||
lpfc_nlp_put(nvmewqeq->context1);
|
||||
lpfc_nlp_put(nvmewqeq->ndlp);
|
||||
|
||||
out_free_buf:
|
||||
/* Give back resources */
|
||||
@ -1075,7 +1075,7 @@ lpfc_nvmet_xmt_fcp_op(struct nvmet_fc_target_port *tgtport,
|
||||
}
|
||||
|
||||
nvmewqeq->cmd_cmpl = lpfc_nvmet_xmt_fcp_op_cmp;
|
||||
nvmewqeq->context2 = ctxp;
|
||||
nvmewqeq->context_un.axchg = ctxp;
|
||||
nvmewqeq->cmd_flag |= LPFC_IO_NVMET;
|
||||
ctxp->wqeq->hba_wqidx = rsp->hwqid;
|
||||
|
||||
@ -1119,8 +1119,8 @@ lpfc_nvmet_xmt_fcp_op(struct nvmet_fc_target_port *tgtport,
|
||||
ctxp->oxid, rc);
|
||||
|
||||
ctxp->wqeq->hba_wqidx = 0;
|
||||
nvmewqeq->context2 = NULL;
|
||||
nvmewqeq->context3 = NULL;
|
||||
nvmewqeq->context_un.axchg = NULL;
|
||||
nvmewqeq->bpl_dmabuf = NULL;
|
||||
rc = -EBUSY;
|
||||
aerr:
|
||||
return rc;
|
||||
@ -1590,7 +1590,7 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba)
|
||||
/* Initialize WQE */
|
||||
memset(wqe, 0, sizeof(union lpfc_wqe));
|
||||
|
||||
ctx_buf->iocbq->context1 = NULL;
|
||||
ctx_buf->iocbq->cmd_dmabuf = NULL;
|
||||
spin_lock(&phba->sli4_hba.sgl_list_lock);
|
||||
ctx_buf->sglq = __lpfc_sli_get_nvmet_sglq(phba, ctx_buf->iocbq);
|
||||
spin_unlock(&phba->sli4_hba.sgl_list_lock);
|
||||
@ -2025,7 +2025,7 @@ lpfc_nvmet_wqfull_flush(struct lpfc_hba *phba, struct lpfc_queue *wq,
|
||||
&wq->wqfull_list, list) {
|
||||
if (ctxp) {
|
||||
/* Checking for a specific IO to flush */
|
||||
if (nvmewqeq->context2 == ctxp) {
|
||||
if (nvmewqeq->context_un.axchg == ctxp) {
|
||||
list_del(&nvmewqeq->list);
|
||||
spin_unlock_irqrestore(&pring->ring_lock,
|
||||
iflags);
|
||||
@ -2071,7 +2071,7 @@ lpfc_nvmet_wqfull_process(struct lpfc_hba *phba,
|
||||
list_remove_head(&wq->wqfull_list, nvmewqeq, struct lpfc_iocbq,
|
||||
list);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
ctxp = (struct lpfc_async_xchg_ctx *)nvmewqeq->context2;
|
||||
ctxp = nvmewqeq->context_un.axchg;
|
||||
rc = lpfc_sli4_issue_wqe(phba, ctxp->hdwq, nvmewqeq);
|
||||
spin_lock_irqsave(&pring->ring_lock, iflags);
|
||||
if (rc == -EBUSY) {
|
||||
@ -2617,10 +2617,10 @@ lpfc_nvmet_prep_ls_wqe(struct lpfc_hba *phba,
|
||||
ctxp->wqeq = nvmewqe;
|
||||
|
||||
/* prevent preparing wqe with NULL ndlp reference */
|
||||
nvmewqe->context1 = lpfc_nlp_get(ndlp);
|
||||
if (nvmewqe->context1 == NULL)
|
||||
nvmewqe->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!nvmewqe->ndlp)
|
||||
goto nvme_wqe_free_wqeq_exit;
|
||||
nvmewqe->context2 = ctxp;
|
||||
nvmewqe->context_un.axchg = ctxp;
|
||||
|
||||
wqe = &nvmewqe->wqe;
|
||||
memset(wqe, 0, sizeof(union lpfc_wqe));
|
||||
@ -2692,8 +2692,9 @@ lpfc_nvmet_prep_ls_wqe(struct lpfc_hba *phba,
|
||||
return nvmewqe;
|
||||
|
||||
nvme_wqe_free_wqeq_exit:
|
||||
nvmewqe->context2 = NULL;
|
||||
nvmewqe->context3 = NULL;
|
||||
nvmewqe->context_un.axchg = NULL;
|
||||
nvmewqe->ndlp = NULL;
|
||||
nvmewqe->bpl_dmabuf = NULL;
|
||||
lpfc_sli_release_iocbq(phba, nvmewqe);
|
||||
return NULL;
|
||||
}
|
||||
@ -2995,7 +2996,7 @@ lpfc_nvmet_prep_fcp_wqe(struct lpfc_hba *phba,
|
||||
nvmewqe->retry = 1;
|
||||
nvmewqe->vport = phba->pport;
|
||||
nvmewqe->drvrTimeout = (phba->fc_ratov * 3) + LPFC_DRVR_TIMEOUT;
|
||||
nvmewqe->context1 = ndlp;
|
||||
nvmewqe->ndlp = ndlp;
|
||||
|
||||
for_each_sg(rsp->sg, sgel, nsegs, i) {
|
||||
physaddr = sg_dma_address(sgel);
|
||||
@ -3053,7 +3054,7 @@ lpfc_nvmet_sol_fcp_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
bool released = false;
|
||||
struct lpfc_wcqe_complete *wcqe = &rspwqe->wcqe_cmpl;
|
||||
|
||||
ctxp = cmdwqe->context2;
|
||||
ctxp = cmdwqe->context_un.axchg;
|
||||
result = wcqe->parameter;
|
||||
|
||||
tgtp = (struct lpfc_nvmet_tgtport *)phba->targetport->private;
|
||||
@ -3084,8 +3085,8 @@ lpfc_nvmet_sol_fcp_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
wcqe->word0, wcqe->total_data_placed,
|
||||
result, wcqe->word3);
|
||||
|
||||
cmdwqe->context2 = NULL;
|
||||
cmdwqe->context3 = NULL;
|
||||
cmdwqe->rsp_dmabuf = NULL;
|
||||
cmdwqe->bpl_dmabuf = NULL;
|
||||
/*
|
||||
* if transport has released ctx, then can reuse it. Otherwise,
|
||||
* will be recycled by transport release call.
|
||||
@ -3123,7 +3124,7 @@ lpfc_nvmet_unsol_fcp_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
bool released = false;
|
||||
struct lpfc_wcqe_complete *wcqe = &rspwqe->wcqe_cmpl;
|
||||
|
||||
ctxp = cmdwqe->context2;
|
||||
ctxp = cmdwqe->context_un.axchg;
|
||||
result = wcqe->parameter;
|
||||
|
||||
if (!ctxp) {
|
||||
@ -3169,8 +3170,8 @@ lpfc_nvmet_unsol_fcp_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
wcqe->word0, wcqe->total_data_placed,
|
||||
result, wcqe->word3);
|
||||
|
||||
cmdwqe->context2 = NULL;
|
||||
cmdwqe->context3 = NULL;
|
||||
cmdwqe->rsp_dmabuf = NULL;
|
||||
cmdwqe->bpl_dmabuf = NULL;
|
||||
/*
|
||||
* if transport has released ctx, then can reuse it. Otherwise,
|
||||
* will be recycled by transport release call.
|
||||
@ -3203,7 +3204,7 @@ lpfc_nvmet_xmt_ls_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
uint32_t result;
|
||||
struct lpfc_wcqe_complete *wcqe = &rspwqe->wcqe_cmpl;
|
||||
|
||||
ctxp = cmdwqe->context2;
|
||||
ctxp = cmdwqe->context_un.axchg;
|
||||
result = wcqe->parameter;
|
||||
|
||||
if (phba->nvmet_support) {
|
||||
@ -3234,8 +3235,8 @@ lpfc_nvmet_xmt_ls_abort_cmp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdwqe,
|
||||
ctxp->oxid, ctxp->state, ctxp->entry_cnt);
|
||||
}
|
||||
|
||||
cmdwqe->context2 = NULL;
|
||||
cmdwqe->context3 = NULL;
|
||||
cmdwqe->rsp_dmabuf = NULL;
|
||||
cmdwqe->bpl_dmabuf = NULL;
|
||||
lpfc_sli_release_iocbq(phba, cmdwqe);
|
||||
kfree(ctxp);
|
||||
}
|
||||
@ -3322,9 +3323,9 @@ lpfc_nvmet_unsol_issue_abort(struct lpfc_hba *phba,
|
||||
OTHER_COMMAND);
|
||||
|
||||
abts_wqeq->vport = phba->pport;
|
||||
abts_wqeq->context1 = ndlp;
|
||||
abts_wqeq->context2 = ctxp;
|
||||
abts_wqeq->context3 = NULL;
|
||||
abts_wqeq->ndlp = ndlp;
|
||||
abts_wqeq->context_un.axchg = ctxp;
|
||||
abts_wqeq->bpl_dmabuf = NULL;
|
||||
abts_wqeq->num_bdes = 0;
|
||||
/* hba_wqidx should already be setup from command we are aborting */
|
||||
abts_wqeq->iocb.ulpCommand = CMD_XMIT_SEQUENCE64_CR;
|
||||
@ -3477,7 +3478,7 @@ lpfc_nvmet_sol_fcp_issue_abort(struct lpfc_hba *phba,
|
||||
abts_wqeq->hba_wqidx = ctxp->wqeq->hba_wqidx;
|
||||
abts_wqeq->cmd_cmpl = lpfc_nvmet_sol_fcp_abort_cmp;
|
||||
abts_wqeq->cmd_flag |= LPFC_IO_NVME;
|
||||
abts_wqeq->context2 = ctxp;
|
||||
abts_wqeq->context_un.axchg = ctxp;
|
||||
abts_wqeq->vport = phba->pport;
|
||||
if (!ctxp->hdwq)
|
||||
ctxp->hdwq = &phba->sli4_hba.hdwq[abts_wqeq->hba_wqidx];
|
||||
@ -3630,8 +3631,8 @@ lpfc_nvme_unsol_ls_issue_abort(struct lpfc_hba *phba,
|
||||
out:
|
||||
if (tgtp)
|
||||
atomic_inc(&tgtp->xmt_abort_rsp_error);
|
||||
abts_wqeq->context2 = NULL;
|
||||
abts_wqeq->context3 = NULL;
|
||||
abts_wqeq->rsp_dmabuf = NULL;
|
||||
abts_wqeq->bpl_dmabuf = NULL;
|
||||
lpfc_sli_release_iocbq(phba, abts_wqeq);
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"6056 Failed to Issue ABTS. Status x%x\n", rc);
|
||||
|
@ -433,7 +433,7 @@ lpfc_new_scsi_buf_s3(struct lpfc_vport *vport, int num_to_alloc)
|
||||
iocb->ulpClass = CLASS3;
|
||||
psb->status = IOSTAT_SUCCESS;
|
||||
/* Put it back into the SCSI buffer list */
|
||||
psb->cur_iocbq.context1 = psb;
|
||||
psb->cur_iocbq.io_buf = psb;
|
||||
spin_lock_init(&psb->buf_lock);
|
||||
lpfc_release_scsi_buf_s3(phba, psb);
|
||||
|
||||
@ -4082,8 +4082,7 @@ static void
|
||||
lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
||||
struct lpfc_iocbq *pwqeOut)
|
||||
{
|
||||
struct lpfc_io_buf *lpfc_cmd =
|
||||
(struct lpfc_io_buf *)pwqeIn->context1;
|
||||
struct lpfc_io_buf *lpfc_cmd = pwqeIn->io_buf;
|
||||
struct lpfc_wcqe_complete *wcqe = &pwqeOut->wcqe_cmpl;
|
||||
struct lpfc_vport *vport = pwqeIn->vport;
|
||||
struct lpfc_rport_data *rdata;
|
||||
@ -4421,7 +4420,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
||||
struct lpfc_iocbq *pIocbOut)
|
||||
{
|
||||
struct lpfc_io_buf *lpfc_cmd =
|
||||
(struct lpfc_io_buf *) pIocbIn->context1;
|
||||
(struct lpfc_io_buf *) pIocbIn->io_buf;
|
||||
struct lpfc_vport *vport = pIocbIn->vport;
|
||||
struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
|
||||
struct lpfc_nodelist *pnode = rdata->pnode;
|
||||
@ -4744,7 +4743,7 @@ static int lpfc_scsi_prep_cmnd_buf_s3(struct lpfc_vport *vport,
|
||||
piocbq->iocb.ulpFCP2Rcvy = 0;
|
||||
|
||||
piocbq->iocb.ulpClass = (pnode->nlp_fcp_info & 0x0f);
|
||||
piocbq->context1 = lpfc_cmd;
|
||||
piocbq->io_buf = lpfc_cmd;
|
||||
if (!piocbq->cmd_cmpl)
|
||||
piocbq->cmd_cmpl = lpfc_scsi_cmd_iocb_cmpl;
|
||||
piocbq->iocb.ulpTimeout = tmo;
|
||||
@ -4856,8 +4855,7 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport,
|
||||
bf_set(wqe_reqtag, &wqe->generic.wqe_com, pwqeq->iotag);
|
||||
|
||||
pwqeq->vport = vport;
|
||||
pwqeq->vport = vport;
|
||||
pwqeq->context1 = lpfc_cmd;
|
||||
pwqeq->io_buf = lpfc_cmd;
|
||||
pwqeq->hba_wqidx = lpfc_cmd->hdwq_no;
|
||||
pwqeq->cmd_cmpl = lpfc_fcp_io_cmd_wqe_cmpl;
|
||||
|
||||
@ -5098,8 +5096,7 @@ lpfc_tskmgmt_def_cmpl(struct lpfc_hba *phba,
|
||||
struct lpfc_iocbq *cmdiocbq,
|
||||
struct lpfc_iocbq *rspiocbq)
|
||||
{
|
||||
struct lpfc_io_buf *lpfc_cmd =
|
||||
(struct lpfc_io_buf *) cmdiocbq->context1;
|
||||
struct lpfc_io_buf *lpfc_cmd = cmdiocbq->io_buf;
|
||||
if (lpfc_cmd)
|
||||
lpfc_release_scsi_buf(phba, lpfc_cmd);
|
||||
return;
|
||||
@ -5916,7 +5913,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
||||
goto out_unlock_ring;
|
||||
}
|
||||
|
||||
BUG_ON(iocb->context1 != lpfc_cmd);
|
||||
WARN_ON(iocb->io_buf != lpfc_cmd);
|
||||
|
||||
/* abort issued in recovery is still in progress */
|
||||
if (iocb->cmd_flag & LPFC_DRIVER_ABORTED) {
|
||||
|
@ -1254,19 +1254,19 @@ __lpfc_sli_get_els_sglq(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq)
|
||||
|
||||
cmnd = get_job_cmnd(phba, piocbq);
|
||||
|
||||
if (piocbq->cmd_flag & LPFC_IO_FCP) {
|
||||
lpfc_cmd = (struct lpfc_io_buf *) piocbq->context1;
|
||||
if (piocbq->cmd_flag & LPFC_IO_FCP) {
|
||||
lpfc_cmd = piocbq->io_buf;
|
||||
ndlp = lpfc_cmd->rdata->pnode;
|
||||
} else if ((cmnd == CMD_GEN_REQUEST64_CR) &&
|
||||
!(piocbq->cmd_flag & LPFC_IO_LIBDFC)) {
|
||||
ndlp = piocbq->context_un.ndlp;
|
||||
ndlp = piocbq->ndlp;
|
||||
} else if (piocbq->cmd_flag & LPFC_IO_LIBDFC) {
|
||||
if (piocbq->cmd_flag & LPFC_IO_LOOPBACK)
|
||||
ndlp = NULL;
|
||||
else
|
||||
ndlp = piocbq->context_un.ndlp;
|
||||
ndlp = piocbq->ndlp;
|
||||
} else {
|
||||
ndlp = piocbq->context1;
|
||||
ndlp = piocbq->ndlp;
|
||||
}
|
||||
|
||||
spin_lock(&phba->sli4_hba.sgl_list_lock);
|
||||
@ -1996,9 +1996,9 @@ initpath:
|
||||
|
||||
sync_buf->vport = phba->pport;
|
||||
sync_buf->cmd_cmpl = lpfc_cmf_sync_cmpl;
|
||||
sync_buf->context1 = NULL;
|
||||
sync_buf->context2 = NULL;
|
||||
sync_buf->context3 = NULL;
|
||||
sync_buf->cmd_dmabuf = NULL;
|
||||
sync_buf->rsp_dmabuf = NULL;
|
||||
sync_buf->bpl_dmabuf = NULL;
|
||||
sync_buf->sli4_xritag = NO_XRI;
|
||||
|
||||
sync_buf->cmd_flag |= LPFC_IO_CMF;
|
||||
@ -3197,7 +3197,7 @@ lpfc_nvme_unsol_ls_handler(struct lpfc_hba *phba, struct lpfc_iocbq *piocb)
|
||||
uint32_t oxid, sid, did, fctl, size;
|
||||
int ret = 1;
|
||||
|
||||
d_buf = piocb->context2;
|
||||
d_buf = piocb->cmd_dmabuf;
|
||||
|
||||
nvmebuf = container_of(d_buf, struct hbq_dmabuf, dbuf);
|
||||
fc_hdr = nvmebuf->hbuf.virt;
|
||||
@ -3478,9 +3478,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
|
||||
if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
|
||||
if (irsp->ulpBdeCount != 0) {
|
||||
saveq->context2 = lpfc_sli_get_buff(phba, pring,
|
||||
saveq->cmd_dmabuf = lpfc_sli_get_buff(phba, pring,
|
||||
irsp->un.ulpWord[3]);
|
||||
if (!saveq->context2)
|
||||
if (!saveq->cmd_dmabuf)
|
||||
lpfc_printf_log(phba,
|
||||
KERN_ERR,
|
||||
LOG_SLI,
|
||||
@ -3490,9 +3490,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
irsp->un.ulpWord[3]);
|
||||
}
|
||||
if (irsp->ulpBdeCount == 2) {
|
||||
saveq->context3 = lpfc_sli_get_buff(phba, pring,
|
||||
saveq->bpl_dmabuf = lpfc_sli_get_buff(phba, pring,
|
||||
irsp->unsli3.sli3Words[7]);
|
||||
if (!saveq->context3)
|
||||
if (!saveq->bpl_dmabuf)
|
||||
lpfc_printf_log(phba,
|
||||
KERN_ERR,
|
||||
LOG_SLI,
|
||||
@ -3504,10 +3504,10 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
list_for_each_entry(iocbq, &saveq->list, list) {
|
||||
irsp = &iocbq->iocb;
|
||||
if (irsp->ulpBdeCount != 0) {
|
||||
iocbq->context2 = lpfc_sli_get_buff(phba,
|
||||
iocbq->cmd_dmabuf = lpfc_sli_get_buff(phba,
|
||||
pring,
|
||||
irsp->un.ulpWord[3]);
|
||||
if (!iocbq->context2)
|
||||
if (!iocbq->cmd_dmabuf)
|
||||
lpfc_printf_log(phba,
|
||||
KERN_ERR,
|
||||
LOG_SLI,
|
||||
@ -3517,10 +3517,10 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
irsp->un.ulpWord[3]);
|
||||
}
|
||||
if (irsp->ulpBdeCount == 2) {
|
||||
iocbq->context3 = lpfc_sli_get_buff(phba,
|
||||
iocbq->bpl_dmabuf = lpfc_sli_get_buff(phba,
|
||||
pring,
|
||||
irsp->unsli3.sli3Words[7]);
|
||||
if (!iocbq->context3)
|
||||
if (!iocbq->bpl_dmabuf)
|
||||
lpfc_printf_log(phba,
|
||||
KERN_ERR,
|
||||
LOG_SLI,
|
||||
@ -3534,12 +3534,12 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
} else {
|
||||
paddr = getPaddr(irsp->un.cont64[0].addrHigh,
|
||||
irsp->un.cont64[0].addrLow);
|
||||
saveq->context2 = lpfc_sli_ringpostbuf_get(phba, pring,
|
||||
saveq->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring,
|
||||
paddr);
|
||||
if (irsp->ulpBdeCount == 2) {
|
||||
paddr = getPaddr(irsp->un.cont64[1].addrHigh,
|
||||
irsp->un.cont64[1].addrLow);
|
||||
saveq->context3 = lpfc_sli_ringpostbuf_get(phba,
|
||||
saveq->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba,
|
||||
pring,
|
||||
paddr);
|
||||
}
|
||||
@ -10342,8 +10342,7 @@ __lpfc_sli_issue_fcp_io_s4(struct lpfc_hba *phba, uint32_t ring_number,
|
||||
struct lpfc_iocbq *piocb, uint32_t flag)
|
||||
{
|
||||
int rc;
|
||||
struct lpfc_io_buf *lpfc_cmd =
|
||||
(struct lpfc_io_buf *)piocb->context1;
|
||||
struct lpfc_io_buf *lpfc_cmd = piocb->io_buf;
|
||||
|
||||
lpfc_prep_embed_io(phba, lpfc_cmd);
|
||||
rc = lpfc_sli4_issue_wqe(phba, lpfc_cmd->hdwq, piocb);
|
||||
@ -10989,7 +10988,7 @@ lpfc_sli4_calc_ring(struct lpfc_hba *phba, struct lpfc_iocbq *piocb)
|
||||
* be setup based on what work queue we used.
|
||||
*/
|
||||
if (!(piocb->cmd_flag & LPFC_USE_FCPWQIDX)) {
|
||||
lpfc_cmd = (struct lpfc_io_buf *)piocb->context1;
|
||||
lpfc_cmd = piocb->io_buf;
|
||||
piocb->hba_wqidx = lpfc_cmd->hdwq_no;
|
||||
}
|
||||
return phba->sli4_hba.hdwq[piocb->hba_wqidx].io_wq->pring;
|
||||
@ -12063,7 +12062,7 @@ void
|
||||
lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_nodelist *ndlp = NULL;
|
||||
struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
|
||||
IOCB_t *irsp;
|
||||
LPFC_MBOXQ_t *mbox;
|
||||
struct lpfc_dmabuf *mp;
|
||||
@ -12098,20 +12097,17 @@ lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* ELS cmd tag <ulpIoTag> completes */
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
|
||||
"0139 Ignoring ELS cmd code x%x completion Data: "
|
||||
"x%x x%x x%x\n",
|
||||
ulp_command, ulp_status, ulp_word4, iotag);
|
||||
|
||||
"x%x x%x x%x x%px\n",
|
||||
ulp_command, ulp_status, ulp_word4, iotag,
|
||||
cmdiocb->ndlp);
|
||||
/*
|
||||
* Deref the ndlp after free_iocb. sli_release_iocb will access the ndlp
|
||||
* if exchange is busy.
|
||||
*/
|
||||
if (ulp_command == CMD_GEN_REQUEST64_CR) {
|
||||
ndlp = cmdiocb->context_un.ndlp;
|
||||
if (ulp_command == CMD_GEN_REQUEST64_CR)
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
} else {
|
||||
ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
|
||||
else
|
||||
lpfc_els_free_iocb(phba, cmdiocb);
|
||||
}
|
||||
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
@ -12192,7 +12188,7 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
} else {
|
||||
iotag = cmdiocb->iocb.ulpIoTag;
|
||||
if (pring->ringno == LPFC_ELS_RING) {
|
||||
ndlp = (struct lpfc_nodelist *)(cmdiocb->context1);
|
||||
ndlp = cmdiocb->ndlp;
|
||||
ulp_context = ndlp->nlp_rpi;
|
||||
} else {
|
||||
ulp_context = cmdiocb->iocb.ulpContext;
|
||||
@ -12650,7 +12646,7 @@ lpfc_sli_abort_taskmgmt(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
|
||||
} else {
|
||||
iotag = iocbq->iocb.ulpIoTag;
|
||||
if (pring->ringno == LPFC_ELS_RING) {
|
||||
ndlp = (struct lpfc_nodelist *)(iocbq->context1);
|
||||
ndlp = iocbq->ndlp;
|
||||
ulp_context = ndlp->nlp_rpi;
|
||||
} else {
|
||||
ulp_context = iocbq->iocb.ulpContext;
|
||||
@ -12755,8 +12751,8 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba,
|
||||
|
||||
/* Copy the contents of the local rspiocb into the caller's buffer. */
|
||||
cmdiocbq->cmd_flag |= LPFC_IO_WAKE;
|
||||
if (cmdiocbq->context2 && rspiocbq)
|
||||
memcpy((char *)cmdiocbq->context2 + offset,
|
||||
if (cmdiocbq->rsp_iocb && rspiocbq)
|
||||
memcpy((char *)cmdiocbq->rsp_iocb + offset,
|
||||
(char *)rspiocbq + offset, sizeof(*rspiocbq) - offset);
|
||||
|
||||
/* Set the exchange busy flag for task management commands */
|
||||
@ -12864,13 +12860,13 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
|
||||
} else
|
||||
pring = &phba->sli.sli3_ring[ring_number];
|
||||
/*
|
||||
* If the caller has provided a response iocbq buffer, then context2
|
||||
* If the caller has provided a response iocbq buffer, then rsp_iocb
|
||||
* is NULL or its an error.
|
||||
*/
|
||||
if (prspiocbq) {
|
||||
if (piocb->context2)
|
||||
if (piocb->rsp_iocb)
|
||||
return IOCB_ERROR;
|
||||
piocb->context2 = prspiocbq;
|
||||
piocb->rsp_iocb = prspiocbq;
|
||||
}
|
||||
|
||||
piocb->wait_cmd_cmpl = piocb->cmd_cmpl;
|
||||
@ -12954,7 +12950,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
|
||||
}
|
||||
|
||||
if (prspiocbq)
|
||||
piocb->context2 = NULL;
|
||||
piocb->rsp_iocb = NULL;
|
||||
|
||||
piocb->context_un.wait_queue = NULL;
|
||||
piocb->cmd_cmpl = NULL;
|
||||
@ -18528,11 +18524,8 @@ lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba,
|
||||
struct lpfc_iocbq *cmd_iocbq,
|
||||
struct lpfc_iocbq *rsp_iocbq)
|
||||
{
|
||||
struct lpfc_nodelist *ndlp;
|
||||
|
||||
if (cmd_iocbq) {
|
||||
ndlp = (struct lpfc_nodelist *)cmd_iocbq->context1;
|
||||
lpfc_nlp_put(ndlp);
|
||||
lpfc_nlp_put(cmd_iocbq->ndlp);
|
||||
lpfc_sli_release_iocbq(phba, cmd_iocbq);
|
||||
}
|
||||
|
||||
@ -18616,8 +18609,8 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_vport *vport,
|
||||
/* Extract the F_CTL field from FC_HDR */
|
||||
fctl = sli4_fctl_from_fc_hdr(fc_hdr);
|
||||
|
||||
ctiocb->context1 = lpfc_nlp_get(ndlp);
|
||||
if (!ctiocb->context1) {
|
||||
ctiocb->ndlp = lpfc_nlp_get(ndlp);
|
||||
if (!ctiocb->ndlp) {
|
||||
lpfc_sli_release_iocbq(phba, ctiocb);
|
||||
return;
|
||||
}
|
||||
@ -18708,7 +18701,7 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_vport *vport,
|
||||
ctiocb->abort_rctl, oxid,
|
||||
phba->link_state);
|
||||
lpfc_nlp_put(ndlp);
|
||||
ctiocb->context1 = NULL;
|
||||
ctiocb->ndlp = NULL;
|
||||
lpfc_sli_release_iocbq(phba, ctiocb);
|
||||
}
|
||||
}
|
||||
@ -18860,8 +18853,8 @@ lpfc_prep_seq(struct lpfc_vport *vport, struct hbq_dmabuf *seq_dmabuf)
|
||||
tot_len = bf_get(lpfc_rcqe_length,
|
||||
&seq_dmabuf->cq_event.cqe.rcqe_cmpl);
|
||||
|
||||
first_iocbq->context2 = &seq_dmabuf->dbuf;
|
||||
first_iocbq->context3 = NULL;
|
||||
first_iocbq->cmd_dmabuf = &seq_dmabuf->dbuf;
|
||||
first_iocbq->bpl_dmabuf = NULL;
|
||||
/* Keep track of the BDE count */
|
||||
first_iocbq->wcqe_cmpl.word3 = 1;
|
||||
|
||||
@ -18885,8 +18878,8 @@ lpfc_prep_seq(struct lpfc_vport *vport, struct hbq_dmabuf *seq_dmabuf)
|
||||
lpfc_in_buf_free(vport->phba, d_buf);
|
||||
continue;
|
||||
}
|
||||
if (!iocbq->context3) {
|
||||
iocbq->context3 = d_buf;
|
||||
if (!iocbq->bpl_dmabuf) {
|
||||
iocbq->bpl_dmabuf = d_buf;
|
||||
iocbq->wcqe_cmpl.word3++;
|
||||
/* We need to get the size out of the right CQE */
|
||||
hbq_buf = container_of(d_buf, struct hbq_dmabuf, dbuf);
|
||||
@ -18912,8 +18905,8 @@ lpfc_prep_seq(struct lpfc_vport *vport, struct hbq_dmabuf *seq_dmabuf)
|
||||
hbq_buf = container_of(d_buf, struct hbq_dmabuf, dbuf);
|
||||
len = bf_get(lpfc_rcqe_length,
|
||||
&hbq_buf->cq_event.cqe.rcqe_cmpl);
|
||||
iocbq->context2 = d_buf;
|
||||
iocbq->context3 = NULL;
|
||||
iocbq->cmd_dmabuf = d_buf;
|
||||
iocbq->bpl_dmabuf = NULL;
|
||||
iocbq->wcqe_cmpl.word3 = 1;
|
||||
|
||||
if (len > LPFC_DATA_BUF_SIZE)
|
||||
@ -18978,7 +18971,7 @@ static void
|
||||
lpfc_sli4_mds_loopback_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
struct lpfc_iocbq *rspiocb)
|
||||
{
|
||||
struct lpfc_dmabuf *pcmd = cmdiocb->context2;
|
||||
struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf;
|
||||
|
||||
if (pcmd && pcmd->virt)
|
||||
dma_pool_free(phba->lpfc_drb_pool, pcmd->virt, pcmd->phys);
|
||||
@ -19029,7 +19022,7 @@ lpfc_sli4_handle_mds_loopback(struct lpfc_vport *vport,
|
||||
/* copyin the payload */
|
||||
memcpy(pcmd->virt, dmabuf->dbuf.virt, frame_len);
|
||||
|
||||
iocbq->context2 = pcmd;
|
||||
iocbq->cmd_dmabuf = pcmd;
|
||||
iocbq->vport = vport;
|
||||
iocbq->cmd_flag &= ~LPFC_FIP_ELS_ID_MASK;
|
||||
iocbq->cmd_flag |= LPFC_USE_FCPWQIDX;
|
||||
@ -20904,8 +20897,8 @@ lpfc_wqe_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeq,
|
||||
* have not been byteswapped yet so there is no
|
||||
* need to swap them back.
|
||||
*/
|
||||
if (pwqeq->context3)
|
||||
dmabuf = (struct lpfc_dmabuf *)pwqeq->context3;
|
||||
if (pwqeq->bpl_dmabuf)
|
||||
dmabuf = pwqeq->bpl_dmabuf;
|
||||
else
|
||||
return xritag;
|
||||
|
||||
@ -21057,7 +21050,7 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
|
||||
wq = qp->io_wq;
|
||||
pring = wq->pring;
|
||||
|
||||
ctxp = pwqe->context2;
|
||||
ctxp = pwqe->context_un.axchg;
|
||||
sglq = ctxp->ctxbuf->sglq;
|
||||
if (pwqe->sli4_xritag == NO_XRI) {
|
||||
pwqe->sli4_lxritag = sglq->sli4_lxritag;
|
||||
@ -22252,7 +22245,6 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
u32 fip, abort_tag;
|
||||
struct lpfc_nodelist *ndlp = NULL;
|
||||
union lpfc_wqe128 *wqe = &job->wqe;
|
||||
struct lpfc_dmabuf *context2;
|
||||
u32 els_id = LPFC_ELS_ID_DEFAULT;
|
||||
u8 command_type = ELS_COMMAND_NON_FIP;
|
||||
|
||||
@ -22270,10 +22262,7 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
|
||||
switch (cmnd) {
|
||||
case CMD_ELS_REQUEST64_WQE:
|
||||
if (job->cmd_flag & LPFC_IO_LIBDFC)
|
||||
ndlp = job->context_un.ndlp;
|
||||
else
|
||||
ndlp = (struct lpfc_nodelist *)job->context1;
|
||||
ndlp = job->ndlp;
|
||||
|
||||
/* CCP CCPE PV PRI in word10 were set in the memcpy */
|
||||
if (command_type == ELS_COMMAND_FIP)
|
||||
@ -22283,8 +22272,7 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
if_type = bf_get(lpfc_sli_intf_if_type,
|
||||
&phba->sli4_hba.sli_intf);
|
||||
if (if_type >= LPFC_SLI_INTF_IF_TYPE_2) {
|
||||
context2 = (struct lpfc_dmabuf *)job->context2;
|
||||
pcmd = (u32 *)context2->virt;
|
||||
pcmd = (u32 *)job->cmd_dmabuf->virt;
|
||||
if (pcmd && (*pcmd == ELS_CMD_FLOGI ||
|
||||
*pcmd == ELS_CMD_SCR ||
|
||||
*pcmd == ELS_CMD_RDF ||
|
||||
@ -22307,7 +22295,7 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
bf_set(wqe_ct, &wqe->els_req.wqe_com, 1);
|
||||
bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
|
||||
phba->vpi_ids[job->vport->vpi]);
|
||||
} else if (pcmd) {
|
||||
} else if (pcmd && ndlp) {
|
||||
bf_set(wqe_ct, &wqe->els_req.wqe_com, 0);
|
||||
bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
|
||||
phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]);
|
||||
@ -22325,7 +22313,7 @@ lpfc_sli_prep_wqe(struct lpfc_hba *phba, struct lpfc_iocbq *job)
|
||||
bf_set(wqe_ebde_cnt, &wqe->els_req.wqe_com, 0);
|
||||
break;
|
||||
case CMD_XMIT_ELS_RSP64_WQE:
|
||||
ndlp = (struct lpfc_nodelist *)job->context1;
|
||||
ndlp = job->ndlp;
|
||||
|
||||
/* word4 */
|
||||
wqe->xmit_els_rsp.word4 = 0;
|
||||
|
@ -77,11 +77,15 @@ struct lpfc_iocbq {
|
||||
|
||||
u32 unsol_rcv_len; /* Receive len in usol path */
|
||||
|
||||
uint8_t num_bdes;
|
||||
uint8_t abort_bls; /* ABTS by initiator or responder */
|
||||
u8 abort_rctl; /* ACC or RJT flag */
|
||||
uint8_t priority; /* OAS priority */
|
||||
uint8_t retry; /* retry counter for IOCB cmd - if needed */
|
||||
/* Pack the u8's together and make them module-4. */
|
||||
u8 num_bdes; /* Number of BDEs */
|
||||
u8 abort_bls; /* ABTS by initiator or responder */
|
||||
u8 abort_rctl; /* ACC or RJT flag */
|
||||
u8 priority; /* OAS priority */
|
||||
u8 retry; /* retry counter for IOCB cmd - if needed */
|
||||
u8 rsvd1; /* Pad for u32 */
|
||||
u8 rsvd2; /* Pad for u32 */
|
||||
u8 rsvd3; /* Pad for u32 */
|
||||
|
||||
u32 cmd_flag;
|
||||
#define LPFC_IO_LIBDFC 1 /* libdfc iocb */
|
||||
@ -116,18 +120,22 @@ struct lpfc_iocbq {
|
||||
|
||||
uint32_t drvrTimeout; /* driver timeout in seconds */
|
||||
struct lpfc_vport *vport;/* virtual port pointer */
|
||||
void *context1; /* caller context information */
|
||||
void *context2; /* caller context information */
|
||||
void *context3; /* caller context information */
|
||||
struct lpfc_dmabuf *cmd_dmabuf;
|
||||
struct lpfc_dmabuf *rsp_dmabuf;
|
||||
struct lpfc_dmabuf *bpl_dmabuf;
|
||||
uint32_t event_tag; /* LA Event tag */
|
||||
union {
|
||||
wait_queue_head_t *wait_queue;
|
||||
struct lpfc_iocbq *rsp_iocb;
|
||||
struct lpfcMboxq *mbox;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
struct lpfc_node_rrq *rrq;
|
||||
struct nvmefc_ls_req *nvme_lsreq;
|
||||
struct lpfc_async_xchg_ctx *axchg;
|
||||
struct bsg_job_data *dd_data;
|
||||
} context_un;
|
||||
|
||||
struct lpfc_io_buf *io_buf;
|
||||
struct lpfc_iocbq *rsp_iocb;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
union lpfc_vmid_tag vmid_tag;
|
||||
void (*fabric_cmd_cmpl)(struct lpfc_hba *phba, struct lpfc_iocbq *cmd,
|
||||
struct lpfc_iocbq *rsp);
|
||||
|
Reference in New Issue
Block a user