|
|
@@ -242,6 +242,8 @@ lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,
|
|
|
icmd->ulpCommand = CMD_ELS_REQUEST64_CR;
|
|
|
if (elscmd == ELS_CMD_FLOGI)
|
|
|
icmd->ulpTimeout = FF_DEF_RATOV * 2;
|
|
|
+ else if (elscmd == ELS_CMD_LOGO)
|
|
|
+ icmd->ulpTimeout = phba->fc_ratov;
|
|
|
else
|
|
|
icmd->ulpTimeout = phba->fc_ratov * 2;
|
|
|
} else {
|
|
|
@@ -2682,16 +2684,15 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* The LOGO will not be retried on failure. A LOGO was
|
|
|
+ * issued to the remote rport and a ACC or RJT or no Answer are
|
|
|
+ * all acceptable. Note the failure and move forward with
|
|
|
+ * discovery. The PLOGI will retry.
|
|
|
+ */
|
|
|
if (irsp->ulpStatus) {
|
|
|
- /* Check for retry */
|
|
|
- if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
|
|
|
- /* ELS command is being retried */
|
|
|
- skip_recovery = 1;
|
|
|
- goto out;
|
|
|
- }
|
|
|
/* LOGO failed */
|
|
|
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
|
|
- "2756 LOGO failure DID:%06X Status:x%x/x%x\n",
|
|
|
+ "2756 LOGO failure, No Retry DID:%06X Status:x%x/x%x\n",
|
|
|
ndlp->nlp_DID, irsp->ulpStatus,
|
|
|
irsp->un.ulpWord[4]);
|
|
|
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
|
|
|
@@ -2737,7 +2738,8 @@ out:
|
|
|
* For any other port type, the rpi is unregistered as an implicit
|
|
|
* LOGO.
|
|
|
*/
|
|
|
- if ((ndlp->nlp_type & NLP_FCP_TARGET) && (skip_recovery == 0)) {
|
|
|
+ if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) &&
|
|
|
+ skip_recovery == 0) {
|
|
|
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
|
ndlp->nlp_flag |= NLP_NPR_2B_DISC;
|
|
|
@@ -2770,6 +2772,8 @@ out:
|
|
|
* will be stored into the context1 field of the IOCB for the completion
|
|
|
* callback function to the LOGO ELS command.
|
|
|
*
|
|
|
+ * Callers of this routine are expected to unregister the RPI first
|
|
|
+ *
|
|
|
* Return code
|
|
|
* 0 - successfully issued logo
|
|
|
* 1 - failed to issue logo
|
|
|
@@ -2811,22 +2815,6 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|
|
"Issue LOGO: did:x%x",
|
|
|
ndlp->nlp_DID, 0, 0);
|
|
|
|
|
|
- /*
|
|
|
- * If we are issuing a LOGO, we may try to recover the remote NPort
|
|
|
- * by issuing a PLOGI later. Even though we issue ELS cmds by the
|
|
|
- * VPI, if we have a valid RPI, and that RPI gets unreg'ed while
|
|
|
- * that ELS command is in-flight, the HBA returns a IOERR_INVALID_RPI
|
|
|
- * for that ELS cmd. To avoid this situation, lets get rid of the
|
|
|
- * RPI right now, before any ELS cmds are sent.
|
|
|
- */
|
|
|
- spin_lock_irq(shost->host_lock);
|
|
|
- ndlp->nlp_flag |= NLP_ISSUE_LOGO;
|
|
|
- spin_unlock_irq(shost->host_lock);
|
|
|
- if (lpfc_unreg_rpi(vport, ndlp)) {
|
|
|
- lpfc_els_free_iocb(phba, elsiocb);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
phba->fc_stat.elsXmitLOGO++;
|
|
|
elsiocb->iocb_cmpl = lpfc_cmpl_els_logo;
|
|
|
spin_lock_irq(shost->host_lock);
|
|
|
@@ -2834,7 +2822,6 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|
|
ndlp->nlp_flag &= ~NLP_ISSUE_LOGO;
|
|
|
spin_unlock_irq(shost->host_lock);
|
|
|
rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
|
|
|
-
|
|
|
if (rc == IOCB_ERROR) {
|
|
|
spin_lock_irq(shost->host_lock);
|
|
|
ndlp->nlp_flag &= ~NLP_LOGO_SND;
|
|
|
@@ -2842,6 +2829,11 @@ lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|
|
lpfc_els_free_iocb(phba, elsiocb);
|
|
|
return 1;
|
|
|
}
|
|
|
+
|
|
|
+ spin_lock_irq(shost->host_lock);
|
|
|
+ ndlp->nlp_prev_state = ndlp->nlp_state;
|
|
|
+ spin_unlock_irq(shost->host_lock);
|
|
|
+ lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -9505,7 +9497,8 @@ lpfc_sli_abts_recover_port(struct lpfc_vport *vport,
|
|
|
"rport in state 0x%x\n", ndlp->nlp_state);
|
|
|
return;
|
|
|
}
|
|
|
- lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
|
|
+ lpfc_printf_log(phba, KERN_ERR,
|
|
|
+ LOG_ELS | LOG_FCP_ERROR | LOG_NVME_IOERR,
|
|
|
"3094 Start rport recovery on shost id 0x%x "
|
|
|
"fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x "
|
|
|
"flags 0x%x\n",
|
|
|
@@ -9518,8 +9511,8 @@ lpfc_sli_abts_recover_port(struct lpfc_vport *vport,
|
|
|
*/
|
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
|
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
|
|
+ ndlp->nlp_flag |= NLP_ISSUE_LOGO;
|
|
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
|
|
- lpfc_issue_els_logo(vport, ndlp, 0);
|
|
|
- lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
|
|
|
+ lpfc_unreg_rpi(vport, ndlp);
|
|
|
}
|
|
|
|