static int
 lpfc_rcv_logo(struct lpfc_hba * phba,
                      struct lpfc_nodelist * ndlp,
-                     struct lpfc_iocbq *cmdiocb)
+                     struct lpfc_iocbq *cmdiocb,
+                     uint32_t els_cmd)
 {
        /* Put ndlp on NPR list with 1 sec timeout for plogi, ACC logo */
        /* Only call LOGO ACC for first LOGO, this avoids sending unnecessary
         * PLOGIs during LOGO storms from a device.
         */
        ndlp->nlp_flag |= NLP_LOGO_ACC;
-       lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
+       if (els_cmd == ELS_CMD_PRLO)
+               lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0);
+       else
+               lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
 
        if (!(ndlp->nlp_type & NLP_FABRIC) ||
                (ndlp->nlp_state == NLP_STE_ADISC_ISSUE)) {
        /* software abort outstanding PLOGI */
        lpfc_els_abort(phba, ndlp, 1);
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
        /* software abort outstanding ADISC */
        lpfc_els_abort(phba, ndlp, 0);
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
        /* Treat like rcv logo */
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_PRLO);
        return ndlp->nlp_state;
 }
 
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
        struct lpfc_iocbq *cmdiocb;
 
        cmdiocb = (struct lpfc_iocbq *) arg;
-       lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
+       lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0);
        return ndlp->nlp_state;
 }
 
        /* Software abort outstanding PRLI before sending acc */
        lpfc_els_abort(phba, ndlp, 1);
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
        struct lpfc_iocbq *cmdiocb;
 
        cmdiocb = (struct lpfc_iocbq *) arg;
-       lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
+       lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0);
        return ndlp->nlp_state;
 }
 
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
-       lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
+       lpfc_els_rsp_acc(phba, ELS_CMD_PRLO, cmdiocb, ndlp, NULL, 0);
        return ndlp->nlp_state;
 }
 
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }
 
        spin_unlock_irq(phba->host->host_lock);
 
        /* Treat like rcv logo */
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_PRLO);
        return ndlp->nlp_state;
 }
 
 
        cmdiocb = (struct lpfc_iocbq *) arg;
 
-       lpfc_rcv_logo(phba, ndlp, cmdiocb);
+       lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO);
        return ndlp->nlp_state;
 }