Lines Matching +full:px +full:- +full:supply
4 * Copyright (C) 2017-2023 Broadcom. All Rights Reserved. The term *
6 * Copyright (C) 2004-2016 Emulex. All rights reserved. *
9 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
17 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
23 /* See Fibre Channel protocol T11 FC-LS for details */
72 * lpfc_els_chk_latt - Check host link attention event for a vport
90 * 0 - no host link attention event happened
91 * 1 - host link attention event happened
97 struct lpfc_hba *phba = vport->phba; in lpfc_els_chk_latt()
100 if (vport->port_state >= LPFC_VPORT_READY || in lpfc_els_chk_latt()
101 phba->link_state == LPFC_LINK_DOWN || in lpfc_els_chk_latt()
102 phba->sli_rev > LPFC_SLI_REV3) in lpfc_els_chk_latt()
106 if (lpfc_readl(phba->HAregaddr, &ha_copy)) in lpfc_els_chk_latt()
116 phba->pport->port_state); in lpfc_els_chk_latt()
118 /* CLEAR_LA should re-enable link attention events and in lpfc_els_chk_latt()
121 * will cleanup any left over in-progress discovery in lpfc_els_chk_latt()
124 spin_lock_irq(shost->host_lock); in lpfc_els_chk_latt()
125 vport->fc_flag |= FC_ABORT_DISCOVERY; in lpfc_els_chk_latt()
126 spin_unlock_irq(shost->host_lock); in lpfc_els_chk_latt()
128 if (phba->link_state != LPFC_CLEAR_LA) in lpfc_els_chk_latt()
136 struct fc_els_ls_acc *rsp = buf->virt; in lpfc_is_els_acc_rsp()
138 if (rsp && rsp->la_cmd == ELS_LS_ACC) in lpfc_is_els_acc_rsp()
144 * lpfc_prep_els_iocb - Allocate and prepare a lpfc iocb data structure
149 * @ndlp: pointer to a node-list data structure.
153 * This routine is used for allocating a lpfc-IOCB data structure from
154 * the driver lpfc-IOCB free-list and prepare the IOCB with the parameters
156 * Link Service (ELS) commands. It is a generic lpfc-IOCB allocation
158 * routines and the ELS command-specific fields will be later set up by
169 * NULL - when els iocb data structure allocation/preparation failed
177 struct lpfc_hba *phba = vport->phba; in lpfc_prep_els_iocb()
196 (phba->hba_flag & HBA_FIP_SUPPORT) && in lpfc_prep_els_iocb()
202 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
207 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
212 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
218 elsiocb->cmd_flag &= ~LPFC_FIP_ELS_ID_MASK; in lpfc_prep_els_iocb()
224 pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys); in lpfc_prep_els_iocb()
225 if (!pcmd || !pcmd->virt) in lpfc_prep_els_iocb()
228 INIT_LIST_HEAD(&pcmd->list); in lpfc_prep_els_iocb()
234 prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
235 &prsp->phys); in lpfc_prep_els_iocb()
236 if (!prsp || !prsp->virt) in lpfc_prep_els_iocb()
238 INIT_LIST_HEAD(&prsp->list); in lpfc_prep_els_iocb()
246 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
247 &pbuflist->phys); in lpfc_prep_els_iocb()
248 if (!pbuflist || !pbuflist->virt) in lpfc_prep_els_iocb()
251 INIT_LIST_HEAD(&pbuflist->list); in lpfc_prep_els_iocb()
259 timeout = phba->fc_ratov; in lpfc_prep_els_iocb()
262 timeout = phba->fc_ratov * 2; in lpfc_prep_els_iocb()
266 elsiocb->num_bdes = 2; in lpfc_prep_els_iocb()
269 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_prep_els_iocb()
277 bpl = (struct ulp_bde64_le *)pbuflist->virt; in lpfc_prep_els_iocb()
278 bpl->addr_low = cpu_to_le32(putPaddrLow(pcmd->phys)); in lpfc_prep_els_iocb()
279 bpl->addr_high = cpu_to_le32(putPaddrHigh(pcmd->phys)); in lpfc_prep_els_iocb()
280 bpl->type_size = cpu_to_le32(cmd_size); in lpfc_prep_els_iocb()
281 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
285 bpl->addr_low = cpu_to_le32(putPaddrLow(prsp->phys)); in lpfc_prep_els_iocb()
286 bpl->addr_high = cpu_to_le32(putPaddrHigh(prsp->phys)); in lpfc_prep_els_iocb()
287 bpl->type_size = cpu_to_le32(FCELSSIZE); in lpfc_prep_els_iocb()
288 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
291 elsiocb->cmd_dmabuf = pcmd; in lpfc_prep_els_iocb()
292 elsiocb->bpl_dmabuf = pbuflist; in lpfc_prep_els_iocb()
293 elsiocb->retry = retry; in lpfc_prep_els_iocb()
294 elsiocb->vport = vport; in lpfc_prep_els_iocb()
295 elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT; in lpfc_prep_els_iocb()
298 list_add(&prsp->list, &pcmd->list); in lpfc_prep_els_iocb()
305 elscmd, did, elsiocb->iotag, in lpfc_prep_els_iocb()
306 vport->port_state, ndlp->nlp_rpi, in lpfc_prep_els_iocb()
307 vport->fc_flag); in lpfc_prep_els_iocb()
314 elscmd, ndlp->nlp_DID, elsiocb->iotag, in lpfc_prep_els_iocb()
315 cmd_size, vport->port_state, in lpfc_prep_els_iocb()
316 ndlp->nlp_rpi, vport->fc_flag); in lpfc_prep_els_iocb()
323 lpfc_mbuf_free(phba, prsp->virt, prsp->phys); in lpfc_prep_els_iocb()
327 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys); in lpfc_prep_els_iocb()
337 * lpfc_issue_fabric_reglogin - Issue fabric registration login for a vport
349 * 0 - successfully issued fabric registration login for @vport
350 * -ENXIO -- failed to issue fabric registration login for @vport
355 struct lpfc_hba *phba = vport->phba; in lpfc_issue_fabric_reglogin()
362 sp = &phba->fc_fabparam; in lpfc_issue_fabric_reglogin()
369 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
375 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_fabric_reglogin()
377 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_issue_fabric_reglogin()
378 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
386 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
391 rc = lpfc_reg_rpi(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox, in lpfc_issue_fabric_reglogin()
392 ndlp->nlp_rpi); in lpfc_issue_fabric_reglogin()
398 mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login; in lpfc_issue_fabric_reglogin()
399 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
403 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_fabric_reglogin()
404 if (!mbox->ctx_ndlp) { in lpfc_issue_fabric_reglogin()
429 return -ENXIO; in lpfc_issue_fabric_reglogin()
433 * lpfc_issue_reg_vfi - Register VFI for this vport's fabric login
440 * 0 - successfully issued REG_VFI for @vport
446 struct lpfc_hba *phba = vport->phba; in lpfc_issue_reg_vfi()
453 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_issue_reg_vfi()
454 !(phba->link_flag & LS_LOOPBACK_MODE) && in lpfc_issue_reg_vfi()
455 !(vport->fc_flag & FC_PT2PT)) { in lpfc_issue_reg_vfi()
458 rc = -ENODEV; in lpfc_issue_reg_vfi()
463 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vfi()
465 rc = -ENOMEM; in lpfc_issue_reg_vfi()
469 /* Supply CSP's only if we are fabric connect or pt-to-pt connect */ in lpfc_issue_reg_vfi()
470 if ((vport->fc_flag & FC_FABRIC) || (vport->fc_flag & FC_PT2PT)) { in lpfc_issue_reg_vfi()
473 rc = -ENOMEM; in lpfc_issue_reg_vfi()
476 dmabuf = mboxq->ctx_buf; in lpfc_issue_reg_vfi()
477 memcpy(dmabuf->virt, &phba->fc_fabparam, in lpfc_issue_reg_vfi()
481 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_reg_vfi()
483 lpfc_reg_vfi(mboxq, vport, dmabuf->phys); in lpfc_issue_reg_vfi()
485 mboxq->ctx_buf = dmabuf; in lpfc_issue_reg_vfi()
490 mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; in lpfc_issue_reg_vfi()
491 mboxq->vport = vport; in lpfc_issue_reg_vfi()
494 rc = -ENXIO; in lpfc_issue_reg_vfi()
509 * lpfc_issue_unreg_vfi - Unregister VFI for this vport's fabric login
516 * 0 - successfully issued REG_VFI for @vport
522 struct lpfc_hba *phba = vport->phba; in lpfc_issue_unreg_vfi()
527 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_unreg_vfi()
531 "HBA state x%x\n", phba->pport->port_state); in lpfc_issue_unreg_vfi()
532 return -ENOMEM; in lpfc_issue_unreg_vfi()
536 mboxq->vport = vport; in lpfc_issue_unreg_vfi()
537 mboxq->mbox_cmpl = lpfc_unregister_vfi_cmpl; in lpfc_issue_unreg_vfi()
544 rc, phba->pport->port_state); in lpfc_issue_unreg_vfi()
545 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_issue_unreg_vfi()
546 return -EIO; in lpfc_issue_unreg_vfi()
550 spin_lock_irq(shost->host_lock); in lpfc_issue_unreg_vfi()
551 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_issue_unreg_vfi()
552 spin_unlock_irq(shost->host_lock); in lpfc_issue_unreg_vfi()
557 * lpfc_check_clean_addr_bit - Check whether assigned FCID is clean.
570 * 0 - FCID and Fabric Nodename and Fabric portname is not changed.
571 * 1 - FCID or Fabric Nodename or Fabric portname is changed.
578 struct lpfc_hba *phba = vport->phba; in lpfc_check_clean_addr_bit()
582 if ((vport->fc_prevDID != vport->fc_myDID) || in lpfc_check_clean_addr_bit()
583 memcmp(&vport->fabric_portname, &sp->portName, in lpfc_check_clean_addr_bit()
585 memcmp(&vport->fabric_nodename, &sp->nodeName, in lpfc_check_clean_addr_bit()
587 (vport->vport_flag & FAWWPN_PARAM_CHG)) { in lpfc_check_clean_addr_bit()
589 vport->vport_flag &= ~FAWWPN_PARAM_CHG; in lpfc_check_clean_addr_bit()
598 * - vport->fc_prevDID != 0 (not initial discovery) OR in lpfc_check_clean_addr_bit()
599 * - lpfc_delay_discovery module parameter is set. in lpfc_check_clean_addr_bit()
601 if (fabric_param_changed && !sp->cmn.clean_address_bit && in lpfc_check_clean_addr_bit()
602 (vport->fc_prevDID || phba->cfg_delay_discovery)) { in lpfc_check_clean_addr_bit()
603 spin_lock_irq(shost->host_lock); in lpfc_check_clean_addr_bit()
604 vport->fc_flag |= FC_DISC_DELAYED; in lpfc_check_clean_addr_bit()
605 spin_unlock_irq(shost->host_lock); in lpfc_check_clean_addr_bit()
613 * lpfc_cmpl_els_flogi_fabric - Completion function for flogi to a fabric port
615 * @ndlp: pointer to a node-list data structure.
630 * 0 - Success (currently, always return 0)
637 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_fabric()
642 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
643 vport->fc_flag |= FC_FABRIC; in lpfc_cmpl_els_flogi_fabric()
644 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
646 phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_cmpl_els_flogi_fabric()
647 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_cmpl_els_flogi_fabric()
648 phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000; in lpfc_cmpl_els_flogi_fabric()
650 phba->fc_edtovResol = sp->cmn.edtovResolution; in lpfc_cmpl_els_flogi_fabric()
651 phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000; in lpfc_cmpl_els_flogi_fabric()
653 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_cmpl_els_flogi_fabric()
654 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
655 vport->fc_flag |= FC_PUBLIC_LOOP; in lpfc_cmpl_els_flogi_fabric()
656 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
659 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_flogi_fabric()
660 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
661 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
662 ndlp->nlp_class_sup = 0; in lpfc_cmpl_els_flogi_fabric()
663 if (sp->cls1.classValid) in lpfc_cmpl_els_flogi_fabric()
664 ndlp->nlp_class_sup |= FC_COS_CLASS1; in lpfc_cmpl_els_flogi_fabric()
665 if (sp->cls2.classValid) in lpfc_cmpl_els_flogi_fabric()
666 ndlp->nlp_class_sup |= FC_COS_CLASS2; in lpfc_cmpl_els_flogi_fabric()
667 if (sp->cls3.classValid) in lpfc_cmpl_els_flogi_fabric()
668 ndlp->nlp_class_sup |= FC_COS_CLASS3; in lpfc_cmpl_els_flogi_fabric()
669 if (sp->cls4.classValid) in lpfc_cmpl_els_flogi_fabric()
670 ndlp->nlp_class_sup |= FC_COS_CLASS4; in lpfc_cmpl_els_flogi_fabric()
671 ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | in lpfc_cmpl_els_flogi_fabric()
672 sp->cmn.bbRcvSizeLsb; in lpfc_cmpl_els_flogi_fabric()
677 if (phba->cfg_enable_SmartSAN || in lpfc_cmpl_els_flogi_fabric()
678 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) { in lpfc_cmpl_els_flogi_fabric()
680 vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR; in lpfc_cmpl_els_flogi_fabric()
681 if (phba->cfg_enable_SmartSAN) in lpfc_cmpl_els_flogi_fabric()
682 vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR; in lpfc_cmpl_els_flogi_fabric()
684 vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR; in lpfc_cmpl_els_flogi_fabric()
686 vport->fdmi_hba_mask = 0; in lpfc_cmpl_els_flogi_fabric()
687 vport->fdmi_port_mask = 0; in lpfc_cmpl_els_flogi_fabric()
691 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_flogi_fabric()
693 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_fabric()
695 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_cmpl_els_flogi_fabric()
697 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_cmpl_els_flogi_fabric()
698 if (sp->cmn.response_multiple_NPort) { in lpfc_cmpl_els_flogi_fabric()
703 sp->cmn.response_multiple_NPort); in lpfc_cmpl_els_flogi_fabric()
704 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
705 phba->link_flag |= LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
706 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
713 "- configuring single port mode.\n"); in lpfc_cmpl_els_flogi_fabric()
714 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
715 phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
716 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
724 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
725 (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)) { in lpfc_cmpl_els_flogi_fabric()
731 if (vport->fc_flag & FC_VFI_REGISTERED) in lpfc_cmpl_els_flogi_fabric()
736 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_flogi_fabric()
742 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_flogi_fabric()
743 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_flogi_fabric()
744 !(np->nlp_flag & NLP_NPR_ADISC)) in lpfc_cmpl_els_flogi_fabric()
746 spin_lock_irq(&np->lock); in lpfc_cmpl_els_flogi_fabric()
747 np->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_cmpl_els_flogi_fabric()
748 spin_unlock_irq(&np->lock); in lpfc_cmpl_els_flogi_fabric()
753 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
756 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
757 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_cmpl_els_flogi_fabric()
758 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
765 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
766 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_els_flogi_fabric()
767 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
768 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
769 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_flogi_fabric()
771 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_flogi_fabric()
779 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
781 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED && in lpfc_cmpl_els_flogi_fabric()
782 vport->fc_flag & FC_VPORT_NEEDS_REG_VPI) in lpfc_cmpl_els_flogi_fabric()
787 ndlp->nlp_type |= NLP_FABRIC; in lpfc_cmpl_els_flogi_fabric()
789 if ((!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) && in lpfc_cmpl_els_flogi_fabric()
790 (vport->vpi_state & LPFC_VPI_REGISTERED)) { in lpfc_cmpl_els_flogi_fabric()
793 } else if (vport->fc_flag & FC_VFI_REGISTERED) in lpfc_cmpl_els_flogi_fabric()
798 vport->fc_prevDID, vport->fc_myDID); in lpfc_cmpl_els_flogi_fabric()
806 * lpfc_cmpl_els_flogi_nport - Completion function for flogi to an N_Port
808 * @ndlp: pointer to a node-list data structure.
813 * in a point-to-point topology. First, the @vport's N_Port Name is compared
822 * 0 - Success
823 * -ENXIO - Fail
830 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_nport()
834 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
835 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_cmpl_els_flogi_nport()
836 vport->fc_flag |= FC_PT2PT; in lpfc_cmpl_els_flogi_nport()
837 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
840 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; in lpfc_cmpl_els_flogi_nport()
843 if ((phba->sli_rev == LPFC_SLI_REV4) && phba->fc_topology_changed) { in lpfc_cmpl_els_flogi_nport()
846 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
847 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_cmpl_els_flogi_nport()
848 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
849 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi_nport()
852 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
853 sizeof(vport->fc_portname)); in lpfc_cmpl_els_flogi_nport()
857 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
858 vport->fc_flag |= FC_PT2PT_PLOGI; in lpfc_cmpl_els_flogi_nport()
859 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
868 vport->fc_myDID = PT2PT_LocalID; in lpfc_cmpl_els_flogi_nport()
874 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
888 memcpy(&ndlp->nlp_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
890 memcpy(&ndlp->nlp_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_nport()
894 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_flogi_nport()
895 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_flogi_nport()
896 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_flogi_nport()
898 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_cmpl_els_flogi_nport()
904 mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_cmpl_els_flogi_nport()
905 mbox->vport = vport; in lpfc_cmpl_els_flogi_nport()
908 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_cmpl_els_flogi_nport()
916 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
919 /* Start discovery - this should just do CLEAR_LA */ in lpfc_cmpl_els_flogi_nport()
925 return -ENXIO; in lpfc_cmpl_els_flogi_nport()
929 * lpfc_cmpl_els_flogi - Completion callback function for flogi
934 * This routine is the top-level completion callback function for issuing
945 * this is a point-to-point topology or a fabric topology: if the Port ID
947 * point-to-point topology. The routine lpfc_cmpl_els_flogi_fabric() or
955 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_flogi()
957 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_flogi()
959 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_flogi()
971 if (!(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
979 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi()
982 irsp = &rspiocb->iocb; in lpfc_cmpl_els_flogi()
983 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_flogi()
989 vport->port_state); in lpfc_cmpl_els_flogi()
996 if ((phba->hba_flag & HBA_FIP_SUPPORT) && in lpfc_cmpl_els_flogi()
997 (phba->fcf.fcf_flag & FCF_DISCOVERY)) { in lpfc_cmpl_els_flogi()
998 if (phba->link_state < LPFC_LINK_UP) in lpfc_cmpl_els_flogi()
1000 if ((phba->fcoe_cvl_eventtag_attn == in lpfc_cmpl_els_flogi()
1001 phba->fcoe_cvl_eventtag) && in lpfc_cmpl_els_flogi()
1007 phba->fcoe_cvl_eventtag_attn = in lpfc_cmpl_els_flogi()
1008 phba->fcoe_cvl_eventtag; in lpfc_cmpl_els_flogi()
1013 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
1016 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1032 phba->hba_flag, phba->fcf.fcf_flag); in lpfc_cmpl_els_flogi()
1049 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS) && in lpfc_cmpl_els_flogi()
1050 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
1056 ulp_status, ulp_word4, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1057 tmo, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1072 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1073 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP | in lpfc_cmpl_els_flogi()
1075 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1081 if (phba->alpa_map[0] == 0) in lpfc_cmpl_els_flogi()
1082 vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS; in lpfc_cmpl_els_flogi()
1083 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi()
1084 (!(vport->fc_flag & FC_VFI_REGISTERED) || in lpfc_cmpl_els_flogi()
1085 (vport->fc_prevDID != vport->fc_myDID) || in lpfc_cmpl_els_flogi()
1086 phba->fc_topology_changed)) { in lpfc_cmpl_els_flogi()
1087 if (vport->fc_flag & FC_VFI_REGISTERED) { in lpfc_cmpl_els_flogi()
1088 if (phba->fc_topology_changed) { in lpfc_cmpl_els_flogi()
1090 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1091 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_cmpl_els_flogi()
1092 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1093 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi()
1107 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1108 vport->fc_flag &= ~FC_VPORT_CVL_RCVD; in lpfc_cmpl_els_flogi()
1109 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD; in lpfc_cmpl_els_flogi()
1110 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1116 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_flogi()
1121 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_flogi()
1127 cmdiocb->iotag, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1128 ulp_word4, sp->cmn.e_d_tov, in lpfc_cmpl_els_flogi()
1129 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution, in lpfc_cmpl_els_flogi()
1130 vport->port_state, vport->fc_flag, in lpfc_cmpl_els_flogi()
1131 sp->cmn.priority_tagging, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1136 if (sp->cmn.priority_tagging) in lpfc_cmpl_els_flogi()
1137 vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA | in lpfc_cmpl_els_flogi()
1146 if (vport->port_state == LPFC_FLOGI) { in lpfc_cmpl_els_flogi()
1151 if (sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1154 else if (!(phba->hba_flag & HBA_FCOE_MODE)) in lpfc_cmpl_els_flogi()
1163 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
1164 phba->fcf.current_rec.switch_name[0], in lpfc_cmpl_els_flogi()
1165 phba->fcf.current_rec.switch_name[1], in lpfc_cmpl_els_flogi()
1166 phba->fcf.current_rec.switch_name[2], in lpfc_cmpl_els_flogi()
1167 phba->fcf.current_rec.switch_name[3], in lpfc_cmpl_els_flogi()
1168 phba->fcf.current_rec.switch_name[4], in lpfc_cmpl_els_flogi()
1169 phba->fcf.current_rec.switch_name[5], in lpfc_cmpl_els_flogi()
1170 phba->fcf.current_rec.switch_name[6], in lpfc_cmpl_els_flogi()
1171 phba->fcf.current_rec.switch_name[7], in lpfc_cmpl_els_flogi()
1172 phba->fcf.current_rec.fabric_name[0], in lpfc_cmpl_els_flogi()
1173 phba->fcf.current_rec.fabric_name[1], in lpfc_cmpl_els_flogi()
1174 phba->fcf.current_rec.fabric_name[2], in lpfc_cmpl_els_flogi()
1175 phba->fcf.current_rec.fabric_name[3], in lpfc_cmpl_els_flogi()
1176 phba->fcf.current_rec.fabric_name[4], in lpfc_cmpl_els_flogi()
1177 phba->fcf.current_rec.fabric_name[5], in lpfc_cmpl_els_flogi()
1178 phba->fcf.current_rec.fabric_name[6], in lpfc_cmpl_els_flogi()
1179 phba->fcf.current_rec.fabric_name[7]); in lpfc_cmpl_els_flogi()
1182 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1183 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1184 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); in lpfc_cmpl_els_flogi()
1185 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1186 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1191 if (phba->hba_flag & HBA_FIP_SUPPORT) in lpfc_cmpl_els_flogi()
1196 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1197 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1198 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1199 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); in lpfc_cmpl_els_flogi()
1200 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1201 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1204 } else if (vport->port_state > LPFC_FLOGI && in lpfc_cmpl_els_flogi()
1205 vport->fc_flag & FC_PT2PT) { in lpfc_cmpl_els_flogi()
1211 if (!sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1216 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1217 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1218 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1231 (phba->link_state != LPFC_CLEAR_LA)) { in lpfc_cmpl_els_flogi()
1237 phba->hba_flag &= ~HBA_FLOGI_OUTSTANDING; in lpfc_cmpl_els_flogi()
1244 * lpfc_cmpl_els_link_down - Completion callback function for ELS command
1259 pcmd = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_cmpl_els_link_down()
1269 cmdiocb->cmd_flag); in lpfc_cmpl_els_link_down()
1271 if (cmdiocb->cmd_flag & LPFC_IO_FABRIC) { in lpfc_cmpl_els_link_down()
1272 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_els_link_down()
1273 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_els_link_down()
1279 * lpfc_issue_els_flogi - Issue an flogi iocb command for a vport
1281 * @ndlp: pointer to a node-list data structure.
1286 * of the FLOGI Request IOCB and the top-level callback function pointer
1296 * 0 - successfully issued flogi iocb for @vport
1297 * 1 - failed to issue flogi iocb for @vport
1303 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_flogi()
1316 ndlp->nlp_DID, ELS_CMD_FLOGI); in lpfc_issue_els_flogi()
1321 wqe = &elsiocb->wqe; in lpfc_issue_els_flogi()
1322 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_flogi()
1323 icmd = &elsiocb->iocb; in lpfc_issue_els_flogi()
1328 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_flogi()
1332 sp->cmn.e_d_tov = 0; in lpfc_issue_els_flogi()
1333 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_flogi()
1334 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_flogi()
1335 sp->cls1.classValid = 0; in lpfc_issue_els_flogi()
1336 if (sp->cmn.fcphLow < FC_PH3) in lpfc_issue_els_flogi()
1337 sp->cmn.fcphLow = FC_PH3; in lpfc_issue_els_flogi()
1338 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_flogi()
1339 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_flogi()
1342 if (phba->cfg_vmid_priority_tagging) { in lpfc_issue_els_flogi()
1343 sp->cmn.priority_tagging = 1; in lpfc_issue_els_flogi()
1345 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_issue_els_flogi()
1346 sizeof(vport->lpfc_vmid_host_uuid))) { in lpfc_issue_els_flogi()
1347 memcpy(vport->lpfc_vmid_host_uuid, phba->wwpn, in lpfc_issue_els_flogi()
1348 sizeof(phba->wwpn)); in lpfc_issue_els_flogi()
1349 memcpy(&vport->lpfc_vmid_host_uuid[8], phba->wwnn, in lpfc_issue_els_flogi()
1350 sizeof(phba->wwnn)); in lpfc_issue_els_flogi()
1354 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1355 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == in lpfc_issue_els_flogi()
1359 bf_set(wqe_ct, &wqe->els_req.wqe_com, ct); in lpfc_issue_els_flogi()
1362 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, in lpfc_issue_els_flogi()
1363 phba->fcf.fcfi); in lpfc_issue_els_flogi()
1367 sp->cls2.classValid = 0; in lpfc_issue_els_flogi()
1368 sp->cls2.seqDelivery = 0; in lpfc_issue_els_flogi()
1370 /* Historical, setting sequential-delivery bit for SLI3 */ in lpfc_issue_els_flogi()
1371 sp->cls2.seqDelivery = (sp->cls2.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1372 sp->cls3.seqDelivery = (sp->cls3.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1373 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_issue_els_flogi()
1374 sp->cmn.request_multiple_Nport = 1; in lpfc_issue_els_flogi()
1376 icmd->ulpCt_h = 1; in lpfc_issue_els_flogi()
1377 icmd->ulpCt_l = 0; in lpfc_issue_els_flogi()
1379 sp->cmn.request_multiple_Nport = 0; in lpfc_issue_els_flogi()
1382 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_issue_els_flogi()
1383 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_flogi()
1384 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_flogi()
1388 tmo = phba->fc_ratov; in lpfc_issue_els_flogi()
1389 phba->fc_ratov = LPFC_DISC_FLOGI_TMO; in lpfc_issue_els_flogi()
1391 phba->fc_ratov = tmo; in lpfc_issue_els_flogi()
1393 phba->fc_stat.elsXmitFLOGI++; in lpfc_issue_els_flogi()
1394 elsiocb->cmd_cmpl = lpfc_cmpl_els_flogi; in lpfc_issue_els_flogi()
1398 phba->sli3_options, 0, 0); in lpfc_issue_els_flogi()
1400 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_flogi()
1401 if (!elsiocb->ndlp) { in lpfc_issue_els_flogi()
1407 phba->hba_flag |= (HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING); in lpfc_issue_els_flogi()
1411 phba->hba_flag &= ~(HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING); in lpfc_issue_els_flogi()
1418 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_issue_els_flogi()
1421 if (phba->defer_flogi_acc_flag) { in lpfc_issue_els_flogi()
1427 did = vport->fc_myDID; in lpfc_issue_els_flogi()
1428 vport->fc_myDID = Fabric_DID; in lpfc_issue_els_flogi()
1432 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1435 phba->defer_flogi_acc_rx_id); in lpfc_issue_els_flogi()
1438 phba->defer_flogi_acc_ox_id); in lpfc_issue_els_flogi()
1441 icmd->ulpContext = phba->defer_flogi_acc_rx_id; in lpfc_issue_els_flogi()
1442 icmd->unsli3.rcvsli3.ox_id = in lpfc_issue_els_flogi()
1443 phba->defer_flogi_acc_ox_id; in lpfc_issue_els_flogi()
1449 phba->defer_flogi_acc_rx_id, in lpfc_issue_els_flogi()
1450 phba->defer_flogi_acc_ox_id, phba->hba_flag); in lpfc_issue_els_flogi()
1456 phba->defer_flogi_acc_flag = false; in lpfc_issue_els_flogi()
1457 vport->fc_myDID = did; in lpfc_issue_els_flogi()
1469 * lpfc_els_abort_flogi - Abort all outstanding flogi iocbs
1480 * 0 - Successfully issued abort iocb on all outstanding flogis (Always 0)
1497 return -EIO; in lpfc_els_abort_flogi()
1503 spin_lock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1504 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_els_abort_flogi()
1507 ndlp = iocb->ndlp; in lpfc_els_abort_flogi()
1508 if (ndlp && ndlp->nlp_DID == Fabric_DID) { in lpfc_els_abort_flogi()
1509 if ((phba->pport->fc_flag & FC_PT2PT) && in lpfc_els_abort_flogi()
1510 !(phba->pport->fc_flag & FC_PT2PT_PLOGI)) in lpfc_els_abort_flogi()
1511 iocb->fabric_cmd_cmpl = in lpfc_els_abort_flogi()
1521 spin_unlock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1527 * lpfc_initial_flogi - Issue an initial fabric login for a vport
1539 * 0 - failed to issue initial flogi for @vport
1540 * 1 - successfully issued initial flogi for @vport
1547 vport->port_state = LPFC_FLOGI; in lpfc_initial_flogi()
1558 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_flogi()
1565 vport->fc_flag &= ~FC_FABRIC; in lpfc_initial_flogi()
1568 * transport or dev-loss-evt work is pending. in lpfc_initial_flogi()
1571 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_flogi()
1572 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_initial_flogi()
1580 * lpfc_initial_fdisc - Issue an initial fabric discovery for a vport
1592 * 0 - failed to issue initial fdisc for @vport
1593 * 1 - successfully issued initial fdisc for @vport
1609 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_fdisc()
1617 * transport or dev-loss-evt work is pending. in lpfc_initial_fdisc()
1620 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_fdisc()
1621 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_initial_fdisc()
1629 * lpfc_more_plogi - Check and issue remaining plogis for a vport
1636 * @vport (@vport->cfg_discovery_threads). The function also decrement
1642 if (vport->num_disc_nodes) in lpfc_more_plogi()
1643 vport->num_disc_nodes--; in lpfc_more_plogi()
1649 vport->num_disc_nodes, vport->fc_plogi_cnt, in lpfc_more_plogi()
1650 vport->fc_flag, vport->port_state); in lpfc_more_plogi()
1652 if (vport->fc_flag & FC_NLP_MORE) in lpfc_more_plogi()
1660 * lpfc_plogi_confirm_nport - Confirm plogi wwpn matches stored ndlp
1663 * @ndlp: pointer to a node-list data structure.
1681 * Note that before the @ndlp got "released", the keepDID from not-matching
1694 struct lpfc_vport *vport = ndlp->vport; in lpfc_plogi_confirm_nport()
1708 if (ndlp->nlp_type & NLP_FABRIC) in lpfc_plogi_confirm_nport()
1717 new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName); in lpfc_plogi_confirm_nport()
1729 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_plogi_confirm_nport()
1730 active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool, in lpfc_plogi_confirm_nport()
1734 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1740 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type, in lpfc_plogi_confirm_nport()
1741 (new_ndlp ? new_ndlp->nlp_DID : 0), in lpfc_plogi_confirm_nport()
1742 (new_ndlp ? new_ndlp->nlp_flag : 0), in lpfc_plogi_confirm_nport()
1743 (new_ndlp ? new_ndlp->nlp_fc4_type : 0)); in lpfc_plogi_confirm_nport()
1745 keepDID = new_ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1747 if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap) in lpfc_plogi_confirm_nport()
1748 memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1749 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1756 if (vport->fc_flag & FC_FABRIC) { in lpfc_plogi_confirm_nport()
1757 keep_nlp_fc4_type = new_ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1758 new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1762 new_ndlp->nlp_DID = ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1763 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state; in lpfc_plogi_confirm_nport()
1764 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_plogi_confirm_nport()
1765 memcpy(new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1766 ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1767 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1770 spin_lock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1771 spin_lock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1772 keep_new_nlp_flag = new_ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1773 keep_nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1774 new_ndlp->nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1778 new_ndlp->nlp_flag |= NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1780 new_ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1784 new_ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1786 new_ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1793 new_ndlp->nlp_flag |= NLP_DROPPED; in lpfc_plogi_confirm_nport()
1795 new_ndlp->nlp_flag &= ~NLP_DROPPED; in lpfc_plogi_confirm_nport()
1797 ndlp->nlp_flag = keep_new_nlp_flag; in lpfc_plogi_confirm_nport()
1801 ndlp->nlp_flag |= NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1803 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1807 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1809 ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1816 ndlp->nlp_flag |= NLP_DROPPED; in lpfc_plogi_confirm_nport()
1818 ndlp->nlp_flag &= ~NLP_DROPPED; in lpfc_plogi_confirm_nport()
1820 spin_unlock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1821 spin_unlock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1824 keep_nlp_state = new_ndlp->nlp_state; in lpfc_plogi_confirm_nport()
1825 lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state); in lpfc_plogi_confirm_nport()
1828 keep_nrport = new_ndlp->nrport; in lpfc_plogi_confirm_nport()
1829 new_ndlp->nrport = ndlp->nrport; in lpfc_plogi_confirm_nport()
1832 if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) { in lpfc_plogi_confirm_nport()
1839 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1845 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1846 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1848 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1850 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1852 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1857 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1864 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1865 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1867 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1869 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1871 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1876 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_plogi_confirm_nport()
1877 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) in lpfc_plogi_confirm_nport()
1880 ndlp->nrport = keep_nrport; in lpfc_plogi_confirm_nport()
1887 if (!ndlp->rport && (ndlp->nlp_state == NLP_STE_NPR_NODE)) in lpfc_plogi_confirm_nport()
1890 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1893 phba->active_rrq_pool); in lpfc_plogi_confirm_nport()
1897 new_ndlp->nlp_DID, new_ndlp->nlp_flag, in lpfc_plogi_confirm_nport()
1898 new_ndlp->nlp_fc4_type); in lpfc_plogi_confirm_nport()
1904 * lpfc_end_rscn - Check and handle more rscn for a vport
1919 if (vport->fc_flag & FC_RSCN_MODE) { in lpfc_end_rscn()
1924 if (vport->fc_rscn_id_cnt || in lpfc_end_rscn()
1925 (vport->fc_flag & FC_RSCN_DISCOVERY) != 0) in lpfc_end_rscn()
1928 spin_lock_irq(shost->host_lock); in lpfc_end_rscn()
1929 vport->fc_flag &= ~FC_RSCN_MODE; in lpfc_end_rscn()
1930 spin_unlock_irq(shost->host_lock); in lpfc_end_rscn()
1936 * lpfc_cmpl_els_rrq - Completion handled for els RRQs.
1951 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_rrq()
1952 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rrq()
1958 rrq = cmdiocb->context_un.rrq; in lpfc_cmpl_els_rrq()
1959 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_rrq()
1971 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_rrq()
1972 get_wqe_tmo(cmdiocb), rrq->xritag, rrq->rxid); in lpfc_cmpl_els_rrq()
1980 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_rrq()
1984 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_rrq()
1988 lpfc_clr_rrq_active(phba, rrq->xritag, rrq); in lpfc_cmpl_els_rrq()
1994 * lpfc_cmpl_els_plogi - Completion callback function for plogi
2017 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_plogi()
2028 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_plogi()
2034 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_plogi()
2037 irsp = &rspiocb->iocb; in lpfc_cmpl_els_plogi()
2038 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_plogi()
2057 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2058 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); in lpfc_cmpl_els_plogi()
2059 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2060 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2066 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_plogi()
2067 ndlp->nlp_fc4_type, in lpfc_cmpl_els_plogi()
2069 disc, vport->num_disc_nodes); in lpfc_cmpl_els_plogi()
2073 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2074 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2075 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2084 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2085 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2086 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2094 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_plogi()
2098 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_plogi()
2109 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2110 if ((ndlp->nlp_flag & (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI)) && in lpfc_cmpl_els_plogi()
2111 ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) { in lpfc_cmpl_els_plogi()
2112 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2120 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_plogi()
2121 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2122 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_plogi()
2125 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2132 prsp = list_get_first(&cmdiocb->cmd_dmabuf->list, in lpfc_cmpl_els_plogi()
2138 ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp); in lpfc_cmpl_els_plogi()
2140 sp = (struct serv_parm *)((u8 *)prsp->virt + in lpfc_cmpl_els_plogi()
2143 ndlp->vmid_support = 0; in lpfc_cmpl_els_plogi()
2144 if ((phba->cfg_vmid_app_header && sp->cmn.app_hdr_support) || in lpfc_cmpl_els_plogi()
2145 (phba->cfg_vmid_priority_tagging && in lpfc_cmpl_els_plogi()
2146 sp->cmn.priority_tagging)) { in lpfc_cmpl_els_plogi()
2149 sp->cmn.app_hdr_support, in lpfc_cmpl_els_plogi()
2150 sp->cmn.priority_tagging, in lpfc_cmpl_els_plogi()
2151 ndlp->nlp_DID); in lpfc_cmpl_els_plogi()
2153 ndlp->vmid_support = 1; in lpfc_cmpl_els_plogi()
2160 if (disc && vport->num_disc_nodes) { in lpfc_cmpl_els_plogi()
2164 if (vport->num_disc_nodes == 0) { in lpfc_cmpl_els_plogi()
2165 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_plogi()
2166 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cmpl_els_plogi()
2167 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_plogi()
2177 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_plogi()
2181 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_plogi()
2189 * lpfc_issue_els_plogi - Issue an plogi iocb command for a vport
2205 * 0 - Successfully issued a plogi for @vport
2206 * 1 - failed to issue a plogi for @vport
2211 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_plogi()
2227 if ((ndlp->nlp_flag & (NLP_IGNR_REG_CMPL | NLP_UNREG_INP)) && in lpfc_issue_els_plogi()
2228 ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) && in lpfc_issue_els_plogi()
2229 !(vport->fc_flag & FC_OFFLINE_MODE)) { in lpfc_issue_els_plogi()
2233 " x%px\n", in lpfc_issue_els_plogi()
2234 ndlp->nlp_defer_did, ndlp->nlp_DID, in lpfc_issue_els_plogi()
2235 ndlp->nlp_rpi, ndlp->nlp_flag, ndlp); in lpfc_issue_els_plogi()
2238 if (ndlp->nlp_defer_did == NLP_EVT_NOTHING_PENDING) in lpfc_issue_els_plogi()
2239 ndlp->nlp_defer_did = did; in lpfc_issue_els_plogi()
2249 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_plogi()
2254 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_plogi()
2258 * If we are a N-port connected to a Fabric, fix-up paramm's so logins in lpfc_issue_els_plogi()
2261 if ((vport->fc_flag & FC_FABRIC) && !(vport->fc_flag & FC_PUBLIC_LOOP)) in lpfc_issue_els_plogi()
2262 sp->cmn.altBbCredit = 1; in lpfc_issue_els_plogi()
2264 if (sp->cmn.fcphLow < FC_PH_4_3) in lpfc_issue_els_plogi()
2265 sp->cmn.fcphLow = FC_PH_4_3; in lpfc_issue_els_plogi()
2267 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_plogi()
2268 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_plogi()
2270 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_plogi()
2271 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_plogi()
2272 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_issue_els_plogi()
2275 ndlp->vmid_support = 0; in lpfc_issue_els_plogi()
2276 if (vport->vmid_priority_tagging) in lpfc_issue_els_plogi()
2277 sp->cmn.priority_tagging = 1; in lpfc_issue_els_plogi()
2278 else if (phba->cfg_vmid_app_header && in lpfc_issue_els_plogi()
2279 bf_get(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags)) in lpfc_issue_els_plogi()
2280 sp->cmn.app_hdr_support = 1; in lpfc_issue_els_plogi()
2289 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_issue_els_plogi()
2290 sp->cmn.valid_vendor_ver_level = 1; in lpfc_issue_els_plogi()
2291 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_issue_els_plogi()
2292 sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP); in lpfc_issue_els_plogi()
2295 phba->fc_stat.elsXmitPLOGI++; in lpfc_issue_els_plogi()
2296 elsiocb->cmd_cmpl = lpfc_cmpl_els_plogi; in lpfc_issue_els_plogi()
2300 did, kref_read(&ndlp->kref), 0); in lpfc_issue_els_plogi()
2301 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_plogi()
2302 if (!elsiocb->ndlp) { in lpfc_issue_els_plogi()
2318 * lpfc_cmpl_els_prli - Completion callback function for prli
2334 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_prli()
2343 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_prli()
2345 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_prli()
2350 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2351 ndlp->nlp_flag &= ~NLP_PRLI_SND; in lpfc_cmpl_els_prli()
2354 vport->fc_prli_sent--; in lpfc_cmpl_els_prli()
2355 ndlp->fc4_prli_sent--; in lpfc_cmpl_els_prli()
2356 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2361 ndlp->nlp_DID); in lpfc_cmpl_els_prli()
2367 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_prli()
2368 vport->num_disc_nodes, ndlp->fc4_prli_sent, in lpfc_cmpl_els_prli()
2369 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_prli()
2385 if ((vport->fc_flag & FC_FABRIC) || in lpfc_cmpl_els_prli()
2386 (vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)) { in lpfc_cmpl_els_prli()
2398 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_prli()
2399 ulp_word4, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2400 ndlp->fc4_prli_sent, ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2411 if ((ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_prli()
2412 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) || in lpfc_cmpl_els_prli()
2413 (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_cmpl_els_prli()
2414 ndlp->nlp_flag & NLP_DELAY_TMO)) { in lpfc_cmpl_els_prli()
2418 ndlp->nlp_DID, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2419 ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2427 if (vport->fc_flag & FC_PT2PT) in lpfc_cmpl_els_prli()
2435 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2436 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_cmpl_els_prli()
2437 !ndlp->fc4_prli_sent) { in lpfc_cmpl_els_prli()
2438 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_prli()
2439 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_prli()
2442 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2464 * lpfc_issue_els_prli - Issue a prli iocb command for a vport
2466 * @ndlp: pointer to a node-list data structure.
2480 * 0 - successfully issued prli iocb command for @vport
2481 * 1 - failed to issue prli iocb command for @vport
2488 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_prli()
2502 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2503 vport->fc_flag & FC_RSCN_MODE && in lpfc_issue_els_prli()
2504 vport->nvmei_support) in lpfc_issue_els_prli()
2505 ndlp->nlp_fc4_type |= NLP_FC4_NVME; in lpfc_issue_els_prli()
2506 local_nlp_type = ndlp->nlp_fc4_type; in lpfc_issue_els_prli()
2511 ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR); in lpfc_issue_els_prli()
2512 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); in lpfc_issue_els_prli()
2513 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_issue_els_prli()
2514 ndlp->nlp_flag &= ~(NLP_FIRSTBURST | NLP_NPR_2B_DISC); in lpfc_issue_els_prli()
2515 ndlp->nvme_fb_size = 0; in lpfc_issue_els_prli()
2529 ndlp->nlp_fc4_type, ndlp->nlp_DID); in lpfc_issue_els_prli()
2536 if (phba->sli_rev == LPFC_SLI_REV3 && in lpfc_issue_els_prli()
2537 ndlp->nlp_fc4_type == NLP_FC4_NVME) { in lpfc_issue_els_prli()
2540 ndlp->nlp_type); in lpfc_issue_els_prli()
2546 ndlp->nlp_DID, elscmd); in lpfc_issue_els_prli()
2550 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_prli()
2567 * set the following bits for FC-TAPE support. in lpfc_issue_els_prli()
2569 if (phba->vpd.rev.feaLevelHigh >= 0x02) { in lpfc_issue_els_prli()
2570 npr->ConfmComplAllowed = 1; in lpfc_issue_els_prli()
2571 npr->Retry = 1; in lpfc_issue_els_prli()
2572 npr->TaskRetryIdReq = 1; in lpfc_issue_els_prli()
2574 npr->estabImagePair = 1; in lpfc_issue_els_prli()
2575 npr->readXferRdyDis = 1; in lpfc_issue_els_prli()
2576 if (vport->cfg_first_burst_size) in lpfc_issue_els_prli()
2577 npr->writeXferRdyDis = 1; in lpfc_issue_els_prli()
2580 npr->prliType = PRLI_FCP_TYPE; in lpfc_issue_els_prli()
2581 npr->initiatorFunc = 1; in lpfc_issue_els_prli()
2582 elsiocb->cmd_flag |= LPFC_PRLI_FCP_REQ; in lpfc_issue_els_prli()
2584 /* Remove FCP type - processed. */ in lpfc_issue_els_prli()
2596 if (phba->nsler) { in lpfc_issue_els_prli()
2602 if ((phba->cfg_nvme_enable_fb) && in lpfc_issue_els_prli()
2603 !phba->nvmet_support) in lpfc_issue_els_prli()
2606 if (phba->nvmet_support) { in lpfc_issue_els_prli()
2614 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_issue_els_prli()
2615 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_issue_els_prli()
2616 elsiocb->cmd_flag |= LPFC_PRLI_NVME_REQ; in lpfc_issue_els_prli()
2618 /* Remove NVME type - processed. */ in lpfc_issue_els_prli()
2622 phba->fc_stat.elsXmitPRLI++; in lpfc_issue_els_prli()
2623 elsiocb->cmd_cmpl = lpfc_cmpl_els_prli; in lpfc_issue_els_prli()
2627 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_prli()
2628 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_prli()
2629 if (!elsiocb->ndlp) { in lpfc_issue_els_prli()
2645 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2646 ndlp->nlp_flag |= NLP_PRLI_SND; in lpfc_issue_els_prli()
2647 vport->fc_prli_sent++; in lpfc_issue_els_prli()
2648 ndlp->fc4_prli_sent++; in lpfc_issue_els_prli()
2649 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2654 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2662 * lpfc_rscn_disc - Perform rscn discovery for a vport
2680 if (vport->fc_npr_cnt) in lpfc_rscn_disc()
2688 * lpfc_adisc_done - Complete the adisc phase of discovery
2701 struct lpfc_hba *phba = vport->phba; in lpfc_adisc_done()
2707 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_adisc_done()
2708 !(vport->fc_flag & FC_RSCN_MODE) && in lpfc_adisc_done()
2709 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_adisc_done()
2734 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_adisc_done()
2737 if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) { in lpfc_adisc_done()
2738 vport->num_disc_nodes = 0; in lpfc_adisc_done()
2740 if (vport->fc_npr_cnt) in lpfc_adisc_done()
2742 if (!vport->num_disc_nodes) { in lpfc_adisc_done()
2743 spin_lock_irq(shost->host_lock); in lpfc_adisc_done()
2744 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_adisc_done()
2745 spin_unlock_irq(shost->host_lock); in lpfc_adisc_done()
2750 vport->port_state = LPFC_VPORT_READY; in lpfc_adisc_done()
2756 * lpfc_more_adisc - Issue more adisc as needed
2767 if (vport->num_disc_nodes) in lpfc_more_adisc()
2768 vport->num_disc_nodes--; in lpfc_more_adisc()
2773 vport->num_disc_nodes, vport->fc_adisc_cnt, in lpfc_more_adisc()
2774 vport->fc_flag, vport->port_state); in lpfc_more_adisc()
2776 if (vport->fc_flag & FC_NLP_MORE) { in lpfc_more_adisc()
2781 if (!vport->num_disc_nodes) in lpfc_more_adisc()
2787 * lpfc_cmpl_els_adisc - Completion callback function for adisc
2806 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_adisc()
2814 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_adisc()
2816 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_adisc()
2821 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_adisc()
2825 irsp = &rspiocb->iocb; in lpfc_cmpl_els_adisc()
2826 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_adisc()
2827 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_adisc()
2833 ndlp->nlp_DID); in lpfc_cmpl_els_adisc()
2838 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2839 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); in lpfc_cmpl_els_adisc()
2840 ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC); in lpfc_cmpl_els_adisc()
2841 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2846 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_adisc()
2848 tmo, disc, vport->num_disc_nodes); in lpfc_cmpl_els_adisc()
2852 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2853 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2854 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2863 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2864 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2865 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2873 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_adisc()
2882 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2883 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_adisc()
2884 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2885 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_adisc()
2888 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2899 if (disc && vport->num_disc_nodes) in lpfc_cmpl_els_adisc()
2908 * lpfc_issue_els_adisc - Issue an address discover iocb to an node on a vport
2910 * @ndlp: pointer to a node-list data structure.
2923 * 0 - successfully issued adisc
2924 * 1 - failed to issue adisc
2931 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_adisc()
2939 ndlp->nlp_DID, ELS_CMD_ADISC); in lpfc_issue_els_adisc()
2943 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_adisc()
2951 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_issue_els_adisc()
2952 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2953 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2954 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_adisc()
2956 phba->fc_stat.elsXmitADISC++; in lpfc_issue_els_adisc()
2957 elsiocb->cmd_cmpl = lpfc_cmpl_els_adisc; in lpfc_issue_els_adisc()
2958 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2959 ndlp->nlp_flag |= NLP_ADISC_SND; in lpfc_issue_els_adisc()
2960 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2961 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_adisc()
2962 if (!elsiocb->ndlp) { in lpfc_issue_els_adisc()
2969 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_adisc()
2981 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2982 ndlp->nlp_flag &= ~NLP_ADISC_SND; in lpfc_issue_els_adisc()
2983 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2988 * lpfc_cmpl_els_logo - Completion callback function for logo
3002 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo()
3003 struct lpfc_vport *vport = ndlp->vport; in lpfc_cmpl_els_logo()
3013 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_logo()
3018 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_logo()
3022 irsp = &rspiocb->iocb; in lpfc_cmpl_els_logo()
3023 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_logo()
3024 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_logo()
3027 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3028 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_cmpl_els_logo()
3029 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_logo()
3031 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_logo()
3033 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3038 ndlp->nlp_DID); in lpfc_cmpl_els_logo()
3045 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_logo()
3046 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo()
3047 ndlp->fc4_xpt_flags, ulp_status, ulp_word4, in lpfc_cmpl_els_logo()
3048 tmo, vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3065 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3081 if (ndlp->nlp_flag & NLP_TARGET_REMOVE) { in lpfc_cmpl_els_logo()
3082 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3083 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_logo()
3084 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_cmpl_els_logo()
3085 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3086 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3099 if (wake_up_waiter && ndlp->logo_waitq) in lpfc_cmpl_els_logo()
3100 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_logo()
3106 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) && in lpfc_cmpl_els_logo()
3109 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_cmpl_els_logo()
3110 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3111 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_cmpl_els_logo()
3116 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3118 vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3132 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_logo()
3133 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3134 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3135 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3146 * lpfc_issue_els_logo - Issue a logo to an node on a vport
3148 * @ndlp: pointer to a node-list data structure.
3163 * 0 - successfully issued logo
3164 * 1 - failed to issue logo
3170 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_logo()
3176 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3177 if (ndlp->nlp_flag & NLP_LOGO_SND) { in lpfc_issue_els_logo()
3178 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3181 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3185 ndlp->nlp_DID, ELS_CMD_LOGO); in lpfc_issue_els_logo()
3189 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_logo()
3194 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_logo()
3196 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_logo()
3198 phba->fc_stat.elsXmitLOGO++; in lpfc_issue_els_logo()
3199 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo; in lpfc_issue_els_logo()
3200 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3201 ndlp->nlp_flag |= NLP_LOGO_SND; in lpfc_issue_els_logo()
3202 ndlp->nlp_flag &= ~NLP_ISSUE_LOGO; in lpfc_issue_els_logo()
3203 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3204 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_logo()
3205 if (!elsiocb->ndlp) { in lpfc_issue_els_logo()
3212 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_logo()
3221 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3222 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_issue_els_logo()
3223 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3228 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3229 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_issue_els_logo()
3230 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3235 * lpfc_cmpl_els_cmd - Completion callback function for generic els command
3253 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_cmd()
3262 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_cmd()
3266 irsp = &rspiocb->iocb; in lpfc_cmpl_els_cmd()
3267 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_cmd()
3268 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_cmd()
3283 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_cmd()
3290 * lpfc_reg_fab_ctrl_node - RPI register the fabric controller node.
3307 struct lpfc_hba *phba = vport->phba; in lpfc_reg_fab_ctrl_node()
3311 if (fc_ndlp->nlp_flag & NLP_RPI_REGISTERED) in lpfc_reg_fab_ctrl_node()
3316 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3320 __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3321 ns_ndlp->nlp_state); in lpfc_reg_fab_ctrl_node()
3322 if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_reg_fab_ctrl_node()
3323 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3325 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_reg_fab_ctrl_node()
3330 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3331 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3332 return -ENOMEM; in lpfc_reg_fab_ctrl_node()
3334 rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3335 (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3337 rc = -EACCES; in lpfc_reg_fab_ctrl_node()
3341 fc_ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; in lpfc_reg_fab_ctrl_node()
3342 mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login; in lpfc_reg_fab_ctrl_node()
3343 mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp); in lpfc_reg_fab_ctrl_node()
3344 if (!mbox->ctx_ndlp) { in lpfc_reg_fab_ctrl_node()
3345 rc = -ENOMEM; in lpfc_reg_fab_ctrl_node()
3349 mbox->vport = vport; in lpfc_reg_fab_ctrl_node()
3352 rc = -ENODEV; in lpfc_reg_fab_ctrl_node()
3366 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3367 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3372 * lpfc_cmpl_els_disc_cmd - Completion callback function for Discovery ELS cmd
3386 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_disc_cmd()
3392 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_disc_cmd()
3399 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_disc_cmd()
3403 irsp = &rspiocb->iocb; in lpfc_cmpl_els_disc_cmd()
3404 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_disc_cmd()
3405 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_disc_cmd()
3415 iotag, ulp_status, ulp_word4, tmo, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3417 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_disc_cmd()
3421 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_disc_cmd()
3430 cmdiocb->retry++; in lpfc_cmpl_els_disc_cmd()
3431 if (cmdiocb->retry <= 1) { in lpfc_cmpl_els_disc_cmd()
3434 lpfc_issue_els_scr(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3437 lpfc_issue_els_edc(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3440 lpfc_issue_els_rdf(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3445 phba->fc_stat.elsRetryExceeded++; in lpfc_cmpl_els_disc_cmd()
3466 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_disc_cmd()
3470 prdf = (struct lpfc_els_rdf_rsp *)prsp->virt; in lpfc_cmpl_els_disc_cmd()
3477 i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++) in lpfc_cmpl_els_disc_cmd()
3483 prdf->reg_d1.desc_tags[i]), in lpfc_cmpl_els_disc_cmd()
3484 phba->cgn_reg_signal, in lpfc_cmpl_els_disc_cmd()
3485 phba->cgn_reg_fpin); in lpfc_cmpl_els_disc_cmd()
3497 * lpfc_issue_els_scr - Issue a scr to an node on a vport
3513 * 0 - Successfully issued scr command
3514 * 1 - Failed to issue scr command
3520 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_scr()
3537 ndlp->nlp_DID, ELS_CMD_SCR); in lpfc_issue_els_scr()
3541 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_scr()
3551 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_scr()
3558 ((SCR *) pcmd)->Function = SCR_FUNC_FULL; in lpfc_issue_els_scr()
3562 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_scr()
3564 phba->fc_stat.elsXmitSCR++; in lpfc_issue_els_scr()
3565 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_scr()
3566 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_scr()
3567 if (!elsiocb->ndlp) { in lpfc_issue_els_scr()
3574 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_scr()
3587 * lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
3594 * in point-to-point mode. When sent to the Fabric Controller, it will
3602 * 0 - Successfully issued RSCN command
3603 * 1 - Failed to issue RSCN command
3609 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rscn()
3620 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_issue_els_rscn()
3621 !(vport->fc_flag & FC_PUBLIC_LOOP)) in lpfc_issue_els_rscn()
3624 if (vport->fc_flag & FC_PT2PT) { in lpfc_issue_els_rscn()
3625 /* find any mapped nport - that would be the other nport */ in lpfc_issue_els_rscn()
3643 ndlp->nlp_DID, ELS_CMD_RSCN_XMT); in lpfc_issue_els_rscn()
3648 event = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rscn()
3650 event->rscn.rscn_cmd = ELS_RSCN; in lpfc_issue_els_rscn()
3651 event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page); in lpfc_issue_els_rscn()
3652 event->rscn.rscn_plen = cpu_to_be16(cmdsize); in lpfc_issue_els_rscn()
3654 nportid = vport->fc_myDID; in lpfc_issue_els_rscn()
3656 event->portid.rscn_page_flags = 0; in lpfc_issue_els_rscn()
3657 event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16; in lpfc_issue_els_rscn()
3658 event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8; in lpfc_issue_els_rscn()
3659 event->portid.rscn_fid[2] = nportid & 0x000000FF; in lpfc_issue_els_rscn()
3661 phba->fc_stat.elsXmitRSCN++; in lpfc_issue_els_rscn()
3662 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_rscn()
3663 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rscn()
3664 if (!elsiocb->ndlp) { in lpfc_issue_els_rscn()
3671 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_rscn()
3684 * lpfc_issue_els_farpr - Issue a farp to an node on a vport
3701 * 0 - Successfully issued farpr command
3702 * 1 - Failed to issue farpr command
3708 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_farpr()
3728 ndlp->nlp_DID, ELS_CMD_FARPR); in lpfc_issue_els_farpr()
3732 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_farpr()
3742 *lp++ = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_farpr()
3743 fp->Rflags = 0; in lpfc_issue_els_farpr()
3744 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE); in lpfc_issue_els_farpr()
3746 memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3747 memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3750 memcpy(&fp->OportName, &ondlp->nlp_portname, in lpfc_issue_els_farpr()
3752 memcpy(&fp->OnodeName, &ondlp->nlp_nodename, in lpfc_issue_els_farpr()
3758 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_farpr()
3760 phba->fc_stat.elsXmitFARPR++; in lpfc_issue_els_farpr()
3761 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_farpr()
3762 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_farpr()
3763 if (!elsiocb->ndlp) { in lpfc_issue_els_farpr()
3778 /* This will cause the callback-function lpfc_cmpl_els_cmd to in lpfc_issue_els_farpr()
3786 * lpfc_issue_els_rdf - Register for diagnostic functions from the fabric.
3798 * 0 - Successfully issued rdf command
3799 * 1 - Failed to issue rdf command
3804 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rdf()
3817 return -ENODEV; in lpfc_issue_els_rdf()
3822 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_rdf()
3823 return -EACCES; in lpfc_issue_els_rdf()
3826 ndlp->nlp_DID, ELS_CMD_RDF); in lpfc_issue_els_rdf()
3828 return -ENOMEM; in lpfc_issue_els_rdf()
3831 prdf = (struct lpfc_els_rdf_req *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rdf()
3833 prdf->rdf.fpin_cmd = ELS_RDF; in lpfc_issue_els_rdf()
3834 prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) - in lpfc_issue_els_rdf()
3836 prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER); in lpfc_issue_els_rdf()
3837 prdf->reg_d1.reg_desc.desc_len = cpu_to_be32( in lpfc_issue_els_rdf()
3838 FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1)); in lpfc_issue_els_rdf()
3839 prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT); in lpfc_issue_els_rdf()
3840 prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY); in lpfc_issue_els_rdf()
3841 prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY); in lpfc_issue_els_rdf()
3842 prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST); in lpfc_issue_els_rdf()
3843 prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION); in lpfc_issue_els_rdf()
3847 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_rdf()
3848 phba->cgn_reg_fpin); in lpfc_issue_els_rdf()
3850 phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ; in lpfc_issue_els_rdf()
3851 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_rdf()
3852 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rdf()
3853 if (!elsiocb->ndlp) { in lpfc_issue_els_rdf()
3855 return -EIO; in lpfc_issue_els_rdf()
3860 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_rdf()
3866 return -EIO; in lpfc_issue_els_rdf()
3872 * lpfc_els_rcv_rdf - Receive RDF ELS request from the fabric.
3875 * @ndlp: pointer to a node-list data structure.
3882 * 0 - Success
3883 * -EIO - Failed to process received RDF
3893 ndlp->nlp_DID, vport->fc_myDID); in lpfc_els_rcv_rdf()
3894 return -EIO; in lpfc_els_rcv_rdf()
3901 vport->fc_myDID); in lpfc_els_rcv_rdf()
3902 return -EIO; in lpfc_els_rcv_rdf()
3909 * lpfc_least_capable_settings - helper function for EDC rsp processing
3926 rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability); in lpfc_least_capable_settings()
3927 rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count); in lpfc_least_capable_settings()
3928 rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units); in lpfc_least_capable_settings()
3950 drv_sig_cap = phba->cgn_reg_signal; in lpfc_least_capable_settings()
3953 if (rsp_sig_freq_cyc > phba->cgn_sig_freq) in lpfc_least_capable_settings()
3954 phba->cgn_sig_freq = rsp_sig_freq_cyc; in lpfc_least_capable_settings()
3960 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_least_capable_settings()
3961 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3965 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3966 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3970 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM; in lpfc_least_capable_settings()
3971 phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE; in lpfc_least_capable_settings()
3974 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3975 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3983 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3984 phba->cgn_sig_freq = 0; in lpfc_least_capable_settings()
3985 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3992 * lpfc_cmpl_els_edc - Completion callback function for EDC
4021 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_edc()
4027 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_edc()
4031 irsp_iocb = &rspiocb->iocb; in lpfc_cmpl_els_edc()
4032 tmo = irsp_iocb->ulpTimeout; in lpfc_cmpl_els_edc()
4033 iotag = irsp_iocb->ulpIoTag; in lpfc_cmpl_els_edc()
4036 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4045 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_edc()
4049 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_edc()
4057 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_edc()
4061 edc_rsp = prsp->virt; in lpfc_cmpl_els_edc()
4070 edc_rsp->acc_hdr.la_cmd, in lpfc_cmpl_els_edc()
4071 be32_to_cpu(edc_rsp->desc_list_len)); in lpfc_cmpl_els_edc()
4081 bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) - in lpfc_cmpl_els_edc()
4086 tlv = edc_rsp->desc; in lpfc_cmpl_els_edc()
4101 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_cmpl_els_edc()
4121 be32_to_cpu(plnkflt->desc_tag), in lpfc_cmpl_els_edc()
4122 be32_to_cpu(plnkflt->desc_len), in lpfc_cmpl_els_edc()
4124 plnkflt->degrade_activate_threshold), in lpfc_cmpl_els_edc()
4126 plnkflt->degrade_deactivate_threshold), in lpfc_cmpl_els_edc()
4127 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_cmpl_els_edc()
4148 be32_to_cpu(pcgd->desc_tag), in lpfc_cmpl_els_edc()
4149 be32_to_cpu(pcgd->desc_len), in lpfc_cmpl_els_edc()
4150 be32_to_cpu(pcgd->xmt_signal_capability), in lpfc_cmpl_els_edc()
4151 be16_to_cpu(pcgd->xmt_signal_frequency.count), in lpfc_cmpl_els_edc()
4152 be16_to_cpu(pcgd->xmt_signal_frequency.units), in lpfc_cmpl_els_edc()
4153 be32_to_cpu(pcgd->rcv_signal_capability), in lpfc_cmpl_els_edc()
4154 be16_to_cpu(pcgd->rcv_signal_frequency.count), in lpfc_cmpl_els_edc()
4155 be16_to_cpu(pcgd->rcv_signal_frequency.units)); in lpfc_cmpl_els_edc()
4171 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_cmpl_els_edc()
4178 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_cmpl_els_edc()
4179 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_cmpl_els_edc()
4180 phba->cgn_sig_freq = 0; in lpfc_cmpl_els_edc()
4182 "4202 EDC rsp error - sending RDF " in lpfc_cmpl_els_edc()
4189 lpfc_els_chk_latt(phba->pport); in lpfc_cmpl_els_edc()
4190 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4192 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_edc()
4202 lft->desc_tag = cpu_to_be32(ELS_DTAG_LNK_FAULT_CAP); in lpfc_format_edc_lft_desc()
4203 lft->desc_len = cpu_to_be32( in lpfc_format_edc_lft_desc()
4206 lft->degrade_activate_threshold = in lpfc_format_edc_lft_desc()
4207 cpu_to_be32(phba->degrade_activate_threshold); in lpfc_format_edc_lft_desc()
4208 lft->degrade_deactivate_threshold = in lpfc_format_edc_lft_desc()
4209 cpu_to_be32(phba->degrade_deactivate_threshold); in lpfc_format_edc_lft_desc()
4210 lft->fec_degrade_interval = cpu_to_be32(phba->fec_degrade_interval); in lpfc_format_edc_lft_desc()
4221 cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP); in lpfc_format_edc_cgn_desc()
4224 cgd->desc_len = cpu_to_be32( in lpfc_format_edc_cgn_desc()
4232 if (phba->cmf_active_mode == LPFC_CFG_OFF) { in lpfc_format_edc_cgn_desc()
4237 phba->cgn_sig_freq = 0; in lpfc_format_edc_cgn_desc()
4240 switch (phba->cgn_reg_signal) { in lpfc_format_edc_cgn_desc()
4242 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY); in lpfc_format_edc_cgn_desc()
4245 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM); in lpfc_format_edc_cgn_desc()
4255 cgd->rcv_signal_frequency.count = in lpfc_format_edc_cgn_desc()
4257 cgd->rcv_signal_frequency.units = in lpfc_format_edc_cgn_desc()
4264 if (!(phba->lmt & LMT_64Gb)) in lpfc_link_is_lds_capable()
4266 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_link_is_lds_capable()
4269 if (phba->sli4_hba.conf_trunk) { in lpfc_link_is_lds_capable()
4270 if (phba->trunk_link.phy_lnk_speed == LPFC_USER_LINK_SPEED_64G) in lpfc_link_is_lds_capable()
4272 } else if (phba->fc_linkspeed == LPFC_LINK_SPEED_64GHZ) { in lpfc_link_is_lds_capable()
4279 * lpfc_issue_els_edc - Exchange Diagnostic Capabilities with the fabric.
4283 * This routine issues an ELS EDC to the F-Port Controller to communicate
4297 * 0 - Successfully issued edc command
4298 * 1 - Failed to issue edc command
4303 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc()
4313 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_edc()
4314 return -EACCES; in lpfc_issue_els_edc()
4317 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_edc()
4318 return -ENODEV; in lpfc_issue_els_edc()
4320 cgn_desc_size = (phba->cgn_init_reg_signal) ? in lpfc_issue_els_edc()
4332 ndlp->nlp_DID, ELS_CMD_EDC); in lpfc_issue_els_edc()
4337 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc()
4340 edc_req->desc_len = cpu_to_be32(cgn_desc_size + lft_desc_size); in lpfc_issue_els_edc()
4341 edc_req->edc_cmd = ELS_EDC; in lpfc_issue_els_edc()
4342 tlv = edc_req->desc; in lpfc_issue_els_edc()
4346 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_issue_els_edc()
4356 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_edc()
4357 phba->cgn_reg_fpin); in lpfc_issue_els_edc()
4359 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_edc()
4360 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc()
4361 if (!elsiocb->ndlp) { in lpfc_issue_els_edc()
4363 return -EIO; in lpfc_issue_els_edc()
4368 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_edc()
4381 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_issue_els_edc()
4382 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_issue_els_edc()
4388 * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
4390 * @nlp: pointer to a node-list data structure.
4392 * This routine cancels the timer with a delayed IOCB-command retry for
4405 if (!(nlp->nlp_flag & NLP_DELAY_TMO)) in lpfc_cancel_retry_delay_tmo()
4407 spin_lock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4408 nlp->nlp_flag &= ~NLP_DELAY_TMO; in lpfc_cancel_retry_delay_tmo()
4409 spin_unlock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4410 del_timer_sync(&nlp->nlp_delayfunc); in lpfc_cancel_retry_delay_tmo()
4411 nlp->nlp_last_elscmd = 0; in lpfc_cancel_retry_delay_tmo()
4412 if (!list_empty(&nlp->els_retry_evt.evt_listp)) { in lpfc_cancel_retry_delay_tmo()
4413 list_del_init(&nlp->els_retry_evt.evt_listp); in lpfc_cancel_retry_delay_tmo()
4415 evtp = &nlp->els_retry_evt; in lpfc_cancel_retry_delay_tmo()
4416 lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1); in lpfc_cancel_retry_delay_tmo()
4418 if (nlp->nlp_flag & NLP_NPR_2B_DISC) { in lpfc_cancel_retry_delay_tmo()
4419 spin_lock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4420 nlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cancel_retry_delay_tmo()
4421 spin_unlock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4422 if (vport->num_disc_nodes) { in lpfc_cancel_retry_delay_tmo()
4423 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_cancel_retry_delay_tmo()
4429 if (vport->num_disc_nodes == 0) { in lpfc_cancel_retry_delay_tmo()
4430 spin_lock_irq(shost->host_lock); in lpfc_cancel_retry_delay_tmo()
4431 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cancel_retry_delay_tmo()
4432 spin_unlock_irq(shost->host_lock); in lpfc_cancel_retry_delay_tmo()
4443 * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
4446 * This routine is invoked by the ndlp delayed-function timer to check
4460 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay()
4461 struct lpfc_hba *phba = vport->phba; in lpfc_els_retry_delay()
4463 struct lpfc_work_evt *evtp = &ndlp->els_retry_evt; in lpfc_els_retry_delay()
4465 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_els_retry_delay()
4466 if (!list_empty(&evtp->evt_listp)) { in lpfc_els_retry_delay()
4467 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4474 evtp->evt_arg1 = lpfc_nlp_get(ndlp); in lpfc_els_retry_delay()
4475 if (evtp->evt_arg1) { in lpfc_els_retry_delay()
4476 evtp->evt = LPFC_EVT_ELS_RETRY; in lpfc_els_retry_delay()
4477 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_els_retry_delay()
4480 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4485 * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
4486 * @ndlp: pointer to a node-list data structure.
4488 * This routine is the worker-thread handler for processing the @ndlp delayed
4496 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay_handler()
4499 spin_lock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4500 cmd = ndlp->nlp_last_elscmd; in lpfc_els_retry_delay_handler()
4501 ndlp->nlp_last_elscmd = 0; in lpfc_els_retry_delay_handler()
4503 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { in lpfc_els_retry_delay_handler()
4504 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4508 ndlp->nlp_flag &= ~NLP_DELAY_TMO; in lpfc_els_retry_delay_handler()
4509 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4515 del_timer_sync(&ndlp->nlp_delayfunc); in lpfc_els_retry_delay_handler()
4516 retry = ndlp->nlp_retry; in lpfc_els_retry_delay_handler()
4517 ndlp->nlp_retry = 0; in lpfc_els_retry_delay_handler()
4524 if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) { in lpfc_els_retry_delay_handler()
4525 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4531 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4538 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4544 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4549 if (!(vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI)) in lpfc_els_retry_delay_handler()
4557 * lpfc_link_reset - Issue link reset
4561 * For SLI-3 adapter, link attention interrupt is enabled before issuing
4565 * 0 - Link reset initiated successfully
4566 * 1 - Failed to initiate link reset
4571 struct lpfc_hba *phba = vport->phba; in lpfc_link_reset()
4578 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_link_reset()
4586 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_link_reset()
4587 spin_lock_irq(&phba->hbalock); in lpfc_link_reset()
4588 phba->sli.sli_flag |= LPFC_PROCESS_LA; in lpfc_link_reset()
4589 control = readl(phba->HCregaddr); in lpfc_link_reset()
4591 writel(control, phba->HCregaddr); in lpfc_link_reset()
4592 readl(phba->HCregaddr); /* flush */ in lpfc_link_reset()
4593 spin_unlock_irq(&phba->hbalock); in lpfc_link_reset()
4596 lpfc_init_link(phba, mbox, phba->cfg_topology, in lpfc_link_reset()
4597 phba->cfg_link_speed); in lpfc_link_reset()
4598 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_link_reset()
4599 mbox->vport = vport; in lpfc_link_reset()
4605 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_link_reset()
4613 * lpfc_els_retry - Make retry decision on an els command iocb
4624 * delayed. In the former case, the corresponding ELS command issuing-function
4630 * 0 - No retry of els command is made
4631 * 1 - Immediate or delayed retry of els command is made
4637 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_els_retry()
4638 union lpfc_wqe128 *irsp = &rspiocb->wqe; in lpfc_els_retry()
4639 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_els_retry()
4640 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_retry()
4656 if (pcmd && pcmd->virt) { in lpfc_els_retry()
4657 elscmd = (uint32_t *) (pcmd->virt); in lpfc_els_retry()
4662 did = ndlp->nlp_DID; in lpfc_els_retry()
4679 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_retry()
4685 cmdiocb->sli4_lxritag, 0, 0); in lpfc_els_retry()
4691 if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0) in lpfc_els_retry()
4700 cmd, cmdiocb->retry, delay); in lpfc_els_retry()
4704 if (cmdiocb->retry > 2) in lpfc_els_retry()
4711 if (cmdiocb->retry > 100) in lpfc_els_retry()
4729 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_els_retry()
4730 /* State-command disagreement. The PRLI was in lpfc_els_retry()
4744 (cmdiocb->retry + 1) == maxretry) { in lpfc_els_retry()
4759 ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_els_retry()
4787 if ((vport->fc_flag & FC_PT2PT) && in lpfc_els_retry()
4800 vport->fc_flag |= FC_PT2PT_NO_NVME; in lpfc_els_retry()
4852 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4874 if (cmdiocb->retry >= 32) in lpfc_els_retry()
4893 vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf; in lpfc_els_retry()
4904 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4964 (phba->fc_topology != LPFC_TOPOLOGY_LOOP) && in lpfc_els_retry()
4969 if (phba->link_flag != LS_LOOPBACK_MODE) in lpfc_els_retry()
4974 if (cmdiocb->retry >= 100) in lpfc_els_retry()
4976 else if (cmdiocb->retry >= 32) in lpfc_els_retry()
4982 maxretry = vport->cfg_devloss_tmo; in lpfc_els_retry()
4986 cmdiocb->retry++; in lpfc_els_retry()
4987 if (maxretry && (cmdiocb->retry >= maxretry)) { in lpfc_els_retry()
4988 phba->fc_stat.elsRetryExceeded++; in lpfc_els_retry()
4992 if ((vport->load_flag & FC_UNLOADING) != 0) in lpfc_els_retry()
4999 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_els_retry()
5004 cmdiocb->retry, delay); in lpfc_els_retry()
5013 cmd, did, cmdiocb->retry, delay); in lpfc_els_retry()
5022 if (timer_pending(&vport->fc_disctmo) || in lpfc_els_retry()
5023 (vport->fc_flag & FC_RSCN_MODE)) in lpfc_els_retry()
5027 phba->fc_stat.elsXmitRetry++; in lpfc_els_retry()
5029 phba->fc_stat.elsDelayRetry++; in lpfc_els_retry()
5030 ndlp->nlp_retry = cmdiocb->retry; in lpfc_els_retry()
5033 mod_timer(&ndlp->nlp_delayfunc, in lpfc_els_retry()
5035 spin_lock_irq(&ndlp->lock); in lpfc_els_retry()
5036 ndlp->nlp_flag |= NLP_DELAY_TMO; in lpfc_els_retry()
5037 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry()
5039 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5047 ndlp->nlp_last_elscmd = cmd; in lpfc_els_retry()
5053 lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5056 lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5060 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5064 lpfc_issue_els_plogi(vport, did, cmdiocb->retry); in lpfc_els_retry()
5067 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5069 lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5073 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5075 lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5078 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5080 lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5091 cmdiocb->iotag); in lpfc_els_retry()
5098 cmd, did, cmdiocb->retry, ulp_status, in lpfc_els_retry()
5099 ulp_word4, cmdiocb->iotag, in lpfc_els_retry()
5100 (ndlp ? ndlp->nlp_flag : 0)); in lpfc_els_retry()
5106 * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
5117 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5125 if (!list_empty(&buf_ptr1->list)) { in lpfc_els_free_data()
5126 list_remove_head(&buf_ptr1->list, buf_ptr, in lpfc_els_free_data()
5129 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_data()
5132 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys); in lpfc_els_free_data()
5138 * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
5147 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5152 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_bpl()
5158 * lpfc_els_free_iocb - Free a command iocb and its associated resources
5166 * cmd_dmabuf - reference to cmd.
5167 * cmd_dmabuf->next - reference to rsp
5168 * rsp_dmabuf - unused
5169 * bpl_dmabuf - reference to bpl
5182 * 0 - Success (currently, always return 0)
5190 elsiocb->ndlp = NULL; in lpfc_els_free_iocb()
5192 /* cmd_dmabuf = cmd, cmd_dmabuf->next = rsp, bpl_dmabuf = bpl */ in lpfc_els_free_iocb()
5193 if (elsiocb->cmd_dmabuf) { in lpfc_els_free_iocb()
5194 if (elsiocb->cmd_flag & LPFC_DELAY_MEM_FREE) { in lpfc_els_free_iocb()
5199 elsiocb->cmd_flag &= ~LPFC_DELAY_MEM_FREE; in lpfc_els_free_iocb()
5200 buf_ptr = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5201 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5204 spin_lock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5205 if (!list_empty(&buf_ptr->list)) { in lpfc_els_free_iocb()
5206 list_remove_head(&buf_ptr->list, in lpfc_els_free_iocb()
5209 INIT_LIST_HEAD(&buf_ptr1->list); in lpfc_els_free_iocb()
5210 list_add_tail(&buf_ptr1->list, in lpfc_els_free_iocb()
5211 &phba->elsbuf); in lpfc_els_free_iocb()
5212 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5214 INIT_LIST_HEAD(&buf_ptr->list); in lpfc_els_free_iocb()
5215 list_add_tail(&buf_ptr->list, &phba->elsbuf); in lpfc_els_free_iocb()
5216 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5217 spin_unlock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5220 buf_ptr1 = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5222 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5226 if (elsiocb->bpl_dmabuf) { in lpfc_els_free_iocb()
5227 buf_ptr = elsiocb->bpl_dmabuf; in lpfc_els_free_iocb()
5229 elsiocb->bpl_dmabuf = NULL; in lpfc_els_free_iocb()
5236 * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
5251 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo_acc()
5252 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_logo_acc()
5260 ulp_status, ulp_word4, ndlp->nlp_DID); in lpfc_cmpl_els_logo_acc()
5265 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo_acc()
5266 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_cmpl_els_logo_acc()
5273 if (ndlp->nlp_type & NLP_FABRIC && in lpfc_cmpl_els_logo_acc()
5274 ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK)) in lpfc_cmpl_els_logo_acc()
5277 if (ndlp->nlp_state == NLP_STE_NPR_NODE) { in lpfc_cmpl_els_logo_acc()
5282 if ((ndlp->nlp_flag & NLP_DELAY_TMO) && in lpfc_cmpl_els_logo_acc()
5283 (ndlp->nlp_last_elscmd == ELS_CMD_PLOGI)) in lpfc_cmpl_els_logo_acc()
5286 if (ndlp->nlp_flag & NLP_RPI_REGISTERED) in lpfc_cmpl_els_logo_acc()
5300 * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
5314 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_dflt_rpi()
5315 u32 mbx_flag = pmb->mbox_flag; in lpfc_mbx_cmpl_dflt_rpi()
5316 u32 mbx_cmd = pmb->u.mb.mbxCommand; in lpfc_mbx_cmpl_dflt_rpi()
5319 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_mbx_cmpl_dflt_rpi()
5320 "0006 rpi x%x DID:%x flg:%x %d x%px " in lpfc_mbx_cmpl_dflt_rpi()
5321 "mbx_cmd x%x mbx_flag x%x x%px\n", in lpfc_mbx_cmpl_dflt_rpi()
5322 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_dflt_rpi()
5323 kref_read(&ndlp->kref), ndlp, mbx_cmd, in lpfc_mbx_cmpl_dflt_rpi()
5331 spin_lock_irq(&ndlp->lock); in lpfc_mbx_cmpl_dflt_rpi()
5332 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_mbx_cmpl_dflt_rpi()
5334 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_mbx_cmpl_dflt_rpi()
5335 spin_unlock_irq(&ndlp->lock); in lpfc_mbx_cmpl_dflt_rpi()
5337 lpfc_drop_node(ndlp->vport, ndlp); in lpfc_mbx_cmpl_dflt_rpi()
5344 * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
5360 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rsp()
5361 struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL; in lpfc_cmpl_els_rsp()
5372 if (cmdiocb->context_un.mbox) in lpfc_cmpl_els_rsp()
5373 mbox = cmdiocb->context_un.mbox; in lpfc_cmpl_els_rsp()
5379 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_rsp()
5383 irsp = &rspiocb->iocb; in lpfc_cmpl_els_rsp()
5384 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_rsp()
5385 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_rsp()
5403 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5404 ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp); in lpfc_cmpl_els_rsp()
5407 && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) { in lpfc_cmpl_els_rsp()
5409 (!(vport->fc_flag & FC_PT2PT))) { in lpfc_cmpl_els_rsp()
5410 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_cmpl_els_rsp()
5411 ndlp->nlp_state == in lpfc_cmpl_els_rsp()
5418 ndlp->nlp_DID, in lpfc_cmpl_els_rsp()
5419 ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5420 ndlp->nlp_rpi, in lpfc_cmpl_els_rsp()
5421 ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5429 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_cmpl_els_rsp()
5430 if (!mbox->ctx_ndlp) in lpfc_cmpl_els_rsp()
5433 mbox->vport = vport; in lpfc_cmpl_els_rsp()
5434 if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) { in lpfc_cmpl_els_rsp()
5435 mbox->mbox_flag |= LPFC_MBX_IMED_UNREG; in lpfc_cmpl_els_rsp()
5436 mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; in lpfc_cmpl_els_rsp()
5439 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; in lpfc_cmpl_els_rsp()
5440 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_rsp()
5445 ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; in lpfc_cmpl_els_rsp()
5454 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_cmpl_els_rsp()
5460 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5461 ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5468 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5470 ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN; in lpfc_cmpl_els_rsp()
5471 ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI; in lpfc_cmpl_els_rsp()
5472 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5478 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_els_rsp()
5479 vport && vport->port_type == LPFC_NPIV_PORT && in lpfc_cmpl_els_rsp()
5480 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_cmpl_els_rsp()
5481 if (ndlp->nlp_flag & NLP_RELEASE_RPI) { in lpfc_cmpl_els_rsp()
5482 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5483 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { in lpfc_cmpl_els_rsp()
5484 lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5485 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5486 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_cmpl_els_rsp()
5487 ndlp->nlp_flag &= ~NLP_RELEASE_RPI; in lpfc_cmpl_els_rsp()
5488 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5491 } else if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5492 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && in lpfc_cmpl_els_rsp()
5493 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_cmpl_els_rsp()
5512 * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
5516 * @ndlp: pointer to a node-list data structure.
5533 * 0 - Successfully issued acc response
5534 * 1 - Failed to issue acc response
5541 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_acc()
5545 union lpfc_wqe128 *oldwqe = &oldiocb->wqe; in lpfc_els_rsp_acc()
5557 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5558 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5560 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5561 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_els_rsp_acc()
5562 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5566 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5567 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5569 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5571 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5574 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5576 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5578 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5579 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5580 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5581 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5582 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5585 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5591 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5596 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5597 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5601 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5602 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5604 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5606 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5609 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5611 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5613 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5614 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5615 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5616 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5617 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5620 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5623 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_acc()
5631 memcpy(sp, &phba->fc_fabparam, in lpfc_els_rsp_acc()
5635 sp->cmn.fPort = 0; in lpfc_els_rsp_acc()
5638 sp->cls1.classValid = 0; in lpfc_els_rsp_acc()
5639 sp->cls2.classValid = 0; in lpfc_els_rsp_acc()
5640 sp->cls3.classValid = 0; in lpfc_els_rsp_acc()
5641 sp->cls4.classValid = 0; in lpfc_els_rsp_acc()
5644 memcpy(&sp->portName, &vport->fc_sparam.portName, in lpfc_els_rsp_acc()
5646 memcpy(&sp->nodeName, &vport->fc_sparam.nodeName, in lpfc_els_rsp_acc()
5649 memcpy(pcmd, &vport->fc_sparam, in lpfc_els_rsp_acc()
5652 sp->cmn.valid_vendor_ver_level = 0; in lpfc_els_rsp_acc()
5653 memset(sp->un.vendorVersion, 0, in lpfc_els_rsp_acc()
5654 sizeof(sp->un.vendorVersion)); in lpfc_els_rsp_acc()
5655 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_els_rsp_acc()
5660 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_els_rsp_acc()
5661 sp->cmn.valid_vendor_ver_level = 1; in lpfc_els_rsp_acc()
5662 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_els_rsp_acc()
5663 sp->un.vv.flags = in lpfc_els_rsp_acc()
5670 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5674 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5675 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO); in lpfc_els_rsp_acc()
5679 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5680 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5682 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5684 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5687 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5689 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5691 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5692 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5693 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5694 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5695 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5698 pcmd = (u8 *) elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5700 memcpy(pcmd, oldiocb->cmd_dmabuf->virt, in lpfc_els_rsp_acc()
5704 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; in lpfc_els_rsp_acc()
5708 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5712 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5713 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5717 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5718 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5720 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5722 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5725 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5727 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5729 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5730 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5731 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5732 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5733 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5736 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5739 rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_els_rsp_acc()
5741 /* FC-LS-5 specifies desc_list_len shall be set to 12 */ in lpfc_els_rsp_acc()
5742 rdf_resp->desc_list_len = cpu_to_be32(12); in lpfc_els_rsp_acc()
5744 /* FC-LS-5 specifies LS REQ Information descriptor */ in lpfc_els_rsp_acc()
5745 rdf_resp->lsri.desc_tag = cpu_to_be32(1); in lpfc_els_rsp_acc()
5746 rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32)); in lpfc_els_rsp_acc()
5747 rdf_resp->lsri.rqst_w0.cmd = ELS_RDF; in lpfc_els_rsp_acc()
5752 if (ndlp->nlp_flag & NLP_LOGO_ACC) { in lpfc_els_rsp_acc()
5753 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5754 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED || in lpfc_els_rsp_acc()
5755 ndlp->nlp_flag & NLP_REG_LOGIN_SEND)) in lpfc_els_rsp_acc()
5756 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_els_rsp_acc()
5757 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5758 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc; in lpfc_els_rsp_acc()
5760 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_acc()
5763 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_acc()
5764 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_acc()
5765 if (!elsiocb->ndlp) { in lpfc_els_rsp_acc()
5782 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_els_rsp_acc()
5783 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_acc()
5784 ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_acc()
5789 * lpfc_els_rsp_reject - Prepare and issue a rjt response iocb command
5793 * @ndlp: pointer to a node-list data structure.
5807 * 0 - Successfully issued reject response
5808 * 1 - Failed to issue reject response
5816 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_reject()
5825 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_reject()
5826 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rsp_reject()
5830 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_reject()
5831 wqe = &elsiocb->wqe; in lpfc_els_rsp_reject()
5832 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_reject()
5834 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_reject()
5837 icmd = &elsiocb->iocb; in lpfc_els_rsp_reject()
5838 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_reject()
5839 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_reject()
5840 icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_reject()
5843 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_reject()
5850 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_reject()
5857 rejectError, elsiocb->iotag, in lpfc_els_rsp_reject()
5858 get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID, in lpfc_els_rsp_reject()
5859 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_els_rsp_reject()
5862 ndlp->nlp_DID, ndlp->nlp_flag, rejectError); in lpfc_els_rsp_reject()
5864 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rsp_reject()
5865 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_reject()
5866 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_reject()
5867 if (!elsiocb->ndlp) { in lpfc_els_rsp_reject()
5876 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_rsp_reject()
5877 vport->port_type == LPFC_NPIV_PORT && in lpfc_els_rsp_reject()
5878 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_els_rsp_reject()
5879 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_reject()
5880 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_els_rsp_reject()
5881 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_reject()
5895 * lpfc_issue_els_edc_rsp - Exchange Diagnostic Capabilities with the fabric.
5900 * This routine issues an EDC ACC RSP to the F-Port Controller to communicate
5905 * 0 - Successfully issued edc rsp command
5906 * 1 - Failed to issue edc rsp command
5912 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc_rsp()
5928 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry, in lpfc_issue_els_edc_rsp()
5929 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_issue_els_edc_rsp()
5933 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_edc_rsp()
5934 wqe = &elsiocb->wqe; in lpfc_issue_els_edc_rsp()
5935 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_issue_els_edc_rsp()
5937 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_issue_els_edc_rsp()
5940 icmd = &elsiocb->iocb; in lpfc_issue_els_edc_rsp()
5941 cmd = &cmdiocb->iocb; in lpfc_issue_els_edc_rsp()
5942 icmd->ulpContext = cmd->ulpContext; /* Xri / rx_id */ in lpfc_issue_els_edc_rsp()
5943 icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id; in lpfc_issue_els_edc_rsp()
5946 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc_rsp()
5950 edc_rsp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_issue_els_edc_rsp()
5951 edc_rsp->desc_list_len = cpu_to_be32(sizeof(struct fc_els_lsri_desc) + in lpfc_issue_els_edc_rsp()
5953 edc_rsp->lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO); in lpfc_issue_els_edc_rsp()
5954 edc_rsp->lsri.desc_len = cpu_to_be32( in lpfc_issue_els_edc_rsp()
5956 edc_rsp->lsri.rqst_w0.cmd = ELS_EDC; in lpfc_issue_els_edc_rsp()
5957 tlv = edc_rsp->desc; in lpfc_issue_els_edc_rsp()
5965 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_issue_els_edc_rsp()
5966 kref_read(&ndlp->kref)); in lpfc_issue_els_edc_rsp()
5967 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_issue_els_edc_rsp()
5969 phba->fc_stat.elsXmitACC++; in lpfc_issue_els_edc_rsp()
5970 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc_rsp()
5971 if (!elsiocb->ndlp) { in lpfc_issue_els_edc_rsp()
5988 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_issue_els_edc_rsp()
5989 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_issue_els_edc_rsp()
5990 ndlp->nlp_rpi, vport->fc_flag); in lpfc_issue_els_edc_rsp()
5996 * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
5999 * @ndlp: pointer to a node-list data structure.
6011 * 0 - Successfully issued acc adisc response
6012 * 1 - Failed to issue adisc acc response
6018 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_adisc_acc()
6029 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_adisc_acc()
6030 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_adisc_acc()
6034 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_adisc_acc()
6035 wqe = &elsiocb->wqe; in lpfc_els_rsp_adisc_acc()
6037 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_adisc_acc()
6041 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_adisc_acc()
6044 icmd = &elsiocb->iocb; in lpfc_els_rsp_adisc_acc()
6045 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_adisc_acc()
6046 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_adisc_acc()
6047 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_adisc_acc()
6048 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_adisc_acc()
6049 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_adisc_acc()
6056 elsiocb->iotag, ulp_context, in lpfc_els_rsp_adisc_acc()
6057 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_adisc_acc()
6058 ndlp->nlp_rpi); in lpfc_els_rsp_adisc_acc()
6059 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_adisc_acc()
6065 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_els_rsp_adisc_acc()
6066 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
6067 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
6068 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_adisc_acc()
6072 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_adisc_acc()
6074 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_adisc_acc()
6075 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_adisc_acc()
6076 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_adisc_acc()
6077 if (!elsiocb->ndlp) { in lpfc_els_rsp_adisc_acc()
6093 * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
6096 * @ndlp: pointer to a node-list data structure.
6108 * 0 - Successfully issued acc prli response
6109 * 1 - Failed to issue acc prli response
6115 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_prli_acc()
6133 req_buf = oldiocb->cmd_dmabuf; in lpfc_els_rsp_prli_acc()
6134 req_payload = (((uint32_t *)req_buf->virt) + 1); in lpfc_els_rsp_prli_acc()
6153 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_prli_acc()
6154 ndlp->nlp_DID, elsrspcmd); in lpfc_els_rsp_prli_acc()
6158 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_prli_acc()
6159 wqe = &elsiocb->wqe; in lpfc_els_rsp_prli_acc()
6160 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_prli_acc()
6163 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_prli_acc()
6166 icmd = &elsiocb->iocb; in lpfc_els_rsp_prli_acc()
6167 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_prli_acc()
6168 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_prli_acc()
6169 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_prli_acc()
6170 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_prli_acc()
6171 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_prli_acc()
6178 elsiocb->iotag, ulp_context, in lpfc_els_rsp_prli_acc()
6179 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_prli_acc()
6180 ndlp->nlp_rpi); in lpfc_els_rsp_prli_acc()
6181 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_prli_acc()
6188 vpd = &phba->vpd; in lpfc_els_rsp_prli_acc()
6193 * is 3.20 or later, set the following bits for FC-TAPE in lpfc_els_rsp_prli_acc()
6197 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_els_rsp_prli_acc()
6198 (vpd->rev.feaLevelHigh >= 0x02)) { in lpfc_els_rsp_prli_acc()
6199 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6200 npr->Retry = 1; in lpfc_els_rsp_prli_acc()
6201 npr->TaskRetryIdReq = 1; in lpfc_els_rsp_prli_acc()
6203 npr->acceptRspCode = PRLI_REQ_EXECUTED; in lpfc_els_rsp_prli_acc()
6206 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_els_rsp_prli_acc()
6207 npr->estabImagePair = 1; in lpfc_els_rsp_prli_acc()
6209 npr->estabImagePair = 0; in lpfc_els_rsp_prli_acc()
6210 npr->readXferRdyDis = 1; in lpfc_els_rsp_prli_acc()
6211 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6212 npr->prliType = PRLI_FCP_TYPE; in lpfc_els_rsp_prli_acc()
6213 npr->initiatorFunc = 1; in lpfc_els_rsp_prli_acc()
6220 npr->estabImagePair, in lpfc_els_rsp_prli_acc()
6221 npr->Retry, npr->TaskRetryIdReq); in lpfc_els_rsp_prli_acc()
6229 if (phba->nvmet_support) { in lpfc_els_rsp_prli_acc()
6232 if (phba->cfg_nvme_enable_fb) { in lpfc_els_rsp_prli_acc()
6240 phba->cfg_nvmet_fb_size); in lpfc_els_rsp_prli_acc()
6250 npr_nvme->word1, npr_nvme->word4, in lpfc_els_rsp_prli_acc()
6251 npr_nvme->word5, ndlp->nlp_flag, in lpfc_els_rsp_prli_acc()
6252 ndlp->nlp_fcp_info, ndlp->nlp_type); in lpfc_els_rsp_prli_acc()
6253 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_els_rsp_prli_acc()
6254 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_els_rsp_prli_acc()
6255 npr_nvme->word5 = cpu_to_be32(npr_nvme->word5); in lpfc_els_rsp_prli_acc()
6259 prli_fc4_req, ndlp->nlp_fc4_type, in lpfc_els_rsp_prli_acc()
6260 ndlp->nlp_DID); in lpfc_els_rsp_prli_acc()
6264 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_prli_acc()
6266 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_prli_acc()
6267 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_prli_acc()
6268 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_prli_acc()
6269 if (!elsiocb->ndlp) { in lpfc_els_rsp_prli_acc()
6285 * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
6289 * @ndlp: pointer to a node-list data structure.
6301 * 0 - Successfully issued acc rnid response
6302 * 1 - Failed to issue acc rnid response
6308 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rnid_acc()
6323 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rnid_acc()
6324 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rnid_acc()
6328 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rnid_acc()
6329 wqe = &elsiocb->wqe; in lpfc_els_rsp_rnid_acc()
6330 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rnid_acc()
6333 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rnid_acc()
6336 icmd = &elsiocb->iocb; in lpfc_els_rsp_rnid_acc()
6337 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_rnid_acc()
6338 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_rnid_acc()
6339 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_rnid_acc()
6340 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_rnid_acc()
6341 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_rnid_acc()
6347 elsiocb->iotag, ulp_context); in lpfc_els_rsp_rnid_acc()
6348 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rnid_acc()
6354 rn->Format = format; in lpfc_els_rsp_rnid_acc()
6355 rn->CommonLen = (2 * sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6356 memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6357 memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6360 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6363 rn->SpecificLen = sizeof(RNID_TOP_DISC); in lpfc_els_rsp_rnid_acc()
6364 memcpy(&rn->un.topologyDisc.portName, in lpfc_els_rsp_rnid_acc()
6365 &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6366 rn->un.topologyDisc.unitType = RNID_HBA; in lpfc_els_rsp_rnid_acc()
6367 rn->un.topologyDisc.physPort = 0; in lpfc_els_rsp_rnid_acc()
6368 rn->un.topologyDisc.attachedNodes = 0; in lpfc_els_rsp_rnid_acc()
6371 rn->CommonLen = 0; in lpfc_els_rsp_rnid_acc()
6372 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6378 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_rnid_acc()
6380 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rnid_acc()
6381 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rnid_acc()
6382 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rnid_acc()
6383 if (!elsiocb->ndlp) { in lpfc_els_rsp_rnid_acc()
6399 * lpfc_els_clear_rrq - Clear the rq that this rrq describes.
6402 * @ndlp: pointer to a node-list data structure.
6410 struct lpfc_hba *phba = vport->phba; in lpfc_els_clear_rrq()
6418 pcmd = (uint8_t *)iocb->cmd_dmabuf->virt; in lpfc_els_clear_rrq()
6421 rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg); in lpfc_els_clear_rrq()
6435 ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg); in lpfc_els_clear_rrq()
6436 if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq))) in lpfc_els_clear_rrq()
6440 prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID); in lpfc_els_clear_rrq()
6447 * lpfc_els_rsp_echo_acc - Issue echo acc response
6451 * @ndlp: pointer to a node-list data structure.
6454 * 0 - Successfully issued acc echo response
6455 * 1 - Failed to issue acc echo response
6461 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_echo_acc()
6470 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rsp_echo_acc()
6471 cmdsize = oldiocb->wcqe_cmpl.total_data_placed; in lpfc_els_rsp_echo_acc()
6473 cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_rsp_echo_acc()
6480 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_echo_acc()
6481 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_echo_acc()
6485 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_echo_acc()
6486 wqe = &elsiocb->wqe; in lpfc_els_rsp_echo_acc()
6487 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_echo_acc()
6490 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_echo_acc()
6493 icmd = &elsiocb->iocb; in lpfc_els_rsp_echo_acc()
6494 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_echo_acc()
6495 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_echo_acc()
6496 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_echo_acc()
6497 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_echo_acc()
6498 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_echo_acc()
6504 elsiocb->iotag, ulp_context); in lpfc_els_rsp_echo_acc()
6505 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_echo_acc()
6508 memcpy(pcmd, data, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_echo_acc()
6512 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_echo_acc()
6514 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_echo_acc()
6515 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_echo_acc()
6516 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_echo_acc()
6517 if (!elsiocb->ndlp) { in lpfc_els_rsp_echo_acc()
6533 * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
6541 * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
6559 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_adisc()
6561 if (ndlp->nlp_state != NLP_STE_NPR_NODE || in lpfc_els_disc_adisc()
6562 !(ndlp->nlp_flag & NLP_NPR_ADISC)) in lpfc_els_disc_adisc()
6565 spin_lock_irq(&ndlp->lock); in lpfc_els_disc_adisc()
6566 ndlp->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_els_disc_adisc()
6567 spin_unlock_irq(&ndlp->lock); in lpfc_els_disc_adisc()
6569 if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) { in lpfc_els_disc_adisc()
6582 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_adisc()
6586 vport->num_disc_nodes++; in lpfc_els_disc_adisc()
6587 if (vport->num_disc_nodes >= in lpfc_els_disc_adisc()
6588 vport->cfg_discovery_threads) { in lpfc_els_disc_adisc()
6589 spin_lock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6590 vport->fc_flag |= FC_NLP_MORE; in lpfc_els_disc_adisc()
6591 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6597 spin_lock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6598 vport->fc_flag &= ~FC_NLP_MORE; in lpfc_els_disc_adisc()
6599 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6605 * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
6612 * incremented. If the num_disc_nodes reaches a pre-configured threshold
6631 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_plogi()
6632 if (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_els_disc_plogi()
6633 (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 && in lpfc_els_disc_plogi()
6634 (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 && in lpfc_els_disc_plogi()
6635 (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) { in lpfc_els_disc_plogi()
6636 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_plogi()
6638 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_disc_plogi()
6640 vport->num_disc_nodes++; in lpfc_els_disc_plogi()
6641 if (vport->num_disc_nodes >= in lpfc_els_disc_plogi()
6642 vport->cfg_discovery_threads) { in lpfc_els_disc_plogi()
6643 spin_lock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6644 vport->fc_flag |= FC_NLP_MORE; in lpfc_els_disc_plogi()
6645 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6653 sentplogi, vport->fc_flag); in lpfc_els_disc_plogi()
6659 spin_lock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6660 vport->fc_flag &= ~FC_NLP_MORE; in lpfc_els_disc_plogi()
6661 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6671 desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG); in lpfc_rdp_res_link_service()
6672 desc->payload.els_req = word0; in lpfc_rdp_res_link_service()
6673 desc->length = cpu_to_be32(sizeof(desc->payload)); in lpfc_rdp_res_link_service()
6692 desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG); in lpfc_rdp_res_sfp_desc()
6699 if ((trasn_code_byte4->fc_sw_laser) || in lpfc_rdp_res_sfp_desc()
6700 (trasn_code_byte5->fc_sw_laser_sl) || in lpfc_rdp_res_sfp_desc()
6701 (trasn_code_byte5->fc_sw_laser_sn)) { /* check if its short WL */ in lpfc_rdp_res_sfp_desc()
6703 } else if (trasn_code_byte4->fc_lw_laser) { in lpfc_rdp_res_sfp_desc()
6731 desc->sfp_info.temperature = cpu_to_be16(temperature); in lpfc_rdp_res_sfp_desc()
6732 desc->sfp_info.rx_power = cpu_to_be16(rx_power); in lpfc_rdp_res_sfp_desc()
6733 desc->sfp_info.tx_bias = cpu_to_be16(tx_bias); in lpfc_rdp_res_sfp_desc()
6734 desc->sfp_info.tx_power = cpu_to_be16(tx_power); in lpfc_rdp_res_sfp_desc()
6735 desc->sfp_info.vcc = cpu_to_be16(vcc); in lpfc_rdp_res_sfp_desc()
6737 desc->sfp_info.flags = cpu_to_be16(flag); in lpfc_rdp_res_sfp_desc()
6738 desc->length = cpu_to_be32(sizeof(desc->sfp_info)); in lpfc_rdp_res_sfp_desc()
6749 desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG); in lpfc_rdp_res_link_error()
6753 desc->info.port_type = cpu_to_be32(type); in lpfc_rdp_res_link_error()
6755 desc->info.link_status.link_failure_cnt = in lpfc_rdp_res_link_error()
6756 cpu_to_be32(stat->linkFailureCnt); in lpfc_rdp_res_link_error()
6757 desc->info.link_status.loss_of_synch_cnt = in lpfc_rdp_res_link_error()
6758 cpu_to_be32(stat->lossSyncCnt); in lpfc_rdp_res_link_error()
6759 desc->info.link_status.loss_of_signal_cnt = in lpfc_rdp_res_link_error()
6760 cpu_to_be32(stat->lossSignalCnt); in lpfc_rdp_res_link_error()
6761 desc->info.link_status.primitive_seq_proto_err = in lpfc_rdp_res_link_error()
6762 cpu_to_be32(stat->primSeqErrCnt); in lpfc_rdp_res_link_error()
6763 desc->info.link_status.invalid_trans_word = in lpfc_rdp_res_link_error()
6764 cpu_to_be32(stat->invalidXmitWord); in lpfc_rdp_res_link_error()
6765 desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt); in lpfc_rdp_res_link_error()
6767 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_link_error()
6778 desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG); in lpfc_rdp_res_bbc_desc()
6780 bbCredit = vport->fc_sparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6781 (vport->fc_sparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6782 desc->bbc_info.port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6783 if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_rdp_res_bbc_desc()
6784 bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6785 (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6786 desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6788 desc->bbc_info.attached_port_bbc = 0; in lpfc_rdp_res_bbc_desc()
6791 desc->bbc_info.rtt = 0; in lpfc_rdp_res_bbc_desc()
6792 desc->length = cpu_to_be32(sizeof(desc->bbc_info)); in lpfc_rdp_res_bbc_desc()
6803 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_temp_desc()
6805 desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6806 desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6807 desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6808 desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6810 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6812 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6814 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6816 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6820 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_temp_desc()
6821 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_temp_desc()
6832 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_voltage_desc()
6834 desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6835 desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6836 desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6837 desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6839 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6841 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6843 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6845 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6849 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_voltage_desc()
6850 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_voltage_desc()
6861 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txbias_desc()
6863 desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6864 desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6865 desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6866 desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6868 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6870 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6872 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6874 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6878 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txbias_desc()
6879 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txbias_desc()
6890 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txpower_desc()
6892 desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6893 desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6894 desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6895 desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6897 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6899 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6901 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6903 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6907 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txpower_desc()
6908 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txpower_desc()
6920 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_rxpower_desc()
6922 desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6923 desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6924 desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6925 desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6927 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6929 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6931 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6933 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6937 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_rxpower_desc()
6938 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_rxpower_desc()
6946 desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG); in lpfc_rdp_res_opd_desc()
6947 memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16); in lpfc_rdp_res_opd_desc()
6948 memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16); in lpfc_rdp_res_opd_desc()
6949 memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16); in lpfc_rdp_res_opd_desc()
6950 memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4); in lpfc_rdp_res_opd_desc()
6951 memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8); in lpfc_rdp_res_opd_desc()
6952 desc->length = cpu_to_be32(sizeof(desc->opd_info)); in lpfc_rdp_res_opd_desc()
6961 desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG); in lpfc_rdp_res_fec_desc()
6963 desc->info.CorrectedBlocks = in lpfc_rdp_res_fec_desc()
6964 cpu_to_be32(stat->fecCorrBlkCount); in lpfc_rdp_res_fec_desc()
6965 desc->info.UncorrectableBlocks = in lpfc_rdp_res_fec_desc()
6966 cpu_to_be32(stat->fecUncorrBlkCount); in lpfc_rdp_res_fec_desc()
6968 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_fec_desc()
6979 desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG); in lpfc_rdp_res_speed()
6981 switch (phba->fc_linkspeed) { in lpfc_rdp_res_speed()
7017 desc->info.port_speed.speed = cpu_to_be16(rdp_speed); in lpfc_rdp_res_speed()
7019 if (phba->lmt & LMT_256Gb) in lpfc_rdp_res_speed()
7021 if (phba->lmt & LMT_128Gb) in lpfc_rdp_res_speed()
7023 if (phba->lmt & LMT_64Gb) in lpfc_rdp_res_speed()
7025 if (phba->lmt & LMT_32Gb) in lpfc_rdp_res_speed()
7027 if (phba->lmt & LMT_16Gb) in lpfc_rdp_res_speed()
7029 if (phba->lmt & LMT_10Gb) in lpfc_rdp_res_speed()
7031 if (phba->lmt & LMT_8Gb) in lpfc_rdp_res_speed()
7033 if (phba->lmt & LMT_4Gb) in lpfc_rdp_res_speed()
7035 if (phba->lmt & LMT_2Gb) in lpfc_rdp_res_speed()
7037 if (phba->lmt & LMT_1Gb) in lpfc_rdp_res_speed()
7042 if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO) in lpfc_rdp_res_speed()
7045 desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap); in lpfc_rdp_res_speed()
7046 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_speed()
7055 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_diag_port_names()
7057 memcpy(desc->port_names.wwnn, &vport->fc_nodename, in lpfc_rdp_res_diag_port_names()
7058 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_diag_port_names()
7060 memcpy(desc->port_names.wwpn, &vport->fc_portname, in lpfc_rdp_res_diag_port_names()
7061 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_diag_port_names()
7063 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_diag_port_names()
7072 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_attach_port_names()
7073 if (vport->fc_flag & FC_FABRIC) { in lpfc_rdp_res_attach_port_names()
7074 memcpy(desc->port_names.wwnn, &vport->fabric_nodename, in lpfc_rdp_res_attach_port_names()
7075 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
7077 memcpy(desc->port_names.wwpn, &vport->fabric_portname, in lpfc_rdp_res_attach_port_names()
7078 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
7080 memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename, in lpfc_rdp_res_attach_port_names()
7081 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
7083 memcpy(desc->port_names.wwpn, &ndlp->nlp_portname, in lpfc_rdp_res_attach_port_names()
7084 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
7087 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_attach_port_names()
7095 struct lpfc_nodelist *ndlp = rdp_context->ndlp; in lpfc_els_rdp_cmpl()
7096 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_rdp_cmpl()
7116 lpfc_max_els_tries, rdp_context->ndlp, in lpfc_els_rdp_cmpl()
7117 rdp_context->ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rdp_cmpl()
7122 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7123 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7124 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7125 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7126 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7127 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7128 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7130 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7131 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7132 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7138 elsiocb->iotag, ulp_context, in lpfc_els_rdp_cmpl()
7139 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rdp_cmpl()
7140 ndlp->nlp_rpi); in lpfc_els_rdp_cmpl()
7141 rdp_res = (struct fc_rdp_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7142 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7147 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS); in lpfc_els_rdp_cmpl()
7148 phba->sfp_alarm |= *flag_ptr; in lpfc_els_rdp_cmpl()
7149 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS); in lpfc_els_rdp_cmpl()
7150 phba->sfp_warning |= *flag_ptr; in lpfc_els_rdp_cmpl()
7158 rdp_context->page_a0, rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7162 (len + pcmd), &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7168 &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7170 &rdp_context->link_stat, vport); in lpfc_els_rdp_cmpl()
7173 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7176 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7179 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7182 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7185 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7187 rdp_context->page_a0, vport); in lpfc_els_rdp_cmpl()
7189 rdp_res->length = cpu_to_be32(len - 8); in lpfc_els_rdp_cmpl()
7190 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7193 bpl = (struct ulp_bde64 *)elsiocb->bpl_dmabuf->virt; in lpfc_els_rdp_cmpl()
7194 bpl->tus.f.bdeSize = len; in lpfc_els_rdp_cmpl()
7195 bpl->tus.f.bdeFlags = 0; in lpfc_els_rdp_cmpl()
7196 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfc_els_rdp_cmpl()
7198 phba->fc_stat.elsXmitACC++; in lpfc_els_rdp_cmpl()
7199 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7200 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7216 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rdp_cmpl()
7220 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7221 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7222 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7223 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7224 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7226 &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7227 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7229 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7230 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7231 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7234 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7238 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_rdp_cmpl()
7240 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rdp_cmpl()
7241 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7242 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7243 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7268 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_rdp_info()
7277 mbox->vport = rdp_context->ndlp->vport; in lpfc_get_rdp_info()
7278 mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0; in lpfc_get_rdp_info()
7279 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_rdp_info()
7289 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_rdp_info()
7303 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_sfp_info_wait()
7312 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7314 virt = mp->virt; in lpfc_get_sfp_info_wait()
7315 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7316 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7317 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7318 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7319 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7320 mb->un.varWords[3] = DMP_SFF_PAGE_A0_SIZE / 4; in lpfc_get_sfp_info_wait()
7321 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7322 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7323 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7324 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7325 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7326 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7327 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7328 mbox->in_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7329 mbox->out_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7330 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7331 mbox->ctx_buf = virt; in lpfc_get_sfp_info_wait()
7334 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A0_SIZE); in lpfc_get_sfp_info_wait()
7335 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7336 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7338 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7339 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_sfp_info_wait()
7347 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_get_sfp_info_wait()
7348 mp = (struct lpfc_dmabuf *)(mbox->ctx_buf); in lpfc_get_sfp_info_wait()
7352 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7357 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a0, in lpfc_get_sfp_info_wait()
7361 memset(mp->virt, 0, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7362 INIT_LIST_HEAD(&mp->list); in lpfc_get_sfp_info_wait()
7365 mbox->ctx_buf = mp; in lpfc_get_sfp_info_wait()
7366 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7368 bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_DUMP_MEMORY); in lpfc_get_sfp_info_wait()
7370 &mbox->u.mqe.un.mem_dump_type3, DMP_LMSD); in lpfc_get_sfp_info_wait()
7372 &mbox->u.mqe.un.mem_dump_type3, phba->sli4_hba.physical_port); in lpfc_get_sfp_info_wait()
7374 &mbox->u.mqe.un.mem_dump_type3, DMP_PAGE_A2); in lpfc_get_sfp_info_wait()
7375 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7376 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7377 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7378 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7379 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7380 mb->un.varWords[3] = DMP_SFF_PAGE_A2_SIZE / 4; in lpfc_get_sfp_info_wait()
7381 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7382 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7383 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7384 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7385 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7386 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7387 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7388 mbox->in_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7389 mbox->out_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7390 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7391 mbox->ctx_buf = virt; in lpfc_get_sfp_info_wait()
7394 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7395 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7396 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7399 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_sfp_info_wait()
7401 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7407 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a2, in lpfc_get_sfp_info_wait()
7411 mbox->ctx_buf = mpsave; in lpfc_get_sfp_info_wait()
7417 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_sfp_info_wait()
7422 * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
7425 * @ndlp: pointer to a node-list data structure.
7429 * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
7435 * 0 - Sent the acc response
7436 * 1 - Sent the reject response.
7442 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rdp()
7450 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7451 bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_rdp()
7458 if (phba->sli_rev < LPFC_SLI_REV4 || (phba->hba_flag & HBA_FCOE_MODE)) { in lpfc_els_rcv_rdp()
7464 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rdp()
7465 rdp_req = (struct fc_rdp_req_frame *) pcmd->virt; in lpfc_els_rcv_rdp()
7470 be32_to_cpu(rdp_req->rdp_des_length), in lpfc_els_rcv_rdp()
7471 be32_to_cpu(rdp_req->nport_id_desc.tag), in lpfc_els_rcv_rdp()
7472 be32_to_cpu(rdp_req->nport_id_desc.nport_id), in lpfc_els_rcv_rdp()
7473 be32_to_cpu(rdp_req->nport_id_desc.length)); in lpfc_els_rcv_rdp()
7476 be32_to_cpu(rdp_req->rdp_des_length)) in lpfc_els_rcv_rdp()
7478 if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag)) in lpfc_els_rcv_rdp()
7481 be32_to_cpu(rdp_req->nport_id_desc.length)) in lpfc_els_rcv_rdp()
7489 cmd = &cmdiocb->wqe; in lpfc_els_rcv_rdp()
7490 rdp_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rdp()
7491 if (!rdp_context->ndlp) { in lpfc_els_rcv_rdp()
7496 rdp_context->ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_rdp()
7497 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7498 rdp_context->rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_rdp()
7499 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7500 rdp_context->cmpl = lpfc_els_rdp_cmpl; in lpfc_els_rcv_rdp()
7502 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS, in lpfc_els_rcv_rdp()
7540 mb = &pmb->u.mb; in lpfc_els_lcb_rsp()
7541 lcb_context = (struct lpfc_lcb_context *)pmb->ctx_ndlp; in lpfc_els_lcb_rsp()
7542 ndlp = lcb_context->ndlp; in lpfc_els_lcb_rsp()
7543 pmb->ctx_ndlp = NULL; in lpfc_els_lcb_rsp()
7544 pmb->ctx_buf = NULL; in lpfc_els_lcb_rsp()
7547 &pmb->u.mqe.un.beacon_config.header.cfg_shdr; in lpfc_els_lcb_rsp()
7548 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_els_lcb_rsp()
7549 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_els_lcb_rsp()
7555 shdr_status, shdr_add_status, mb->mbxStatus); in lpfc_els_lcb_rsp()
7557 if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status || in lpfc_els_lcb_rsp()
7560 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7564 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7566 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7568 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_lcb_rsp()
7576 lcb_res = (struct fc_lcb_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7580 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7581 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7582 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7583 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7584 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7586 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7587 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7588 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7591 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7593 lcb_res->lcb_sub_command = lcb_context->sub_command; in lpfc_els_lcb_rsp()
7594 lcb_res->lcb_type = lcb_context->type; in lpfc_els_lcb_rsp()
7595 lcb_res->capability = lcb_context->capability; in lpfc_els_lcb_rsp()
7596 lcb_res->lcb_frequency = lcb_context->frequency; in lpfc_els_lcb_rsp()
7597 lcb_res->lcb_duration = lcb_context->duration; in lpfc_els_lcb_rsp()
7598 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7599 phba->fc_stat.elsXmitACC++; in lpfc_els_lcb_rsp()
7601 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7602 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7618 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7620 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_lcb_rsp()
7625 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7626 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7627 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7628 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7629 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7631 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7632 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7633 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7636 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7640 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_lcb_rsp()
7643 stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS; in lpfc_els_lcb_rsp()
7645 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7646 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_lcb_rsp()
7647 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7648 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7667 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_set_beacon()
7673 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_set_beacon()
7677 cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_set_beacon()
7678 len = sizeof(struct lpfc_mbx_set_beacon_config) - in lpfc_sli4_set_beacon()
7683 mbox->ctx_ndlp = (void *)lcb_context; in lpfc_sli4_set_beacon()
7684 mbox->vport = phba->pport; in lpfc_sli4_set_beacon()
7685 mbox->mbox_cmpl = lpfc_els_lcb_rsp; in lpfc_sli4_set_beacon()
7686 bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7687 phba->sli4_hba.physical_port); in lpfc_sli4_set_beacon()
7688 bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7690 mbox->u.mqe.un.beacon_config.word5 = 0; /* Reserved */ in lpfc_sli4_set_beacon()
7698 if (phba->sli4_hba.pc_sli4_params.bv1s) { in lpfc_sli4_set_beacon()
7700 cfg_shdr->request.word9 = BEACON_VERSION_V1; in lpfc_sli4_set_beacon()
7701 lcb_context->capability |= LCB_CAPABILITY_DURATION; in lpfc_sli4_set_beacon()
7703 &mbox->u.mqe.un.beacon_config, 0); in lpfc_sli4_set_beacon()
7705 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7706 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7709 if (be16_to_cpu(lcb_context->duration) != 0) { in lpfc_sli4_set_beacon()
7710 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7713 cfg_shdr->request.word9 = BEACON_VERSION_V0; in lpfc_sli4_set_beacon()
7714 lcb_context->capability &= ~(LCB_CAPABILITY_DURATION); in lpfc_sli4_set_beacon()
7716 &mbox->u.mqe.un.beacon_config, beacon_state); in lpfc_sli4_set_beacon()
7718 &mbox->u.mqe.un.beacon_config, 1); in lpfc_sli4_set_beacon()
7720 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7721 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7726 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7735 * lpfc_els_rcv_lcb - Process an unsolicited LCB
7738 * @ndlp: pointer to a node-list data structure.
7745 * 0 - Sent the acc response
7746 * 1 - Sent the reject response.
7752 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_lcb()
7760 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_lcb()
7761 lp = (uint8_t *)pcmd->virt; in lpfc_els_rcv_lcb()
7762 beacon = (struct fc_lcb_request_frame *)pcmd->virt; in lpfc_els_rcv_lcb()
7768 beacon->lcb_command, in lpfc_els_rcv_lcb()
7769 beacon->lcb_sub_command, in lpfc_els_rcv_lcb()
7770 beacon->lcb_type, in lpfc_els_rcv_lcb()
7771 beacon->lcb_frequency, in lpfc_els_rcv_lcb()
7772 be16_to_cpu(beacon->lcb_duration)); in lpfc_els_rcv_lcb()
7774 if (beacon->lcb_sub_command != LPFC_LCB_ON && in lpfc_els_rcv_lcb()
7775 beacon->lcb_sub_command != LPFC_LCB_OFF) { in lpfc_els_rcv_lcb()
7780 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_lcb()
7781 phba->hba_flag & HBA_FCOE_MODE || in lpfc_els_rcv_lcb()
7782 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_lcb()
7794 state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0; in lpfc_els_rcv_lcb()
7795 lcb_context->sub_command = beacon->lcb_sub_command; in lpfc_els_rcv_lcb()
7796 lcb_context->capability = 0; in lpfc_els_rcv_lcb()
7797 lcb_context->type = beacon->lcb_type; in lpfc_els_rcv_lcb()
7798 lcb_context->frequency = beacon->lcb_frequency; in lpfc_els_rcv_lcb()
7799 lcb_context->duration = beacon->lcb_duration; in lpfc_els_rcv_lcb()
7800 lcb_context->ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_lcb()
7801 lcb_context->rx_id = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_lcb()
7802 lcb_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_lcb()
7803 if (!lcb_context->ndlp) { in lpfc_els_rcv_lcb()
7809 lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT, in lpfc_els_rcv_lcb()
7828 * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
7840 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_rscn()
7843 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7844 if (vport->fc_rscn_flush) { in lpfc_els_flush_rscn()
7846 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7850 vport->fc_rscn_flush = 1; in lpfc_els_flush_rscn()
7851 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7853 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_els_flush_rscn()
7854 lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]); in lpfc_els_flush_rscn()
7855 vport->fc_rscn_id_list[i] = NULL; in lpfc_els_flush_rscn()
7857 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7858 vport->fc_rscn_id_cnt = 0; in lpfc_els_flush_rscn()
7859 vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY); in lpfc_els_flush_rscn()
7860 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7863 vport->fc_rscn_flush = 0; in lpfc_els_flush_rscn()
7867 * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
7875 * None zero - The @did matched with a pending rscn
7876 * 0 - not able to match @did with a pending rscn
7894 if (vport->fc_flag & FC_RSCN_DISCOVERY) in lpfc_rscn_payload_check()
7897 spin_lock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7898 if (vport->fc_rscn_flush) { in lpfc_rscn_payload_check()
7900 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7904 vport->fc_rscn_flush = 1; in lpfc_rscn_payload_check()
7905 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7906 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_rscn_payload_check()
7907 lp = vport->fc_rscn_id_list[i]->virt; in lpfc_rscn_payload_check()
7909 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_rscn_payload_check()
7912 payload_len -= sizeof(uint32_t); in lpfc_rscn_payload_check()
7935 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7939 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7944 * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
7952 * 0 - Successful (currently alway return 0)
7960 list_for_each_entry_safe(ndlp, n, &vport->fc_nodes, nlp_listp) { in lpfc_rscn_recovery_check()
7961 if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) || in lpfc_rscn_recovery_check()
7962 !lpfc_rscn_payload_check(vport, ndlp->nlp_DID)) in lpfc_rscn_recovery_check()
7966 if (vport->phba->nvmet_support) in lpfc_rscn_recovery_check()
7972 switch (ndlp->nlp_state) { in lpfc_rscn_recovery_check()
7989 * lpfc_send_rscn_event - Send an RSCN event to management application
8006 pcmd = cmdiocb->cmd_dmabuf; in lpfc_send_rscn_event()
8007 payload_ptr = (uint32_t *) pcmd->virt; in lpfc_send_rscn_event()
8017 rscn_event_data->event_type = FC_REG_RSCN_EVENT; in lpfc_send_rscn_event()
8018 rscn_event_data->payload_length = payload_len; in lpfc_send_rscn_event()
8019 memcpy(rscn_event_data->rscn_payload, payload_ptr, in lpfc_send_rscn_event()
8032 * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
8035 * @ndlp: pointer to a node-list data structure.
8050 * 0 - Just sent the acc response
8051 * 1 - Sent the acc response and waited for name server completion
8058 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rscn()
8066 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rscn()
8067 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rscn()
8070 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_els_rcv_rscn()
8074 vport->fc_flag, payload_len, *lp, in lpfc_els_rcv_rscn()
8075 vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8084 /* Check if RSCN is coming from a direct-connected remote NPort */ in lpfc_els_rcv_rscn()
8085 if (vport->fc_flag & FC_PT2PT) { in lpfc_els_rcv_rscn()
8089 *lp, vport->fc_flag, payload_len); in lpfc_els_rcv_rscn()
8095 if (ndlp->nlp_fc4_type & NLP_FC4_NVME && in lpfc_els_rcv_rscn()
8096 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) in lpfc_els_rcv_rscn()
8104 if (vport->port_state <= LPFC_NS_QRY) { in lpfc_els_rcv_rscn()
8107 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8116 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_rcv_rscn()
8117 !(vport->cfg_peer_port_login)) { in lpfc_els_rcv_rscn()
8123 i -= sizeof(uint32_t); in lpfc_els_rcv_rscn()
8133 vport->fc_flag, payload_len, in lpfc_els_rcv_rscn()
8134 *lp, vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8137 ndlp->nlp_DID, vport->port_state, in lpfc_els_rcv_rscn()
8138 ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8143 if (vport->fc_flag & FC_DISC_TMO) { in lpfc_els_rcv_rscn()
8144 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8145 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8153 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8154 if (vport->fc_rscn_flush) { in lpfc_els_rcv_rscn()
8156 vport->fc_flag |= FC_RSCN_DISCOVERY; in lpfc_els_rcv_rscn()
8157 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8163 vport->fc_rscn_flush = 1; in lpfc_els_rcv_rscn()
8164 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8166 rscn_cnt = vport->fc_rscn_id_cnt; in lpfc_els_rcv_rscn()
8168 * RSCN payload buffer, cmdiocb->cmd_dmabuf to process later. in lpfc_els_rcv_rscn()
8170 if (vport->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) { in lpfc_els_rcv_rscn()
8173 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8175 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8176 vport->fc_flag |= FC_RSCN_DEFERRED; in lpfc_els_rcv_rscn()
8179 if (vport->fc_flag & FC_DISC_TMO) { in lpfc_els_rcv_rscn()
8180 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8181 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8185 !(vport->fc_flag & FC_RSCN_DISCOVERY)) { in lpfc_els_rcv_rscn()
8186 vport->fc_flag |= FC_RSCN_MODE; in lpfc_els_rcv_rscn()
8187 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8189 cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt; in lpfc_els_rcv_rscn()
8199 vport->fc_rscn_id_list[rscn_cnt] = pcmd; in lpfc_els_rcv_rscn()
8200 vport->fc_rscn_id_cnt++; in lpfc_els_rcv_rscn()
8201 /* If we zero, cmdiocb->cmd_dmabuf, the calling in lpfc_els_rcv_rscn()
8204 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8210 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8211 vport->port_state); in lpfc_els_rcv_rscn()
8213 vport->fc_flag |= FC_RSCN_DISCOVERY; in lpfc_els_rcv_rscn()
8214 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8219 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8220 vport->port_state); in lpfc_els_rcv_rscn()
8223 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8232 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8234 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8235 vport->fc_flag |= FC_RSCN_MODE; in lpfc_els_rcv_rscn()
8236 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8237 vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd; in lpfc_els_rcv_rscn()
8239 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8241 * If we zero, cmdiocb->cmd_dmabuf, the calling routine will in lpfc_els_rcv_rscn()
8244 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8254 * lpfc_els_handle_rscn - Handle rscn for a vport
8266 * 0 - Cleaned up rscn on the @vport
8267 * 1 - Wait for plogi to name server before proceed
8273 struct lpfc_hba *phba = vport->phba; in lpfc_els_handle_rscn()
8276 if (vport->load_flag & FC_UNLOADING) { in lpfc_els_handle_rscn()
8287 vport->fc_flag, 0, vport->fc_rscn_id_cnt, in lpfc_els_handle_rscn()
8288 vport->port_state, vport->num_disc_nodes, in lpfc_els_handle_rscn()
8289 vport->gidft_inp); in lpfc_els_handle_rscn()
8292 vport->fc_ns_retry = 0; in lpfc_els_handle_rscn()
8293 vport->num_disc_nodes = 0; in lpfc_els_handle_rscn()
8296 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_els_handle_rscn()
8302 if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) { in lpfc_els_handle_rscn()
8305 } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) { in lpfc_els_handle_rscn()
8314 ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE; in lpfc_els_handle_rscn()
8322 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_handle_rscn()
8325 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_handle_rscn()
8338 * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
8341 * @ndlp: pointer to a node-list data structure.
8344 * unsolicited event. An unsolicited FLOGI can be received in a point-to-
8359 * 0 - Successfully processed the unsolicited flogi
8360 * 1 - Failed to process the unsolicited flogi
8367 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_flogi()
8368 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_flogi()
8369 uint32_t *lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_flogi()
8370 union lpfc_wqe128 *wqe = &cmdiocb->wqe; in lpfc_els_rcv_flogi()
8379 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8388 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_els_rcv_flogi()
8390 did = bf_get(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest); in lpfc_els_rcv_flogi()
8408 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_els_rcv_flogi()
8412 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_els_rcv_flogi()
8413 mbox = mempool_alloc(phba->mbox_mem_pool, in lpfc_els_rcv_flogi()
8419 phba->cfg_topology, in lpfc_els_rcv_flogi()
8420 phba->cfg_link_speed); in lpfc_els_rcv_flogi()
8421 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_rcv_flogi()
8422 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_rcv_flogi()
8423 mbox->vport = vport; in lpfc_els_rcv_flogi()
8428 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_flogi()
8433 phba->link_flag |= LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8445 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8446 vport->fc_flag |= FC_PT2PT_PLOGI; in lpfc_els_rcv_flogi()
8447 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8454 vport->fc_myDID = PT2PT_LocalID; in lpfc_els_rcv_flogi()
8456 vport->fc_myDID = PT2PT_RemoteID; in lpfc_els_rcv_flogi()
8463 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8464 fc_flag = vport->fc_flag; in lpfc_els_rcv_flogi()
8465 port_state = vport->port_state; in lpfc_els_rcv_flogi()
8466 vport->fc_flag |= FC_PT2PT; in lpfc_els_rcv_flogi()
8467 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_els_rcv_flogi()
8470 * work-around. in lpfc_els_rcv_flogi()
8472 vport->rcv_flogi_cnt++; in lpfc_els_rcv_flogi()
8473 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8477 port_state, vport->port_state, in lpfc_els_rcv_flogi()
8478 fc_flag, vport->fc_flag); in lpfc_els_rcv_flogi()
8485 did = vport->fc_myDID; in lpfc_els_rcv_flogi()
8486 vport->fc_myDID = Fabric_DID; in lpfc_els_rcv_flogi()
8488 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_els_rcv_flogi()
8491 if (!(phba->hba_flag & HBA_FLOGI_ISSUED)) { in lpfc_els_rcv_flogi()
8492 phba->defer_flogi_acc_rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_flogi()
8493 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8494 phba->defer_flogi_acc_ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_flogi()
8495 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8497 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8502 phba->defer_flogi_acc_rx_id, in lpfc_els_rcv_flogi()
8503 phba->defer_flogi_acc_ox_id, phba->hba_flag); in lpfc_els_rcv_flogi()
8505 phba->defer_flogi_acc_flag = true; in lpfc_els_rcv_flogi()
8514 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8520 * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
8523 * @ndlp: pointer to a node-list data structure.
8533 * 0 - Successfully processed rnid iocb (currently always return 0)
8544 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rnid()
8545 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rnid()
8552 switch (rn->Format) { in lpfc_els_rcv_rnid()
8556 lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp); in lpfc_els_rcv_rnid()
8571 * lpfc_els_rcv_echo - Process an unsolicited echo iocb
8574 * @ndlp: pointer to a node-list data structure.
8577 * 0 - Successfully processed echo iocb (currently always return 0)
8585 pcmd = (uint8_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_echo()
8595 * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
8598 * @ndlp: pointer to a node-list data structure.
8605 * 0 - Successfully processed lirr iocb (currently always return 0)
8623 * lpfc_els_rcv_rrq - Process an unsolicited rrq iocb
8626 * @ndlp: pointer to a node-list data structure.
8643 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rcv_rrq()
8648 * lpfc_els_rsp_rls_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
8682 mb = &pmb->u.mb; in lpfc_els_rsp_rls_acc()
8684 ndlp = pmb->ctx_ndlp; in lpfc_els_rsp_rls_acc()
8685 rxid = (uint16_t)((unsigned long)(pmb->ctx_buf) & 0xffff); in lpfc_els_rsp_rls_acc()
8686 oxid = (uint16_t)(((unsigned long)(pmb->ctx_buf) >> 16) & 0xffff); in lpfc_els_rsp_rls_acc()
8687 pmb->ctx_buf = NULL; in lpfc_els_rsp_rls_acc()
8688 pmb->ctx_ndlp = NULL; in lpfc_els_rsp_rls_acc()
8690 if (mb->mbxStatus) { in lpfc_els_rsp_rls_acc()
8691 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8696 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rsp_rls_acc()
8698 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rls_acc()
8704 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8709 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rls_acc()
8710 wqe = &elsiocb->wqe; in lpfc_els_rsp_rls_acc()
8712 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, rxid); in lpfc_els_rsp_rls_acc()
8713 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, oxid); in lpfc_els_rsp_rls_acc()
8715 icmd = &elsiocb->iocb; in lpfc_els_rsp_rls_acc()
8716 icmd->ulpContext = rxid; in lpfc_els_rsp_rls_acc()
8717 icmd->unsli3.rcvsli3.ox_id = oxid; in lpfc_els_rsp_rls_acc()
8720 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rls_acc()
8725 rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt); in lpfc_els_rsp_rls_acc()
8726 rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt); in lpfc_els_rsp_rls_acc()
8727 rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt); in lpfc_els_rsp_rls_acc()
8728 rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt); in lpfc_els_rsp_rls_acc()
8729 rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord); in lpfc_els_rsp_rls_acc()
8730 rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt); in lpfc_els_rsp_rls_acc()
8731 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8733 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rsp_rls_acc()
8736 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rls_acc()
8737 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rls_acc()
8738 ndlp->nlp_rpi); in lpfc_els_rsp_rls_acc()
8739 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rls_acc()
8740 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rls_acc()
8741 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rls_acc()
8742 if (!elsiocb->ndlp) { in lpfc_els_rsp_rls_acc()
8756 * lpfc_els_rcv_rls - Process an unsolicited rls iocb
8759 * @ndlp: pointer to a node-list data structure.
8771 * 0 - Successfully processed rls iocb (currently always return 0)
8777 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rls()
8783 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rls()
8784 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rls()
8788 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC); in lpfc_els_rcv_rls()
8791 mbox->ctx_buf = (void *)((unsigned long) in lpfc_els_rcv_rls()
8793 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rls()
8794 if (!mbox->ctx_ndlp) in lpfc_els_rcv_rls()
8796 mbox->vport = vport; in lpfc_els_rcv_rls()
8797 mbox->mbox_cmpl = lpfc_els_rsp_rls_acc; in lpfc_els_rcv_rls()
8807 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_rls()
8820 * lpfc_els_rcv_rtv - Process an unsolicited rtv iocb
8823 * @ndlp: pointer to a node-list data structure.
8838 * 0 - Successfully processed rtv iocb (currently always return 0)
8847 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rtv()
8855 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rtv()
8856 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rtv()
8861 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rcv_rtv()
8863 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rcv_rtv()
8868 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rcv_rtv()
8874 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rcv_rtv()
8875 wqe = &elsiocb->wqe; in lpfc_els_rcv_rtv()
8876 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rcv_rtv()
8878 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rcv_rtv()
8881 icmd = &elsiocb->iocb; in lpfc_els_rcv_rtv()
8882 icmd->ulpContext = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_rtv()
8883 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_rtv()
8889 rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000); /* report msecs */ in lpfc_els_rcv_rtv()
8890 rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov); in lpfc_els_rcv_rtv()
8891 bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0); in lpfc_els_rcv_rtv()
8893 rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8896 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rcv_rtv()
8900 elsiocb->iotag, ulp_context, in lpfc_els_rcv_rtv()
8901 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rcv_rtv()
8902 ndlp->nlp_rpi, in lpfc_els_rcv_rtv()
8903 rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8904 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rcv_rtv()
8905 phba->fc_stat.elsXmitACC++; in lpfc_els_rcv_rtv()
8906 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rtv()
8907 if (!elsiocb->ndlp) { in lpfc_els_rcv_rtv()
8929 /* lpfc_issue_els_rrq - Process an unsolicited rrq iocb
8931 * @ndlp: pointer to a node-list data structure.
8939 * 0 - Successfully sent rrq els iocb.
8940 * 1 - Failed to send rrq els iocb.
8946 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rrq()
8963 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rrq()
8970 bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]); in lpfc_issue_els_rrq()
8971 bf_set(rrq_rxid, els_rrq, rrq->rxid); in lpfc_issue_els_rrq()
8972 bf_set(rrq_did, els_rrq, vport->fc_myDID); in lpfc_issue_els_rrq()
8973 els_rrq->rrq = cpu_to_be32(els_rrq->rrq); in lpfc_issue_els_rrq()
8974 els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg); in lpfc_issue_els_rrq()
8979 did, rrq->xritag, rrq->rxid); in lpfc_issue_els_rrq()
8980 elsiocb->context_un.rrq = rrq; in lpfc_issue_els_rrq()
8981 elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq; in lpfc_issue_els_rrq()
8983 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rrq()
8984 if (!elsiocb->ndlp) in lpfc_issue_els_rrq()
9000 * lpfc_send_rrq - Sends ELS RRQ if needed.
9014 struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport, in lpfc_send_rrq()
9015 rrq->nlp_DID); in lpfc_send_rrq()
9019 if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag)) in lpfc_send_rrq()
9020 return lpfc_issue_els_rrq(rrq->vport, ndlp, in lpfc_send_rrq()
9021 rrq->nlp_DID, rrq); in lpfc_send_rrq()
9027 * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
9031 * @ndlp: pointer to a node-list data structure.
9042 * 0 - Successfully issued ACC RPL ELS command
9043 * 1 - Failed to issue ACC RPL ELS command
9050 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rpl_acc()
9058 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rpl_acc()
9059 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rpl_acc()
9065 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rpl_acc()
9066 wqe = &elsiocb->wqe; in lpfc_els_rsp_rpl_acc()
9068 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rpl_acc()
9070 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rpl_acc()
9073 icmd = &elsiocb->iocb; in lpfc_els_rsp_rpl_acc()
9074 icmd->ulpContext = get_job_ulpcontext(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
9075 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
9078 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rpl_acc()
9088 rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_rpl_acc()
9089 memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname, in lpfc_els_rsp_rpl_acc()
9091 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_rpl_acc()
9097 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rpl_acc()
9098 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rpl_acc()
9099 ndlp->nlp_rpi); in lpfc_els_rsp_rpl_acc()
9100 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rpl_acc()
9101 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rpl_acc()
9102 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rpl_acc()
9103 if (!elsiocb->ndlp) { in lpfc_els_rsp_rpl_acc()
9119 * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
9122 * @ndlp: pointer to a node-list data structure.
9132 * 0 - Successfully processed rpl iocb (currently always return 0)
9145 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rpl()
9146 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_rpl()
9158 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rpl()
9159 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rpl()
9161 maxsize = be32_to_cpu(rpl->maxsize); in lpfc_els_rcv_rpl()
9164 if ((rpl->index == 0) && in lpfc_els_rcv_rpl()
9177 * lpfc_els_rcv_farp - Process an unsolicited farp request els command
9180 * @ndlp: pointer to a node-list data structure.
9198 * 0 - Either the FARP Match Mode not supported or successfully processed
9209 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farp()
9210 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_farp()
9211 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_farp()
9215 /* FARP-REQ received from DID <did> */ in lpfc_els_rcv_farp()
9217 "0601 FARP-REQ received from DID x%x\n", did); in lpfc_els_rcv_farp()
9219 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) { in lpfc_els_rcv_farp()
9225 if (fp->Mflags & FARP_MATCH_PORT) { in lpfc_els_rcv_farp()
9226 if (memcmp(&fp->RportName, &vport->fc_portname, in lpfc_els_rcv_farp()
9232 if (fp->Mflags & FARP_MATCH_NODE) { in lpfc_els_rcv_farp()
9233 if (memcmp(&fp->RnodeName, &vport->fc_nodename, in lpfc_els_rcv_farp()
9239 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_els_rcv_farp()
9240 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_farp()
9242 if (fp->Rflags & FARP_REQUEST_PLOGI) { in lpfc_els_rcv_farp()
9243 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_rcv_farp()
9246 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_rcv_farp()
9250 if (fp->Rflags & FARP_REQUEST_FARPR) in lpfc_els_rcv_farp()
9258 * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
9261 * @ndlp: pointer to a node-list data structure.
9269 * 0 - Successfully processed FARPR IOCB (currently always return 0)
9277 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farpr()
9279 /* FARP-RSP received from DID <did> */ in lpfc_els_rcv_farpr()
9281 "0600 FARP-RSP received from DID x%x\n", did); in lpfc_els_rcv_farpr()
9289 * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
9292 * @fan_ndlp: pointer to a node-list data structure.
9305 * 0 - Successfully processed fan iocb (currently always return 0).
9311 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fan()
9316 lp = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_fan()
9319 if ((vport == phba->pport) && in lpfc_els_rcv_fan()
9320 (vport->port_state == LPFC_LOCAL_CFG_LINK)) { in lpfc_els_rcv_fan()
9321 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName, in lpfc_els_rcv_fan()
9323 (memcmp(&phba->fc_fabparam.portName, &fp->FportName, in lpfc_els_rcv_fan()
9328 /* FAN verified - skip FLOGI */ in lpfc_els_rcv_fan()
9329 vport->fc_myDID = vport->fc_prevDID; in lpfc_els_rcv_fan()
9330 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_els_rcv_fan()
9335 vport->fc_prevDID, vport->fc_myDID); in lpfc_els_rcv_fan()
9344 * lpfc_els_rcv_edc - Process an unsolicited EDC iocb
9347 * @ndlp: pointer to a node-list data structure.
9350 * 0 - Successfully processed echo iocb (currently always return 0)
9356 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_edc()
9365 payload = cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_edc()
9368 bytes_remain = be32_to_cpu(edc_req->desc_len); in lpfc_els_rcv_edc()
9378 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_els_rcv_edc()
9379 phba->cgn_sig_freq = 0; in lpfc_els_rcv_edc()
9380 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_els_rcv_edc()
9385 tlv = edc_req->desc; in lpfc_els_rcv_edc()
9401 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_edc()
9421 be32_to_cpu(plnkflt->desc_tag), in lpfc_els_rcv_edc()
9422 be32_to_cpu(plnkflt->desc_len), in lpfc_els_rcv_edc()
9424 plnkflt->degrade_activate_threshold), in lpfc_els_rcv_edc()
9426 plnkflt->degrade_deactivate_threshold), in lpfc_els_rcv_edc()
9427 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_els_rcv_edc()
9443 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_els_rcv_edc()
9444 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_els_rcv_edc()
9450 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_els_rcv_edc()
9463 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_edc()
9476 * lpfc_els_timeout - Handler funciton to the els timer
9489 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout()
9493 spin_lock_irqsave(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9494 tmo_posted = vport->work_port_events & WORKER_ELS_TMO; in lpfc_els_timeout()
9495 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING))) in lpfc_els_timeout()
9496 vport->work_port_events |= WORKER_ELS_TMO; in lpfc_els_timeout()
9497 spin_unlock_irqrestore(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9499 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING))) in lpfc_els_timeout()
9506 * lpfc_els_timeout_handler - Process an els timeout event
9517 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout_handler()
9529 timeout = (uint32_t)(phba->fc_ratov << 1); in lpfc_els_timeout_handler()
9535 if (phba->pport->load_flag & FC_UNLOADING) in lpfc_els_timeout_handler()
9538 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9539 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9540 spin_lock(&pring->ring_lock); in lpfc_els_timeout_handler()
9542 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_timeout_handler()
9547 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_timeout_handler()
9550 cmd = &piocb->iocb; in lpfc_els_timeout_handler()
9551 iotag = cmd->ulpIoTag; in lpfc_els_timeout_handler()
9554 if ((piocb->cmd_flag & LPFC_IO_LIBDFC) != 0 || in lpfc_els_timeout_handler()
9560 if (piocb->vport != vport) in lpfc_els_timeout_handler()
9563 pcmd = piocb->cmd_dmabuf; in lpfc_els_timeout_handler()
9565 els_command = *(uint32_t *) (pcmd->virt); in lpfc_els_timeout_handler()
9572 if (piocb->drvrTimeout > 0) { in lpfc_els_timeout_handler()
9573 if (piocb->drvrTimeout >= timeout) in lpfc_els_timeout_handler()
9574 piocb->drvrTimeout -= timeout; in lpfc_els_timeout_handler()
9576 piocb->drvrTimeout = 0; in lpfc_els_timeout_handler()
9587 remote_ID = ndlp->nlp_DID; in lpfc_els_timeout_handler()
9589 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_timeout_handler()
9591 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9592 spin_unlock(&pring->ring_lock); in lpfc_els_timeout_handler()
9593 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9601 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9602 list_del_init(&piocb->dlist); in lpfc_els_timeout_handler()
9604 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9610 if (!list_empty(&pring->txcmplq)) in lpfc_els_timeout_handler()
9611 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_els_timeout_handler()
9612 mod_timer(&vport->els_tmofunc, in lpfc_els_timeout_handler()
9617 * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
9624 * the IOCBs with a non-NULL completion callback function, the callback
9641 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_cmd()
9656 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9661 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9665 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9666 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9668 mbx_tmo_err = test_bit(MBX_TMO_ERR, &phba->bit_flags); in lpfc_els_flush_cmd()
9670 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_flush_cmd()
9671 if (piocb->cmd_flag & LPFC_IO_LIBDFC && !mbx_tmo_err) in lpfc_els_flush_cmd()
9674 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9677 if (piocb->cmd_flag & LPFC_DRIVER_ABORTED && !mbx_tmo_err) in lpfc_els_flush_cmd()
9685 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9694 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_els_flush_cmd()
9695 piocb->cmd_cmpl = lpfc_cmpl_els_link_down; in lpfc_els_flush_cmd()
9698 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9701 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9702 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9703 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9707 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9708 list_del_init(&piocb->dlist); in lpfc_els_flush_cmd()
9710 list_move_tail(&piocb->list, &cancel_list); in lpfc_els_flush_cmd()
9714 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9728 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9729 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9730 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9735 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) { in lpfc_els_flush_cmd()
9738 if (piocb->cmd_flag & LPFC_IO_LIBDFC) in lpfc_els_flush_cmd()
9749 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9752 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9753 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9757 if (vport == phba->pport) { in lpfc_els_flush_cmd()
9759 &phba->fabric_iocb_list, list) { in lpfc_els_flush_cmd()
9760 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9761 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9765 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9766 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9767 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9777 * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
9798 spin_lock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9799 list_for_each_entry(vport, &phba->port_list, listentry) in lpfc_els_flush_all_cmd()
9801 spin_unlock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9807 * lpfc_send_els_failure_event - Posts an ELS command failure event
9820 struct lpfc_vport *vport = cmdiocbp->vport; in lpfc_send_els_failure_event()
9829 ndlp = cmdiocbp->ndlp; in lpfc_send_els_failure_event()
9839 memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9841 memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9843 pcmd = (uint32_t *)cmdiocbp->cmd_dmabuf->virt; in lpfc_send_els_failure_event()
9862 memcpy(fabric_event.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9864 memcpy(fabric_event.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9877 * lpfc_send_els_event - Posts unsolicited els event
9902 els_data = &logo_data->header; in lpfc_send_els_event()
9913 els_data->event_type = FC_REG_ELS_EVENT; in lpfc_send_els_event()
9916 els_data->subcategory = LPFC_EVENT_PLOGI_RCV; in lpfc_send_els_event()
9919 els_data->subcategory = LPFC_EVENT_PRLO_RCV; in lpfc_send_els_event()
9922 els_data->subcategory = LPFC_EVENT_ADISC_RCV; in lpfc_send_els_event()
9925 els_data->subcategory = LPFC_EVENT_LOGO_RCV; in lpfc_send_els_event()
9927 memcpy(logo_data->logo_wwpn, &payload[2], in lpfc_send_els_event()
9934 memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9935 memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9971 * lpfc_display_fpin_wwpn - Display WWPNs accessible by the attached port
9993 if (i == (cnt - 1)) in lpfc_display_fpin_wwpn()
9999 len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len, in lpfc_display_fpin_wwpn()
10020 cnt - i - 1); in lpfc_display_fpin_wwpn()
10033 * lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
10046 li_evt = be16_to_cpu(li->event_type); in lpfc_els_rcv_fpin_li()
10048 cnt = be32_to_cpu(li->pname_count); in lpfc_els_rcv_fpin_li()
10055 be64_to_cpu(li->detecting_wwpn), in lpfc_els_rcv_fpin_li()
10056 be64_to_cpu(li->attached_wwpn), in lpfc_els_rcv_fpin_li()
10057 be32_to_cpu(li->event_threshold), in lpfc_els_rcv_fpin_li()
10058 be32_to_cpu(li->event_count), cnt); in lpfc_els_rcv_fpin_li()
10060 lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt); in lpfc_els_rcv_fpin_li()
10064 * lpfc_els_rcv_fpin_del - Process an FPIN Delivery Event.
10078 del_rsn = be16_to_cpu(del->deli_reason_code); in lpfc_els_rcv_fpin_del()
10091 be64_to_cpu(del->detecting_wwpn), in lpfc_els_rcv_fpin_del()
10092 be64_to_cpu(del->attached_wwpn), in lpfc_els_rcv_fpin_del()
10102 * lpfc_els_rcv_fpin_peer_cgn - Process a FPIN Peer Congestion Event.
10115 pc_evt = be16_to_cpu(pc->event_type); in lpfc_els_rcv_fpin_peer_cgn()
10117 cnt = be32_to_cpu(pc->pname_count); in lpfc_els_rcv_fpin_peer_cgn()
10125 be32_to_cpu(pc->event_period), in lpfc_els_rcv_fpin_peer_cgn()
10126 be64_to_cpu(pc->detecting_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10127 be64_to_cpu(pc->attached_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10130 lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt); in lpfc_els_rcv_fpin_peer_cgn()
10134 * lpfc_els_rcv_fpin_cgn - Process an FPIN Congestion notification
10158 cgn_evt = be16_to_cpu(cgn->event_type); in lpfc_els_rcv_fpin_cgn()
10160 cgn_sev = cgn->severity; in lpfc_els_rcv_fpin_cgn()
10182 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10183 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) { in lpfc_els_rcv_fpin_cgn()
10185 atomic_inc(&phba->cgn_sync_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10191 atomic_inc(&phba->cgn_fabric_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10197 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10198 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) { in lpfc_els_rcv_fpin_cgn()
10200 atomic_inc(&phba->cgn_sync_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10206 atomic_inc(&phba->cgn_fabric_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10209 phba->cgn_fpin_frequency = in lpfc_els_rcv_fpin_cgn()
10210 be32_to_cpu(cgn->event_period); in lpfc_els_rcv_fpin_cgn()
10211 value = phba->cgn_fpin_frequency; in lpfc_els_rcv_fpin_cgn()
10212 if (phba->cgn_i) { in lpfc_els_rcv_fpin_cgn()
10214 phba->cgn_i->virt; in lpfc_els_rcv_fpin_cgn()
10215 cp->cgn_alarm_freq = in lpfc_els_rcv_fpin_cgn()
10217 cp->cgn_warn_freq = in lpfc_els_rcv_fpin_cgn()
10223 cp->cgn_info_crc = cpu_to_le32(crc); in lpfc_els_rcv_fpin_cgn()
10242 be32_to_cpu(cgn->event_period)); in lpfc_els_rcv_fpin_cgn()
10249 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fpin()
10258 if (vport->port_state < LPFC_DISC_AUTH) in lpfc_els_rcv_fpin()
10268 len = be32_to_cpu(fpin->desc_len); in lpfc_els_rcv_fpin()
10276 tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0]; in lpfc_els_rcv_fpin()
10278 bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc); in lpfc_els_rcv_fpin()
10279 bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len)); in lpfc_els_rcv_fpin()
10284 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_fpin()
10312 cnt = be32_to_cpu(tlv->desc_len); in lpfc_els_rcv_fpin()
10317 len -= (cnt + sizeof(struct fc_tlv_desc)); in lpfc_els_rcv_fpin()
10328 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_fpin()
10342 fpin->desc_len = cpu_to_be32(fpin_length); in lpfc_els_rcv_fpin()
10354 * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
10379 if (!vport || !elsiocb->cmd_dmabuf) in lpfc_els_unsol_buffer()
10383 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_buffer()
10384 payload = elsiocb->cmd_dmabuf->virt; in lpfc_els_unsol_buffer()
10385 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_buffer()
10386 payload_len = wcqe_cmpl->total_data_placed; in lpfc_els_unsol_buffer()
10388 payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_unsol_buffer()
10391 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0) in lpfc_els_unsol_buffer()
10407 if (vport->load_flag & FC_UNLOADING) in lpfc_els_unsol_buffer()
10411 if ((vport->fc_flag & FC_DISC_DELAYED) && in lpfc_els_unsol_buffer()
10424 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_unsol_buffer()
10425 } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) { in lpfc_els_unsol_buffer()
10430 phba->fc_stat.elsRcvFrame++; in lpfc_els_unsol_buffer()
10436 spin_lock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10437 if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { in lpfc_els_unsol_buffer()
10438 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10443 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10445 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_unsol_buffer()
10446 if (!elsiocb->ndlp) in lpfc_els_unsol_buffer()
10448 elsiocb->vport = vport; in lpfc_els_unsol_buffer()
10457 cmd, did, kref_read(&ndlp->kref), vport->port_state, in lpfc_els_unsol_buffer()
10458 vport->fc_flag, vport->fc_myDID, vport->fc_prevDID); in lpfc_els_unsol_buffer()
10461 if ((vport->port_state < LPFC_FABRIC_CFG_LINK) && in lpfc_els_unsol_buffer()
10463 !((cmd == ELS_CMD_PLOGI) && (vport->fc_flag & FC_PT2PT))) { in lpfc_els_unsol_buffer()
10473 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10475 phba->fc_stat.elsRcvPLOGI++; in lpfc_els_unsol_buffer()
10477 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_unsol_buffer()
10478 (phba->pport->fc_flag & FC_PT2PT)) { in lpfc_els_unsol_buffer()
10479 vport->fc_prevDID = vport->fc_myDID; in lpfc_els_unsol_buffer()
10484 vport->fc_myDID = in lpfc_els_unsol_buffer()
10486 &elsiocb->wqe.xmit_els_rsp); in lpfc_els_unsol_buffer()
10489 "%x\n", vport->fc_myDID, in lpfc_els_unsol_buffer()
10490 vport->fc_prevDID); in lpfc_els_unsol_buffer()
10496 if (vport->fc_flag & FC_DISC_DELAYED) { in lpfc_els_unsol_buffer()
10502 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10503 if (!(phba->pport->fc_flag & FC_PT2PT) || in lpfc_els_unsol_buffer()
10504 (phba->pport->fc_flag & FC_PT2PT_PLOGI)) { in lpfc_els_unsol_buffer()
10511 spin_lock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10512 ndlp->nlp_flag &= ~NLP_TARGET_REMOVE; in lpfc_els_unsol_buffer()
10513 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10522 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10524 phba->fc_stat.elsRcvFLOGI++; in lpfc_els_unsol_buffer()
10529 if (vport->port_state >= LPFC_LOCAL_CFG_LINK && in lpfc_els_unsol_buffer()
10530 vport->fc_flag & FC_PT2PT && in lpfc_els_unsol_buffer()
10531 vport->rcv_flogi_cnt >= 1) { in lpfc_els_unsol_buffer()
10540 if (phba->defer_flogi_acc_flag) in lpfc_els_unsol_buffer()
10549 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10551 phba->fc_stat.elsRcvLOGO++; in lpfc_els_unsol_buffer()
10553 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10566 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10568 phba->fc_stat.elsRcvPRLO++; in lpfc_els_unsol_buffer()
10570 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10578 phba->fc_stat.elsRcvLCB++; in lpfc_els_unsol_buffer()
10582 phba->fc_stat.elsRcvRDP++; in lpfc_els_unsol_buffer()
10586 phba->fc_stat.elsRcvRSCN++; in lpfc_els_unsol_buffer()
10595 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10598 phba->fc_stat.elsRcvADISC++; in lpfc_els_unsol_buffer()
10599 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10610 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10612 phba->fc_stat.elsRcvPDISC++; in lpfc_els_unsol_buffer()
10613 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10624 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10626 phba->fc_stat.elsRcvFARPR++; in lpfc_els_unsol_buffer()
10632 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10634 phba->fc_stat.elsRcvFARP++; in lpfc_els_unsol_buffer()
10640 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10642 phba->fc_stat.elsRcvFAN++; in lpfc_els_unsol_buffer()
10649 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10651 phba->fc_stat.elsRcvPRLI++; in lpfc_els_unsol_buffer()
10652 if ((vport->port_state < LPFC_DISC_AUTH) && in lpfc_els_unsol_buffer()
10653 (vport->fc_flag & FC_FABRIC)) { in lpfc_els_unsol_buffer()
10663 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10665 phba->fc_stat.elsRcvLIRR++; in lpfc_els_unsol_buffer()
10674 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10676 phba->fc_stat.elsRcvRLS++; in lpfc_els_unsol_buffer()
10685 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10687 phba->fc_stat.elsRcvRPL++; in lpfc_els_unsol_buffer()
10696 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10698 phba->fc_stat.elsRcvRNID++; in lpfc_els_unsol_buffer()
10707 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10708 phba->fc_stat.elsRcvRTV++; in lpfc_els_unsol_buffer()
10717 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10719 phba->fc_stat.elsRcvRRQ++; in lpfc_els_unsol_buffer()
10728 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10730 phba->fc_stat.elsRcvECHO++; in lpfc_els_unsol_buffer()
10744 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10755 phba->fc_stat.elsRcvRDF++; in lpfc_els_unsol_buffer()
10771 cmd, did, vport->port_state); in lpfc_els_unsol_buffer()
10802 lpfc_nlp_put(elsiocb->ndlp); in lpfc_els_unsol_buffer()
10803 elsiocb->ndlp = NULL; in lpfc_els_unsol_buffer()
10810 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_els_unsol_buffer()
10815 phba->cfg_topology, in lpfc_els_unsol_buffer()
10816 phba->cfg_link_speed); in lpfc_els_unsol_buffer()
10817 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_unsol_buffer()
10818 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_unsol_buffer()
10819 mbox->vport = vport; in lpfc_els_unsol_buffer()
10822 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_unsol_buffer()
10828 if (vport && !(vport->load_flag & FC_UNLOADING)) in lpfc_els_unsol_buffer()
10834 phba->fc_stat.elsRcvDrop++; in lpfc_els_unsol_buffer()
10838 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
10853 struct lpfc_vport *vport = elsiocb->vport; in lpfc_els_unsol_event()
10857 struct lpfc_dmabuf *bdeBuf1 = elsiocb->cmd_dmabuf; in lpfc_els_unsol_event()
10858 struct lpfc_dmabuf *bdeBuf2 = elsiocb->bpl_dmabuf; in lpfc_els_unsol_event()
10861 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10862 elsiocb->rsp_dmabuf = NULL; in lpfc_els_unsol_event()
10863 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10865 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_event()
10869 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_event()
10870 bde_count = wcqe_cmpl->word3; in lpfc_els_unsol_event()
10872 bde_count = elsiocb->iocb.ulpBdeCount; in lpfc_els_unsol_event()
10879 phba->fc_stat.NoRcvBuf++; in lpfc_els_unsol_event()
10881 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) in lpfc_els_unsol_event()
10886 if (phba->sli_rev == LPFC_SLI_REV3) { in lpfc_els_unsol_event()
10887 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10888 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_unsol_event()
10891 if (icmd->unsli3.rcvsli3.vpi == 0xffff) in lpfc_els_unsol_event()
10892 vport = phba->pport; in lpfc_els_unsol_event()
10895 icmd->unsli3.rcvsli3.vpi); in lpfc_els_unsol_event()
10906 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_els_unsol_event()
10907 elsiocb->cmd_dmabuf = bdeBuf1; in lpfc_els_unsol_event()
10909 elsiocb->bpl_dmabuf = bdeBuf2; in lpfc_els_unsol_event()
10911 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10912 paddr = getPaddr(icmd->un.cont64[0].addrHigh, in lpfc_els_unsol_event()
10913 icmd->un.cont64[0].addrLow); in lpfc_els_unsol_event()
10914 elsiocb->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring, in lpfc_els_unsol_event()
10917 paddr = getPaddr(icmd->un.cont64[1].addrHigh, in lpfc_els_unsol_event()
10918 icmd->un.cont64[1].addrLow); in lpfc_els_unsol_event()
10919 elsiocb->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba, in lpfc_els_unsol_event()
10930 if (elsiocb->cmd_dmabuf) { in lpfc_els_unsol_event()
10931 lpfc_in_buf_free(phba, elsiocb->cmd_dmabuf); in lpfc_els_unsol_event()
10932 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10935 if (elsiocb->bpl_dmabuf) { in lpfc_els_unsol_event()
10936 lpfc_in_buf_free(phba, elsiocb->bpl_dmabuf); in lpfc_els_unsol_event()
10937 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10955 ndlp->nlp_type |= NLP_FABRIC; in lpfc_start_fdmi()
10962 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_start_fdmi()
10966 * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
10974 * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
10989 spin_lock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
10990 if (vport->fc_flag & FC_DISC_DELAYED) { in lpfc_do_scr_ns_plogi()
10991 spin_unlock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
10994 phba->fc_ratov); in lpfc_do_scr_ns_plogi()
10995 mod_timer(&vport->delayed_disc_tmo, in lpfc_do_scr_ns_plogi()
10996 jiffies + msecs_to_jiffies(1000 * phba->fc_ratov)); in lpfc_do_scr_ns_plogi()
10999 spin_unlock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
11005 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_do_scr_ns_plogi()
11016 ndlp->nlp_type |= NLP_FABRIC; in lpfc_do_scr_ns_plogi()
11020 if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) { in lpfc_do_scr_ns_plogi()
11027 if ((phba->cfg_enable_SmartSAN || in lpfc_do_scr_ns_plogi()
11028 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) && in lpfc_do_scr_ns_plogi()
11029 (vport->load_flag & FC_ALLOW_FDMI)) in lpfc_do_scr_ns_plogi()
11034 * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
11048 struct lpfc_vport *vport = pmb->vport; in lpfc_cmpl_reg_new_vport()
11050 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_cmpl_reg_new_vport()
11051 MAILBOX_t *mb = &pmb->u.mb; in lpfc_cmpl_reg_new_vport()
11054 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11055 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11056 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11058 if (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
11061 " upd bit: x%x \n", mb->mbxStatus, in lpfc_cmpl_reg_new_vport()
11062 mb->un.varRegVpi.upd); in lpfc_cmpl_reg_new_vport()
11063 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_reg_new_vport()
11064 mb->un.varRegVpi.upd) in lpfc_cmpl_reg_new_vport()
11067 switch (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
11073 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11074 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_cmpl_reg_new_vport()
11075 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11078 /* If reg_vpi fail with invalid VPI status, re-init VPI */ in lpfc_cmpl_reg_new_vport()
11080 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11081 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11082 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11083 lpfc_init_vpi(phba, pmb, vport->vpi); in lpfc_cmpl_reg_new_vport()
11084 pmb->vport = vport; in lpfc_cmpl_reg_new_vport()
11085 pmb->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_cmpl_reg_new_vport()
11100 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11103 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11104 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11105 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11106 if (mb->mbxStatus == MBX_NOT_FINISHED) in lpfc_cmpl_reg_new_vport()
11108 if ((vport->port_type == LPFC_PHYSICAL_PORT) && in lpfc_cmpl_reg_new_vport()
11109 !(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG)) { in lpfc_cmpl_reg_new_vport()
11110 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11120 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11121 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_cmpl_reg_new_vport()
11122 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11123 if (vport == phba->pport) { in lpfc_cmpl_reg_new_vport()
11124 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11131 if (vport->port_state != LPFC_FDISC) in lpfc_cmpl_reg_new_vport()
11145 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_cmpl_reg_new_vport()
11152 vport->vmid_flag = vport->phba->pport->vmid_flag; in lpfc_cmpl_reg_new_vport()
11158 * lpfc_register_new_vport - Register a new vport with a HBA
11161 * @ndlp: pointer to a node-list data structure.
11173 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_new_vport()
11176 mbox->vport = vport; in lpfc_register_new_vport()
11177 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_register_new_vport()
11178 if (!mbox->ctx_ndlp) { in lpfc_register_new_vport()
11179 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11183 mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport; in lpfc_register_new_vport()
11190 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11205 spin_lock_irq(shost->host_lock); in lpfc_register_new_vport()
11206 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_register_new_vport()
11207 spin_unlock_irq(shost->host_lock); in lpfc_register_new_vport()
11212 * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer
11226 link_state = phba->link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11228 phba->link_state = link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11233 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_cancel_all_vport_retry_delay_timer()
11244 * lpfc_retry_pport_discovery - Start timer to retry FLOGI.
11259 /* If fabric require FLOGI, then re-instantiate physical login */ in lpfc_retry_pport_discovery()
11260 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_retry_pport_discovery()
11264 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); in lpfc_retry_pport_discovery()
11265 spin_lock_irq(&ndlp->lock); in lpfc_retry_pport_discovery()
11266 ndlp->nlp_flag |= NLP_DELAY_TMO; in lpfc_retry_pport_discovery()
11267 spin_unlock_irq(&ndlp->lock); in lpfc_retry_pport_discovery()
11268 ndlp->nlp_last_elscmd = ELS_CMD_FLOGI; in lpfc_retry_pport_discovery()
11269 phba->pport->port_state = LPFC_FLOGI; in lpfc_retry_pport_discovery()
11274 * lpfc_fabric_login_reqd - Check if FLOGI required.
11298 * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
11321 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_fdisc()
11323 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_fdisc()
11327 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_fdisc()
11338 vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11343 list_for_each_entry(piocb, &phba->fabric_iocb_list, list) { in lpfc_cmpl_els_fdisc()
11344 lpfc_set_disctmo(piocb->vport); in lpfc_cmpl_els_fdisc()
11349 ulp_status, ulp_word4, vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11370 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11371 vport->fc_flag &= ~FC_VPORT_CVL_RCVD; in lpfc_cmpl_els_fdisc()
11372 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD; in lpfc_cmpl_els_fdisc()
11373 vport->fc_flag |= FC_FABRIC; in lpfc_cmpl_els_fdisc()
11374 if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP) in lpfc_cmpl_els_fdisc()
11375 vport->fc_flag |= FC_PUBLIC_LOOP; in lpfc_cmpl_els_fdisc()
11376 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11378 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_fdisc()
11380 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_fdisc()
11386 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_fdisc()
11388 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_fdisc()
11390 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_fdisc()
11393 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_fdisc()
11399 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_fdisc()
11400 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_fdisc()
11401 !(np->nlp_flag & NLP_NPR_ADISC)) in lpfc_cmpl_els_fdisc()
11403 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_fdisc()
11404 np->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_cmpl_els_fdisc()
11405 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_fdisc()
11410 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11414 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11415 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_els_fdisc()
11416 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11417 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_cmpl_els_fdisc()
11419 vport->fc_flag |= FC_LOGO_RCVD_DID_CHNG; in lpfc_cmpl_els_fdisc()
11420 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11421 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_fdisc()
11422 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_fdisc()
11424 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_fdisc()
11432 if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI) in lpfc_cmpl_els_fdisc()
11434 else if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI) in lpfc_cmpl_els_fdisc()
11446 if (vport->fc_vport && in lpfc_cmpl_els_fdisc()
11447 (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS)) in lpfc_cmpl_els_fdisc()
11457 * lpfc_issue_els_fdisc - Issue a fdisc iocb command
11459 * @ndlp: pointer to a node-list data structure.
11472 * 0 - Successfully issued fdisc iocb command
11473 * 1 - Failed to issue fdisc iocb command
11479 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_fdisc()
11486 int did = ndlp->nlp_DID; in lpfc_issue_els_fdisc()
11489 vport->port_state = LPFC_FDISC; in lpfc_issue_els_fdisc()
11490 vport->fc_myDID = 0; in lpfc_issue_els_fdisc()
11501 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_fdisc()
11502 wqe = &elsiocb->wqe; in lpfc_issue_els_fdisc()
11503 bf_set(els_req64_sid, &wqe->els_req, 0); in lpfc_issue_els_fdisc()
11504 bf_set(els_req64_sp, &wqe->els_req, 1); in lpfc_issue_els_fdisc()
11506 icmd = &elsiocb->iocb; in lpfc_issue_els_fdisc()
11507 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_fdisc()
11508 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_fdisc()
11509 icmd->ulpCt_h = 1; in lpfc_issue_els_fdisc()
11510 icmd->ulpCt_l = 0; in lpfc_issue_els_fdisc()
11513 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_fdisc()
11516 memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_fdisc()
11519 sp->cmn.e_d_tov = 0; in lpfc_issue_els_fdisc()
11520 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_fdisc()
11521 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_fdisc()
11522 sp->cls1.classValid = 0; in lpfc_issue_els_fdisc()
11523 sp->cls2.seqDelivery = 1; in lpfc_issue_els_fdisc()
11524 sp->cls3.seqDelivery = 1; in lpfc_issue_els_fdisc()
11530 memcpy(pcmd, &vport->fc_portname, 8); in lpfc_issue_els_fdisc()
11533 memcpy(pcmd, &vport->fc_nodename, 8); in lpfc_issue_els_fdisc()
11534 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_fdisc()
11535 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_fdisc()
11538 phba->fc_stat.elsXmitFDISC++; in lpfc_issue_els_fdisc()
11539 elsiocb->cmd_cmpl = lpfc_cmpl_els_fdisc; in lpfc_issue_els_fdisc()
11545 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_fdisc()
11546 if (!elsiocb->ndlp) in lpfc_issue_els_fdisc()
11567 * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
11584 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_npiv_logo()
11590 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_npiv_logo()
11595 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_npiv_logo()
11599 irsp = &rspiocb->iocb; in lpfc_cmpl_els_npiv_logo()
11601 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_npiv_logo()
11612 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_npiv_logo()
11613 tmo, vport->num_disc_nodes, in lpfc_cmpl_els_npiv_logo()
11614 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_npiv_logo()
11615 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_npiv_logo()
11618 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_npiv_logo()
11619 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cmpl_els_npiv_logo()
11620 vport->fc_flag &= ~FC_FABRIC; in lpfc_cmpl_els_npiv_logo()
11621 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_npiv_logo()
11625 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_npiv_logo()
11627 if (ndlp->logo_waitq) in lpfc_cmpl_els_npiv_logo()
11628 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_npiv_logo()
11629 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11630 ndlp->nlp_flag &= ~(NLP_ISSUE_LOGO | NLP_LOGO_SND); in lpfc_cmpl_els_npiv_logo()
11631 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_npiv_logo()
11632 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11641 * lpfc_issue_els_npiv_logo - Issue a logo off a vport
11643 * @ndlp: pointer to a node-list data structure.
11652 * 0 - Successfully issued logo off the @vport
11653 * 1 - Failed to issue logo off the @vport
11659 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_npiv_logo()
11665 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID, in lpfc_issue_els_npiv_logo()
11670 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_npiv_logo()
11675 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_npiv_logo()
11677 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_npiv_logo()
11681 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_issue_els_npiv_logo()
11683 elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo; in lpfc_issue_els_npiv_logo()
11684 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11685 ndlp->nlp_flag |= NLP_LOGO_SND; in lpfc_issue_els_npiv_logo()
11686 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11687 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_npiv_logo()
11688 if (!elsiocb->ndlp) { in lpfc_issue_els_npiv_logo()
11702 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11703 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_issue_els_npiv_logo()
11704 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11709 * lpfc_fabric_block_timeout - Handler function to the fabric block timer
11726 spin_lock_irqsave(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11727 tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11729 phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11730 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11738 * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
11756 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11758 if (atomic_read(&phba->fabric_iocb_count) == 0) { in lpfc_resume_fabric_iocbs()
11759 list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb), in lpfc_resume_fabric_iocbs()
11763 atomic_inc(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11765 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11767 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_resume_fabric_iocbs()
11768 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_resume_fabric_iocbs()
11769 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11771 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_resume_fabric_iocbs()
11773 iocb->vport->port_state, 0, 0); in lpfc_resume_fabric_iocbs()
11778 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_resume_fabric_iocbs()
11779 iocb->fabric_cmd_cmpl = NULL; in lpfc_resume_fabric_iocbs()
11780 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11782 iocb->wcqe_cmpl.parameter = IOERR_SLI_ABORTED; in lpfc_resume_fabric_iocbs()
11783 iocb->cmd_cmpl(phba, iocb, iocb); in lpfc_resume_fabric_iocbs()
11785 atomic_dec(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11792 * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
11803 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_unblock_fabric_iocbs()
11810 * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
11823 blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_block_fabric_iocbs()
11826 mod_timer(&phba->fabric_block_timer, in lpfc_block_fabric_iocbs()
11833 * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
11839 * callback function pointer (iocb->cmd_cmpl). The original iocb's callback
11840 * function pointer has been stored in iocb->fabric_cmd_cmpl. This callback
11853 WARN_ON((cmdiocb->cmd_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC); in lpfc_cmpl_fabric_iocb()
11876 BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0); in lpfc_cmpl_fabric_iocb()
11878 cmdiocb->cmd_cmpl = cmdiocb->fabric_cmd_cmpl; in lpfc_cmpl_fabric_iocb()
11879 cmdiocb->fabric_cmd_cmpl = NULL; in lpfc_cmpl_fabric_iocb()
11880 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_fabric_iocb()
11881 cmdiocb->cmd_cmpl(phba, cmdiocb, rspiocb); in lpfc_cmpl_fabric_iocb()
11883 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_fabric_iocb()
11884 if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) { in lpfc_cmpl_fabric_iocb()
11891 * lpfc_issue_fabric_iocb - Issue a fabric iocb command
11895 * This routine is used as the top-level API for issuing a fabric iocb command
11911 * IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
11912 * IOCB_ERROR - failed to issue fabric iocb
11921 BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1); in lpfc_issue_fabric_iocb()
11923 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11924 ready = atomic_read(&phba->fabric_iocb_count) == 0 && in lpfc_issue_fabric_iocb()
11925 !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_issue_fabric_iocb()
11929 atomic_inc(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11930 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11932 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_issue_fabric_iocb()
11933 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_issue_fabric_iocb()
11934 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11936 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_issue_fabric_iocb()
11938 iocb->vport->port_state, 0, 0); in lpfc_issue_fabric_iocb()
11943 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_issue_fabric_iocb()
11944 iocb->fabric_cmd_cmpl = NULL; in lpfc_issue_fabric_iocb()
11945 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11946 atomic_dec(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11949 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11950 list_add_tail(&iocb->list, &phba->fabric_iocb_list); in lpfc_issue_fabric_iocb()
11951 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11958 * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
11971 struct lpfc_hba *phba = vport->phba; in lpfc_fabric_abort_vport()
11974 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11975 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_vport()
11978 if (piocb->vport != vport) in lpfc_fabric_abort_vport()
11981 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_vport()
11983 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11991 * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
11992 * @ndlp: pointer to a node-list data structure.
12004 struct lpfc_hba *phba = ndlp->phba; in lpfc_fabric_abort_nport()
12013 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
12014 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_nport()
12018 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_nport()
12021 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
12029 * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
12043 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
12044 list_splice_init(&phba->fabric_iocb_list, &completions); in lpfc_fabric_abort_hba()
12045 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
12053 * lpfc_sli4_vport_delete_els_xri_aborted -Remove all ndlp references for vport
12062 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_vport_delete_els_xri_aborted()
12067 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
12069 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_vport_delete_els_xri_aborted()
12070 if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) { in lpfc_sli4_vport_delete_els_xri_aborted()
12071 lpfc_nlp_put(sglq_entry->ndlp); in lpfc_sli4_vport_delete_els_xri_aborted()
12072 ndlp = sglq_entry->ndlp; in lpfc_sli4_vport_delete_els_xri_aborted()
12073 sglq_entry->ndlp = NULL; in lpfc_sli4_vport_delete_els_xri_aborted()
12079 if ((vport->load_flag & FC_UNLOADING) && in lpfc_sli4_vport_delete_els_xri_aborted()
12080 ndlp->nlp_DID == Fabric_DID) { in lpfc_sli4_vport_delete_els_xri_aborted()
12081 list_del(&sglq_entry->list); in lpfc_sli4_vport_delete_els_xri_aborted()
12082 sglq_entry->state = SGL_FREED; in lpfc_sli4_vport_delete_els_xri_aborted()
12083 list_add_tail(&sglq_entry->list, in lpfc_sli4_vport_delete_els_xri_aborted()
12084 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_vport_delete_els_xri_aborted()
12088 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
12093 * lpfc_sli4_els_xri_aborted - Slow-path process of els xri abort
12097 * This routine is invoked by the worker thread to process a SLI4 slow-path
12115 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12117 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_els_xri_aborted()
12118 if (sglq_entry->sli4_xritag == xri) { in lpfc_sli4_els_xri_aborted()
12119 list_del(&sglq_entry->list); in lpfc_sli4_els_xri_aborted()
12120 ndlp = sglq_entry->ndlp; in lpfc_sli4_els_xri_aborted()
12121 sglq_entry->ndlp = NULL; in lpfc_sli4_els_xri_aborted()
12122 list_add_tail(&sglq_entry->list, in lpfc_sli4_els_xri_aborted()
12123 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_xri_aborted()
12124 sglq_entry->state = SGL_FREED; in lpfc_sli4_els_xri_aborted()
12125 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, in lpfc_sli4_els_xri_aborted()
12130 sglq_entry->sli4_lxritag, in lpfc_sli4_els_xri_aborted()
12136 if (pring && !list_empty(&pring->txq)) in lpfc_sli4_els_xri_aborted()
12141 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12146 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12148 if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) { in lpfc_sli4_els_xri_aborted()
12149 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12152 sglq_entry->state = SGL_XRI_ABORTED; in lpfc_sli4_els_xri_aborted()
12153 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12157 /* lpfc_sli_abts_recover_port - Recover a port that failed a BLS_ABORT req.
12175 phba = vport->phba; in lpfc_sli_abts_recover_port()
12176 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { in lpfc_sli_abts_recover_port()
12179 "rport in state 0x%x\n", ndlp->nlp_state); in lpfc_sli_abts_recover_port()
12186 shost->host_no, ndlp->nlp_DID, in lpfc_sli_abts_recover_port()
12187 vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, in lpfc_sli_abts_recover_port()
12188 ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12190 * The rport is not responding. Remove the FCP-2 flag to prevent in lpfc_sli_abts_recover_port()
12191 * an ADISC in the follow-up recovery code. in lpfc_sli_abts_recover_port()
12193 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12194 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_sli_abts_recover_port()
12195 ndlp->nlp_flag |= NLP_ISSUE_LOGO; in lpfc_sli_abts_recover_port()
12196 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12202 bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE); in lpfc_init_cs_ctl_bitmap()
12214 set_bit(i, vport->vmid_priority_range); in lpfc_vmid_set_cs_ctl_range()
12219 set_bit(ctcl_vmid, vport->vmid_priority_range); in lpfc_vmid_put_cs_ctl()
12226 i = find_first_bit(vport->vmid_priority_range, in lpfc_vmid_get_cs_ctl()
12232 clear_bit(i, vport->vmid_priority_range); in lpfc_vmid_get_cs_ctl()
12242 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_qfpa()
12247 struct lpfc_dmabuf *dmabuf = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_qfpa()
12252 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_qfpa()
12254 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_qfpa()
12258 pcmd = prsp->virt; in lpfc_cmpl_els_qfpa()
12273 if (!vport->qfpa_res) { in lpfc_cmpl_els_qfpa()
12274 max_desc = FCELSSIZE / sizeof(*vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12275 vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res), in lpfc_cmpl_els_qfpa()
12277 if (!vport->qfpa_res) in lpfc_cmpl_els_qfpa()
12283 memcpy(vport->qfpa_res, pcmd, len + 8); in lpfc_cmpl_els_qfpa()
12287 vmid_range = vport->vmid_priority.vmid_range; in lpfc_cmpl_els_qfpa()
12292 kfree(vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12295 vport->vmid_priority.vmid_range = vmid_range; in lpfc_cmpl_els_qfpa()
12297 vport->vmid_priority.num_descriptors = len; in lpfc_cmpl_els_qfpa()
12302 "local ve id=%d\n", desc->lo_range, in lpfc_cmpl_els_qfpa()
12303 desc->hi_range, desc->qos_priority, in lpfc_cmpl_els_qfpa()
12304 desc->local_ve_id); in lpfc_cmpl_els_qfpa()
12306 vmid_range->low = desc->lo_range << 1; in lpfc_cmpl_els_qfpa()
12307 if (desc->local_ve_id == QFPA_ODD_ONLY) in lpfc_cmpl_els_qfpa()
12308 vmid_range->low++; in lpfc_cmpl_els_qfpa()
12309 if (desc->qos_priority) in lpfc_cmpl_els_qfpa()
12310 vport->vmid_flag |= LPFC_VMID_QOS_ENABLED; in lpfc_cmpl_els_qfpa()
12311 vmid_range->qos = desc->qos_priority; in lpfc_cmpl_els_qfpa()
12313 vmid_range->high = desc->hi_range << 1; in lpfc_cmpl_els_qfpa()
12314 if ((desc->local_ve_id == QFPA_ODD_ONLY) || in lpfc_cmpl_els_qfpa()
12315 (desc->local_ve_id == QFPA_EVEN_ODD)) in lpfc_cmpl_els_qfpa()
12316 vmid_range->high++; in lpfc_cmpl_els_qfpa()
12319 for (i = 0; i < vport->vmid_priority.num_descriptors; i++) { in lpfc_cmpl_els_qfpa()
12321 vport->vmid_priority.vmid_range[i].low, in lpfc_cmpl_els_qfpa()
12322 vport->vmid_priority.vmid_range[i].high); in lpfc_cmpl_els_qfpa()
12325 vport->vmid_flag |= LPFC_VMID_QFPA_CMPL; in lpfc_cmpl_els_qfpa()
12333 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_qfpa()
12339 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_issue_els_qfpa()
12340 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_qfpa()
12341 return -ENXIO; in lpfc_issue_els_qfpa()
12344 ndlp->nlp_DID, ELS_CMD_QFPA); in lpfc_issue_els_qfpa()
12346 return -ENOMEM; in lpfc_issue_els_qfpa()
12348 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_qfpa()
12353 elsiocb->cmd_cmpl = lpfc_cmpl_els_qfpa; in lpfc_issue_els_qfpa()
12355 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_qfpa()
12356 if (!elsiocb->ndlp) { in lpfc_issue_els_qfpa()
12357 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_issue_els_qfpa()
12358 return -ENXIO; in lpfc_issue_els_qfpa()
12365 return -EIO; in lpfc_issue_els_qfpa()
12367 vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED; in lpfc_issue_els_qfpa()
12385 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_vmid_uvem()
12386 return -ENXIO; in lpfc_vmid_uvem()
12390 return -ENOMEM; in lpfc_vmid_uvem()
12398 vmid->host_vmid, instantiated); in lpfc_vmid_uvem()
12399 vmid_context->vmp = vmid; in lpfc_vmid_uvem()
12400 vmid_context->nlp = ndlp; in lpfc_vmid_uvem()
12401 vmid_context->instantiated = instantiated; in lpfc_vmid_uvem()
12402 elsiocb->vmid_tag.vmid_context = vmid_context; in lpfc_vmid_uvem()
12403 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_vmid_uvem()
12405 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_vmid_uvem()
12406 sizeof(vport->lpfc_vmid_host_uuid))) in lpfc_vmid_uvem()
12407 memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid, in lpfc_vmid_uvem()
12408 sizeof(vport->lpfc_vmid_host_uuid)); in lpfc_vmid_uvem()
12412 *len = cpu_to_be32(LPFC_UVEM_SIZE - 8); in lpfc_vmid_uvem()
12415 vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG); in lpfc_vmid_uvem()
12416 vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE); in lpfc_vmid_uvem()
12417 memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid, in lpfc_vmid_uvem()
12418 sizeof(vem_id_desc->vem_id)); in lpfc_vmid_uvem()
12421 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12422 inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE); in lpfc_vmid_uvem()
12423 memcpy(inst_desc->global_vem_id, vmid->host_vmid, in lpfc_vmid_uvem()
12424 sizeof(inst_desc->global_vem_id)); in lpfc_vmid_uvem()
12426 bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID); in lpfc_vmid_uvem()
12428 vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12430 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12432 inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12433 lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12435 inst_desc->word6 = cpu_to_be32(inst_desc->word6); in lpfc_vmid_uvem()
12437 elsiocb->cmd_cmpl = lpfc_cmpl_els_uvem; in lpfc_vmid_uvem()
12439 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_vmid_uvem()
12440 if (!elsiocb->ndlp) { in lpfc_vmid_uvem()
12441 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12445 ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0); in lpfc_vmid_uvem()
12447 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12455 return -EIO; in lpfc_vmid_uvem()
12462 struct lpfc_vport *vport = icmdiocb->vport; in lpfc_cmpl_els_uvem()
12465 icmdiocb->vmid_tag.vmid_context; in lpfc_cmpl_els_uvem()
12466 struct lpfc_nodelist *ndlp = icmdiocb->ndlp; in lpfc_cmpl_els_uvem()
12471 struct lpfc_dmabuf *dmabuf = icmdiocb->cmd_dmabuf; in lpfc_cmpl_els_uvem()
12474 vmid = vmid_context->vmp; in lpfc_cmpl_els_uvem()
12475 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_cmpl_els_uvem()
12478 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_uvem()
12481 pcmd = prsp->virt; in lpfc_cmpl_els_uvem()
12494 spin_lock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12496 vport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12497 phba->pport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12498 spin_unlock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12500 if (vmid_context->instantiated) { in lpfc_cmpl_els_uvem()
12501 write_lock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()
12502 vmid->flag |= LPFC_VMID_REGISTERED; in lpfc_cmpl_els_uvem()
12503 vmid->flag &= ~LPFC_VMID_REQ_REGISTER; in lpfc_cmpl_els_uvem()
12504 write_unlock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()