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 {
                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 */
         * 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;
  * 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
                "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);
        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;
                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;
 }
 
                                "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",
         */
        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);
 }