提交 cad93a08 编写于 作者: J James Smart 提交者: Martin K. Petersen

scsi: lpfc: SLI path split: Refactor PLOGI/PRLI/ADISC/LOGO paths

This patch refactors the PLOGI/PRLI/ADISC/LOGO paths to use SLI-4 as
the primary interface:

 - Conversion away from using SLI-3 iocb structures to set/access fields in
   common routines. Use the new generic get/set routines that were added.
   This move changes code from indirect structure references to using local
   variables with the generic routines.

 - Refactor routines when setting non-generic fields, to have both SLI3 and
   SLI4 specific sections. This replaces the set-as-SLI3 then translate to
   SLI4 behavior of the past.

Link: https://lore.kernel.org/r/20220225022308.16486-6-jsmart2021@gmail.comCo-developed-by: NJustin Tee <justin.tee@broadcom.com>
Signed-off-by: NJustin Tee <justin.tee@broadcom.com>
Signed-off-by: NJames Smart <jsmart2021@gmail.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 6831ce12
...@@ -1840,6 +1840,15 @@ u16 get_job_ulpcontext(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) ...@@ -1840,6 +1840,15 @@ u16 get_job_ulpcontext(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
return iocbq->iocb.ulpContext; return iocbq->iocb.ulpContext;
} }
static inline
u16 get_job_rcvoxid(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
{
if (phba->sli_rev == LPFC_SLI_REV4)
return bf_get(wqe_rcvoxid, &iocbq->wqe.generic.wqe_com);
else
return iocbq->iocb.unsli3.rcvsli3.ox_id;
}
static inline static inline
u32 get_job_els_rsp64_did(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) u32 get_job_els_rsp64_did(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
{ {
......
...@@ -1979,24 +1979,32 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -1979,24 +1979,32 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
struct lpfc_dmabuf *prsp; struct lpfc_dmabuf *prsp;
int disc; int disc;
struct serv_parm *sp = NULL; struct serv_parm *sp = NULL;
u32 ulp_status, ulp_word4, did, iotag;
/* we pass cmdiocb to state machine which needs rspiocb as well */ /* we pass cmdiocb to state machine which needs rspiocb as well */
cmdiocb->context_un.rsp_iocb = rspiocb; cmdiocb->context_un.rsp_iocb = rspiocb;
irsp = &rspiocb->iocb; ulp_status = get_job_ulpstatus(phba, rspiocb);
ulp_word4 = get_job_word4(phba, rspiocb);
did = get_job_els_rsp64_did(phba, cmdiocb);
if (phba->sli_rev == LPFC_SLI_REV4) {
iotag = get_wqe_reqtag(cmdiocb);
} else {
irsp = &rspiocb->iocb;
iotag = irsp->ulpIoTag;
}
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
"PLOGI cmpl: status:x%x/x%x did:x%x", "PLOGI cmpl: status:x%x/x%x did:x%x",
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4, did);
irsp->un.elsreq64.remoteID);
ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID); ndlp = lpfc_findnode_did(vport, did);
if (!ndlp) { if (!ndlp) {
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
"0136 PLOGI completes to NPort x%x " "0136 PLOGI completes to NPort x%x "
"with no ndlp. Data: x%x x%x x%x\n", "with no ndlp. Data: x%x x%x x%x\n",
irsp->un.elsreq64.remoteID, did, ulp_status, ulp_word4, iotag);
irsp->ulpStatus, irsp->un.ulpWord[4],
irsp->ulpIoTag);
goto out_freeiocb; goto out_freeiocb;
} }
...@@ -2013,7 +2021,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2013,7 +2021,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
"0102 PLOGI completes to NPort x%06x " "0102 PLOGI completes to NPort x%06x "
"Data: x%x x%x x%x x%x x%x\n", "Data: x%x x%x x%x x%x x%x\n",
ndlp->nlp_DID, ndlp->nlp_fc4_type, ndlp->nlp_DID, ndlp->nlp_fc4_type,
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4,
disc, vport->num_disc_nodes); disc, vport->num_disc_nodes);
/* Check to see if link went down during discovery */ /* Check to see if link went down during discovery */
...@@ -2024,7 +2032,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2024,7 +2032,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
goto out; goto out;
} }
if (irsp->ulpStatus) { if (ulp_status) {
/* Check for retry */ /* Check for retry */
if (lpfc_els_retry(phba, cmdiocb, rspiocb)) { if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
/* ELS command is being retried */ /* ELS command is being retried */
...@@ -2036,17 +2044,18 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2036,17 +2044,18 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
goto out; goto out;
} }
/* PLOGI failed Don't print the vport to vport rjts */ /* PLOGI failed Don't print the vport to vport rjts */
if (irsp->ulpStatus != IOSTAT_LS_RJT || if (ulp_status != IOSTAT_LS_RJT ||
(((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) && (((ulp_word4) >> 16 != LSRJT_INVALID_CMD) &&
((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) || ((ulp_word4) >> 16 != LSRJT_UNABLE_TPC)) ||
(phba)->pport->cfg_log_verbose & LOG_ELS) (phba)->pport->cfg_log_verbose & LOG_ELS)
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
"2753 PLOGI failure DID:%06X Status:x%x/x%x\n", "2753 PLOGI failure DID:%06X "
ndlp->nlp_DID, irsp->ulpStatus, "Status:x%x/x%x\n",
irsp->un.ulpWord[4]); ndlp->nlp_DID, ulp_status,
ulp_word4);
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */ /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
if (!lpfc_error_lost_link(irsp->ulpStatus, irsp->un.ulpWord[4])) if (!lpfc_error_lost_link(ulp_status, ulp_word4))
lpfc_disc_state_machine(vport, ndlp, cmdiocb, lpfc_disc_state_machine(vport, ndlp, cmdiocb,
NLP_EVT_CMPL_PLOGI); NLP_EVT_CMPL_PLOGI);
...@@ -2277,16 +2286,20 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2277,16 +2286,20 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
struct lpfc_iocbq *rspiocb) struct lpfc_iocbq *rspiocb)
{ {
struct lpfc_vport *vport = cmdiocb->vport; struct lpfc_vport *vport = cmdiocb->vport;
IOCB_t *irsp;
struct lpfc_nodelist *ndlp; struct lpfc_nodelist *ndlp;
char *mode; char *mode;
u32 loglevel; u32 loglevel;
u32 ulp_status;
u32 ulp_word4;
/* we pass cmdiocb to state machine which needs rspiocb as well */ /* we pass cmdiocb to state machine which needs rspiocb as well */
cmdiocb->context_un.rsp_iocb = rspiocb; cmdiocb->context_un.rsp_iocb = rspiocb;
irsp = &(rspiocb->iocb);
ndlp = (struct lpfc_nodelist *) cmdiocb->context1; ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
ulp_status = get_job_ulpstatus(phba, rspiocb);
ulp_word4 = get_job_word4(phba, rspiocb);
spin_lock_irq(&ndlp->lock); spin_lock_irq(&ndlp->lock);
ndlp->nlp_flag &= ~NLP_PRLI_SND; ndlp->nlp_flag &= ~NLP_PRLI_SND;
...@@ -2297,21 +2310,21 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2297,21 +2310,21 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
"PRLI cmpl: status:x%x/x%x did:x%x", "PRLI cmpl: status:x%x/x%x did:x%x",
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4,
ndlp->nlp_DID); ndlp->nlp_DID);
/* PRLI completes to NPort <nlp_DID> */ /* PRLI completes to NPort <nlp_DID> */
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"0103 PRLI completes to NPort x%06x " "0103 PRLI completes to NPort x%06x "
"Data: x%x x%x x%x x%x\n", "Data: x%x x%x x%x x%x\n",
ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4], ndlp->nlp_DID, ulp_status, ulp_word4,
vport->num_disc_nodes, ndlp->fc4_prli_sent); vport->num_disc_nodes, ndlp->fc4_prli_sent);
/* Check to see if link went down during discovery */ /* Check to see if link went down during discovery */
if (lpfc_els_chk_latt(vport)) if (lpfc_els_chk_latt(vport))
goto out; goto out;
if (irsp->ulpStatus) { if (ulp_status) {
/* Check for retry */ /* Check for retry */
if (lpfc_els_retry(phba, cmdiocb, rspiocb)) { if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
/* ELS command is being retried */ /* ELS command is being retried */
...@@ -2334,11 +2347,11 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2334,11 +2347,11 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
lpfc_printf_vlog(vport, mode, loglevel, lpfc_printf_vlog(vport, mode, loglevel,
"2754 PRLI failure DID:%06X Status:x%x/x%x, " "2754 PRLI failure DID:%06X Status:x%x/x%x, "
"data: x%x\n", "data: x%x\n",
ndlp->nlp_DID, irsp->ulpStatus, ndlp->nlp_DID, ulp_status,
irsp->un.ulpWord[4], ndlp->fc4_prli_sent); ulp_word4, ndlp->fc4_prli_sent);
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */ /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
if (!lpfc_error_lost_link(irsp->ulpStatus, irsp->un.ulpWord[4])) if (!lpfc_error_lost_link(ulp_status, ulp_word4))
lpfc_disc_state_machine(vport, ndlp, cmdiocb, lpfc_disc_state_machine(vport, ndlp, cmdiocb,
NLP_EVT_CMPL_PRLI); NLP_EVT_CMPL_PRLI);
...@@ -2732,16 +2745,26 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2732,16 +2745,26 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
IOCB_t *irsp; IOCB_t *irsp;
struct lpfc_nodelist *ndlp; struct lpfc_nodelist *ndlp;
int disc; int disc;
u32 ulp_status, ulp_word4, tmo;
/* we pass cmdiocb to state machine which needs rspiocb as well */ /* we pass cmdiocb to state machine which needs rspiocb as well */
cmdiocb->context_un.rsp_iocb = rspiocb; cmdiocb->context_un.rsp_iocb = rspiocb;
irsp = &(rspiocb->iocb);
ndlp = (struct lpfc_nodelist *) cmdiocb->context1; ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
ulp_status = get_job_ulpstatus(phba, rspiocb);
ulp_word4 = get_job_word4(phba, rspiocb);
if (phba->sli_rev == LPFC_SLI_REV4) {
tmo = get_wqe_tmo(cmdiocb);
} else {
irsp = &rspiocb->iocb;
tmo = irsp->ulpTimeout;
}
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
"ADISC cmpl: status:x%x/x%x did:x%x", "ADISC cmpl: status:x%x/x%x did:x%x",
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4,
ndlp->nlp_DID); ndlp->nlp_DID);
/* Since ndlp can be freed in the disc state machine, note if this node /* Since ndlp can be freed in the disc state machine, note if this node
...@@ -2755,8 +2778,8 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2755,8 +2778,8 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"0104 ADISC completes to NPort x%x " "0104 ADISC completes to NPort x%x "
"Data: x%x x%x x%x x%x x%x\n", "Data: x%x x%x x%x x%x x%x\n",
ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4], ndlp->nlp_DID, ulp_status, ulp_word4,
irsp->ulpTimeout, disc, vport->num_disc_nodes); tmo, disc, vport->num_disc_nodes);
/* Check to see if link went down during discovery */ /* Check to see if link went down during discovery */
if (lpfc_els_chk_latt(vport)) { if (lpfc_els_chk_latt(vport)) {
spin_lock_irq(&ndlp->lock); spin_lock_irq(&ndlp->lock);
...@@ -2765,7 +2788,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2765,7 +2788,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
goto out; goto out;
} }
if (irsp->ulpStatus) { if (ulp_status) {
/* Check for retry */ /* Check for retry */
if (lpfc_els_retry(phba, cmdiocb, rspiocb)) { if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
/* ELS command is being retried */ /* ELS command is being retried */
...@@ -2780,11 +2803,10 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2780,11 +2803,10 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
/* ADISC failed */ /* ADISC failed */
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
"2755 ADISC failure DID:%06X Status:x%x/x%x\n", "2755 ADISC failure DID:%06X Status:x%x/x%x\n",
ndlp->nlp_DID, irsp->ulpStatus, ndlp->nlp_DID, ulp_status,
irsp->un.ulpWord[4]); ulp_word4);
lpfc_disc_state_machine(vport, ndlp, cmdiocb, lpfc_disc_state_machine(vport, ndlp, cmdiocb,
NLP_EVT_CMPL_ADISC); NLP_EVT_CMPL_ADISC);
/* As long as this node is not registered with the SCSI or NVMe /* As long as this node is not registered with the SCSI or NVMe
* transport, it is no longer an active node. Otherwise * transport, it is no longer an active node. Otherwise
...@@ -2912,11 +2934,23 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2912,11 +2934,23 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
unsigned long flags; unsigned long flags;
uint32_t skip_recovery = 0; uint32_t skip_recovery = 0;
int wake_up_waiter = 0; int wake_up_waiter = 0;
u32 ulp_status;
u32 ulp_word4;
u32 tmo;
/* we pass cmdiocb to state machine which needs rspiocb as well */ /* we pass cmdiocb to state machine which needs rspiocb as well */
cmdiocb->context_un.rsp_iocb = rspiocb; cmdiocb->context_un.rsp_iocb = rspiocb;
irsp = &(rspiocb->iocb); ulp_status = get_job_ulpstatus(phba, rspiocb);
ulp_word4 = get_job_word4(phba, rspiocb);
if (phba->sli_rev == LPFC_SLI_REV4) {
tmo = get_wqe_tmo(cmdiocb);
} else {
irsp = &rspiocb->iocb;
tmo = irsp->ulpTimeout;
}
spin_lock_irq(&ndlp->lock); spin_lock_irq(&ndlp->lock);
ndlp->nlp_flag &= ~NLP_LOGO_SND; ndlp->nlp_flag &= ~NLP_LOGO_SND;
if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
...@@ -2927,7 +2961,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2927,7 +2961,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
"LOGO cmpl: status:x%x/x%x did:x%x", "LOGO cmpl: status:x%x/x%x did:x%x",
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4,
ndlp->nlp_DID); ndlp->nlp_DID);
/* LOGO completes to NPort <nlp_DID> */ /* LOGO completes to NPort <nlp_DID> */
...@@ -2935,8 +2969,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2935,8 +2969,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
"0105 LOGO completes to NPort x%x " "0105 LOGO completes to NPort x%x "
"refcnt %d nflags x%x Data: x%x x%x x%x x%x\n", "refcnt %d nflags x%x Data: x%x x%x x%x x%x\n",
ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag, ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
irsp->ulpStatus, irsp->un.ulpWord[4], ulp_status, ulp_word4,
irsp->ulpTimeout, vport->num_disc_nodes); tmo, vport->num_disc_nodes);
if (lpfc_els_chk_latt(vport)) { if (lpfc_els_chk_latt(vport)) {
skip_recovery = 1; skip_recovery = 1;
...@@ -2948,14 +2982,15 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -2948,14 +2982,15 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
* all acceptable. Note the failure and move forward with * all acceptable. Note the failure and move forward with
* discovery. The PLOGI will retry. * discovery. The PLOGI will retry.
*/ */
if (irsp->ulpStatus) { if (ulp_status) {
/* LOGO failed */ /* LOGO failed */
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
"2756 LOGO failure, No Retry DID:%06X Status:x%x/x%x\n", "2756 LOGO failure, No Retry DID:%06X "
ndlp->nlp_DID, irsp->ulpStatus, "Status:x%x/x%x\n",
irsp->un.ulpWord[4]); ndlp->nlp_DID, ulp_status,
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */ ulp_word4);
if (lpfc_error_lost_link(irsp->ulpStatus, irsp->un.ulpWord[4])) {
if (lpfc_error_lost_link(ulp_status, ulp_word4)) {
skip_recovery = 1; skip_recovery = 1;
goto out; goto out;
} }
...@@ -3010,8 +3045,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -3010,8 +3045,8 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"3187 LOGO completes to NPort x%x: Start " "3187 LOGO completes to NPort x%x: Start "
"Recovery Data: x%x x%x x%x x%x\n", "Recovery Data: x%x x%x x%x x%x\n",
ndlp->nlp_DID, irsp->ulpStatus, ndlp->nlp_DID, ulp_status,
irsp->un.ulpWord[4], irsp->ulpTimeout, ulp_word4, tmo,
vport->num_disc_nodes); vport->num_disc_nodes);
lpfc_disc_start(vport); lpfc_disc_start(vport);
return; return;
...@@ -5374,6 +5409,8 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5374,6 +5409,8 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
IOCB_t *icmd; IOCB_t *icmd;
IOCB_t *oldcmd; IOCB_t *oldcmd;
union lpfc_wqe128 *wqe;
union lpfc_wqe128 *oldwqe = &oldiocb->wqe;
struct lpfc_iocbq *elsiocb; struct lpfc_iocbq *elsiocb;
uint8_t *pcmd; uint8_t *pcmd;
struct serv_parm *sp; struct serv_parm *sp;
...@@ -5382,8 +5419,6 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5382,8 +5419,6 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
ELS_PKT *els_pkt_ptr; ELS_PKT *els_pkt_ptr;
struct fc_els_rdf_resp *rdf_resp; struct fc_els_rdf_resp *rdf_resp;
oldcmd = &oldiocb->iocb;
switch (flag) { switch (flag) {
case ELS_CMD_ACC: case ELS_CMD_ACC:
cmdsize = sizeof(uint32_t); cmdsize = sizeof(uint32_t);
...@@ -5396,9 +5431,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5396,9 +5431,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
return 1; return 1;
} }
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ wqe = &elsiocb->wqe;
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; /* XRI / rx_id */
bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_ctxt_tag,
&oldwqe->xmit_els_rsp.wqe_com));
/* oxid */
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_rcvoxid,
&oldwqe->xmit_els_rsp.wqe_com));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
*((uint32_t *) (pcmd)) = ELS_CMD_ACC; *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
pcmd += sizeof(uint32_t); pcmd += sizeof(uint32_t);
...@@ -5415,9 +5466,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5415,9 +5466,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
if (!elsiocb) if (!elsiocb)
return 1; return 1;
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ wqe = &elsiocb->wqe;
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; /* XRI / rx_id */
bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_ctxt_tag,
&oldwqe->xmit_els_rsp.wqe_com));
/* oxid */
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_rcvoxid,
&oldwqe->xmit_els_rsp.wqe_com));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
if (mbox) if (mbox)
...@@ -5477,9 +5544,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5477,9 +5544,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
if (!elsiocb) if (!elsiocb)
return 1; return 1;
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ wqe = &elsiocb->wqe;
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; /* XRI / rx_id */
bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_ctxt_tag,
&oldwqe->xmit_els_rsp.wqe_com));
/* oxid */
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_rcvoxid,
&oldwqe->xmit_els_rsp.wqe_com));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt); pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt, memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt,
...@@ -5499,9 +5582,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, ...@@ -5499,9 +5582,25 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
if (!elsiocb) if (!elsiocb)
return 1; return 1;
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ wqe = &elsiocb->wqe;
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; /* XRI / rx_id */
bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_ctxt_tag,
&oldwqe->xmit_els_rsp.wqe_com));
/* oxid */
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
bf_get(wqe_rcvoxid,
&oldwqe->xmit_els_rsp.wqe_com));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
pcmd = (((struct lpfc_dmabuf *)elsiocb->context2)->virt); pcmd = (((struct lpfc_dmabuf *)elsiocb->context2)->virt);
rdf_resp = (struct fc_els_rdf_resp *)pcmd; rdf_resp = (struct fc_els_rdf_resp *)pcmd;
memset(rdf_resp, 0, sizeof(*rdf_resp)); memset(rdf_resp, 0, sizeof(*rdf_resp));
...@@ -5756,10 +5855,12 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ...@@ -5756,10 +5855,12 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
ADISC *ap; ADISC *ap;
IOCB_t *icmd, *oldcmd; IOCB_t *icmd, *oldcmd;
union lpfc_wqe128 *wqe;
struct lpfc_iocbq *elsiocb; struct lpfc_iocbq *elsiocb;
uint8_t *pcmd; uint8_t *pcmd;
uint16_t cmdsize; uint16_t cmdsize;
int rc; int rc;
u32 ulp_context;
cmdsize = sizeof(uint32_t) + sizeof(ADISC); cmdsize = sizeof(uint32_t) + sizeof(ADISC);
elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
...@@ -5767,16 +5868,29 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ...@@ -5767,16 +5868,29 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
if (!elsiocb) if (!elsiocb)
return 1; return 1;
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
oldcmd = &oldiocb->iocb; wqe = &elsiocb->wqe;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ /* XRI / rx_id */
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
get_job_ulpcontext(phba, oldiocb));
ulp_context = get_job_ulpcontext(phba, elsiocb);
/* oxid */
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
get_job_rcvoxid(phba, oldiocb));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
ulp_context = elsiocb->iocb.ulpContext;
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
/* Xmit ADISC ACC response tag <ulpIoTag> */ /* Xmit ADISC ACC response tag <ulpIoTag> */
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"0130 Xmit ADISC ACC response iotag x%x xri: " "0130 Xmit ADISC ACC response iotag x%x xri: "
"x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n", "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
elsiocb->iotag, elsiocb->iocb.ulpContext, elsiocb->iotag, ulp_context,
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
ndlp->nlp_rpi); ndlp->nlp_rpi);
pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
...@@ -5809,14 +5923,6 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ...@@ -5809,14 +5923,6 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
return 1; return 1;
} }
/* Xmit ELS ACC response tag <ulpIoTag> */
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, "
"XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
"RPI: x%x, fc_flag x%x\n",
rc, elsiocb->iotag, elsiocb->sli4_xritag,
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
ndlp->nlp_rpi, vport->fc_flag);
return 0; return 0;
} }
...@@ -5849,13 +5955,14 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ...@@ -5849,13 +5955,14 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
lpfc_vpd_t *vpd; lpfc_vpd_t *vpd;
IOCB_t *icmd; IOCB_t *icmd;
IOCB_t *oldcmd; IOCB_t *oldcmd;
union lpfc_wqe128 *wqe;
struct lpfc_iocbq *elsiocb; struct lpfc_iocbq *elsiocb;
uint8_t *pcmd; uint8_t *pcmd;
uint16_t cmdsize; uint16_t cmdsize;
uint32_t prli_fc4_req, *req_payload; uint32_t prli_fc4_req, *req_payload;
struct lpfc_dmabuf *req_buf; struct lpfc_dmabuf *req_buf;
int rc; int rc;
u32 elsrspcmd; u32 elsrspcmd, ulp_context;
/* Need the incoming PRLI payload to determine if the ACC is for an /* Need the incoming PRLI payload to determine if the ACC is for an
* FC4 or NVME PRLI type. The PRLI type is at word 1. * FC4 or NVME PRLI type. The PRLI type is at word 1.
...@@ -5881,20 +5988,31 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, ...@@ -5881,20 +5988,31 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
} }
elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
ndlp->nlp_DID, elsrspcmd); ndlp->nlp_DID, elsrspcmd);
if (!elsiocb) if (!elsiocb)
return 1; return 1;
icmd = &elsiocb->iocb; if (phba->sli_rev == LPFC_SLI_REV4) {
oldcmd = &oldiocb->iocb; wqe = &elsiocb->wqe;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; get_job_ulpcontext(phba, oldiocb)); /* Xri / rx_id */
ulp_context = get_job_ulpcontext(phba, elsiocb);
bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
get_job_rcvoxid(phba, oldiocb));
} else {
icmd = &elsiocb->iocb;
oldcmd = &oldiocb->iocb;
icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */
ulp_context = elsiocb->iocb.ulpContext;
icmd->unsli3.rcvsli3.ox_id =
oldcmd->unsli3.rcvsli3.ox_id;
}
/* Xmit PRLI ACC response tag <ulpIoTag> */ /* Xmit PRLI ACC response tag <ulpIoTag> */
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
"0131 Xmit PRLI ACC response tag x%x xri x%x, " "0131 Xmit PRLI ACC response tag x%x xri x%x, "
"did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n", "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
elsiocb->iotag, elsiocb->iocb.ulpContext, elsiocb->iotag, ulp_context,
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
ndlp->nlp_rpi); ndlp->nlp_rpi);
pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt); pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
......
...@@ -680,13 +680,13 @@ static int ...@@ -680,13 +680,13 @@ static int
lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
struct lpfc_iocbq *cmdiocb) struct lpfc_iocbq *cmdiocb)
{ {
struct lpfc_hba *phba = vport->phba;
struct lpfc_iocbq *elsiocb; struct lpfc_iocbq *elsiocb;
struct lpfc_dmabuf *pcmd; struct lpfc_dmabuf *pcmd;
struct serv_parm *sp; struct serv_parm *sp;
struct lpfc_name *pnn, *ppn; struct lpfc_name *pnn, *ppn;
struct ls_rjt stat; struct ls_rjt stat;
ADISC *ap; ADISC *ap;
IOCB_t *icmd;
uint32_t *lp; uint32_t *lp;
uint32_t cmd; uint32_t cmd;
...@@ -704,8 +704,8 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ...@@ -704,8 +704,8 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
ppn = (struct lpfc_name *) & sp->portName; ppn = (struct lpfc_name *) & sp->portName;
} }
icmd = &cmdiocb->iocb; if (get_job_ulpstatus(phba, cmdiocb) == 0 &&
if (icmd->ulpStatus == 0 && lpfc_check_adisc(vport, ndlp, pnn, ppn)) { lpfc_check_adisc(vport, ndlp, pnn, ppn)) {
/* /*
* As soon as we send ACC, the remote NPort can * As soon as we send ACC, the remote NPort can
...@@ -716,7 +716,6 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ...@@ -716,7 +716,6 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
elsiocb = kmalloc(sizeof(struct lpfc_iocbq), elsiocb = kmalloc(sizeof(struct lpfc_iocbq),
GFP_KERNEL); GFP_KERNEL);
if (elsiocb) { if (elsiocb) {
/* Save info from cmd IOCB used in rsp */ /* Save info from cmd IOCB used in rsp */
memcpy((uint8_t *)elsiocb, (uint8_t *)cmdiocb, memcpy((uint8_t *)elsiocb, (uint8_t *)cmdiocb,
sizeof(struct lpfc_iocbq)); sizeof(struct lpfc_iocbq));
...@@ -1312,23 +1311,24 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, ...@@ -1312,23 +1311,24 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
struct lpfc_dmabuf *pcmd, *prsp, *mp; struct lpfc_dmabuf *pcmd, *prsp, *mp;
uint32_t *lp; uint32_t *lp;
uint32_t vid, flag; uint32_t vid, flag;
IOCB_t *irsp;
struct serv_parm *sp; struct serv_parm *sp;
uint32_t ed_tov; uint32_t ed_tov;
LPFC_MBOXQ_t *mbox; LPFC_MBOXQ_t *mbox;
int rc; int rc;
u32 ulp_status;
u32 did;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
ulp_status = get_job_ulpstatus(phba, rspiocb);
if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
/* Recovery from PLOGI collision logic */ /* Recovery from PLOGI collision logic */
return ndlp->nlp_state; return ndlp->nlp_state;
} }
irsp = &rspiocb->iocb; if (ulp_status)
if (irsp->ulpStatus)
goto out; goto out;
pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
...@@ -1440,7 +1440,9 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, ...@@ -1440,7 +1440,9 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
goto out; goto out;
} }
if (lpfc_reg_rpi(phba, vport->vpi, irsp->un.elsreq64.remoteID, did = get_job_els_rsp64_did(phba, cmdiocb);
if (lpfc_reg_rpi(phba, vport->vpi, did,
(uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) { (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) {
switch (ndlp->nlp_DID) { switch (ndlp->nlp_DID) {
case NameServer_DID: case NameServer_DID:
...@@ -1670,17 +1672,18 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport, ...@@ -1670,17 +1672,18 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport,
{ {
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
struct lpfc_iocbq *cmdiocb, *rspiocb; struct lpfc_iocbq *cmdiocb, *rspiocb;
IOCB_t *irsp;
ADISC *ap; ADISC *ap;
int rc; int rc;
u32 ulp_status;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
ulp_status = get_job_ulpstatus(phba, rspiocb);
ap = (ADISC *)lpfc_check_elscmpl_iocb(phba, cmdiocb, rspiocb); ap = (ADISC *)lpfc_check_elscmpl_iocb(phba, cmdiocb, rspiocb);
irsp = &rspiocb->iocb;
if ((irsp->ulpStatus) || if ((ulp_status) ||
(!lpfc_check_adisc(vport, ndlp, &ap->nodeName, &ap->portName))) { (!lpfc_check_adisc(vport, ndlp, &ap->nodeName, &ap->portName))) {
/* 1 sec timeout */ /* 1 sec timeout */
mod_timer(&ndlp->nlp_delayfunc, mod_timer(&ndlp->nlp_delayfunc,
...@@ -2122,14 +2125,16 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ...@@ -2122,14 +2125,16 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
{ {
struct lpfc_iocbq *cmdiocb, *rspiocb; struct lpfc_iocbq *cmdiocb, *rspiocb;
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
IOCB_t *irsp;
PRLI *npr; PRLI *npr;
struct lpfc_nvme_prli *nvpr; struct lpfc_nvme_prli *nvpr;
void *temp_ptr; void *temp_ptr;
u32 ulp_status;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
ulp_status = get_job_ulpstatus(phba, rspiocb);
/* A solicited PRLI is either FCP or NVME. The PRLI cmd/rsp /* A solicited PRLI is either FCP or NVME. The PRLI cmd/rsp
* format is different so NULL the two PRLI types so that the * format is different so NULL the two PRLI types so that the
* driver correctly gets the correct context. * driver correctly gets the correct context.
...@@ -2142,8 +2147,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, ...@@ -2142,8 +2147,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
else if (cmdiocb->cmd_flag & LPFC_PRLI_NVME_REQ) else if (cmdiocb->cmd_flag & LPFC_PRLI_NVME_REQ)
nvpr = (struct lpfc_nvme_prli *) temp_ptr; nvpr = (struct lpfc_nvme_prli *) temp_ptr;
irsp = &rspiocb->iocb; if (ulp_status) {
if (irsp->ulpStatus) {
if ((vport->port_type == LPFC_NPIV_PORT) && if ((vport->port_type == LPFC_NPIV_PORT) &&
vport->cfg_restrict_login) { vport->cfg_restrict_login) {
goto out; goto out;
...@@ -2742,16 +2746,18 @@ static uint32_t ...@@ -2742,16 +2746,18 @@ static uint32_t
lpfc_cmpl_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_cmpl_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
void *arg, uint32_t evt) void *arg, uint32_t evt)
{ {
struct lpfc_hba *phba = vport->phba;
struct lpfc_iocbq *cmdiocb, *rspiocb; struct lpfc_iocbq *cmdiocb, *rspiocb;
IOCB_t *irsp; u32 ulp_status;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
irsp = &rspiocb->iocb; ulp_status = get_job_ulpstatus(phba, rspiocb);
if (irsp->ulpStatus) {
if (ulp_status)
return NLP_STE_FREED_NODE; return NLP_STE_FREED_NODE;
}
return ndlp->nlp_state; return ndlp->nlp_state;
} }
...@@ -2759,14 +2765,16 @@ static uint32_t ...@@ -2759,14 +2765,16 @@ static uint32_t
lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
void *arg, uint32_t evt) void *arg, uint32_t evt)
{ {
struct lpfc_hba *phba = vport->phba;
struct lpfc_iocbq *cmdiocb, *rspiocb; struct lpfc_iocbq *cmdiocb, *rspiocb;
IOCB_t *irsp; u32 ulp_status;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
irsp = &rspiocb->iocb; ulp_status = get_job_ulpstatus(phba, rspiocb);
if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
lpfc_drop_node(vport, ndlp); lpfc_drop_node(vport, ndlp);
return NLP_STE_FREED_NODE; return NLP_STE_FREED_NODE;
} }
...@@ -2793,14 +2801,16 @@ static uint32_t ...@@ -2793,14 +2801,16 @@ static uint32_t
lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
void *arg, uint32_t evt) void *arg, uint32_t evt)
{ {
struct lpfc_hba *phba = vport->phba;
struct lpfc_iocbq *cmdiocb, *rspiocb; struct lpfc_iocbq *cmdiocb, *rspiocb;
IOCB_t *irsp; u32 ulp_status;
cmdiocb = (struct lpfc_iocbq *) arg; cmdiocb = (struct lpfc_iocbq *) arg;
rspiocb = cmdiocb->context_un.rsp_iocb; rspiocb = cmdiocb->context_un.rsp_iocb;
irsp = &rspiocb->iocb; ulp_status = get_job_ulpstatus(phba, rspiocb);
if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
lpfc_drop_node(vport, ndlp); lpfc_drop_node(vport, ndlp);
return NLP_STE_FREED_NODE; return NLP_STE_FREED_NODE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册