Lines Matching defs:ndlp

52 lpfc_check_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
56 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED))
62 if (memcmp(nn, &ndlp->nlp_nodename, sizeof (struct lpfc_name)))
65 if (memcmp(pn, &ndlp->nlp_portname, sizeof (struct lpfc_name)))
73 lpfc_check_sparm(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
151 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name));
152 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof (struct lpfc_name));
159 ndlp->nlp_DID,
208 lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
221 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY,
224 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
225 ndlp->nlp_rpi);
227 lpfc_fabric_abort_nport(ndlp);
239 if (lpfc_check_sli_ndlp(phba, pring, iocb, ndlp))
263 if (lpfc_check_sli_ndlp(phba, pring, iocb, ndlp)) {
277 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp);
293 struct lpfc_nodelist *ndlp;
296 ndlp = link_mbox->ctx_ndlp;
317 save_iocb, ndlp, login_mbox);
345 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp;
360 lpfc_nlp_get(ndlp);
371 rc = lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, piocb, ndlp, mbox);
380 lpfc_nlp_put(ndlp);
384 lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
412 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
421 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
426 nlp_portwwn = wwn_to_u64(ndlp->nlp_portname.u.wwn);
427 if ((lpfc_check_sparm(vport, ndlp, sp, CLASS3, 0) == 0)) {
431 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
441 ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag,
442 ndlp->nlp_rpi, vport->port_state,
446 ndlp->nlp_fcp_info |= CLASS2;
448 ndlp->nlp_fcp_info |= CLASS3;
451 ndlp->nlp_class_sup = 0;
453 ndlp->nlp_class_sup |= FC_COS_CLASS1;
455 ndlp->nlp_class_sup |= FC_COS_CLASS2;
457 ndlp->nlp_class_sup |= FC_COS_CLASS3;
459 ndlp->nlp_class_sup |= FC_COS_CLASS4;
460 ndlp->nlp_maxframe =
463 switch (ndlp->nlp_state) {
465 if (!(ndlp->nlp_flag & NLP_NPR_ADISC))
476 if (!(ndlp->nlp_type & NLP_FABRIC) &&
479 ndlp, NULL);
487 ndlp->nlp_DID,
494 ndlp->nlp_state == NLP_STE_UNMAPPED_NODE)
495 lpfc_nvmet_invalidate_host(phba, ndlp);
497 ndlp->nlp_prev_state = ndlp->nlp_state;
499 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
503 ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
504 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
505 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
506 ndlp->nlp_flag &= ~NLP_FIRSTBURST;
547 link_mbox->ctx_ndlp = ndlp;
560 ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP;
566 ndlp->nlp_flag |= NLP_SUPPRESS_RSP;
588 rpi = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
591 link_mbox->ctx_ndlp = ndlp;
594 if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
596 ndlp->nlp_flag |= NLP_UNREG_INP;
604 lpfc_unreg_rpi(vport, ndlp);
607 (uint8_t *)sp, login_mbox, ndlp->nlp_rpi);
616 * login_mbox->ctx_ndlp = lpfc_nlp_get(ndlp) deferred until mailbox
621 ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI);
634 if ((ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) &&
637 lpfc_els_abort(phba, ndlp);
652 ndlp->nlp_flag |= NLP_RM_DFLT_RPI;
657 ndlp, login_mbox);
686 rc = lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, login_mbox);
703 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
720 struct lpfc_nodelist *ndlp;
724 ndlp = (struct lpfc_nodelist *)mboxq->ctx_ndlp;
729 lpfc_els_rsp_adisc_acc(vport, elsiocb, ndlp);
732 ndlp, NULL);
739 lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
768 if (icmd->ulpStatus == 0 && lpfc_check_adisc(vport, ndlp, pnn, ppn)) {
787 lpfc_sli4_resume_rpi(ndlp,
794 lpfc_els_rsp_adisc_acc(vport, cmdiocb, ndlp);
797 ndlp, NULL);
806 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
807 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE)
808 lpfc_nlp_set_state(vport, ndlp,
819 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
822 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000));
825 ndlp->nlp_flag |= NLP_DELAY_TMO;
827 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
828 ndlp->nlp_prev_state = ndlp->nlp_state;
829 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
834 lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
842 /* Put ndlp in NPR state with 1 sec timeout for plogi, ACC logo */
847 ndlp->nlp_flag |= NLP_LOGO_ACC;
850 lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
852 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
856 ndlp->nlp_state == NLP_STE_UNMAPPED_NODE)
857 lpfc_nvmet_invalidate_host(phba, ndlp);
859 if (ndlp->nlp_DID == Fabric_DID) {
892 mod_timer(&ndlp->nlp_delayfunc,
895 ndlp->nlp_flag |= NLP_DELAY_TMO;
897 ndlp->nlp_last_elscmd = ELS_CMD_FDISC;
905 } else if ((!(ndlp->nlp_type & NLP_FABRIC) &&
906 ((ndlp->nlp_type & NLP_FCP_TARGET) ||
907 (ndlp->nlp_type & NLP_NVME_TARGET) ||
909 (ndlp->nlp_state == NLP_STE_ADISC_ISSUE)) {
915 mod_timer(&ndlp->nlp_delayfunc,
918 ndlp->nlp_flag |= NLP_DELAY_TMO;
921 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
924 ndlp->nlp_prev_state = ndlp->nlp_state;
925 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
928 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
940 struct lpfc_nodelist *ndlp,
961 "6115 Rcv PRLI (%x) check failed: ndlp rpi %d "
963 cmd, ndlp->nlp_rpi, ndlp->nlp_state,
964 ndlp->nlp_flag);
969 ndlp, NULL);
974 lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
981 struct fc_rport *rport = ndlp->rport;
992 ndlp->nlp_type |= NLP_FCP_INITIATOR;
994 ndlp->nlp_type |= NLP_NVME_INITIATOR;
998 ndlp->nlp_type |= NLP_FCP_TARGET;
1000 ndlp->nlp_type |= NLP_NVME_TARGET;
1002 ndlp->nlp_flag |= NLP_FIRSTBURST;
1004 if (npr->Retry && ndlp->nlp_type &
1006 ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
1009 ndlp->nlp_type & (NLP_NVME_INITIATOR | NLP_NVME_TARGET))
1010 ndlp->nlp_nvme_info |= NLP_NVME_NSLER;
1013 /* If this driver is in nvme target mode, set the ndlp's fc4
1019 ndlp->nlp_fc4_type |= NLP_FC4_NVME;
1020 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
1023 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
1028 if (ndlp->nlp_type & NLP_FCP_INITIATOR)
1030 if (ndlp->nlp_type & NLP_FCP_TARGET)
1035 roles, ndlp->nlp_DID, ndlp->nlp_flag);
1043 lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
1047 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED)) {
1049 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
1057 ((ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) &&
1058 (ndlp->nlp_type & NLP_FCP_TARGET)))) {
1060 ndlp->nlp_flag |= NLP_NPR_ADISC;
1067 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
1069 lpfc_unreg_rpi(vport, ndlp);
1077 * @ndlp: Pointer to lpfc_nodelist structure.
1085 struct lpfc_nodelist *ndlp, uint16_t rpi)
1090 /* If there is already an UNREG in progress for this ndlp,
1093 if (ndlp->nlp_flag & NLP_UNREG_INP) {
1098 ndlp->nlp_rpi, ndlp->nlp_DID,
1099 ndlp->nlp_defer_did,
1100 ndlp->nlp_flag, ndlp);
1113 pmb->ctx_ndlp = ndlp;
1115 if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
1117 ndlp->nlp_flag |= NLP_UNREG_INP;
1122 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag);
1131 lpfc_disc_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1144 lpfc_release_rpi(phba, vport, ndlp, rpi);
1149 ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi,
1150 ndlp->nlp_flag);
1151 return ndlp->nlp_state;
1155 lpfc_cmpl_plogi_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1163 if (!(ndlp->nlp_flag & NLP_RCV_PLOGI)) {
1167 ndlp->nlp_DID, evt, ndlp->nlp_state,
1168 ndlp->nlp_rpi, ndlp->nlp_flag);
1170 return ndlp->nlp_state;
1176 lpfc_rcv_plogi_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1183 if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) {
1184 return ndlp->nlp_state;
1190 lpfc_rcv_els_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1193 lpfc_issue_els_logo(vport, ndlp, 0);
1194 return ndlp->nlp_state;
1198 lpfc_rcv_logo_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1205 ndlp->nlp_flag |= NLP_LOGO_ACC;
1207 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
1209 return ndlp->nlp_state;
1213 lpfc_cmpl_logo_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1220 lpfc_device_rm_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1228 struct lpfc_nodelist *ndlp,
1231 return ndlp->nlp_state;
1235 lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1261 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
1264 if (lpfc_rcv_plogi(vport, ndlp, cmdiocb) &&
1265 (ndlp->nlp_flag & NLP_NPR_2B_DISC) &&
1268 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1282 return ndlp->nlp_state;
1286 lpfc_rcv_prli_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1295 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
1296 return ndlp->nlp_state;
1300 lpfc_rcv_logo_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1307 ndlp->nlp_rpi = cmdiocb->iocb.ulpIoTag;
1309 lpfc_els_abort(vport->phba, ndlp);
1311 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
1312 return ndlp->nlp_state;
1316 lpfc_rcv_els_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1324 lpfc_els_abort(phba, ndlp);
1327 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
1329 lpfc_issue_els_logo(vport, ndlp, 0);
1332 /* Put ndlp in npr state set plogi timer for 1 sec */
1333 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1));
1335 ndlp->nlp_flag |= NLP_DELAY_TMO;
1337 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
1338 ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE;
1339 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1341 return ndlp->nlp_state;
1346 struct lpfc_nodelist *ndlp,
1365 if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
1367 return ndlp->nlp_state;
1385 if ((ndlp->nlp_DID != FDMI_DID) &&
1392 if (!lpfc_check_sparm(vport, ndlp, sp, CLASS3, 0))
1397 ndlp->nlp_DID, ndlp->nlp_state,
1398 ndlp->nlp_flag, ndlp->nlp_rpi);
1400 ndlp->nlp_fcp_info |= CLASS2;
1402 ndlp->nlp_fcp_info |= CLASS3;
1404 ndlp->nlp_class_sup = 0;
1406 ndlp->nlp_class_sup |= FC_COS_CLASS1;
1408 ndlp->nlp_class_sup |= FC_COS_CLASS2;
1410 ndlp->nlp_class_sup |= FC_COS_CLASS3;
1412 ndlp->nlp_class_sup |= FC_COS_CLASS4;
1413 ndlp->nlp_maxframe =
1424 ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP;
1431 ndlp->nlp_flag |= NLP_SUPPRESS_RSP;
1455 ndlp->nlp_DID, ndlp->nlp_state,
1456 ndlp->nlp_flag, ndlp->nlp_rpi);
1472 lpfc_unreg_rpi(vport, ndlp);
1479 ndlp->nlp_DID, ndlp->nlp_state,
1480 ndlp->nlp_flag, ndlp->nlp_rpi);
1485 (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) {
1486 switch (ndlp->nlp_DID) {
1494 ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
1497 mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
1501 lpfc_nlp_set_state(vport, ndlp,
1503 return ndlp->nlp_state;
1505 if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
1506 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
1510 lpfc_nlp_put(ndlp);
1519 ndlp->nlp_DID, ndlp->nlp_state,
1520 ndlp->nlp_flag, ndlp->nlp_rpi);
1527 ndlp->nlp_DID, ndlp->nlp_state,
1528 ndlp->nlp_flag, ndlp->nlp_rpi);
1533 if (ndlp->nlp_DID == NameServer_DID) {
1544 ndlp->nlp_prev_state = ndlp->nlp_state;
1545 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1547 ndlp->nlp_flag |= NLP_DEFER_RM;
1553 lpfc_cmpl_logo_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1556 return ndlp->nlp_state;
1561 struct lpfc_nodelist *ndlp, void *arg, uint32_t evt)
1573 lpfc_release_rpi(phba, vport, ndlp, rpi);
1575 return ndlp->nlp_state;
1579 lpfc_device_rm_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1584 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
1586 ndlp->nlp_flag |= NLP_NODEV_REMOVE;
1588 return ndlp->nlp_state;
1591 lpfc_els_abort(vport->phba, ndlp);
1593 lpfc_drop_node(vport, ndlp);
1600 struct lpfc_nodelist *ndlp,
1611 return ndlp->nlp_state;
1614 lpfc_els_abort(phba, ndlp);
1616 ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE;
1617 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1619 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
1622 return ndlp->nlp_state;
1626 lpfc_rcv_plogi_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1634 lpfc_els_abort(phba, ndlp);
1638 if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) {
1639 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
1641 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1646 return ndlp->nlp_state;
1648 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1649 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
1650 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
1652 return ndlp->nlp_state;
1656 lpfc_rcv_prli_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1661 if (lpfc_rcv_prli_support_check(vport, ndlp, cmdiocb))
1662 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
1663 return ndlp->nlp_state;
1667 lpfc_rcv_logo_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1676 lpfc_els_abort(phba, ndlp);
1678 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
1679 return ndlp->nlp_state;
1684 struct lpfc_nodelist *ndlp,
1691 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
1692 return ndlp->nlp_state;
1696 lpfc_rcv_prlo_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1704 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_PRLO);
1705 return ndlp->nlp_state;
1710 struct lpfc_nodelist *ndlp,
1727 (!lpfc_check_adisc(vport, ndlp, &ap->nodeName, &ap->portName))) {
1729 mod_timer(&ndlp->nlp_delayfunc,
1732 ndlp->nlp_flag |= NLP_DELAY_TMO;
1734 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
1736 memset(&ndlp->nlp_nodename, 0, sizeof(struct lpfc_name));
1737 memset(&ndlp->nlp_portname, 0, sizeof(struct lpfc_name));
1739 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1740 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1741 lpfc_unreg_rpi(vport, ndlp);
1742 return ndlp->nlp_state;
1746 rc = lpfc_sli4_resume_rpi(ndlp, NULL, NULL);
1749 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1750 return ndlp->nlp_state;
1754 if (ndlp->nlp_type & NLP_FCP_TARGET)
1755 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
1757 if (ndlp->nlp_type & NLP_NVME_TARGET)
1758 ndlp->nlp_fc4_type |= NLP_FC4_NVME;
1760 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
1761 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1762 lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE);
1764 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1765 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
1768 return ndlp->nlp_state;
1772 lpfc_device_rm_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1777 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
1779 ndlp->nlp_flag |= NLP_NODEV_REMOVE;
1781 return ndlp->nlp_state;
1784 lpfc_els_abort(vport->phba, ndlp);
1786 lpfc_drop_node(vport, ndlp);
1793 struct lpfc_nodelist *ndlp,
1804 return ndlp->nlp_state;
1807 lpfc_els_abort(phba, ndlp);
1809 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
1810 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1812 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
1814 lpfc_disc_set_adisc(vport, ndlp);
1815 return ndlp->nlp_state;
1820 struct lpfc_nodelist *ndlp,
1826 lpfc_rcv_plogi(vport, ndlp, cmdiocb);
1827 return ndlp->nlp_state;
1832 struct lpfc_nodelist *ndlp,
1839 if (!lpfc_rcv_prli_support_check(vport, ndlp, cmdiocb)) {
1840 return ndlp->nlp_state;
1847 if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
1848 lpfc_rcv_prli(vport, ndlp, cmdiocb);
1849 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
1859 ndlp, NULL);
1860 return ndlp->nlp_state;
1864 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
1866 return ndlp->nlp_state;
1871 struct lpfc_nodelist *ndlp,
1884 /* cleanup any ndlp on mbox q waiting for reglogin cmpl */
1887 (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) {
1888 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
1889 lpfc_nlp_put(ndlp);
1898 (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) {
1904 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
1905 lpfc_nlp_put(ndlp);
1920 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
1921 return ndlp->nlp_state;
1926 struct lpfc_nodelist *ndlp,
1932 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
1933 return ndlp->nlp_state;
1938 struct lpfc_nodelist *ndlp,
1945 lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
1946 return ndlp->nlp_state;
1951 struct lpfc_nodelist *ndlp,
1974 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
1975 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1976 return ndlp->nlp_state;
1979 /* Put ndlp in npr state set plogi timer for 1 sec */
1980 mod_timer(&ndlp->nlp_delayfunc,
1983 ndlp->nlp_flag |= NLP_DELAY_TMO;
1985 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
1987 lpfc_issue_els_logo(vport, ndlp, 0);
1988 return ndlp->nlp_state;
1993 ndlp->nlp_rpi = mb->un.varWords[0];
1995 ndlp->nlp_flag |= NLP_RPI_REGISTERED;
2000 did, ndlp->nlp_type, ndlp->nlp_fc4_type);
2001 if (!(ndlp->nlp_type & NLP_FABRIC) &&
2004 * ndlp's nlp_fc4_type is still zero, the driver doesn't
2013 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
2017 ndlp->nlp_fc4_type |= NLP_FC4_NVME;
2023 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
2025 } else if (ndlp->nlp_fc4_type == 0) {
2032 ndlp->nlp_DID);
2033 return ndlp->nlp_state;
2035 ndlp->nlp_fc4_type = NLP_FC4_FCP;
2038 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
2039 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
2040 if (lpfc_issue_els_prli(vport, ndlp, 0)) {
2041 lpfc_issue_els_logo(vport, ndlp, 0);
2042 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
2043 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2052 if (ndlp->nlp_type & NLP_FABRIC) {
2053 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
2054 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
2057 return ndlp->nlp_state;
2062 struct lpfc_nodelist *ndlp,
2068 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
2070 ndlp->nlp_flag |= NLP_NODEV_REMOVE;
2072 return ndlp->nlp_state;
2074 lpfc_drop_node(vport, ndlp);
2081 struct lpfc_nodelist *ndlp,
2091 return ndlp->nlp_state;
2093 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
2094 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2100 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED) ||
2102 ndlp->nlp_flag |= NLP_IGNR_REG_CMPL;
2104 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2106 lpfc_disc_set_adisc(vport, ndlp);
2107 return ndlp->nlp_state;
2111 lpfc_rcv_plogi_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2118 lpfc_rcv_plogi(vport, ndlp, cmdiocb);
2119 return ndlp->nlp_state;
2123 lpfc_rcv_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2128 if (!lpfc_rcv_prli_support_check(vport, ndlp, cmdiocb))
2129 return ndlp->nlp_state;
2130 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
2131 return ndlp->nlp_state;
2135 lpfc_rcv_logo_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2141 lpfc_els_abort(vport->phba, ndlp);
2143 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
2144 return ndlp->nlp_state;
2148 lpfc_rcv_padisc_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2153 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
2154 return ndlp->nlp_state;
2163 lpfc_rcv_prlo_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2168 lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
2169 return ndlp->nlp_state;
2173 lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2208 ndlp->nlp_fc4_type &= ~NLP_FC4_FCP;
2210 ndlp->nlp_fc4_type &= ~NLP_FC4_NVME;
2223 ndlp->nlp_type |= NLP_FCP_INITIATOR;
2225 ndlp->nlp_type |= NLP_FCP_TARGET;
2227 ndlp->nlp_flag |= NLP_FIRSTBURST;
2230 ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
2238 /* Complete setting up the remote ndlp personality. */
2240 ndlp->nlp_type |= NLP_NVME_INITIATOR;
2245 ndlp->nlp_nvme_info |= NLP_NVME_NSLER;
2247 ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER;
2255 ndlp->nlp_type |= NLP_NVME_TARGET;
2257 ndlp->nlp_type |= NLP_NVME_DISCOVERY;
2271 ndlp->nlp_flag |= NLP_FIRSTBURST;
2272 ndlp->nvme_fb_size = bf_get_be32(prli_fb_sz,
2276 if (ndlp->nvme_fb_size)
2277 ndlp->nvme_fb_size <<=
2280 ndlp->nvme_fb_size = LPFC_NVME_MAX_FB;
2291 ndlp->nlp_flag, ndlp->nlp_fcp_info,
2292 ndlp->nlp_type);
2294 if (!(ndlp->nlp_type & NLP_FCP_TARGET) &&
2299 ndlp->nlp_flag |= NLP_TARGET_REMOVE;
2301 lpfc_issue_els_logo(vport, ndlp, 0);
2303 ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
2304 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2305 return ndlp->nlp_state;
2309 /* The ndlp state cannot move to MAPPED or UNMAPPED before all PRLIs
2312 if (ndlp->fc4_prli_sent == 0) {
2313 ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
2314 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET))
2315 lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE);
2316 else if (ndlp->nlp_type &
2318 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
2325 ndlp->nlp_DID, ndlp->fc4_prli_sent);
2327 return ndlp->nlp_state;
2335 * \param ndlp
2349 lpfc_device_rm_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2354 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
2356 ndlp->nlp_flag |= NLP_NODEV_REMOVE;
2358 return ndlp->nlp_state;
2361 lpfc_els_abort(vport->phba, ndlp);
2363 lpfc_drop_node(vport, ndlp);
2374 * \param ndlp
2387 struct lpfc_nodelist *ndlp,
2398 return ndlp->nlp_state;
2401 lpfc_els_abort(phba, ndlp);
2403 ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
2404 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2406 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2408 lpfc_disc_set_adisc(vport, ndlp);
2409 return ndlp->nlp_state;
2413 lpfc_rcv_plogi_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2422 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
2423 return ndlp->nlp_state;
2427 lpfc_rcv_prli_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2436 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
2437 return ndlp->nlp_state;
2441 lpfc_rcv_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2448 ndlp->nlp_flag |= NLP_LOGO_ACC;
2450 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
2451 return ndlp->nlp_state;
2455 lpfc_rcv_padisc_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2464 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
2465 return ndlp->nlp_state;
2469 lpfc_rcv_prlo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2478 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
2479 return ndlp->nlp_state;
2483 lpfc_cmpl_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2488 ndlp->nlp_prev_state = NLP_STE_LOGO_ISSUE;
2489 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2491 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2493 lpfc_disc_set_adisc(vport, ndlp);
2494 return ndlp->nlp_state;
2498 lpfc_device_rm_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2503 * In this case, abort the LOGO and cleanup the ndlp
2506 lpfc_unreg_rpi(vport, ndlp);
2508 lpfc_els_abort(vport->phba, ndlp);
2509 lpfc_drop_node(vport, ndlp);
2515 struct lpfc_nodelist *ndlp,
2523 return ndlp->nlp_state;
2527 lpfc_rcv_plogi_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2532 lpfc_rcv_plogi(vport, ndlp, cmdiocb);
2533 return ndlp->nlp_state;
2537 lpfc_rcv_prli_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2542 if (!lpfc_rcv_prli_support_check(vport, ndlp, cmdiocb))
2543 return ndlp->nlp_state;
2545 lpfc_rcv_prli(vport, ndlp, cmdiocb);
2546 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
2547 return ndlp->nlp_state;
2551 lpfc_rcv_logo_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2556 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
2557 return ndlp->nlp_state;
2561 lpfc_rcv_padisc_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2566 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
2567 return ndlp->nlp_state;
2571 lpfc_rcv_prlo_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2576 lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
2577 return ndlp->nlp_state;
2582 struct lpfc_nodelist *ndlp,
2588 ndlp->nlp_prev_state = NLP_STE_UNMAPPED_NODE;
2589 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2591 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2592 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
2594 lpfc_disc_set_adisc(vport, ndlp);
2596 return ndlp->nlp_state;
2600 lpfc_rcv_plogi_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2605 lpfc_rcv_plogi(vport, ndlp, cmdiocb);
2606 return ndlp->nlp_state;
2610 lpfc_rcv_prli_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2615 if (!lpfc_rcv_prli_support_check(vport, ndlp, cmdiocb))
2616 return ndlp->nlp_state;
2617 lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
2618 return ndlp->nlp_state;
2622 lpfc_rcv_logo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2627 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
2628 return ndlp->nlp_state;
2633 struct lpfc_nodelist *ndlp,
2638 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
2639 return ndlp->nlp_state;
2643 lpfc_rcv_prlo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2651 ndlp->nlp_sid, 0, LPFC_CTX_TGT);
2654 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_PRLO);
2655 return ndlp->nlp_state;
2660 struct lpfc_nodelist *ndlp,
2666 ndlp->nlp_prev_state = NLP_STE_MAPPED_NODE;
2667 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2669 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2670 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
2672 lpfc_disc_set_adisc(vport, ndlp);
2673 return ndlp->nlp_state;
2677 lpfc_rcv_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2684 if (ndlp->nlp_flag & (NLP_LOGO_SND | NLP_LOGO_ACC))
2685 return ndlp->nlp_state;
2686 if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) {
2687 lpfc_cancel_retry_delay_tmo(vport, ndlp);
2689 ndlp->nlp_flag &= ~(NLP_NPR_ADISC | NLP_NPR_2B_DISC);
2691 } else if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
2693 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
2694 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
2695 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
2696 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
2699 return ndlp->nlp_state;
2703 lpfc_rcv_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2713 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
2715 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
2716 if (ndlp->nlp_flag & NLP_NPR_ADISC) {
2718 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2719 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
2721 lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
2722 lpfc_issue_els_adisc(vport, ndlp, 0);
2724 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
2725 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
2726 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
2729 return ndlp->nlp_state;
2733 lpfc_rcv_logo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2738 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
2739 return ndlp->nlp_state;
2743 lpfc_rcv_padisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2748 lpfc_rcv_padisc(vport, ndlp, cmdiocb);
2754 if (!(ndlp->nlp_flag & NLP_DELAY_TMO) &&
2755 !(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
2756 if (ndlp->nlp_flag & NLP_NPR_ADISC) {
2757 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2758 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
2759 lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
2760 lpfc_issue_els_adisc(vport, ndlp, 0);
2762 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
2763 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
2764 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
2767 return ndlp->nlp_state;
2771 lpfc_rcv_prlo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2778 ndlp->nlp_flag |= NLP_LOGO_ACC;
2781 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
2783 if ((ndlp->nlp_flag & NLP_DELAY_TMO) == 0) {
2784 mod_timer(&ndlp->nlp_delayfunc,
2787 ndlp->nlp_flag |= NLP_DELAY_TMO;
2788 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2790 ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
2793 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2796 return ndlp->nlp_state;
2800 lpfc_cmpl_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2813 ndlp->nlp_flag |= NLP_DEFER_RM;
2817 return ndlp->nlp_state;
2821 lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2831 if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
2832 lpfc_drop_node(vport, ndlp);
2835 return ndlp->nlp_state;
2839 lpfc_cmpl_logo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2845 if (ndlp->nlp_DID == Fabric_DID) {
2850 lpfc_unreg_rpi(vport, ndlp);
2851 return ndlp->nlp_state;
2855 lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2865 if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
2866 lpfc_drop_node(vport, ndlp);
2869 return ndlp->nlp_state;
2874 struct lpfc_nodelist *ndlp,
2883 ndlp->nlp_rpi = mb->un.varWords[0];
2884 ndlp->nlp_flag |= NLP_RPI_REGISTERED;
2885 if (ndlp->nlp_flag & NLP_LOGO_ACC) {
2886 lpfc_unreg_rpi(vport, ndlp);
2889 if (ndlp->nlp_flag & NLP_NODEV_REMOVE) {
2890 lpfc_drop_node(vport, ndlp);
2894 return ndlp->nlp_state;
2898 lpfc_device_rm_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2903 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
2905 ndlp->nlp_flag |= NLP_NODEV_REMOVE;
2907 return ndlp->nlp_state;
2909 lpfc_drop_node(vport, ndlp);
2914 lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2923 return ndlp->nlp_state;
2925 lpfc_cancel_retry_delay_tmo(vport, ndlp);
2927 ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
2928 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
2930 return ndlp->nlp_state;
3121 lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3130 if (lpfc_nlp_get(ndlp))
3133 cur_state = ndlp->nlp_state;
3135 data1 = (((uint32_t)ndlp->nlp_fc4_type << 16) |
3136 ((uint32_t)ndlp->nlp_type));
3141 evt, ndlp->nlp_DID, cur_state, ndlp->nlp_rpi,
3142 ndlp->nlp_flag, data1);
3146 evt, cur_state, ndlp->nlp_DID);
3149 rc = (func) (vport, ndlp, arg, evt);
3153 data1 = (((uint32_t)ndlp->nlp_fc4_type << 16) |
3154 ((uint32_t)ndlp->nlp_type));
3158 rc, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_flag,
3163 rc, ndlp->nlp_DID, ndlp->nlp_flag);
3164 /* Decrement the ndlp reference count held for this function */
3165 lpfc_nlp_put(ndlp);