Lines Matching +full:- +full:- +full:retry +full:- +full:delay

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 */
28 #include <linux/delay.h>
56 struct lpfc_nodelist *ndlp, uint8_t retry);
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()
135 * lpfc_prep_els_iocb - Allocate and prepare a lpfc iocb data structure
139 * @retry: number of retries to the command when it fails.
140 * @ndlp: pointer to a node-list data structure.
144 * This routine is used for allocating a lpfc-IOCB data structure from
145 * the driver lpfc-IOCB free-list and prepare the IOCB with the parameters
147 * Link Service (ELS) commands. It is a generic lpfc-IOCB allocation
149 * routines and the ELS command-specific fields will be later set up by
160 * NULL - when els iocb data structure allocation/preparation failed
164 u16 cmd_size, u8 retry, in lpfc_prep_els_iocb() argument
168 struct lpfc_hba *phba = vport->phba; in lpfc_prep_els_iocb()
187 (phba->hba_flag & HBA_FIP_SUPPORT) && in lpfc_prep_els_iocb()
193 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
198 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
203 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
209 elsiocb->cmd_flag &= ~LPFC_FIP_ELS_ID_MASK; in lpfc_prep_els_iocb()
215 pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys); in lpfc_prep_els_iocb()
216 if (!pcmd || !pcmd->virt) in lpfc_prep_els_iocb()
219 INIT_LIST_HEAD(&pcmd->list); in lpfc_prep_els_iocb()
225 prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
226 &prsp->phys); in lpfc_prep_els_iocb()
227 if (!prsp || !prsp->virt) in lpfc_prep_els_iocb()
229 INIT_LIST_HEAD(&prsp->list); in lpfc_prep_els_iocb()
237 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
238 &pbuflist->phys); in lpfc_prep_els_iocb()
239 if (!pbuflist || !pbuflist->virt) in lpfc_prep_els_iocb()
242 INIT_LIST_HEAD(&pbuflist->list); in lpfc_prep_els_iocb()
250 timeout = phba->fc_ratov; in lpfc_prep_els_iocb()
253 timeout = phba->fc_ratov * 2; in lpfc_prep_els_iocb()
257 elsiocb->num_bdes = 2; in lpfc_prep_els_iocb()
260 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_prep_els_iocb()
268 bpl = (struct ulp_bde64_le *)pbuflist->virt; in lpfc_prep_els_iocb()
269 bpl->addr_low = cpu_to_le32(putPaddrLow(pcmd->phys)); in lpfc_prep_els_iocb()
270 bpl->addr_high = cpu_to_le32(putPaddrHigh(pcmd->phys)); in lpfc_prep_els_iocb()
271 bpl->type_size = cpu_to_le32(cmd_size); in lpfc_prep_els_iocb()
272 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
276 bpl->addr_low = cpu_to_le32(putPaddrLow(prsp->phys)); in lpfc_prep_els_iocb()
277 bpl->addr_high = cpu_to_le32(putPaddrHigh(prsp->phys)); in lpfc_prep_els_iocb()
278 bpl->type_size = cpu_to_le32(FCELSSIZE); in lpfc_prep_els_iocb()
279 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
282 elsiocb->cmd_dmabuf = pcmd; in lpfc_prep_els_iocb()
283 elsiocb->bpl_dmabuf = pbuflist; in lpfc_prep_els_iocb()
284 elsiocb->retry = retry; in lpfc_prep_els_iocb()
285 elsiocb->vport = vport; in lpfc_prep_els_iocb()
286 elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT; in lpfc_prep_els_iocb()
289 list_add(&prsp->list, &pcmd->list); in lpfc_prep_els_iocb()
296 elscmd, did, elsiocb->iotag, in lpfc_prep_els_iocb()
297 vport->port_state, ndlp->nlp_rpi, in lpfc_prep_els_iocb()
298 vport->fc_flag); in lpfc_prep_els_iocb()
305 elscmd, ndlp->nlp_DID, elsiocb->iotag, in lpfc_prep_els_iocb()
306 cmd_size, vport->port_state, in lpfc_prep_els_iocb()
307 ndlp->nlp_rpi, vport->fc_flag); in lpfc_prep_els_iocb()
314 lpfc_mbuf_free(phba, prsp->virt, prsp->phys); in lpfc_prep_els_iocb()
318 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys); in lpfc_prep_els_iocb()
328 * lpfc_issue_fabric_reglogin - Issue fabric registration login for a vport
340 * 0 - successfully issued fabric registration login for @vport
341 * -ENXIO -- failed to issue fabric registration login for @vport
346 struct lpfc_hba *phba = vport->phba; in lpfc_issue_fabric_reglogin()
353 sp = &phba->fc_fabparam; in lpfc_issue_fabric_reglogin()
360 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
366 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_fabric_reglogin()
368 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_issue_fabric_reglogin()
369 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
377 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
382 rc = lpfc_reg_rpi(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox, in lpfc_issue_fabric_reglogin()
383 ndlp->nlp_rpi); in lpfc_issue_fabric_reglogin()
389 mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login; in lpfc_issue_fabric_reglogin()
390 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
394 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_fabric_reglogin()
395 if (!mbox->ctx_ndlp) { in lpfc_issue_fabric_reglogin()
420 return -ENXIO; in lpfc_issue_fabric_reglogin()
424 * lpfc_issue_reg_vfi - Register VFI for this vport's fabric login
431 * 0 - successfully issued REG_VFI for @vport
437 struct lpfc_hba *phba = vport->phba; in lpfc_issue_reg_vfi()
444 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_issue_reg_vfi()
445 !(phba->link_flag & LS_LOOPBACK_MODE) && in lpfc_issue_reg_vfi()
446 !(vport->fc_flag & FC_PT2PT)) { in lpfc_issue_reg_vfi()
449 rc = -ENODEV; in lpfc_issue_reg_vfi()
454 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vfi()
456 rc = -ENOMEM; in lpfc_issue_reg_vfi()
460 /* Supply CSP's only if we are fabric connect or pt-to-pt connect */ in lpfc_issue_reg_vfi()
461 if ((vport->fc_flag & FC_FABRIC) || (vport->fc_flag & FC_PT2PT)) { in lpfc_issue_reg_vfi()
464 rc = -ENOMEM; in lpfc_issue_reg_vfi()
467 dmabuf = mboxq->ctx_buf; in lpfc_issue_reg_vfi()
468 memcpy(dmabuf->virt, &phba->fc_fabparam, in lpfc_issue_reg_vfi()
472 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_reg_vfi()
474 lpfc_reg_vfi(mboxq, vport, dmabuf->phys); in lpfc_issue_reg_vfi()
476 mboxq->ctx_buf = dmabuf; in lpfc_issue_reg_vfi()
481 mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; in lpfc_issue_reg_vfi()
482 mboxq->vport = vport; in lpfc_issue_reg_vfi()
485 rc = -ENXIO; in lpfc_issue_reg_vfi()
500 * lpfc_issue_unreg_vfi - Unregister VFI for this vport's fabric login
507 * 0 - successfully issued REG_VFI for @vport
513 struct lpfc_hba *phba = vport->phba; in lpfc_issue_unreg_vfi()
518 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_unreg_vfi()
522 "HBA state x%x\n", phba->pport->port_state); in lpfc_issue_unreg_vfi()
523 return -ENOMEM; in lpfc_issue_unreg_vfi()
527 mboxq->vport = vport; in lpfc_issue_unreg_vfi()
528 mboxq->mbox_cmpl = lpfc_unregister_vfi_cmpl; in lpfc_issue_unreg_vfi()
535 rc, phba->pport->port_state); in lpfc_issue_unreg_vfi()
536 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_issue_unreg_vfi()
537 return -EIO; in lpfc_issue_unreg_vfi()
541 spin_lock_irq(shost->host_lock); in lpfc_issue_unreg_vfi()
542 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_issue_unreg_vfi()
543 spin_unlock_irq(shost->host_lock); in lpfc_issue_unreg_vfi()
548 * lpfc_check_clean_addr_bit - Check whether assigned FCID is clean.
555 * 0. This function also set flag in the vport data structure to delay
561 * 0 - FCID and Fabric Nodename and Fabric portname is not changed.
562 * 1 - FCID or Fabric Nodename or Fabric portname is changed.
569 struct lpfc_hba *phba = vport->phba; in lpfc_check_clean_addr_bit()
573 if ((vport->fc_prevDID != vport->fc_myDID) || in lpfc_check_clean_addr_bit()
574 memcmp(&vport->fabric_portname, &sp->portName, in lpfc_check_clean_addr_bit()
576 memcmp(&vport->fabric_nodename, &sp->nodeName, in lpfc_check_clean_addr_bit()
578 (vport->vport_flag & FAWWPN_PARAM_CHG)) { in lpfc_check_clean_addr_bit()
580 vport->vport_flag &= ~FAWWPN_PARAM_CHG; in lpfc_check_clean_addr_bit()
588 * cleared delay nport discovery if in lpfc_check_clean_addr_bit()
589 * - vport->fc_prevDID != 0 (not initial discovery) OR in lpfc_check_clean_addr_bit()
590 * - lpfc_delay_discovery module parameter is set. in lpfc_check_clean_addr_bit()
592 if (fabric_param_changed && !sp->cmn.clean_address_bit && in lpfc_check_clean_addr_bit()
593 (vport->fc_prevDID || phba->cfg_delay_discovery)) { in lpfc_check_clean_addr_bit()
594 spin_lock_irq(shost->host_lock); in lpfc_check_clean_addr_bit()
595 vport->fc_flag |= FC_DISC_DELAYED; in lpfc_check_clean_addr_bit()
596 spin_unlock_irq(shost->host_lock); in lpfc_check_clean_addr_bit()
604 * lpfc_cmpl_els_flogi_fabric - Completion function for flogi to a fabric port
606 * @ndlp: pointer to a node-list data structure.
621 * 0 - Success (currently, always return 0)
628 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_fabric()
633 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
634 vport->fc_flag |= FC_FABRIC; in lpfc_cmpl_els_flogi_fabric()
635 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
637 phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_cmpl_els_flogi_fabric()
638 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_cmpl_els_flogi_fabric()
639 phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000; in lpfc_cmpl_els_flogi_fabric()
641 phba->fc_edtovResol = sp->cmn.edtovResolution; in lpfc_cmpl_els_flogi_fabric()
642 phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000; in lpfc_cmpl_els_flogi_fabric()
644 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_cmpl_els_flogi_fabric()
645 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
646 vport->fc_flag |= FC_PUBLIC_LOOP; in lpfc_cmpl_els_flogi_fabric()
647 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
650 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_flogi_fabric()
651 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
652 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
653 ndlp->nlp_class_sup = 0; in lpfc_cmpl_els_flogi_fabric()
654 if (sp->cls1.classValid) in lpfc_cmpl_els_flogi_fabric()
655 ndlp->nlp_class_sup |= FC_COS_CLASS1; in lpfc_cmpl_els_flogi_fabric()
656 if (sp->cls2.classValid) in lpfc_cmpl_els_flogi_fabric()
657 ndlp->nlp_class_sup |= FC_COS_CLASS2; in lpfc_cmpl_els_flogi_fabric()
658 if (sp->cls3.classValid) in lpfc_cmpl_els_flogi_fabric()
659 ndlp->nlp_class_sup |= FC_COS_CLASS3; in lpfc_cmpl_els_flogi_fabric()
660 if (sp->cls4.classValid) in lpfc_cmpl_els_flogi_fabric()
661 ndlp->nlp_class_sup |= FC_COS_CLASS4; in lpfc_cmpl_els_flogi_fabric()
662 ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | in lpfc_cmpl_els_flogi_fabric()
663 sp->cmn.bbRcvSizeLsb; in lpfc_cmpl_els_flogi_fabric()
668 if (phba->cfg_enable_SmartSAN || in lpfc_cmpl_els_flogi_fabric()
669 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) { in lpfc_cmpl_els_flogi_fabric()
671 vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR; in lpfc_cmpl_els_flogi_fabric()
672 if (phba->cfg_enable_SmartSAN) in lpfc_cmpl_els_flogi_fabric()
673 vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR; in lpfc_cmpl_els_flogi_fabric()
675 vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR; in lpfc_cmpl_els_flogi_fabric()
677 vport->fdmi_hba_mask = 0; in lpfc_cmpl_els_flogi_fabric()
678 vport->fdmi_port_mask = 0; in lpfc_cmpl_els_flogi_fabric()
682 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_flogi_fabric()
684 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_fabric()
686 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_cmpl_els_flogi_fabric()
688 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_cmpl_els_flogi_fabric()
689 if (sp->cmn.response_multiple_NPort) { in lpfc_cmpl_els_flogi_fabric()
694 sp->cmn.response_multiple_NPort); in lpfc_cmpl_els_flogi_fabric()
695 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
696 phba->link_flag |= LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
697 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
704 "- configuring single port mode.\n"); in lpfc_cmpl_els_flogi_fabric()
705 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
706 phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
707 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
715 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
716 (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)) { in lpfc_cmpl_els_flogi_fabric()
722 if (vport->fc_flag & FC_VFI_REGISTERED) in lpfc_cmpl_els_flogi_fabric()
727 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_flogi_fabric()
733 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_flogi_fabric()
734 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_flogi_fabric()
735 !(np->nlp_flag & NLP_NPR_ADISC)) in lpfc_cmpl_els_flogi_fabric()
737 spin_lock_irq(&np->lock); in lpfc_cmpl_els_flogi_fabric()
738 np->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_cmpl_els_flogi_fabric()
739 spin_unlock_irq(&np->lock); in lpfc_cmpl_els_flogi_fabric()
744 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
747 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
748 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_cmpl_els_flogi_fabric()
749 spin_unlock_irq(shost->host_lock); 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_REG_VPI; in lpfc_cmpl_els_flogi_fabric()
758 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_fabric()
759 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
760 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_flogi_fabric()
762 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_flogi_fabric()
770 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
772 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED && in lpfc_cmpl_els_flogi_fabric()
773 vport->fc_flag & FC_VPORT_NEEDS_REG_VPI) in lpfc_cmpl_els_flogi_fabric()
778 ndlp->nlp_type |= NLP_FABRIC; in lpfc_cmpl_els_flogi_fabric()
780 if ((!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) && in lpfc_cmpl_els_flogi_fabric()
781 (vport->vpi_state & LPFC_VPI_REGISTERED)) { in lpfc_cmpl_els_flogi_fabric()
784 } else if (vport->fc_flag & FC_VFI_REGISTERED) in lpfc_cmpl_els_flogi_fabric()
789 vport->fc_prevDID, vport->fc_myDID); in lpfc_cmpl_els_flogi_fabric()
797 * lpfc_cmpl_els_flogi_nport - Completion function for flogi to an N_Port
799 * @ndlp: pointer to a node-list data structure.
804 * in a point-to-point topology. First, the @vport's N_Port Name is compared
813 * 0 - Success
814 * -ENXIO - Fail
821 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_nport()
825 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
826 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_cmpl_els_flogi_nport()
827 vport->fc_flag |= FC_PT2PT; in lpfc_cmpl_els_flogi_nport()
828 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
831 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; in lpfc_cmpl_els_flogi_nport()
834 if ((phba->sli_rev == LPFC_SLI_REV4) && phba->fc_topology_changed) { in lpfc_cmpl_els_flogi_nport()
837 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
838 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_cmpl_els_flogi_nport()
839 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
840 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi_nport()
843 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
844 sizeof(vport->fc_portname)); in lpfc_cmpl_els_flogi_nport()
848 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
849 vport->fc_flag |= FC_PT2PT_PLOGI; in lpfc_cmpl_els_flogi_nport()
850 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi_nport()
859 vport->fc_myDID = PT2PT_LocalID; in lpfc_cmpl_els_flogi_nport()
865 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
879 memcpy(&ndlp->nlp_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
881 memcpy(&ndlp->nlp_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_nport()
885 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_flogi_nport()
886 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_flogi_nport()
887 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_flogi_nport()
889 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_cmpl_els_flogi_nport()
895 mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_cmpl_els_flogi_nport()
896 mbox->vport = vport; in lpfc_cmpl_els_flogi_nport()
899 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_cmpl_els_flogi_nport()
907 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
910 /* Start discovery - this should just do CLEAR_LA */ in lpfc_cmpl_els_flogi_nport()
916 return -ENXIO; in lpfc_cmpl_els_flogi_nport()
920 * lpfc_cmpl_els_flogi - Completion callback function for flogi
925 * This routine is the top-level completion callback function for issuing
927 * the lpfc_els_retry() routine shall be invoked to retry the FLOGI. If
928 * retry has been made (either immediately or delayed with lpfc_els_retry()
930 * If the retry attempt has been given up (possibly reach the maximum
936 * this is a point-to-point topology or a fabric topology: if the Port ID
938 * point-to-point topology. The routine lpfc_cmpl_els_flogi_fabric() or
946 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_flogi()
948 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_flogi()
950 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_flogi()
962 if (!(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
970 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi()
973 irsp = &rspiocb->iocb; in lpfc_cmpl_els_flogi()
974 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_flogi()
980 vport->port_state); in lpfc_cmpl_els_flogi()
987 if ((phba->hba_flag & HBA_FIP_SUPPORT) && in lpfc_cmpl_els_flogi()
988 (phba->fcf.fcf_flag & FCF_DISCOVERY)) { in lpfc_cmpl_els_flogi()
989 if (phba->link_state < LPFC_LINK_UP) in lpfc_cmpl_els_flogi()
991 if ((phba->fcoe_cvl_eventtag_attn == in lpfc_cmpl_els_flogi()
992 phba->fcoe_cvl_eventtag) && in lpfc_cmpl_els_flogi()
998 phba->fcoe_cvl_eventtag_attn = in lpfc_cmpl_els_flogi()
999 phba->fcoe_cvl_eventtag; in lpfc_cmpl_els_flogi()
1004 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
1007 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1023 phba->hba_flag, phba->fcf.fcf_flag); in lpfc_cmpl_els_flogi()
1025 /* Check for retry */ in lpfc_cmpl_els_flogi()
1040 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS) && in lpfc_cmpl_els_flogi()
1041 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
1047 ulp_status, ulp_word4, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1048 tmo, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1063 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1064 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP | in lpfc_cmpl_els_flogi()
1066 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1072 if (phba->alpa_map[0] == 0) in lpfc_cmpl_els_flogi()
1073 vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS; in lpfc_cmpl_els_flogi()
1074 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi()
1075 (!(vport->fc_flag & FC_VFI_REGISTERED) || in lpfc_cmpl_els_flogi()
1076 (vport->fc_prevDID != vport->fc_myDID) || in lpfc_cmpl_els_flogi()
1077 phba->fc_topology_changed)) { in lpfc_cmpl_els_flogi()
1078 if (vport->fc_flag & FC_VFI_REGISTERED) { in lpfc_cmpl_els_flogi()
1079 if (phba->fc_topology_changed) { in lpfc_cmpl_els_flogi()
1081 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1082 vport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_cmpl_els_flogi()
1083 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1084 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi()
1098 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1099 vport->fc_flag &= ~FC_VPORT_CVL_RCVD; in lpfc_cmpl_els_flogi()
1100 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD; in lpfc_cmpl_els_flogi()
1101 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_flogi()
1107 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_flogi()
1110 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_flogi()
1116 cmdiocb->iotag, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1117 ulp_word4, sp->cmn.e_d_tov, in lpfc_cmpl_els_flogi()
1118 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution, in lpfc_cmpl_els_flogi()
1119 vport->port_state, vport->fc_flag, in lpfc_cmpl_els_flogi()
1120 sp->cmn.priority_tagging, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1122 if (sp->cmn.priority_tagging) in lpfc_cmpl_els_flogi()
1123 vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA | in lpfc_cmpl_els_flogi()
1135 if (vport->port_state == LPFC_FLOGI) { in lpfc_cmpl_els_flogi()
1140 if (sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1143 else if (!(phba->hba_flag & HBA_FCOE_MODE)) in lpfc_cmpl_els_flogi()
1152 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
1153 phba->fcf.current_rec.switch_name[0], in lpfc_cmpl_els_flogi()
1154 phba->fcf.current_rec.switch_name[1], in lpfc_cmpl_els_flogi()
1155 phba->fcf.current_rec.switch_name[2], in lpfc_cmpl_els_flogi()
1156 phba->fcf.current_rec.switch_name[3], in lpfc_cmpl_els_flogi()
1157 phba->fcf.current_rec.switch_name[4], in lpfc_cmpl_els_flogi()
1158 phba->fcf.current_rec.switch_name[5], in lpfc_cmpl_els_flogi()
1159 phba->fcf.current_rec.switch_name[6], in lpfc_cmpl_els_flogi()
1160 phba->fcf.current_rec.switch_name[7], in lpfc_cmpl_els_flogi()
1161 phba->fcf.current_rec.fabric_name[0], in lpfc_cmpl_els_flogi()
1162 phba->fcf.current_rec.fabric_name[1], in lpfc_cmpl_els_flogi()
1163 phba->fcf.current_rec.fabric_name[2], in lpfc_cmpl_els_flogi()
1164 phba->fcf.current_rec.fabric_name[3], in lpfc_cmpl_els_flogi()
1165 phba->fcf.current_rec.fabric_name[4], in lpfc_cmpl_els_flogi()
1166 phba->fcf.current_rec.fabric_name[5], in lpfc_cmpl_els_flogi()
1167 phba->fcf.current_rec.fabric_name[6], in lpfc_cmpl_els_flogi()
1168 phba->fcf.current_rec.fabric_name[7]); in lpfc_cmpl_els_flogi()
1171 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1172 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1173 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); in lpfc_cmpl_els_flogi()
1174 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1175 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1180 if (phba->hba_flag & HBA_FIP_SUPPORT) in lpfc_cmpl_els_flogi()
1185 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1186 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1187 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1188 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); in lpfc_cmpl_els_flogi()
1189 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1190 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1193 } else if (vport->port_state > LPFC_FLOGI && in lpfc_cmpl_els_flogi()
1194 vport->fc_flag & FC_PT2PT) { in lpfc_cmpl_els_flogi()
1200 if (!sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1205 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1206 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1207 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1220 (phba->link_state != LPFC_CLEAR_LA)) { in lpfc_cmpl_els_flogi()
1226 phba->hba_flag &= ~HBA_FLOGI_OUTSTANDING; in lpfc_cmpl_els_flogi()
1233 * lpfc_cmpl_els_link_down - Completion callback function for ELS command
1248 pcmd = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_cmpl_els_link_down()
1258 cmdiocb->cmd_flag); in lpfc_cmpl_els_link_down()
1260 if (cmdiocb->cmd_flag & LPFC_IO_FABRIC) { in lpfc_cmpl_els_link_down()
1261 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_els_link_down()
1262 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_els_link_down()
1268 * lpfc_issue_els_flogi - Issue an flogi iocb command for a vport
1270 * @ndlp: pointer to a node-list data structure.
1271 * @retry: number of retries to the command IOCB.
1275 * of the FLOGI Request IOCB and the top-level callback function pointer
1285 * 0 - successfully issued flogi iocb for @vport
1286 * 1 - failed to issue flogi iocb for @vport
1290 uint8_t retry) in lpfc_issue_els_flogi() argument
1292 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_flogi()
1304 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_flogi()
1305 ndlp->nlp_DID, ELS_CMD_FLOGI); in lpfc_issue_els_flogi()
1310 wqe = &elsiocb->wqe; in lpfc_issue_els_flogi()
1311 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_flogi()
1312 icmd = &elsiocb->iocb; in lpfc_issue_els_flogi()
1317 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_flogi()
1321 sp->cmn.e_d_tov = 0; in lpfc_issue_els_flogi()
1322 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_flogi()
1323 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_flogi()
1324 sp->cls1.classValid = 0; in lpfc_issue_els_flogi()
1325 if (sp->cmn.fcphLow < FC_PH3) in lpfc_issue_els_flogi()
1326 sp->cmn.fcphLow = FC_PH3; in lpfc_issue_els_flogi()
1327 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_flogi()
1328 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_flogi()
1331 if (phba->cfg_vmid_priority_tagging) { in lpfc_issue_els_flogi()
1332 sp->cmn.priority_tagging = 1; in lpfc_issue_els_flogi()
1334 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_issue_els_flogi()
1335 sizeof(vport->lpfc_vmid_host_uuid))) { in lpfc_issue_els_flogi()
1336 memcpy(vport->lpfc_vmid_host_uuid, phba->wwpn, in lpfc_issue_els_flogi()
1337 sizeof(phba->wwpn)); in lpfc_issue_els_flogi()
1338 memcpy(&vport->lpfc_vmid_host_uuid[8], phba->wwnn, in lpfc_issue_els_flogi()
1339 sizeof(phba->wwnn)); in lpfc_issue_els_flogi()
1343 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1344 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == in lpfc_issue_els_flogi()
1348 bf_set(wqe_ct, &wqe->els_req.wqe_com, ct); in lpfc_issue_els_flogi()
1351 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, in lpfc_issue_els_flogi()
1352 phba->fcf.fcfi); in lpfc_issue_els_flogi()
1356 sp->cls2.classValid = 0; in lpfc_issue_els_flogi()
1357 sp->cls2.seqDelivery = 0; in lpfc_issue_els_flogi()
1359 /* Historical, setting sequential-delivery bit for SLI3 */ in lpfc_issue_els_flogi()
1360 sp->cls2.seqDelivery = (sp->cls2.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1361 sp->cls3.seqDelivery = (sp->cls3.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1362 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_issue_els_flogi()
1363 sp->cmn.request_multiple_Nport = 1; in lpfc_issue_els_flogi()
1365 icmd->ulpCt_h = 1; in lpfc_issue_els_flogi()
1366 icmd->ulpCt_l = 0; in lpfc_issue_els_flogi()
1368 sp->cmn.request_multiple_Nport = 0; in lpfc_issue_els_flogi()
1371 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_issue_els_flogi()
1372 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_flogi()
1373 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_flogi()
1377 tmo = phba->fc_ratov; in lpfc_issue_els_flogi()
1378 phba->fc_ratov = LPFC_DISC_FLOGI_TMO; in lpfc_issue_els_flogi()
1380 phba->fc_ratov = tmo; in lpfc_issue_els_flogi()
1382 phba->fc_stat.elsXmitFLOGI++; in lpfc_issue_els_flogi()
1383 elsiocb->cmd_cmpl = lpfc_cmpl_els_flogi; in lpfc_issue_els_flogi()
1387 phba->sli3_options, 0, 0); in lpfc_issue_els_flogi()
1389 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_flogi()
1390 if (!elsiocb->ndlp) { in lpfc_issue_els_flogi()
1396 phba->hba_flag |= (HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING); in lpfc_issue_els_flogi()
1400 phba->hba_flag &= ~(HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING); in lpfc_issue_els_flogi()
1407 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_issue_els_flogi()
1410 if (phba->defer_flogi_acc_flag) { in lpfc_issue_els_flogi()
1416 did = vport->fc_myDID; in lpfc_issue_els_flogi()
1417 vport->fc_myDID = Fabric_DID; in lpfc_issue_els_flogi()
1421 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1424 phba->defer_flogi_acc_rx_id); in lpfc_issue_els_flogi()
1427 phba->defer_flogi_acc_ox_id); in lpfc_issue_els_flogi()
1430 icmd->ulpContext = phba->defer_flogi_acc_rx_id; in lpfc_issue_els_flogi()
1431 icmd->unsli3.rcvsli3.ox_id = in lpfc_issue_els_flogi()
1432 phba->defer_flogi_acc_ox_id; in lpfc_issue_els_flogi()
1438 phba->defer_flogi_acc_rx_id, in lpfc_issue_els_flogi()
1439 phba->defer_flogi_acc_ox_id, phba->hba_flag); in lpfc_issue_els_flogi()
1445 phba->defer_flogi_acc_flag = false; in lpfc_issue_els_flogi()
1446 vport->fc_myDID = did; in lpfc_issue_els_flogi()
1458 * lpfc_els_abort_flogi - Abort all outstanding flogi iocbs
1469 * 0 - Successfully issued abort iocb on all outstanding flogis (Always 0)
1486 return -EIO; in lpfc_els_abort_flogi()
1492 spin_lock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1493 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_els_abort_flogi()
1496 ndlp = iocb->ndlp; in lpfc_els_abort_flogi()
1497 if (ndlp && ndlp->nlp_DID == Fabric_DID) { in lpfc_els_abort_flogi()
1498 if ((phba->pport->fc_flag & FC_PT2PT) && in lpfc_els_abort_flogi()
1499 !(phba->pport->fc_flag & FC_PT2PT_PLOGI)) in lpfc_els_abort_flogi()
1500 iocb->fabric_cmd_cmpl = in lpfc_els_abort_flogi()
1510 spin_unlock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1516 * lpfc_initial_flogi - Issue an initial fabric login for a vport
1528 * 0 - failed to issue initial flogi for @vport
1529 * 1 - successfully issued initial flogi for @vport
1536 vport->port_state = LPFC_FLOGI; in lpfc_initial_flogi()
1547 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_flogi()
1554 vport->fc_flag &= ~FC_FABRIC; in lpfc_initial_flogi()
1557 * transport or dev-loss-evt work is pending. in lpfc_initial_flogi()
1560 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_flogi()
1561 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_initial_flogi()
1569 * lpfc_initial_fdisc - Issue an initial fabric discovery for a vport
1581 * 0 - failed to issue initial fdisc for @vport
1582 * 1 - successfully issued initial fdisc for @vport
1598 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_fdisc()
1606 * transport or dev-loss-evt work is pending. in lpfc_initial_fdisc()
1609 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_fdisc()
1610 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_initial_fdisc()
1618 * lpfc_more_plogi - Check and issue remaining plogis for a vport
1625 * @vport (@vport->cfg_discovery_threads). The function also decrement
1631 if (vport->num_disc_nodes) in lpfc_more_plogi()
1632 vport->num_disc_nodes--; in lpfc_more_plogi()
1638 vport->num_disc_nodes, vport->fc_plogi_cnt, in lpfc_more_plogi()
1639 vport->fc_flag, vport->port_state); in lpfc_more_plogi()
1641 if (vport->fc_flag & FC_NLP_MORE) in lpfc_more_plogi()
1649 * lpfc_plogi_confirm_nport - Confirm plogi wwpn matches stored ndlp
1652 * @ndlp: pointer to a node-list data structure.
1670 * Note that before the @ndlp got "released", the keepDID from not-matching
1683 struct lpfc_vport *vport = ndlp->vport; in lpfc_plogi_confirm_nport()
1697 if (ndlp->nlp_type & NLP_FABRIC) in lpfc_plogi_confirm_nport()
1706 new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName); in lpfc_plogi_confirm_nport()
1718 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_plogi_confirm_nport()
1719 active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool, in lpfc_plogi_confirm_nport()
1723 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1729 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type, in lpfc_plogi_confirm_nport()
1730 (new_ndlp ? new_ndlp->nlp_DID : 0), in lpfc_plogi_confirm_nport()
1731 (new_ndlp ? new_ndlp->nlp_flag : 0), in lpfc_plogi_confirm_nport()
1732 (new_ndlp ? new_ndlp->nlp_fc4_type : 0)); in lpfc_plogi_confirm_nport()
1734 keepDID = new_ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1736 if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap) in lpfc_plogi_confirm_nport()
1737 memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1738 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1745 if (vport->fc_flag & FC_FABRIC) { in lpfc_plogi_confirm_nport()
1746 keep_nlp_fc4_type = new_ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1747 new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1751 new_ndlp->nlp_DID = ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1752 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state; in lpfc_plogi_confirm_nport()
1753 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_plogi_confirm_nport()
1754 memcpy(new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1755 ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1756 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1759 spin_lock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1760 spin_lock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1761 keep_new_nlp_flag = new_ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1762 keep_nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1763 new_ndlp->nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1767 new_ndlp->nlp_flag |= NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1769 new_ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1773 new_ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1775 new_ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1782 new_ndlp->nlp_flag |= NLP_DROPPED; in lpfc_plogi_confirm_nport()
1784 new_ndlp->nlp_flag &= ~NLP_DROPPED; in lpfc_plogi_confirm_nport()
1786 ndlp->nlp_flag = keep_new_nlp_flag; in lpfc_plogi_confirm_nport()
1790 ndlp->nlp_flag |= NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1792 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_plogi_confirm_nport()
1796 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1798 ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; in lpfc_plogi_confirm_nport()
1805 ndlp->nlp_flag |= NLP_DROPPED; in lpfc_plogi_confirm_nport()
1807 ndlp->nlp_flag &= ~NLP_DROPPED; in lpfc_plogi_confirm_nport()
1809 spin_unlock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1810 spin_unlock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1813 keep_nlp_state = new_ndlp->nlp_state; in lpfc_plogi_confirm_nport()
1814 lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state); in lpfc_plogi_confirm_nport()
1817 keep_nrport = new_ndlp->nrport; in lpfc_plogi_confirm_nport()
1818 new_ndlp->nrport = ndlp->nrport; in lpfc_plogi_confirm_nport()
1821 if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) { in lpfc_plogi_confirm_nport()
1828 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1834 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1835 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1837 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1839 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1841 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1846 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1853 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1854 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1856 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1858 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1860 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1865 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_plogi_confirm_nport()
1866 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) in lpfc_plogi_confirm_nport()
1869 ndlp->nrport = keep_nrport; in lpfc_plogi_confirm_nport()
1876 if (!ndlp->rport && (ndlp->nlp_state == NLP_STE_NPR_NODE)) in lpfc_plogi_confirm_nport()
1879 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1882 phba->active_rrq_pool); in lpfc_plogi_confirm_nport()
1886 new_ndlp->nlp_DID, new_ndlp->nlp_flag, in lpfc_plogi_confirm_nport()
1887 new_ndlp->nlp_fc4_type); in lpfc_plogi_confirm_nport()
1893 * lpfc_end_rscn - Check and handle more rscn for a vport
1908 if (vport->fc_flag & FC_RSCN_MODE) { in lpfc_end_rscn()
1913 if (vport->fc_rscn_id_cnt || in lpfc_end_rscn()
1914 (vport->fc_flag & FC_RSCN_DISCOVERY) != 0) in lpfc_end_rscn()
1917 spin_lock_irq(shost->host_lock); in lpfc_end_rscn()
1918 vport->fc_flag &= ~FC_RSCN_MODE; in lpfc_end_rscn()
1919 spin_unlock_irq(shost->host_lock); in lpfc_end_rscn()
1925 * lpfc_cmpl_els_rrq - Completion handled for els RRQs.
1940 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_rrq()
1941 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rrq()
1947 rrq = cmdiocb->context_un.rrq; in lpfc_cmpl_els_rrq()
1948 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_rrq()
1960 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_rrq()
1961 get_wqe_tmo(cmdiocb), rrq->xritag, rrq->rxid); in lpfc_cmpl_els_rrq()
1964 /* Check for retry */ in lpfc_cmpl_els_rrq()
1969 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_rrq()
1973 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_rrq()
1977 lpfc_clr_rrq_active(phba, rrq->xritag, rrq); in lpfc_cmpl_els_rrq()
1983 * lpfc_cmpl_els_plogi - Completion callback function for plogi
1994 * retry shall be attempted by invoking the lpfc_els_retry() routine.
2006 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_plogi()
2017 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_plogi()
2023 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_plogi()
2026 irsp = &rspiocb->iocb; in lpfc_cmpl_els_plogi()
2027 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_plogi()
2046 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2047 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); in lpfc_cmpl_els_plogi()
2048 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2049 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2055 ndlp->nlp_DID, ndlp->nlp_fc4_type, in lpfc_cmpl_els_plogi()
2057 disc, vport->num_disc_nodes); in lpfc_cmpl_els_plogi()
2061 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2062 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2063 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2068 /* Check for retry */ in lpfc_cmpl_els_plogi()
2072 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2073 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2074 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2082 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_plogi()
2086 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_plogi()
2097 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2098 if ((ndlp->nlp_flag & (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI)) && in lpfc_cmpl_els_plogi()
2099 ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) { in lpfc_cmpl_els_plogi()
2100 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2108 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_plogi()
2109 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_plogi()
2110 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_plogi()
2113 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2120 prsp = list_entry(cmdiocb->cmd_dmabuf->list.next, in lpfc_cmpl_els_plogi()
2122 ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp); in lpfc_cmpl_els_plogi()
2124 sp = (struct serv_parm *)((u8 *)prsp->virt + in lpfc_cmpl_els_plogi()
2127 ndlp->vmid_support = 0; in lpfc_cmpl_els_plogi()
2128 if ((phba->cfg_vmid_app_header && sp->cmn.app_hdr_support) || in lpfc_cmpl_els_plogi()
2129 (phba->cfg_vmid_priority_tagging && in lpfc_cmpl_els_plogi()
2130 sp->cmn.priority_tagging)) { in lpfc_cmpl_els_plogi()
2133 sp->cmn.app_hdr_support, in lpfc_cmpl_els_plogi()
2134 sp->cmn.priority_tagging, in lpfc_cmpl_els_plogi()
2135 ndlp->nlp_DID); in lpfc_cmpl_els_plogi()
2137 ndlp->vmid_support = 1; in lpfc_cmpl_els_plogi()
2144 if (disc && vport->num_disc_nodes) { in lpfc_cmpl_els_plogi()
2148 if (vport->num_disc_nodes == 0) { in lpfc_cmpl_els_plogi()
2149 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_plogi()
2150 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cmpl_els_plogi()
2151 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_plogi()
2161 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_plogi()
2165 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_plogi()
2173 * lpfc_issue_els_plogi - Issue an plogi iocb command for a vport
2176 * @retry: number of retries to the command IOCB.
2189 * 0 - Successfully issued a plogi for @vport
2190 * 1 - failed to issue a plogi for @vport
2193 lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry) in lpfc_issue_els_plogi() argument
2195 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_plogi()
2211 if ((ndlp->nlp_flag & (NLP_IGNR_REG_CMPL | NLP_UNREG_INP)) && in lpfc_issue_els_plogi()
2212 ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) && in lpfc_issue_els_plogi()
2213 !(vport->fc_flag & FC_OFFLINE_MODE)) { in lpfc_issue_els_plogi()
2218 ndlp->nlp_defer_did, ndlp->nlp_DID, in lpfc_issue_els_plogi()
2219 ndlp->nlp_rpi, ndlp->nlp_flag, ndlp); in lpfc_issue_els_plogi()
2222 if (ndlp->nlp_defer_did == NLP_EVT_NOTHING_PENDING) in lpfc_issue_els_plogi()
2223 ndlp->nlp_defer_did = did; in lpfc_issue_els_plogi()
2228 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, in lpfc_issue_els_plogi()
2233 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_plogi()
2238 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_plogi()
2242 * If we are a N-port connected to a Fabric, fix-up paramm's so logins in lpfc_issue_els_plogi()
2245 if ((vport->fc_flag & FC_FABRIC) && !(vport->fc_flag & FC_PUBLIC_LOOP)) in lpfc_issue_els_plogi()
2246 sp->cmn.altBbCredit = 1; in lpfc_issue_els_plogi()
2248 if (sp->cmn.fcphLow < FC_PH_4_3) in lpfc_issue_els_plogi()
2249 sp->cmn.fcphLow = FC_PH_4_3; in lpfc_issue_els_plogi()
2251 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_plogi()
2252 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_plogi()
2254 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_plogi()
2255 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_plogi()
2256 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_issue_els_plogi()
2259 ndlp->vmid_support = 0; in lpfc_issue_els_plogi()
2260 if (vport->vmid_priority_tagging) in lpfc_issue_els_plogi()
2261 sp->cmn.priority_tagging = 1; in lpfc_issue_els_plogi()
2262 else if (phba->cfg_vmid_app_header && in lpfc_issue_els_plogi()
2263 bf_get(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags)) in lpfc_issue_els_plogi()
2264 sp->cmn.app_hdr_support = 1; in lpfc_issue_els_plogi()
2273 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_issue_els_plogi()
2274 sp->cmn.valid_vendor_ver_level = 1; in lpfc_issue_els_plogi()
2275 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_issue_els_plogi()
2276 sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP); in lpfc_issue_els_plogi()
2279 phba->fc_stat.elsXmitPLOGI++; in lpfc_issue_els_plogi()
2280 elsiocb->cmd_cmpl = lpfc_cmpl_els_plogi; in lpfc_issue_els_plogi()
2284 did, kref_read(&ndlp->kref), 0); in lpfc_issue_els_plogi()
2285 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_plogi()
2286 if (!elsiocb->ndlp) { in lpfc_issue_els_plogi()
2302 * lpfc_cmpl_els_prli - Completion callback function for prli
2309 * status. If there is error status reported, PRLI retry shall be attempted
2318 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_prli()
2327 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_prli()
2329 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_prli()
2334 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2335 ndlp->nlp_flag &= ~NLP_PRLI_SND; in lpfc_cmpl_els_prli()
2338 vport->fc_prli_sent--; in lpfc_cmpl_els_prli()
2339 ndlp->fc4_prli_sent--; in lpfc_cmpl_els_prli()
2340 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2345 ndlp->nlp_DID); in lpfc_cmpl_els_prli()
2351 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_prli()
2352 vport->num_disc_nodes, ndlp->fc4_prli_sent); in lpfc_cmpl_els_prli()
2359 /* Check for retry */ in lpfc_cmpl_els_prli()
2368 if ((vport->fc_flag & FC_FABRIC) || in lpfc_cmpl_els_prli()
2369 (vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)) { in lpfc_cmpl_els_prli()
2381 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_prli()
2382 ulp_word4, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2383 ndlp->fc4_prli_sent, ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2394 if ((ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_prli()
2395 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) || in lpfc_cmpl_els_prli()
2396 (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_cmpl_els_prli()
2397 ndlp->nlp_flag & NLP_DELAY_TMO)) { in lpfc_cmpl_els_prli()
2401 ndlp->nlp_DID, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2402 ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2410 if (vport->fc_flag & FC_PT2PT) in lpfc_cmpl_els_prli()
2418 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2419 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_cmpl_els_prli()
2420 !ndlp->fc4_prli_sent) { in lpfc_cmpl_els_prli()
2421 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_prli()
2422 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_prli()
2425 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2447 * lpfc_issue_els_prli - Issue a prli iocb command for a vport
2449 * @ndlp: pointer to a node-list data structure.
2450 * @retry: number of retries to the command IOCB.
2463 * 0 - successfully issued prli iocb command for @vport
2464 * 1 - failed to issue prli iocb command for @vport
2468 uint8_t retry) in lpfc_issue_els_prli() argument
2471 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_prli()
2485 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2486 vport->fc_flag & FC_RSCN_MODE && in lpfc_issue_els_prli()
2487 vport->nvmei_support) in lpfc_issue_els_prli()
2488 ndlp->nlp_fc4_type |= NLP_FC4_NVME; in lpfc_issue_els_prli()
2489 local_nlp_type = ndlp->nlp_fc4_type; in lpfc_issue_els_prli()
2494 ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR); in lpfc_issue_els_prli()
2495 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); in lpfc_issue_els_prli()
2496 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_issue_els_prli()
2497 ndlp->nlp_flag &= ~(NLP_FIRSTBURST | NLP_NPR_2B_DISC); in lpfc_issue_els_prli()
2498 ndlp->nvme_fb_size = 0; in lpfc_issue_els_prli()
2512 ndlp->nlp_fc4_type, ndlp->nlp_DID); in lpfc_issue_els_prli()
2519 if (phba->sli_rev == LPFC_SLI_REV3 && in lpfc_issue_els_prli()
2520 ndlp->nlp_fc4_type == NLP_FC4_NVME) { in lpfc_issue_els_prli()
2523 ndlp->nlp_type); in lpfc_issue_els_prli()
2528 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_prli()
2529 ndlp->nlp_DID, elscmd); in lpfc_issue_els_prli()
2533 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_prli()
2550 * set the following bits for FC-TAPE support. in lpfc_issue_els_prli()
2552 if (phba->vpd.rev.feaLevelHigh >= 0x02) { in lpfc_issue_els_prli()
2553 npr->ConfmComplAllowed = 1; in lpfc_issue_els_prli()
2554 npr->Retry = 1; in lpfc_issue_els_prli()
2555 npr->TaskRetryIdReq = 1; in lpfc_issue_els_prli()
2557 npr->estabImagePair = 1; in lpfc_issue_els_prli()
2558 npr->readXferRdyDis = 1; in lpfc_issue_els_prli()
2559 if (vport->cfg_first_burst_size) in lpfc_issue_els_prli()
2560 npr->writeXferRdyDis = 1; in lpfc_issue_els_prli()
2563 npr->prliType = PRLI_FCP_TYPE; in lpfc_issue_els_prli()
2564 npr->initiatorFunc = 1; in lpfc_issue_els_prli()
2565 elsiocb->cmd_flag |= LPFC_PRLI_FCP_REQ; in lpfc_issue_els_prli()
2567 /* Remove FCP type - processed. */ in lpfc_issue_els_prli()
2579 if (phba->nsler) { in lpfc_issue_els_prli()
2585 if ((phba->cfg_nvme_enable_fb) && in lpfc_issue_els_prli()
2586 !phba->nvmet_support) in lpfc_issue_els_prli()
2589 if (phba->nvmet_support) { in lpfc_issue_els_prli()
2597 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_issue_els_prli()
2598 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_issue_els_prli()
2599 elsiocb->cmd_flag |= LPFC_PRLI_NVME_REQ; in lpfc_issue_els_prli()
2601 /* Remove NVME type - processed. */ in lpfc_issue_els_prli()
2605 phba->fc_stat.elsXmitPRLI++; in lpfc_issue_els_prli()
2606 elsiocb->cmd_cmpl = lpfc_cmpl_els_prli; in lpfc_issue_els_prli()
2610 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_prli()
2611 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_prli()
2612 if (!elsiocb->ndlp) { in lpfc_issue_els_prli()
2628 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2629 ndlp->nlp_flag |= NLP_PRLI_SND; in lpfc_issue_els_prli()
2630 vport->fc_prli_sent++; in lpfc_issue_els_prli()
2631 ndlp->fc4_prli_sent++; in lpfc_issue_els_prli()
2632 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2637 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2645 * lpfc_rscn_disc - Perform rscn discovery for a vport
2663 if (vport->fc_npr_cnt) in lpfc_rscn_disc()
2671 * lpfc_adisc_done - Complete the adisc phase of discovery
2684 struct lpfc_hba *phba = vport->phba; in lpfc_adisc_done()
2690 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_adisc_done()
2691 !(vport->fc_flag & FC_RSCN_MODE) && in lpfc_adisc_done()
2692 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_adisc_done()
2717 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_adisc_done()
2720 if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) { in lpfc_adisc_done()
2721 vport->num_disc_nodes = 0; in lpfc_adisc_done()
2723 if (vport->fc_npr_cnt) in lpfc_adisc_done()
2725 if (!vport->num_disc_nodes) { in lpfc_adisc_done()
2726 spin_lock_irq(shost->host_lock); in lpfc_adisc_done()
2727 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_adisc_done()
2728 spin_unlock_irq(shost->host_lock); in lpfc_adisc_done()
2733 vport->port_state = LPFC_VPORT_READY; in lpfc_adisc_done()
2739 * lpfc_more_adisc - Issue more adisc as needed
2750 if (vport->num_disc_nodes) in lpfc_more_adisc()
2751 vport->num_disc_nodes--; in lpfc_more_adisc()
2756 vport->num_disc_nodes, vport->fc_adisc_cnt, in lpfc_more_adisc()
2757 vport->fc_flag, vport->port_state); in lpfc_more_adisc()
2759 if (vport->fc_flag & FC_NLP_MORE) { in lpfc_more_adisc()
2764 if (!vport->num_disc_nodes) in lpfc_more_adisc()
2770 * lpfc_cmpl_els_adisc - Completion callback function for adisc
2789 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_adisc()
2797 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_adisc()
2799 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_adisc()
2804 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_adisc()
2807 irsp = &rspiocb->iocb; in lpfc_cmpl_els_adisc()
2808 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_adisc()
2814 ndlp->nlp_DID); in lpfc_cmpl_els_adisc()
2819 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2820 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); in lpfc_cmpl_els_adisc()
2821 ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC); in lpfc_cmpl_els_adisc()
2822 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2827 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_adisc()
2828 tmo, disc, vport->num_disc_nodes); in lpfc_cmpl_els_adisc()
2831 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2832 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2833 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2838 /* Check for retry */ in lpfc_cmpl_els_adisc()
2842 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2843 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2844 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2852 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_adisc()
2861 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2862 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_adisc()
2863 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_adisc()
2864 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS)) in lpfc_cmpl_els_adisc()
2867 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2878 if (disc && vport->num_disc_nodes) in lpfc_cmpl_els_adisc()
2887 * lpfc_issue_els_adisc - Issue an address discover iocb to an node on a vport
2889 * @ndlp: pointer to a node-list data structure.
2890 * @retry: number of retries to the command IOCB.
2902 * 0 - successfully issued adisc
2903 * 1 - failed to issue adisc
2907 uint8_t retry) in lpfc_issue_els_adisc() argument
2910 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_adisc()
2917 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_adisc()
2918 ndlp->nlp_DID, ELS_CMD_ADISC); in lpfc_issue_els_adisc()
2922 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_adisc()
2930 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_issue_els_adisc()
2931 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2932 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2933 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_adisc()
2935 phba->fc_stat.elsXmitADISC++; in lpfc_issue_els_adisc()
2936 elsiocb->cmd_cmpl = lpfc_cmpl_els_adisc; in lpfc_issue_els_adisc()
2937 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2938 ndlp->nlp_flag |= NLP_ADISC_SND; in lpfc_issue_els_adisc()
2939 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2940 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_adisc()
2941 if (!elsiocb->ndlp) { in lpfc_issue_els_adisc()
2948 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_adisc()
2960 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2961 ndlp->nlp_flag &= ~NLP_ADISC_SND; in lpfc_issue_els_adisc()
2962 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_adisc()
2967 * lpfc_cmpl_els_logo - Completion callback function for logo
2981 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo()
2982 struct lpfc_vport *vport = ndlp->vport; in lpfc_cmpl_els_logo()
2992 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_logo()
2997 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_logo()
3000 irsp = &rspiocb->iocb; in lpfc_cmpl_els_logo()
3001 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_logo()
3004 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3005 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_cmpl_els_logo()
3006 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_logo()
3008 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_logo()
3010 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3015 ndlp->nlp_DID); in lpfc_cmpl_els_logo()
3021 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo()
3023 tmo, vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3033 * discovery. The PLOGI will retry. in lpfc_cmpl_els_logo()
3038 "2756 LOGO failure, No Retry DID:%06X " in lpfc_cmpl_els_logo()
3040 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3056 if (ndlp->nlp_flag & NLP_TARGET_REMOVE) { in lpfc_cmpl_els_logo()
3057 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3058 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_logo()
3059 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_cmpl_els_logo()
3060 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3061 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3074 if (wake_up_waiter && ndlp->logo_waitq) in lpfc_cmpl_els_logo()
3075 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_logo()
3081 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) && in lpfc_cmpl_els_logo()
3084 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_cmpl_els_logo()
3085 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3086 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_cmpl_els_logo()
3091 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3093 vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3107 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_logo()
3108 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3109 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cmpl_els_logo()
3110 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3121 * lpfc_issue_els_logo - Issue a logo to an node on a vport
3123 * @ndlp: pointer to a node-list data structure.
3124 * @retry: number of retries to the command IOCB.
3138 * 0 - successfully issued logo
3139 * 1 - failed to issue logo
3143 uint8_t retry) in lpfc_issue_els_logo() argument
3145 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_logo()
3151 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3152 if (ndlp->nlp_flag & NLP_LOGO_SND) { in lpfc_issue_els_logo()
3153 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3156 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3159 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_logo()
3160 ndlp->nlp_DID, ELS_CMD_LOGO); in lpfc_issue_els_logo()
3164 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_logo()
3169 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_logo()
3171 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_logo()
3173 phba->fc_stat.elsXmitLOGO++; in lpfc_issue_els_logo()
3174 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo; in lpfc_issue_els_logo()
3175 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3176 ndlp->nlp_flag |= NLP_LOGO_SND; in lpfc_issue_els_logo()
3177 ndlp->nlp_flag &= ~NLP_ISSUE_LOGO; in lpfc_issue_els_logo()
3178 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3179 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_logo()
3180 if (!elsiocb->ndlp) { in lpfc_issue_els_logo()
3187 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_logo()
3196 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3197 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_issue_els_logo()
3198 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3203 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3204 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_issue_els_logo()
3205 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3210 * lpfc_cmpl_els_cmd - Completion callback function for generic els command
3228 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_cmd()
3237 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_cmd()
3241 irsp = &rspiocb->iocb; in lpfc_cmpl_els_cmd()
3242 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_cmd()
3243 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_cmd()
3258 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_cmd()
3265 * lpfc_reg_fab_ctrl_node - RPI register the fabric controller node.
3282 struct lpfc_hba *phba = vport->phba; in lpfc_reg_fab_ctrl_node()
3286 if (fc_ndlp->nlp_flag & NLP_RPI_REGISTERED) in lpfc_reg_fab_ctrl_node()
3291 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3295 __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3296 ns_ndlp->nlp_state); in lpfc_reg_fab_ctrl_node()
3297 if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_reg_fab_ctrl_node()
3298 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3300 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_reg_fab_ctrl_node()
3305 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3306 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3307 return -ENOMEM; in lpfc_reg_fab_ctrl_node()
3309 rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3310 (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3312 rc = -EACCES; in lpfc_reg_fab_ctrl_node()
3316 fc_ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; in lpfc_reg_fab_ctrl_node()
3317 mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login; in lpfc_reg_fab_ctrl_node()
3318 mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp); in lpfc_reg_fab_ctrl_node()
3319 if (!mbox->ctx_ndlp) { in lpfc_reg_fab_ctrl_node()
3320 rc = -ENOMEM; in lpfc_reg_fab_ctrl_node()
3324 mbox->vport = vport; in lpfc_reg_fab_ctrl_node()
3327 rc = -ENODEV; in lpfc_reg_fab_ctrl_node()
3341 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3342 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3347 * lpfc_cmpl_els_disc_cmd - Completion callback function for Discovery ELS cmd
3361 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_disc_cmd()
3367 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_disc_cmd()
3374 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_disc_cmd()
3378 irsp = &rspiocb->iocb; in lpfc_cmpl_els_disc_cmd()
3379 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_disc_cmd()
3380 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_disc_cmd()
3390 iotag, ulp_status, ulp_word4, tmo, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3392 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_disc_cmd()
3396 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_disc_cmd()
3401 /* Only 1 retry for ELS Timeout only */ in lpfc_cmpl_els_disc_cmd()
3405 cmdiocb->retry++; in lpfc_cmpl_els_disc_cmd()
3406 if (cmdiocb->retry <= 1) { in lpfc_cmpl_els_disc_cmd()
3409 lpfc_issue_els_scr(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3412 lpfc_issue_els_edc(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3415 lpfc_issue_els_rdf(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3420 phba->fc_stat.elsRetryExceeded++; in lpfc_cmpl_els_disc_cmd()
3441 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_disc_cmd()
3445 prdf = (struct lpfc_els_rdf_rsp *)prsp->virt; in lpfc_cmpl_els_disc_cmd()
3450 i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++) in lpfc_cmpl_els_disc_cmd()
3456 prdf->reg_d1.desc_tags[i]), in lpfc_cmpl_els_disc_cmd()
3457 phba->cgn_reg_signal, in lpfc_cmpl_els_disc_cmd()
3458 phba->cgn_reg_fpin); in lpfc_cmpl_els_disc_cmd()
3470 * lpfc_issue_els_scr - Issue a scr to an node on a vport
3472 * @retry: retry counter for the command IOCB.
3486 * 0 - Successfully issued scr command
3487 * 1 - Failed to issue scr command
3490 lpfc_issue_els_scr(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_scr() argument
3493 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_scr()
3509 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_scr()
3510 ndlp->nlp_DID, ELS_CMD_SCR); in lpfc_issue_els_scr()
3514 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_scr()
3524 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_scr()
3531 ((SCR *) pcmd)->Function = SCR_FUNC_FULL; in lpfc_issue_els_scr()
3535 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_scr()
3537 phba->fc_stat.elsXmitSCR++; in lpfc_issue_els_scr()
3538 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_scr()
3539 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_scr()
3540 if (!elsiocb->ndlp) { in lpfc_issue_els_scr()
3547 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_scr()
3560 * lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
3563 * @retry: number of retries to the command IOCB.
3567 * in point-to-point mode. When sent to the Fabric Controller, it will
3575 * 0 - Successfully issued RSCN command
3576 * 1 - Failed to issue RSCN command
3579 lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rscn() argument
3582 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rscn()
3593 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_issue_els_rscn()
3594 !(vport->fc_flag & FC_PUBLIC_LOOP)) in lpfc_issue_els_rscn()
3597 if (vport->fc_flag & FC_PT2PT) { in lpfc_issue_els_rscn()
3598 /* find any mapped nport - that would be the other nport */ in lpfc_issue_els_rscn()
3615 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rscn()
3616 ndlp->nlp_DID, ELS_CMD_RSCN_XMT); in lpfc_issue_els_rscn()
3621 event = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rscn()
3623 event->rscn.rscn_cmd = ELS_RSCN; in lpfc_issue_els_rscn()
3624 event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page); in lpfc_issue_els_rscn()
3625 event->rscn.rscn_plen = cpu_to_be16(cmdsize); in lpfc_issue_els_rscn()
3627 nportid = vport->fc_myDID; in lpfc_issue_els_rscn()
3629 event->portid.rscn_page_flags = 0; in lpfc_issue_els_rscn()
3630 event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16; in lpfc_issue_els_rscn()
3631 event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8; in lpfc_issue_els_rscn()
3632 event->portid.rscn_fid[2] = nportid & 0x000000FF; in lpfc_issue_els_rscn()
3634 phba->fc_stat.elsXmitRSCN++; in lpfc_issue_els_rscn()
3635 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_rscn()
3636 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rscn()
3637 if (!elsiocb->ndlp) { in lpfc_issue_els_rscn()
3644 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_rscn()
3657 * lpfc_issue_els_farpr - Issue a farp to an node on a vport
3660 * @retry: number of retries to the command IOCB.
3674 * 0 - Successfully issued farpr command
3675 * 1 - Failed to issue farpr command
3678 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry) in lpfc_issue_els_farpr() argument
3681 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_farpr()
3700 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_farpr()
3701 ndlp->nlp_DID, ELS_CMD_FARPR); in lpfc_issue_els_farpr()
3705 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_farpr()
3715 *lp++ = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_farpr()
3716 fp->Rflags = 0; in lpfc_issue_els_farpr()
3717 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE); in lpfc_issue_els_farpr()
3719 memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3720 memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3723 memcpy(&fp->OportName, &ondlp->nlp_portname, in lpfc_issue_els_farpr()
3725 memcpy(&fp->OnodeName, &ondlp->nlp_nodename, in lpfc_issue_els_farpr()
3731 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_farpr()
3733 phba->fc_stat.elsXmitFARPR++; in lpfc_issue_els_farpr()
3734 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_farpr()
3735 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_farpr()
3736 if (!elsiocb->ndlp) { in lpfc_issue_els_farpr()
3751 /* This will cause the callback-function lpfc_cmpl_els_cmd to in lpfc_issue_els_farpr()
3759 * lpfc_issue_els_rdf - Register for diagnostic functions from the fabric.
3761 * @retry: retry counter for the command IOCB.
3771 * 0 - Successfully issued rdf command
3772 * 1 - Failed to issue rdf command
3775 lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rdf() argument
3777 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rdf()
3790 return -ENODEV; in lpfc_issue_els_rdf()
3795 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_rdf()
3796 return -EACCES; in lpfc_issue_els_rdf()
3798 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rdf()
3799 ndlp->nlp_DID, ELS_CMD_RDF); in lpfc_issue_els_rdf()
3801 return -ENOMEM; in lpfc_issue_els_rdf()
3804 prdf = (struct lpfc_els_rdf_req *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rdf()
3806 prdf->rdf.fpin_cmd = ELS_RDF; in lpfc_issue_els_rdf()
3807 prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) - in lpfc_issue_els_rdf()
3809 prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER); in lpfc_issue_els_rdf()
3810 prdf->reg_d1.reg_desc.desc_len = cpu_to_be32( in lpfc_issue_els_rdf()
3811 FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1)); in lpfc_issue_els_rdf()
3812 prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT); in lpfc_issue_els_rdf()
3813 prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY); in lpfc_issue_els_rdf()
3814 prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY); in lpfc_issue_els_rdf()
3815 prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST); in lpfc_issue_els_rdf()
3816 prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION); in lpfc_issue_els_rdf()
3820 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_rdf()
3821 phba->cgn_reg_fpin); in lpfc_issue_els_rdf()
3823 phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ; in lpfc_issue_els_rdf()
3824 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_rdf()
3825 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rdf()
3826 if (!elsiocb->ndlp) { in lpfc_issue_els_rdf()
3828 return -EIO; in lpfc_issue_els_rdf()
3833 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_rdf()
3839 return -EIO; in lpfc_issue_els_rdf()
3845 * lpfc_els_rcv_rdf - Receive RDF ELS request from the fabric.
3848 * @ndlp: pointer to a node-list data structure.
3855 * 0 - Success
3856 * -EIO - Failed to process received RDF
3866 ndlp->nlp_DID, vport->fc_myDID); in lpfc_els_rcv_rdf()
3867 return -EIO; in lpfc_els_rcv_rdf()
3874 vport->fc_myDID); in lpfc_els_rcv_rdf()
3875 return -EIO; in lpfc_els_rcv_rdf()
3882 * lpfc_least_capable_settings - helper function for EDC rsp processing
3899 rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability); in lpfc_least_capable_settings()
3900 rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count); in lpfc_least_capable_settings()
3901 rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units); in lpfc_least_capable_settings()
3923 drv_sig_cap = phba->cgn_reg_signal; in lpfc_least_capable_settings()
3926 if (rsp_sig_freq_cyc > phba->cgn_sig_freq) in lpfc_least_capable_settings()
3927 phba->cgn_sig_freq = rsp_sig_freq_cyc; in lpfc_least_capable_settings()
3933 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_least_capable_settings()
3934 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3938 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3939 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3943 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM; in lpfc_least_capable_settings()
3944 phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE; in lpfc_least_capable_settings()
3947 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3948 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3956 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3957 phba->cgn_sig_freq = 0; in lpfc_least_capable_settings()
3958 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3965 * lpfc_cmpl_els_edc - Completion callback function for EDC
3994 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_edc()
4000 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_edc()
4004 irsp_iocb = &rspiocb->iocb; in lpfc_cmpl_els_edc()
4005 tmo = irsp_iocb->ulpTimeout; in lpfc_cmpl_els_edc()
4006 iotag = irsp_iocb->ulpIoTag; in lpfc_cmpl_els_edc()
4009 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4018 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_edc()
4022 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_edc()
4030 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_edc()
4034 edc_rsp = prsp->virt; in lpfc_cmpl_els_edc()
4043 edc_rsp->acc_hdr.la_cmd, in lpfc_cmpl_els_edc()
4044 be32_to_cpu(edc_rsp->desc_list_len)); in lpfc_cmpl_els_edc()
4051 bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) - in lpfc_cmpl_els_edc()
4056 tlv = edc_rsp->desc; in lpfc_cmpl_els_edc()
4071 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_cmpl_els_edc()
4091 be32_to_cpu(plnkflt->desc_tag), in lpfc_cmpl_els_edc()
4092 be32_to_cpu(plnkflt->desc_len), in lpfc_cmpl_els_edc()
4094 plnkflt->degrade_activate_threshold), in lpfc_cmpl_els_edc()
4096 plnkflt->degrade_deactivate_threshold), in lpfc_cmpl_els_edc()
4097 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_cmpl_els_edc()
4118 be32_to_cpu(pcgd->desc_tag), in lpfc_cmpl_els_edc()
4119 be32_to_cpu(pcgd->desc_len), in lpfc_cmpl_els_edc()
4120 be32_to_cpu(pcgd->xmt_signal_capability), in lpfc_cmpl_els_edc()
4121 be16_to_cpu(pcgd->xmt_signal_frequency.count), in lpfc_cmpl_els_edc()
4122 be16_to_cpu(pcgd->xmt_signal_frequency.units), in lpfc_cmpl_els_edc()
4123 be32_to_cpu(pcgd->rcv_signal_capability), in lpfc_cmpl_els_edc()
4124 be16_to_cpu(pcgd->rcv_signal_frequency.count), in lpfc_cmpl_els_edc()
4125 be16_to_cpu(pcgd->rcv_signal_frequency.units)); in lpfc_cmpl_els_edc()
4141 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_cmpl_els_edc()
4148 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_cmpl_els_edc()
4149 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_cmpl_els_edc()
4150 phba->cgn_sig_freq = 0; in lpfc_cmpl_els_edc()
4152 "4202 EDC rsp error - sending RDF " in lpfc_cmpl_els_edc()
4159 lpfc_els_chk_latt(phba->pport); in lpfc_cmpl_els_edc()
4160 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4162 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_edc()
4172 lft->desc_tag = cpu_to_be32(ELS_DTAG_LNK_FAULT_CAP); in lpfc_format_edc_lft_desc()
4173 lft->desc_len = cpu_to_be32( in lpfc_format_edc_lft_desc()
4176 lft->degrade_activate_threshold = in lpfc_format_edc_lft_desc()
4177 cpu_to_be32(phba->degrade_activate_threshold); in lpfc_format_edc_lft_desc()
4178 lft->degrade_deactivate_threshold = in lpfc_format_edc_lft_desc()
4179 cpu_to_be32(phba->degrade_deactivate_threshold); in lpfc_format_edc_lft_desc()
4180 lft->fec_degrade_interval = cpu_to_be32(phba->fec_degrade_interval); in lpfc_format_edc_lft_desc()
4191 cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP); in lpfc_format_edc_cgn_desc()
4194 cgd->desc_len = cpu_to_be32( in lpfc_format_edc_cgn_desc()
4202 if (phba->cmf_active_mode == LPFC_CFG_OFF) { in lpfc_format_edc_cgn_desc()
4207 phba->cgn_sig_freq = 0; in lpfc_format_edc_cgn_desc()
4210 switch (phba->cgn_reg_signal) { in lpfc_format_edc_cgn_desc()
4212 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY); in lpfc_format_edc_cgn_desc()
4215 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM); in lpfc_format_edc_cgn_desc()
4225 cgd->rcv_signal_frequency.count = in lpfc_format_edc_cgn_desc()
4227 cgd->rcv_signal_frequency.units = in lpfc_format_edc_cgn_desc()
4234 if (!(phba->lmt & LMT_64Gb)) in lpfc_link_is_lds_capable()
4236 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_link_is_lds_capable()
4239 if (phba->sli4_hba.conf_trunk) { in lpfc_link_is_lds_capable()
4240 if (phba->trunk_link.phy_lnk_speed == LPFC_USER_LINK_SPEED_64G) in lpfc_link_is_lds_capable()
4242 } else if (phba->fc_linkspeed == LPFC_LINK_SPEED_64GHZ) { in lpfc_link_is_lds_capable()
4249 * lpfc_issue_els_edc - Exchange Diagnostic Capabilities with the fabric.
4251 * @retry: retry counter for the command iocb.
4253 * This routine issues an ELS EDC to the F-Port Controller to communicate
4267 * 0 - Successfully issued edc command
4268 * 1 - Failed to issue edc command
4271 lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_edc() argument
4273 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc()
4283 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_edc()
4284 return -EACCES; in lpfc_issue_els_edc()
4287 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_edc()
4288 return -ENODEV; in lpfc_issue_els_edc()
4290 cgn_desc_size = (phba->cgn_init_reg_signal) ? in lpfc_issue_els_edc()
4301 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_edc()
4302 ndlp->nlp_DID, ELS_CMD_EDC); in lpfc_issue_els_edc()
4307 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc()
4310 edc_req->desc_len = cpu_to_be32(cgn_desc_size + lft_desc_size); in lpfc_issue_els_edc()
4311 edc_req->edc_cmd = ELS_EDC; in lpfc_issue_els_edc()
4312 tlv = edc_req->desc; in lpfc_issue_els_edc()
4316 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_issue_els_edc()
4326 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_edc()
4327 phba->cgn_reg_fpin); in lpfc_issue_els_edc()
4329 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_edc()
4330 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc()
4331 if (!elsiocb->ndlp) { in lpfc_issue_els_edc()
4333 return -EIO; in lpfc_issue_els_edc()
4338 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_edc()
4351 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_issue_els_edc()
4352 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_issue_els_edc()
4358 * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
4360 * @nlp: pointer to a node-list data structure.
4362 * This routine cancels the timer with a delayed IOCB-command retry for
4364 * removes the ELS retry event if it presents. In addition, if the
4375 if (!(nlp->nlp_flag & NLP_DELAY_TMO)) in lpfc_cancel_retry_delay_tmo()
4377 spin_lock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4378 nlp->nlp_flag &= ~NLP_DELAY_TMO; in lpfc_cancel_retry_delay_tmo()
4379 spin_unlock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4380 del_timer_sync(&nlp->nlp_delayfunc); in lpfc_cancel_retry_delay_tmo()
4381 nlp->nlp_last_elscmd = 0; in lpfc_cancel_retry_delay_tmo()
4382 if (!list_empty(&nlp->els_retry_evt.evt_listp)) { in lpfc_cancel_retry_delay_tmo()
4383 list_del_init(&nlp->els_retry_evt.evt_listp); in lpfc_cancel_retry_delay_tmo()
4384 /* Decrement nlp reference count held for the delayed retry */ in lpfc_cancel_retry_delay_tmo()
4385 evtp = &nlp->els_retry_evt; in lpfc_cancel_retry_delay_tmo()
4386 lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1); in lpfc_cancel_retry_delay_tmo()
4388 if (nlp->nlp_flag & NLP_NPR_2B_DISC) { in lpfc_cancel_retry_delay_tmo()
4389 spin_lock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4390 nlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_cancel_retry_delay_tmo()
4391 spin_unlock_irq(&nlp->lock); in lpfc_cancel_retry_delay_tmo()
4392 if (vport->num_disc_nodes) { in lpfc_cancel_retry_delay_tmo()
4393 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_cancel_retry_delay_tmo()
4399 if (vport->num_disc_nodes == 0) { in lpfc_cancel_retry_delay_tmo()
4400 spin_lock_irq(shost->host_lock); in lpfc_cancel_retry_delay_tmo()
4401 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cancel_retry_delay_tmo()
4402 spin_unlock_irq(shost->host_lock); in lpfc_cancel_retry_delay_tmo()
4413 * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
4416 * This routine is invoked by the ndlp delayed-function timer to check
4417 * whether there is any pending ELS retry event(s) with the node. If not, it
4430 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay()
4431 struct lpfc_hba *phba = vport->phba; in lpfc_els_retry_delay()
4433 struct lpfc_work_evt *evtp = &ndlp->els_retry_evt; in lpfc_els_retry_delay()
4435 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_els_retry_delay()
4436 if (!list_empty(&evtp->evt_listp)) { in lpfc_els_retry_delay()
4437 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4444 evtp->evt_arg1 = lpfc_nlp_get(ndlp); in lpfc_els_retry_delay()
4445 if (evtp->evt_arg1) { in lpfc_els_retry_delay()
4446 evtp->evt = LPFC_EVT_ELS_RETRY; in lpfc_els_retry_delay()
4447 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_els_retry_delay()
4450 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4455 * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
4456 * @ndlp: pointer to a node-list data structure.
4458 * This routine is the worker-thread handler for processing the @ndlp delayed
4461 * function according to the delayed ELS command to retry the command.
4466 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay_handler()
4467 uint32_t cmd, retry; in lpfc_els_retry_delay_handler() local
4469 spin_lock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4470 cmd = ndlp->nlp_last_elscmd; in lpfc_els_retry_delay_handler()
4471 ndlp->nlp_last_elscmd = 0; in lpfc_els_retry_delay_handler()
4473 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { in lpfc_els_retry_delay_handler()
4474 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4478 ndlp->nlp_flag &= ~NLP_DELAY_TMO; in lpfc_els_retry_delay_handler()
4479 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4485 del_timer_sync(&ndlp->nlp_delayfunc); in lpfc_els_retry_delay_handler()
4486 retry = ndlp->nlp_retry; in lpfc_els_retry_delay_handler()
4487 ndlp->nlp_retry = 0; in lpfc_els_retry_delay_handler()
4491 lpfc_issue_els_flogi(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4494 if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) { in lpfc_els_retry_delay_handler()
4495 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4500 if (!lpfc_issue_els_adisc(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4501 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4507 if (!lpfc_issue_els_prli(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4508 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4513 if (!lpfc_issue_els_logo(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4514 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4519 if (!(vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI)) in lpfc_els_retry_delay_handler()
4520 lpfc_issue_els_fdisc(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4527 * lpfc_link_reset - Issue link reset
4531 * For SLI-3 adapter, link attention interrupt is enabled before issuing
4535 * 0 - Link reset initiated successfully
4536 * 1 - Failed to initiate link reset
4541 struct lpfc_hba *phba = vport->phba; in lpfc_link_reset()
4548 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_link_reset()
4556 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_link_reset()
4557 spin_lock_irq(&phba->hbalock); in lpfc_link_reset()
4558 phba->sli.sli_flag |= LPFC_PROCESS_LA; in lpfc_link_reset()
4559 control = readl(phba->HCregaddr); in lpfc_link_reset()
4561 writel(control, phba->HCregaddr); in lpfc_link_reset()
4562 readl(phba->HCregaddr); /* flush */ in lpfc_link_reset()
4563 spin_unlock_irq(&phba->hbalock); in lpfc_link_reset()
4566 lpfc_init_link(phba, mbox, phba->cfg_topology, in lpfc_link_reset()
4567 phba->cfg_link_speed); in lpfc_link_reset()
4568 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_link_reset()
4569 mbox->vport = vport; in lpfc_link_reset()
4575 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_link_reset()
4583 * lpfc_els_retry - Make retry decision on an els command iocb
4588 * This routine makes a retry decision on an ELS command IOCB, which has
4592 * returned error status, it makes the decision whether a retry shall be
4593 * issued for the command, and whether a retry shall be made immediately or
4594 * delayed. In the former case, the corresponding ELS command issuing-function
4595 * is called to retry the command. In the later case, the ELS command shall
4600 * 0 - No retry of els command is made
4601 * 1 - Immediate or delayed retry of els command is made
4607 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_els_retry()
4608 union lpfc_wqe128 *irsp = &rspiocb->wqe; in lpfc_els_retry()
4609 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_els_retry()
4610 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_retry()
4613 int retry = 0, maxretry = lpfc_max_els_tries, delay = 0; in lpfc_els_retry() local
4626 if (pcmd && pcmd->virt) { in lpfc_els_retry()
4627 elscmd = (uint32_t *) (pcmd->virt); in lpfc_els_retry()
4632 did = ndlp->nlp_DID; in lpfc_els_retry()
4642 "Retry ELS: wd7:x%x wd4:x%x did:x%x", in lpfc_els_retry()
4649 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_retry()
4655 cmdiocb->sli4_lxritag, 0, 0); in lpfc_els_retry()
4661 if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0) in lpfc_els_retry()
4662 delay = 1000; in lpfc_els_retry()
4663 retry = 1; in lpfc_els_retry()
4668 "0124 Retry illegal cmd x%x " in lpfc_els_retry()
4669 "retry:x%x delay:x%x\n", in lpfc_els_retry()
4670 cmd, cmdiocb->retry, delay); in lpfc_els_retry()
4671 retry = 1; in lpfc_els_retry()
4672 /* All command's retry policy */ in lpfc_els_retry()
4674 if (cmdiocb->retry > 2) in lpfc_els_retry()
4675 delay = 1000; in lpfc_els_retry()
4680 retry = 1; in lpfc_els_retry()
4681 if (cmdiocb->retry > 100) in lpfc_els_retry()
4682 delay = 100; in lpfc_els_retry()
4687 delay = 100; in lpfc_els_retry()
4688 retry = 1; in lpfc_els_retry()
4697 delay = 100; in lpfc_els_retry()
4699 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_els_retry()
4700 /* State-command disagreement. The PRLI was in lpfc_els_retry()
4702 * some unexpected state change. Don't retry. in lpfc_els_retry()
4705 retry = 0; in lpfc_els_retry()
4708 retry = 1; in lpfc_els_retry()
4714 (cmdiocb->retry + 1) == maxretry) { in lpfc_els_retry()
4719 retry = 1; in lpfc_els_retry()
4720 delay = 100; in lpfc_els_retry()
4723 /* Retry ELS PLOGI command? in lpfc_els_retry()
4727 /* No retry if state change */ in lpfc_els_retry()
4729 ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_els_retry()
4731 retry = 1; in lpfc_els_retry()
4741 retry = 1; in lpfc_els_retry()
4749 retry = 1; in lpfc_els_retry()
4757 if ((vport->fc_flag & FC_PT2PT) && in lpfc_els_retry()
4769 retry = 0; in lpfc_els_retry()
4770 vport->fc_flag |= FC_PT2PT_NO_NVME; in lpfc_els_retry()
4779 * isn't really supported, don't retry and cause in lpfc_els_retry()
4795 delay = 1000; in lpfc_els_retry()
4798 retry = 1; in lpfc_els_retry()
4802 /* These explanation codes get no retry. */ in lpfc_els_retry()
4808 /* Limit the delay and retry action to a limited in lpfc_els_retry()
4810 * a retry is not expected. in lpfc_els_retry()
4815 delay = 1000; in lpfc_els_retry()
4817 retry = 1; in lpfc_els_retry()
4822 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4839 delay = 1000; in lpfc_els_retry()
4842 /* FDISC retry policy */ in lpfc_els_retry()
4844 if (cmdiocb->retry >= 32) in lpfc_els_retry()
4845 delay = 1000; in lpfc_els_retry()
4847 retry = 1; in lpfc_els_retry()
4853 * Logical Busy. We should delay every time. in lpfc_els_retry()
4858 delay = 1000; in lpfc_els_retry()
4859 retry = 1; in lpfc_els_retry()
4863 vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf; in lpfc_els_retry()
4864 retry = 1; in lpfc_els_retry()
4874 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4920 /* Do not give up. Retry PLOGI one more time and attempt in lpfc_els_retry()
4923 retry = 1; in lpfc_els_retry()
4924 delay = 100; in lpfc_els_retry()
4931 retry = 1; in lpfc_els_retry()
4934 (phba->fc_topology != LPFC_TOPOLOGY_LOOP) && in lpfc_els_retry()
4936 /* FLOGI retry policy */ in lpfc_els_retry()
4937 retry = 1; in lpfc_els_retry()
4938 /* retry FLOGI forever */ in lpfc_els_retry()
4939 if (phba->link_flag != LS_LOOPBACK_MODE) in lpfc_els_retry()
4944 if (cmdiocb->retry >= 100) in lpfc_els_retry()
4945 delay = 5000; in lpfc_els_retry()
4946 else if (cmdiocb->retry >= 32) in lpfc_els_retry()
4947 delay = 1000; in lpfc_els_retry()
4950 /* retry FDISCs every second up to devloss */ in lpfc_els_retry()
4951 retry = 1; in lpfc_els_retry()
4952 maxretry = vport->cfg_devloss_tmo; in lpfc_els_retry()
4953 delay = 1000; in lpfc_els_retry()
4956 cmdiocb->retry++; in lpfc_els_retry()
4957 if (maxretry && (cmdiocb->retry >= maxretry)) { in lpfc_els_retry()
4958 phba->fc_stat.elsRetryExceeded++; in lpfc_els_retry()
4959 retry = 0; in lpfc_els_retry()
4962 if ((vport->load_flag & FC_UNLOADING) != 0) in lpfc_els_retry()
4963 retry = 0; in lpfc_els_retry()
4966 if (retry) { in lpfc_els_retry()
4969 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_els_retry()
4971 "2849 Stop retry ELS command " in lpfc_els_retry()
4974 cmdiocb->retry, delay); in lpfc_els_retry()
4979 /* Retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
4981 "0107 Retry ELS command x%x to remote " in lpfc_els_retry()
4983 cmd, did, cmdiocb->retry, delay); in lpfc_els_retry()
4992 if (timer_pending(&vport->fc_disctmo) || in lpfc_els_retry()
4993 (vport->fc_flag & FC_RSCN_MODE)) in lpfc_els_retry()
4997 phba->fc_stat.elsXmitRetry++; in lpfc_els_retry()
4998 if (ndlp && delay) { in lpfc_els_retry()
4999 phba->fc_stat.elsDelayRetry++; in lpfc_els_retry()
5000 ndlp->nlp_retry = cmdiocb->retry; in lpfc_els_retry()
5002 /* delay is specified in milliseconds */ in lpfc_els_retry()
5003 mod_timer(&ndlp->nlp_delayfunc, in lpfc_els_retry()
5004 jiffies + msecs_to_jiffies(delay)); in lpfc_els_retry()
5005 spin_lock_irq(&ndlp->lock); in lpfc_els_retry()
5006 ndlp->nlp_flag |= NLP_DELAY_TMO; in lpfc_els_retry()
5007 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry()
5009 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5017 ndlp->nlp_last_elscmd = cmd; in lpfc_els_retry()
5023 lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5026 lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5030 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5034 lpfc_issue_els_plogi(vport, did, cmdiocb->retry); in lpfc_els_retry()
5037 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5039 lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5043 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5045 lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5048 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5050 lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5054 /* No retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
5057 "0137 No retry ELS command x%x to remote " in lpfc_els_retry()
5064 "0108 No retry ELS command x%x to remote " in lpfc_els_retry()
5066 cmd, did, cmdiocb->retry, ulp_status, in lpfc_els_retry()
5073 * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
5084 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5092 if (!list_empty(&buf_ptr1->list)) { in lpfc_els_free_data()
5093 list_remove_head(&buf_ptr1->list, buf_ptr, in lpfc_els_free_data()
5096 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_data()
5099 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys); in lpfc_els_free_data()
5105 * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
5114 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5119 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_bpl()
5125 * lpfc_els_free_iocb - Free a command iocb and its associated resources
5133 * cmd_dmabuf - reference to cmd.
5134 * cmd_dmabuf->next - reference to rsp
5135 * rsp_dmabuf - unused
5136 * bpl_dmabuf - reference to bpl
5149 * 0 - Success (currently, always return 0)
5157 elsiocb->ndlp = NULL; in lpfc_els_free_iocb()
5159 /* cmd_dmabuf = cmd, cmd_dmabuf->next = rsp, bpl_dmabuf = bpl */ in lpfc_els_free_iocb()
5160 if (elsiocb->cmd_dmabuf) { in lpfc_els_free_iocb()
5161 if (elsiocb->cmd_flag & LPFC_DELAY_MEM_FREE) { in lpfc_els_free_iocb()
5166 elsiocb->cmd_flag &= ~LPFC_DELAY_MEM_FREE; in lpfc_els_free_iocb()
5167 buf_ptr = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5168 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5171 spin_lock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5172 if (!list_empty(&buf_ptr->list)) { in lpfc_els_free_iocb()
5173 list_remove_head(&buf_ptr->list, in lpfc_els_free_iocb()
5176 INIT_LIST_HEAD(&buf_ptr1->list); in lpfc_els_free_iocb()
5177 list_add_tail(&buf_ptr1->list, in lpfc_els_free_iocb()
5178 &phba->elsbuf); in lpfc_els_free_iocb()
5179 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5181 INIT_LIST_HEAD(&buf_ptr->list); in lpfc_els_free_iocb()
5182 list_add_tail(&buf_ptr->list, &phba->elsbuf); in lpfc_els_free_iocb()
5183 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5184 spin_unlock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5187 buf_ptr1 = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5189 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5193 if (elsiocb->bpl_dmabuf) { in lpfc_els_free_iocb()
5194 buf_ptr = elsiocb->bpl_dmabuf; in lpfc_els_free_iocb()
5196 elsiocb->bpl_dmabuf = NULL; in lpfc_els_free_iocb()
5203 * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
5218 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo_acc()
5219 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_logo_acc()
5227 ulp_status, ulp_word4, ndlp->nlp_DID); in lpfc_cmpl_els_logo_acc()
5232 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo_acc()
5233 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_cmpl_els_logo_acc()
5240 if (ndlp->nlp_type & NLP_FABRIC && in lpfc_cmpl_els_logo_acc()
5241 ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK)) in lpfc_cmpl_els_logo_acc()
5244 if (ndlp->nlp_state == NLP_STE_NPR_NODE) { in lpfc_cmpl_els_logo_acc()
5249 if ((ndlp->nlp_flag & NLP_DELAY_TMO) && in lpfc_cmpl_els_logo_acc()
5250 (ndlp->nlp_last_elscmd == ELS_CMD_PLOGI)) in lpfc_cmpl_els_logo_acc()
5253 if (ndlp->nlp_flag & NLP_RPI_REGISTERED) in lpfc_cmpl_els_logo_acc()
5267 * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
5281 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_dflt_rpi()
5282 u32 mbx_flag = pmb->mbox_flag; in lpfc_mbx_cmpl_dflt_rpi()
5283 u32 mbx_cmd = pmb->u.mb.mbxCommand; in lpfc_mbx_cmpl_dflt_rpi()
5286 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_mbx_cmpl_dflt_rpi()
5289 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_dflt_rpi()
5290 kref_read(&ndlp->kref), ndlp, mbx_cmd, in lpfc_mbx_cmpl_dflt_rpi()
5298 spin_lock_irq(&ndlp->lock); in lpfc_mbx_cmpl_dflt_rpi()
5299 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_mbx_cmpl_dflt_rpi()
5301 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_mbx_cmpl_dflt_rpi()
5302 spin_unlock_irq(&ndlp->lock); in lpfc_mbx_cmpl_dflt_rpi()
5304 lpfc_drop_node(ndlp->vport, ndlp); in lpfc_mbx_cmpl_dflt_rpi()
5311 * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
5327 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rsp()
5328 struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL; in lpfc_cmpl_els_rsp()
5339 if (cmdiocb->context_un.mbox) in lpfc_cmpl_els_rsp()
5340 mbox = cmdiocb->context_un.mbox; in lpfc_cmpl_els_rsp()
5346 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_rsp()
5350 irsp = &rspiocb->iocb; in lpfc_cmpl_els_rsp()
5351 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_rsp()
5352 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_rsp()
5370 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5371 ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp); in lpfc_cmpl_els_rsp()
5374 && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) { in lpfc_cmpl_els_rsp()
5376 (!(vport->fc_flag & FC_PT2PT))) { in lpfc_cmpl_els_rsp()
5377 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_cmpl_els_rsp()
5378 ndlp->nlp_state == in lpfc_cmpl_els_rsp()
5385 ndlp->nlp_DID, in lpfc_cmpl_els_rsp()
5386 ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5387 ndlp->nlp_rpi, in lpfc_cmpl_els_rsp()
5388 ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5396 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_cmpl_els_rsp()
5397 if (!mbox->ctx_ndlp) in lpfc_cmpl_els_rsp()
5400 mbox->vport = vport; in lpfc_cmpl_els_rsp()
5401 if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) { in lpfc_cmpl_els_rsp()
5402 mbox->mbox_flag |= LPFC_MBX_IMED_UNREG; in lpfc_cmpl_els_rsp()
5403 mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; in lpfc_cmpl_els_rsp()
5406 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; in lpfc_cmpl_els_rsp()
5407 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_rsp()
5412 ndlp->nlp_flag |= NLP_REG_LOGIN_SEND; in lpfc_cmpl_els_rsp()
5421 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_cmpl_els_rsp()
5427 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5428 ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5435 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5437 ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN; in lpfc_cmpl_els_rsp()
5438 ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI; in lpfc_cmpl_els_rsp()
5439 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5445 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_els_rsp()
5446 vport && vport->port_type == LPFC_NPIV_PORT && in lpfc_cmpl_els_rsp()
5447 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_cmpl_els_rsp()
5448 if (ndlp->nlp_flag & NLP_RELEASE_RPI) { in lpfc_cmpl_els_rsp()
5449 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5450 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { in lpfc_cmpl_els_rsp()
5451 lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5452 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5453 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_cmpl_els_rsp()
5454 ndlp->nlp_flag &= ~NLP_RELEASE_RPI; in lpfc_cmpl_els_rsp()
5455 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_rsp()
5458 } else if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5459 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && in lpfc_cmpl_els_rsp()
5460 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_cmpl_els_rsp()
5479 * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
5483 * @ndlp: pointer to a node-list data structure.
5500 * 0 - Successfully issued acc response
5501 * 1 - Failed to issue acc response
5508 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_acc()
5512 union lpfc_wqe128 *oldwqe = &oldiocb->wqe; in lpfc_els_rsp_acc()
5524 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5525 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5527 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5528 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_els_rsp_acc()
5529 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5533 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5534 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5536 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5538 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5541 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5543 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5545 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5546 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5547 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5548 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5549 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5552 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5558 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5563 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5564 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5568 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5569 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5571 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5573 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5576 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5578 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5580 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5581 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5582 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5583 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5584 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5587 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5590 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_acc()
5598 memcpy(sp, &phba->fc_fabparam, in lpfc_els_rsp_acc()
5602 sp->cmn.fPort = 0; in lpfc_els_rsp_acc()
5605 sp->cls1.classValid = 0; in lpfc_els_rsp_acc()
5606 sp->cls2.classValid = 0; in lpfc_els_rsp_acc()
5607 sp->cls3.classValid = 0; in lpfc_els_rsp_acc()
5608 sp->cls4.classValid = 0; in lpfc_els_rsp_acc()
5611 memcpy(&sp->portName, &vport->fc_sparam.portName, in lpfc_els_rsp_acc()
5613 memcpy(&sp->nodeName, &vport->fc_sparam.nodeName, in lpfc_els_rsp_acc()
5616 memcpy(pcmd, &vport->fc_sparam, in lpfc_els_rsp_acc()
5619 sp->cmn.valid_vendor_ver_level = 0; in lpfc_els_rsp_acc()
5620 memset(sp->un.vendorVersion, 0, in lpfc_els_rsp_acc()
5621 sizeof(sp->un.vendorVersion)); in lpfc_els_rsp_acc()
5622 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_els_rsp_acc()
5627 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_els_rsp_acc()
5628 sp->cmn.valid_vendor_ver_level = 1; in lpfc_els_rsp_acc()
5629 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_els_rsp_acc()
5630 sp->un.vv.flags = in lpfc_els_rsp_acc()
5637 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5641 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5642 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO); in lpfc_els_rsp_acc()
5646 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5647 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5649 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5651 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5654 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5656 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5658 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5659 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5660 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5661 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5662 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5665 pcmd = (u8 *) elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5667 memcpy(pcmd, oldiocb->cmd_dmabuf->virt, in lpfc_els_rsp_acc()
5671 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; in lpfc_els_rsp_acc()
5675 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5679 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5680 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5684 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5685 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5687 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5689 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5692 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5694 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5696 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5697 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5698 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5699 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5700 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5703 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5706 rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_els_rsp_acc()
5708 /* FC-LS-5 specifies desc_list_len shall be set to 12 */ in lpfc_els_rsp_acc()
5709 rdf_resp->desc_list_len = cpu_to_be32(12); in lpfc_els_rsp_acc()
5711 /* FC-LS-5 specifies LS REQ Information descriptor */ in lpfc_els_rsp_acc()
5712 rdf_resp->lsri.desc_tag = cpu_to_be32(1); in lpfc_els_rsp_acc()
5713 rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32)); in lpfc_els_rsp_acc()
5714 rdf_resp->lsri.rqst_w0.cmd = ELS_RDF; in lpfc_els_rsp_acc()
5719 if (ndlp->nlp_flag & NLP_LOGO_ACC) { in lpfc_els_rsp_acc()
5720 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5721 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED || in lpfc_els_rsp_acc()
5722 ndlp->nlp_flag & NLP_REG_LOGIN_SEND)) in lpfc_els_rsp_acc()
5723 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_els_rsp_acc()
5724 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_acc()
5725 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc; in lpfc_els_rsp_acc()
5727 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_acc()
5730 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_acc()
5731 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_acc()
5732 if (!elsiocb->ndlp) { in lpfc_els_rsp_acc()
5749 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_els_rsp_acc()
5750 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_acc()
5751 ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_acc()
5756 * lpfc_els_rsp_reject - Prepare and issue a rjt response iocb command
5760 * @ndlp: pointer to a node-list data structure.
5774 * 0 - Successfully issued reject response
5775 * 1 - Failed to issue reject response
5783 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_reject()
5792 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_reject()
5793 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rsp_reject()
5797 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_reject()
5798 wqe = &elsiocb->wqe; in lpfc_els_rsp_reject()
5799 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_reject()
5801 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_reject()
5804 icmd = &elsiocb->iocb; in lpfc_els_rsp_reject()
5805 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_reject()
5806 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_reject()
5807 icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_reject()
5810 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_reject()
5817 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_reject()
5824 rejectError, elsiocb->iotag, in lpfc_els_rsp_reject()
5825 get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID, in lpfc_els_rsp_reject()
5826 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_els_rsp_reject()
5829 ndlp->nlp_DID, ndlp->nlp_flag, rejectError); in lpfc_els_rsp_reject()
5831 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rsp_reject()
5832 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_reject()
5833 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_reject()
5834 if (!elsiocb->ndlp) { in lpfc_els_rsp_reject()
5843 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_rsp_reject()
5844 vport->port_type == LPFC_NPIV_PORT && in lpfc_els_rsp_reject()
5845 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_els_rsp_reject()
5846 spin_lock_irq(&ndlp->lock); in lpfc_els_rsp_reject()
5847 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_els_rsp_reject()
5848 spin_unlock_irq(&ndlp->lock); in lpfc_els_rsp_reject()
5862 * lpfc_issue_els_edc_rsp - Exchange Diagnostic Capabilities with the fabric.
5867 * This routine issues an EDC ACC RSP to the F-Port Controller to communicate
5872 * 0 - Successfully issued edc rsp command
5873 * 1 - Failed to issue edc rsp command
5879 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc_rsp()
5895 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry, in lpfc_issue_els_edc_rsp()
5896 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_issue_els_edc_rsp()
5900 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_edc_rsp()
5901 wqe = &elsiocb->wqe; in lpfc_issue_els_edc_rsp()
5902 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_issue_els_edc_rsp()
5904 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_issue_els_edc_rsp()
5907 icmd = &elsiocb->iocb; in lpfc_issue_els_edc_rsp()
5908 cmd = &cmdiocb->iocb; in lpfc_issue_els_edc_rsp()
5909 icmd->ulpContext = cmd->ulpContext; /* Xri / rx_id */ in lpfc_issue_els_edc_rsp()
5910 icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id; in lpfc_issue_els_edc_rsp()
5913 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc_rsp()
5917 edc_rsp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_issue_els_edc_rsp()
5918 edc_rsp->desc_list_len = cpu_to_be32(sizeof(struct fc_els_lsri_desc) + in lpfc_issue_els_edc_rsp()
5920 edc_rsp->lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO); in lpfc_issue_els_edc_rsp()
5921 edc_rsp->lsri.desc_len = cpu_to_be32( in lpfc_issue_els_edc_rsp()
5923 edc_rsp->lsri.rqst_w0.cmd = ELS_EDC; in lpfc_issue_els_edc_rsp()
5924 tlv = edc_rsp->desc; in lpfc_issue_els_edc_rsp()
5932 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_issue_els_edc_rsp()
5933 kref_read(&ndlp->kref)); in lpfc_issue_els_edc_rsp()
5934 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_issue_els_edc_rsp()
5936 phba->fc_stat.elsXmitACC++; in lpfc_issue_els_edc_rsp()
5937 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc_rsp()
5938 if (!elsiocb->ndlp) { in lpfc_issue_els_edc_rsp()
5955 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_issue_els_edc_rsp()
5956 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_issue_els_edc_rsp()
5957 ndlp->nlp_rpi, vport->fc_flag); in lpfc_issue_els_edc_rsp()
5963 * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
5966 * @ndlp: pointer to a node-list data structure.
5978 * 0 - Successfully issued acc adisc response
5979 * 1 - Failed to issue adisc acc response
5985 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_adisc_acc()
5996 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_adisc_acc()
5997 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_adisc_acc()
6001 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_adisc_acc()
6002 wqe = &elsiocb->wqe; in lpfc_els_rsp_adisc_acc()
6004 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_adisc_acc()
6008 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_adisc_acc()
6011 icmd = &elsiocb->iocb; in lpfc_els_rsp_adisc_acc()
6012 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_adisc_acc()
6013 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_adisc_acc()
6014 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_adisc_acc()
6015 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_adisc_acc()
6016 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_adisc_acc()
6023 elsiocb->iotag, ulp_context, in lpfc_els_rsp_adisc_acc()
6024 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_adisc_acc()
6025 ndlp->nlp_rpi); in lpfc_els_rsp_adisc_acc()
6026 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_adisc_acc()
6032 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_els_rsp_adisc_acc()
6033 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
6034 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
6035 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_adisc_acc()
6039 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_adisc_acc()
6041 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_adisc_acc()
6042 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_adisc_acc()
6043 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_adisc_acc()
6044 if (!elsiocb->ndlp) { in lpfc_els_rsp_adisc_acc()
6060 * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
6063 * @ndlp: pointer to a node-list data structure.
6075 * 0 - Successfully issued acc prli response
6076 * 1 - Failed to issue acc prli response
6082 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_prli_acc()
6100 req_buf = oldiocb->cmd_dmabuf; in lpfc_els_rsp_prli_acc()
6101 req_payload = (((uint32_t *)req_buf->virt) + 1); in lpfc_els_rsp_prli_acc()
6120 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_prli_acc()
6121 ndlp->nlp_DID, elsrspcmd); in lpfc_els_rsp_prli_acc()
6125 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_prli_acc()
6126 wqe = &elsiocb->wqe; in lpfc_els_rsp_prli_acc()
6127 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_prli_acc()
6130 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_prli_acc()
6133 icmd = &elsiocb->iocb; in lpfc_els_rsp_prli_acc()
6134 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_prli_acc()
6135 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_prli_acc()
6136 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_prli_acc()
6137 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_prli_acc()
6138 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_prli_acc()
6145 elsiocb->iotag, ulp_context, in lpfc_els_rsp_prli_acc()
6146 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_prli_acc()
6147 ndlp->nlp_rpi); in lpfc_els_rsp_prli_acc()
6148 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_prli_acc()
6155 vpd = &phba->vpd; in lpfc_els_rsp_prli_acc()
6160 * is 3.20 or later, set the following bits for FC-TAPE in lpfc_els_rsp_prli_acc()
6164 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_els_rsp_prli_acc()
6165 (vpd->rev.feaLevelHigh >= 0x02)) { in lpfc_els_rsp_prli_acc()
6166 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6167 npr->Retry = 1; in lpfc_els_rsp_prli_acc()
6168 npr->TaskRetryIdReq = 1; in lpfc_els_rsp_prli_acc()
6170 npr->acceptRspCode = PRLI_REQ_EXECUTED; in lpfc_els_rsp_prli_acc()
6173 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_els_rsp_prli_acc()
6174 npr->estabImagePair = 1; in lpfc_els_rsp_prli_acc()
6176 npr->estabImagePair = 0; in lpfc_els_rsp_prli_acc()
6177 npr->readXferRdyDis = 1; in lpfc_els_rsp_prli_acc()
6178 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6179 npr->prliType = PRLI_FCP_TYPE; in lpfc_els_rsp_prli_acc()
6180 npr->initiatorFunc = 1; in lpfc_els_rsp_prli_acc()
6186 "retry %d task %d\n", in lpfc_els_rsp_prli_acc()
6187 npr->estabImagePair, in lpfc_els_rsp_prli_acc()
6188 npr->Retry, npr->TaskRetryIdReq); in lpfc_els_rsp_prli_acc()
6196 if (phba->nvmet_support) { in lpfc_els_rsp_prli_acc()
6199 if (phba->cfg_nvme_enable_fb) { in lpfc_els_rsp_prli_acc()
6207 phba->cfg_nvmet_fb_size); in lpfc_els_rsp_prli_acc()
6217 npr_nvme->word1, npr_nvme->word4, in lpfc_els_rsp_prli_acc()
6218 npr_nvme->word5, ndlp->nlp_flag, in lpfc_els_rsp_prli_acc()
6219 ndlp->nlp_fcp_info, ndlp->nlp_type); in lpfc_els_rsp_prli_acc()
6220 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_els_rsp_prli_acc()
6221 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_els_rsp_prli_acc()
6222 npr_nvme->word5 = cpu_to_be32(npr_nvme->word5); in lpfc_els_rsp_prli_acc()
6226 prli_fc4_req, ndlp->nlp_fc4_type, in lpfc_els_rsp_prli_acc()
6227 ndlp->nlp_DID); in lpfc_els_rsp_prli_acc()
6231 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_prli_acc()
6233 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_prli_acc()
6234 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_prli_acc()
6235 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_prli_acc()
6236 if (!elsiocb->ndlp) { in lpfc_els_rsp_prli_acc()
6252 * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
6256 * @ndlp: pointer to a node-list data structure.
6268 * 0 - Successfully issued acc rnid response
6269 * 1 - Failed to issue acc rnid response
6275 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rnid_acc()
6290 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rnid_acc()
6291 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rnid_acc()
6295 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rnid_acc()
6296 wqe = &elsiocb->wqe; in lpfc_els_rsp_rnid_acc()
6297 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rnid_acc()
6300 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rnid_acc()
6303 icmd = &elsiocb->iocb; in lpfc_els_rsp_rnid_acc()
6304 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_rnid_acc()
6305 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_rnid_acc()
6306 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_rnid_acc()
6307 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_rnid_acc()
6308 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_rnid_acc()
6314 elsiocb->iotag, ulp_context); in lpfc_els_rsp_rnid_acc()
6315 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rnid_acc()
6321 rn->Format = format; in lpfc_els_rsp_rnid_acc()
6322 rn->CommonLen = (2 * sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6323 memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6324 memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6327 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6330 rn->SpecificLen = sizeof(RNID_TOP_DISC); in lpfc_els_rsp_rnid_acc()
6331 memcpy(&rn->un.topologyDisc.portName, in lpfc_els_rsp_rnid_acc()
6332 &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6333 rn->un.topologyDisc.unitType = RNID_HBA; in lpfc_els_rsp_rnid_acc()
6334 rn->un.topologyDisc.physPort = 0; in lpfc_els_rsp_rnid_acc()
6335 rn->un.topologyDisc.attachedNodes = 0; in lpfc_els_rsp_rnid_acc()
6338 rn->CommonLen = 0; in lpfc_els_rsp_rnid_acc()
6339 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6345 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_rnid_acc()
6347 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rnid_acc()
6348 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rnid_acc()
6349 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rnid_acc()
6350 if (!elsiocb->ndlp) { in lpfc_els_rsp_rnid_acc()
6366 * lpfc_els_clear_rrq - Clear the rq that this rrq describes.
6369 * @ndlp: pointer to a node-list data structure.
6377 struct lpfc_hba *phba = vport->phba; in lpfc_els_clear_rrq()
6385 pcmd = (uint8_t *)iocb->cmd_dmabuf->virt; in lpfc_els_clear_rrq()
6388 rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg); in lpfc_els_clear_rrq()
6402 ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg); in lpfc_els_clear_rrq()
6403 if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq))) in lpfc_els_clear_rrq()
6407 prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID); in lpfc_els_clear_rrq()
6414 * lpfc_els_rsp_echo_acc - Issue echo acc response
6418 * @ndlp: pointer to a node-list data structure.
6421 * 0 - Successfully issued acc echo response
6422 * 1 - Failed to issue acc echo response
6428 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_echo_acc()
6437 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rsp_echo_acc()
6438 cmdsize = oldiocb->wcqe_cmpl.total_data_placed; in lpfc_els_rsp_echo_acc()
6440 cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_rsp_echo_acc()
6447 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_echo_acc()
6448 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_echo_acc()
6452 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_echo_acc()
6453 wqe = &elsiocb->wqe; in lpfc_els_rsp_echo_acc()
6454 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_echo_acc()
6457 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_echo_acc()
6460 icmd = &elsiocb->iocb; in lpfc_els_rsp_echo_acc()
6461 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_echo_acc()
6462 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_echo_acc()
6463 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_echo_acc()
6464 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_echo_acc()
6465 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_echo_acc()
6471 elsiocb->iotag, ulp_context); in lpfc_els_rsp_echo_acc()
6472 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_echo_acc()
6475 memcpy(pcmd, data, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_echo_acc()
6479 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_echo_acc()
6481 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_echo_acc()
6482 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_echo_acc()
6483 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_echo_acc()
6484 if (!elsiocb->ndlp) { in lpfc_els_rsp_echo_acc()
6500 * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
6508 * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
6526 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_adisc()
6528 if (ndlp->nlp_state != NLP_STE_NPR_NODE || in lpfc_els_disc_adisc()
6529 !(ndlp->nlp_flag & NLP_NPR_ADISC)) in lpfc_els_disc_adisc()
6532 spin_lock_irq(&ndlp->lock); in lpfc_els_disc_adisc()
6533 ndlp->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_els_disc_adisc()
6534 spin_unlock_irq(&ndlp->lock); in lpfc_els_disc_adisc()
6536 if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) { in lpfc_els_disc_adisc()
6549 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_adisc()
6553 vport->num_disc_nodes++; in lpfc_els_disc_adisc()
6554 if (vport->num_disc_nodes >= in lpfc_els_disc_adisc()
6555 vport->cfg_discovery_threads) { in lpfc_els_disc_adisc()
6556 spin_lock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6557 vport->fc_flag |= FC_NLP_MORE; in lpfc_els_disc_adisc()
6558 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6564 spin_lock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6565 vport->fc_flag &= ~FC_NLP_MORE; in lpfc_els_disc_adisc()
6566 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_adisc()
6572 * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
6579 * incremented. If the num_disc_nodes reaches a pre-configured threshold
6598 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_plogi()
6599 if (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_els_disc_plogi()
6600 (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 && in lpfc_els_disc_plogi()
6601 (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 && in lpfc_els_disc_plogi()
6602 (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) { in lpfc_els_disc_plogi()
6603 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_plogi()
6605 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_disc_plogi()
6607 vport->num_disc_nodes++; in lpfc_els_disc_plogi()
6608 if (vport->num_disc_nodes >= in lpfc_els_disc_plogi()
6609 vport->cfg_discovery_threads) { in lpfc_els_disc_plogi()
6610 spin_lock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6611 vport->fc_flag |= FC_NLP_MORE; in lpfc_els_disc_plogi()
6612 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6620 sentplogi, vport->fc_flag); in lpfc_els_disc_plogi()
6626 spin_lock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6627 vport->fc_flag &= ~FC_NLP_MORE; in lpfc_els_disc_plogi()
6628 spin_unlock_irq(shost->host_lock); in lpfc_els_disc_plogi()
6638 desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG); in lpfc_rdp_res_link_service()
6639 desc->payload.els_req = word0; in lpfc_rdp_res_link_service()
6640 desc->length = cpu_to_be32(sizeof(desc->payload)); in lpfc_rdp_res_link_service()
6659 desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG); in lpfc_rdp_res_sfp_desc()
6666 if ((trasn_code_byte4->fc_sw_laser) || in lpfc_rdp_res_sfp_desc()
6667 (trasn_code_byte5->fc_sw_laser_sl) || in lpfc_rdp_res_sfp_desc()
6668 (trasn_code_byte5->fc_sw_laser_sn)) { /* check if its short WL */ in lpfc_rdp_res_sfp_desc()
6670 } else if (trasn_code_byte4->fc_lw_laser) { in lpfc_rdp_res_sfp_desc()
6698 desc->sfp_info.temperature = cpu_to_be16(temperature); in lpfc_rdp_res_sfp_desc()
6699 desc->sfp_info.rx_power = cpu_to_be16(rx_power); in lpfc_rdp_res_sfp_desc()
6700 desc->sfp_info.tx_bias = cpu_to_be16(tx_bias); in lpfc_rdp_res_sfp_desc()
6701 desc->sfp_info.tx_power = cpu_to_be16(tx_power); in lpfc_rdp_res_sfp_desc()
6702 desc->sfp_info.vcc = cpu_to_be16(vcc); in lpfc_rdp_res_sfp_desc()
6704 desc->sfp_info.flags = cpu_to_be16(flag); in lpfc_rdp_res_sfp_desc()
6705 desc->length = cpu_to_be32(sizeof(desc->sfp_info)); in lpfc_rdp_res_sfp_desc()
6716 desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG); in lpfc_rdp_res_link_error()
6720 desc->info.port_type = cpu_to_be32(type); in lpfc_rdp_res_link_error()
6722 desc->info.link_status.link_failure_cnt = in lpfc_rdp_res_link_error()
6723 cpu_to_be32(stat->linkFailureCnt); in lpfc_rdp_res_link_error()
6724 desc->info.link_status.loss_of_synch_cnt = in lpfc_rdp_res_link_error()
6725 cpu_to_be32(stat->lossSyncCnt); in lpfc_rdp_res_link_error()
6726 desc->info.link_status.loss_of_signal_cnt = in lpfc_rdp_res_link_error()
6727 cpu_to_be32(stat->lossSignalCnt); in lpfc_rdp_res_link_error()
6728 desc->info.link_status.primitive_seq_proto_err = in lpfc_rdp_res_link_error()
6729 cpu_to_be32(stat->primSeqErrCnt); in lpfc_rdp_res_link_error()
6730 desc->info.link_status.invalid_trans_word = in lpfc_rdp_res_link_error()
6731 cpu_to_be32(stat->invalidXmitWord); in lpfc_rdp_res_link_error()
6732 desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt); in lpfc_rdp_res_link_error()
6734 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_link_error()
6745 desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG); in lpfc_rdp_res_bbc_desc()
6747 bbCredit = vport->fc_sparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6748 (vport->fc_sparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6749 desc->bbc_info.port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6750 if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_rdp_res_bbc_desc()
6751 bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6752 (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6753 desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6755 desc->bbc_info.attached_port_bbc = 0; in lpfc_rdp_res_bbc_desc()
6758 desc->bbc_info.rtt = 0; in lpfc_rdp_res_bbc_desc()
6759 desc->length = cpu_to_be32(sizeof(desc->bbc_info)); in lpfc_rdp_res_bbc_desc()
6770 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_temp_desc()
6772 desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6773 desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6774 desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6775 desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6777 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6779 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6781 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6783 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6787 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_temp_desc()
6788 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_temp_desc()
6799 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_voltage_desc()
6801 desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6802 desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6803 desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6804 desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6806 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6808 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6810 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6812 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6816 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_voltage_desc()
6817 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_voltage_desc()
6828 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txbias_desc()
6830 desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6831 desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6832 desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6833 desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6835 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6837 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6839 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6841 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6845 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txbias_desc()
6846 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txbias_desc()
6857 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txpower_desc()
6859 desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6860 desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6861 desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6862 desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6864 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6866 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6868 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6870 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6874 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txpower_desc()
6875 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txpower_desc()
6887 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_rxpower_desc()
6889 desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6890 desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6891 desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6892 desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6894 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6896 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6898 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6900 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6904 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_rxpower_desc()
6905 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_rxpower_desc()
6913 desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG); in lpfc_rdp_res_opd_desc()
6914 memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16); in lpfc_rdp_res_opd_desc()
6915 memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16); in lpfc_rdp_res_opd_desc()
6916 memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16); in lpfc_rdp_res_opd_desc()
6917 memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4); in lpfc_rdp_res_opd_desc()
6918 memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8); in lpfc_rdp_res_opd_desc()
6919 desc->length = cpu_to_be32(sizeof(desc->opd_info)); in lpfc_rdp_res_opd_desc()
6928 desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG); in lpfc_rdp_res_fec_desc()
6930 desc->info.CorrectedBlocks = in lpfc_rdp_res_fec_desc()
6931 cpu_to_be32(stat->fecCorrBlkCount); in lpfc_rdp_res_fec_desc()
6932 desc->info.UncorrectableBlocks = in lpfc_rdp_res_fec_desc()
6933 cpu_to_be32(stat->fecUncorrBlkCount); in lpfc_rdp_res_fec_desc()
6935 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_fec_desc()
6946 desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG); in lpfc_rdp_res_speed()
6948 switch (phba->fc_linkspeed) { in lpfc_rdp_res_speed()
6984 desc->info.port_speed.speed = cpu_to_be16(rdp_speed); in lpfc_rdp_res_speed()
6986 if (phba->lmt & LMT_256Gb) in lpfc_rdp_res_speed()
6988 if (phba->lmt & LMT_128Gb) in lpfc_rdp_res_speed()
6990 if (phba->lmt & LMT_64Gb) in lpfc_rdp_res_speed()
6992 if (phba->lmt & LMT_32Gb) in lpfc_rdp_res_speed()
6994 if (phba->lmt & LMT_16Gb) in lpfc_rdp_res_speed()
6996 if (phba->lmt & LMT_10Gb) in lpfc_rdp_res_speed()
6998 if (phba->lmt & LMT_8Gb) in lpfc_rdp_res_speed()
7000 if (phba->lmt & LMT_4Gb) in lpfc_rdp_res_speed()
7002 if (phba->lmt & LMT_2Gb) in lpfc_rdp_res_speed()
7004 if (phba->lmt & LMT_1Gb) in lpfc_rdp_res_speed()
7009 if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO) in lpfc_rdp_res_speed()
7012 desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap); in lpfc_rdp_res_speed()
7013 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_speed()
7022 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_diag_port_names()
7024 memcpy(desc->port_names.wwnn, &vport->fc_nodename, in lpfc_rdp_res_diag_port_names()
7025 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_diag_port_names()
7027 memcpy(desc->port_names.wwpn, &vport->fc_portname, in lpfc_rdp_res_diag_port_names()
7028 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_diag_port_names()
7030 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_diag_port_names()
7039 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_attach_port_names()
7040 if (vport->fc_flag & FC_FABRIC) { in lpfc_rdp_res_attach_port_names()
7041 memcpy(desc->port_names.wwnn, &vport->fabric_nodename, in lpfc_rdp_res_attach_port_names()
7042 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
7044 memcpy(desc->port_names.wwpn, &vport->fabric_portname, in lpfc_rdp_res_attach_port_names()
7045 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
7047 memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename, in lpfc_rdp_res_attach_port_names()
7048 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
7050 memcpy(desc->port_names.wwpn, &ndlp->nlp_portname, in lpfc_rdp_res_attach_port_names()
7051 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
7054 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_attach_port_names()
7062 struct lpfc_nodelist *ndlp = rdp_context->ndlp; in lpfc_els_rdp_cmpl()
7063 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_rdp_cmpl()
7083 lpfc_max_els_tries, rdp_context->ndlp, in lpfc_els_rdp_cmpl()
7084 rdp_context->ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rdp_cmpl()
7089 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7090 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7091 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7092 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7093 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7094 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7095 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7097 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7098 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7099 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7105 elsiocb->iotag, ulp_context, in lpfc_els_rdp_cmpl()
7106 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rdp_cmpl()
7107 ndlp->nlp_rpi); in lpfc_els_rdp_cmpl()
7108 rdp_res = (struct fc_rdp_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7109 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7114 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS); in lpfc_els_rdp_cmpl()
7115 phba->sfp_alarm |= *flag_ptr; in lpfc_els_rdp_cmpl()
7116 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS); in lpfc_els_rdp_cmpl()
7117 phba->sfp_warning |= *flag_ptr; in lpfc_els_rdp_cmpl()
7125 rdp_context->page_a0, rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7129 (len + pcmd), &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7135 &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7137 &rdp_context->link_stat, vport); in lpfc_els_rdp_cmpl()
7140 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7143 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7146 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7149 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7152 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7154 rdp_context->page_a0, vport); in lpfc_els_rdp_cmpl()
7156 rdp_res->length = cpu_to_be32(len - 8); in lpfc_els_rdp_cmpl()
7157 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7160 bpl = (struct ulp_bde64 *)elsiocb->bpl_dmabuf->virt; in lpfc_els_rdp_cmpl()
7161 bpl->tus.f.bdeSize = len; in lpfc_els_rdp_cmpl()
7162 bpl->tus.f.bdeFlags = 0; in lpfc_els_rdp_cmpl()
7163 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfc_els_rdp_cmpl()
7165 phba->fc_stat.elsXmitACC++; in lpfc_els_rdp_cmpl()
7166 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7167 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7183 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rdp_cmpl()
7187 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7188 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7189 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7190 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7191 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7193 &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7194 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7196 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7197 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7198 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7201 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7205 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_rdp_cmpl()
7207 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rdp_cmpl()
7208 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7209 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7210 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7235 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_rdp_info()
7244 mbox->vport = rdp_context->ndlp->vport; in lpfc_get_rdp_info()
7245 mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0; in lpfc_get_rdp_info()
7246 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_rdp_info()
7256 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_rdp_info()
7270 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_sfp_info_wait()
7279 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7281 virt = mp->virt; in lpfc_get_sfp_info_wait()
7282 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7283 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7284 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7285 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7286 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7287 mb->un.varWords[3] = DMP_SFF_PAGE_A0_SIZE / 4; in lpfc_get_sfp_info_wait()
7288 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7289 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7290 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7291 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7292 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7293 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7294 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7295 mbox->in_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7296 mbox->out_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7297 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7298 mbox->ctx_buf = virt; in lpfc_get_sfp_info_wait()
7301 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A0_SIZE); in lpfc_get_sfp_info_wait()
7302 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7303 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7305 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7306 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_sfp_info_wait()
7314 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_get_sfp_info_wait()
7315 mp = (struct lpfc_dmabuf *)(mbox->ctx_buf); in lpfc_get_sfp_info_wait()
7319 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7324 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a0, in lpfc_get_sfp_info_wait()
7328 memset(mp->virt, 0, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7329 INIT_LIST_HEAD(&mp->list); in lpfc_get_sfp_info_wait()
7332 mbox->ctx_buf = mp; in lpfc_get_sfp_info_wait()
7333 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7335 bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_DUMP_MEMORY); in lpfc_get_sfp_info_wait()
7337 &mbox->u.mqe.un.mem_dump_type3, DMP_LMSD); in lpfc_get_sfp_info_wait()
7339 &mbox->u.mqe.un.mem_dump_type3, phba->sli4_hba.physical_port); in lpfc_get_sfp_info_wait()
7341 &mbox->u.mqe.un.mem_dump_type3, DMP_PAGE_A2); in lpfc_get_sfp_info_wait()
7342 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7343 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7344 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7345 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7346 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7347 mb->un.varWords[3] = DMP_SFF_PAGE_A2_SIZE / 4; in lpfc_get_sfp_info_wait()
7348 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7349 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7350 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7351 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7352 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7353 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7354 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7355 mbox->in_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7356 mbox->out_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7357 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7358 mbox->ctx_buf = virt; in lpfc_get_sfp_info_wait()
7361 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7362 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7363 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7366 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context; in lpfc_get_sfp_info_wait()
7368 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7374 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a2, in lpfc_get_sfp_info_wait()
7378 mbox->ctx_buf = mpsave; in lpfc_get_sfp_info_wait()
7384 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_sfp_info_wait()
7389 * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
7392 * @ndlp: pointer to a node-list data structure.
7396 * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
7402 * 0 - Sent the acc response
7403 * 1 - Sent the reject response.
7409 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rdp()
7417 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7418 bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_rdp()
7425 if (phba->sli_rev < LPFC_SLI_REV4 || (phba->hba_flag & HBA_FCOE_MODE)) { in lpfc_els_rcv_rdp()
7431 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rdp()
7432 rdp_req = (struct fc_rdp_req_frame *) pcmd->virt; in lpfc_els_rcv_rdp()
7437 be32_to_cpu(rdp_req->rdp_des_length), in lpfc_els_rcv_rdp()
7438 be32_to_cpu(rdp_req->nport_id_desc.tag), in lpfc_els_rcv_rdp()
7439 be32_to_cpu(rdp_req->nport_id_desc.nport_id), in lpfc_els_rcv_rdp()
7440 be32_to_cpu(rdp_req->nport_id_desc.length)); in lpfc_els_rcv_rdp()
7443 be32_to_cpu(rdp_req->rdp_des_length)) in lpfc_els_rcv_rdp()
7445 if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag)) in lpfc_els_rcv_rdp()
7448 be32_to_cpu(rdp_req->nport_id_desc.length)) in lpfc_els_rcv_rdp()
7456 cmd = &cmdiocb->wqe; in lpfc_els_rcv_rdp()
7457 rdp_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rdp()
7458 if (!rdp_context->ndlp) { in lpfc_els_rcv_rdp()
7463 rdp_context->ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_rdp()
7464 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7465 rdp_context->rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_rdp()
7466 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7467 rdp_context->cmpl = lpfc_els_rdp_cmpl; in lpfc_els_rcv_rdp()
7469 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS, in lpfc_els_rcv_rdp()
7507 mb = &pmb->u.mb; in lpfc_els_lcb_rsp()
7508 lcb_context = (struct lpfc_lcb_context *)pmb->ctx_ndlp; in lpfc_els_lcb_rsp()
7509 ndlp = lcb_context->ndlp; in lpfc_els_lcb_rsp()
7510 pmb->ctx_ndlp = NULL; in lpfc_els_lcb_rsp()
7511 pmb->ctx_buf = NULL; in lpfc_els_lcb_rsp()
7514 &pmb->u.mqe.un.beacon_config.header.cfg_shdr; in lpfc_els_lcb_rsp()
7515 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_els_lcb_rsp()
7516 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_els_lcb_rsp()
7522 shdr_status, shdr_add_status, mb->mbxStatus); in lpfc_els_lcb_rsp()
7524 if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status || in lpfc_els_lcb_rsp()
7527 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7531 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7533 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7535 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_lcb_rsp()
7543 lcb_res = (struct fc_lcb_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7547 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7548 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7549 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7550 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7551 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7553 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7554 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7555 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7558 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7560 lcb_res->lcb_sub_command = lcb_context->sub_command; in lpfc_els_lcb_rsp()
7561 lcb_res->lcb_type = lcb_context->type; in lpfc_els_lcb_rsp()
7562 lcb_res->capability = lcb_context->capability; in lpfc_els_lcb_rsp()
7563 lcb_res->lcb_frequency = lcb_context->frequency; in lpfc_els_lcb_rsp()
7564 lcb_res->lcb_duration = lcb_context->duration; in lpfc_els_lcb_rsp()
7565 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7566 phba->fc_stat.elsXmitACC++; in lpfc_els_lcb_rsp()
7568 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7569 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7585 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7587 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_lcb_rsp()
7592 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7593 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7594 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7595 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7596 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7598 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7599 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7600 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7603 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7607 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_lcb_rsp()
7610 stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS; in lpfc_els_lcb_rsp()
7612 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7613 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_lcb_rsp()
7614 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7615 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7634 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_set_beacon()
7640 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_set_beacon()
7644 cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_set_beacon()
7645 len = sizeof(struct lpfc_mbx_set_beacon_config) - in lpfc_sli4_set_beacon()
7650 mbox->ctx_ndlp = (void *)lcb_context; in lpfc_sli4_set_beacon()
7651 mbox->vport = phba->pport; in lpfc_sli4_set_beacon()
7652 mbox->mbox_cmpl = lpfc_els_lcb_rsp; in lpfc_sli4_set_beacon()
7653 bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7654 phba->sli4_hba.physical_port); in lpfc_sli4_set_beacon()
7655 bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7657 mbox->u.mqe.un.beacon_config.word5 = 0; /* Reserved */ in lpfc_sli4_set_beacon()
7665 if (phba->sli4_hba.pc_sli4_params.bv1s) { in lpfc_sli4_set_beacon()
7667 cfg_shdr->request.word9 = BEACON_VERSION_V1; in lpfc_sli4_set_beacon()
7668 lcb_context->capability |= LCB_CAPABILITY_DURATION; in lpfc_sli4_set_beacon()
7670 &mbox->u.mqe.un.beacon_config, 0); in lpfc_sli4_set_beacon()
7672 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7673 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7676 if (be16_to_cpu(lcb_context->duration) != 0) { in lpfc_sli4_set_beacon()
7677 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7680 cfg_shdr->request.word9 = BEACON_VERSION_V0; in lpfc_sli4_set_beacon()
7681 lcb_context->capability &= ~(LCB_CAPABILITY_DURATION); in lpfc_sli4_set_beacon()
7683 &mbox->u.mqe.un.beacon_config, beacon_state); in lpfc_sli4_set_beacon()
7685 &mbox->u.mqe.un.beacon_config, 1); in lpfc_sli4_set_beacon()
7687 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7688 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7693 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7702 * lpfc_els_rcv_lcb - Process an unsolicited LCB
7705 * @ndlp: pointer to a node-list data structure.
7712 * 0 - Sent the acc response
7713 * 1 - Sent the reject response.
7719 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_lcb()
7727 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_lcb()
7728 lp = (uint8_t *)pcmd->virt; in lpfc_els_rcv_lcb()
7729 beacon = (struct fc_lcb_request_frame *)pcmd->virt; in lpfc_els_rcv_lcb()
7735 beacon->lcb_command, in lpfc_els_rcv_lcb()
7736 beacon->lcb_sub_command, in lpfc_els_rcv_lcb()
7737 beacon->lcb_type, in lpfc_els_rcv_lcb()
7738 beacon->lcb_frequency, in lpfc_els_rcv_lcb()
7739 be16_to_cpu(beacon->lcb_duration)); in lpfc_els_rcv_lcb()
7741 if (beacon->lcb_sub_command != LPFC_LCB_ON && in lpfc_els_rcv_lcb()
7742 beacon->lcb_sub_command != LPFC_LCB_OFF) { in lpfc_els_rcv_lcb()
7747 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_lcb()
7748 phba->hba_flag & HBA_FCOE_MODE || in lpfc_els_rcv_lcb()
7749 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_lcb()
7761 state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0; in lpfc_els_rcv_lcb()
7762 lcb_context->sub_command = beacon->lcb_sub_command; in lpfc_els_rcv_lcb()
7763 lcb_context->capability = 0; in lpfc_els_rcv_lcb()
7764 lcb_context->type = beacon->lcb_type; in lpfc_els_rcv_lcb()
7765 lcb_context->frequency = beacon->lcb_frequency; in lpfc_els_rcv_lcb()
7766 lcb_context->duration = beacon->lcb_duration; in lpfc_els_rcv_lcb()
7767 lcb_context->ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_lcb()
7768 lcb_context->rx_id = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_lcb()
7769 lcb_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_lcb()
7770 if (!lcb_context->ndlp) { in lpfc_els_rcv_lcb()
7776 lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT, in lpfc_els_rcv_lcb()
7795 * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
7807 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_rscn()
7810 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7811 if (vport->fc_rscn_flush) { in lpfc_els_flush_rscn()
7813 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7817 vport->fc_rscn_flush = 1; in lpfc_els_flush_rscn()
7818 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7820 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_els_flush_rscn()
7821 lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]); in lpfc_els_flush_rscn()
7822 vport->fc_rscn_id_list[i] = NULL; in lpfc_els_flush_rscn()
7824 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7825 vport->fc_rscn_id_cnt = 0; in lpfc_els_flush_rscn()
7826 vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY); in lpfc_els_flush_rscn()
7827 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7830 vport->fc_rscn_flush = 0; in lpfc_els_flush_rscn()
7834 * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
7842 * None zero - The @did matched with a pending rscn
7843 * 0 - not able to match @did with a pending rscn
7861 if (vport->fc_flag & FC_RSCN_DISCOVERY) in lpfc_rscn_payload_check()
7864 spin_lock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7865 if (vport->fc_rscn_flush) { in lpfc_rscn_payload_check()
7867 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7871 vport->fc_rscn_flush = 1; in lpfc_rscn_payload_check()
7872 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7873 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_rscn_payload_check()
7874 lp = vport->fc_rscn_id_list[i]->virt; in lpfc_rscn_payload_check()
7876 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_rscn_payload_check()
7879 payload_len -= sizeof(uint32_t); in lpfc_rscn_payload_check()
7902 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7906 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7911 * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
7919 * 0 - Successful (currently alway return 0)
7927 list_for_each_entry_safe(ndlp, n, &vport->fc_nodes, nlp_listp) { in lpfc_rscn_recovery_check()
7928 if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) || in lpfc_rscn_recovery_check()
7929 !lpfc_rscn_payload_check(vport, ndlp->nlp_DID)) in lpfc_rscn_recovery_check()
7933 if (vport->phba->nvmet_support) in lpfc_rscn_recovery_check()
7939 switch (ndlp->nlp_state) { in lpfc_rscn_recovery_check()
7956 * lpfc_send_rscn_event - Send an RSCN event to management application
7973 pcmd = cmdiocb->cmd_dmabuf; in lpfc_send_rscn_event()
7974 payload_ptr = (uint32_t *) pcmd->virt; in lpfc_send_rscn_event()
7984 rscn_event_data->event_type = FC_REG_RSCN_EVENT; in lpfc_send_rscn_event()
7985 rscn_event_data->payload_length = payload_len; in lpfc_send_rscn_event()
7986 memcpy(rscn_event_data->rscn_payload, payload_ptr, in lpfc_send_rscn_event()
7999 * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
8002 * @ndlp: pointer to a node-list data structure.
8017 * 0 - Just sent the acc response
8018 * 1 - Sent the acc response and waited for name server completion
8025 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rscn()
8033 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rscn()
8034 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rscn()
8037 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_els_rcv_rscn()
8041 vport->fc_flag, payload_len, *lp, in lpfc_els_rcv_rscn()
8042 vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8051 /* Check if RSCN is coming from a direct-connected remote NPort */ in lpfc_els_rcv_rscn()
8052 if (vport->fc_flag & FC_PT2PT) { in lpfc_els_rcv_rscn()
8056 *lp, vport->fc_flag, payload_len); in lpfc_els_rcv_rscn()
8062 if (ndlp->nlp_fc4_type & NLP_FC4_NVME && in lpfc_els_rcv_rscn()
8063 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) in lpfc_els_rcv_rscn()
8071 if (vport->port_state <= LPFC_NS_QRY) { in lpfc_els_rcv_rscn()
8074 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8083 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_rcv_rscn()
8084 !(vport->cfg_peer_port_login)) { in lpfc_els_rcv_rscn()
8090 i -= sizeof(uint32_t); in lpfc_els_rcv_rscn()
8100 vport->fc_flag, payload_len, in lpfc_els_rcv_rscn()
8101 *lp, vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8104 ndlp->nlp_DID, vport->port_state, in lpfc_els_rcv_rscn()
8105 ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8110 if (vport->fc_flag & FC_DISC_TMO) { in lpfc_els_rcv_rscn()
8111 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8112 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8120 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8121 if (vport->fc_rscn_flush) { in lpfc_els_rcv_rscn()
8123 vport->fc_flag |= FC_RSCN_DISCOVERY; in lpfc_els_rcv_rscn()
8124 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8130 vport->fc_rscn_flush = 1; in lpfc_els_rcv_rscn()
8131 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8133 rscn_cnt = vport->fc_rscn_id_cnt; in lpfc_els_rcv_rscn()
8135 * RSCN payload buffer, cmdiocb->cmd_dmabuf to process later. in lpfc_els_rcv_rscn()
8137 if (vport->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) { in lpfc_els_rcv_rscn()
8140 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8142 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8143 vport->fc_flag |= FC_RSCN_DEFERRED; in lpfc_els_rcv_rscn()
8146 if (vport->fc_flag & FC_DISC_TMO) { in lpfc_els_rcv_rscn()
8147 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8148 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8152 !(vport->fc_flag & FC_RSCN_DISCOVERY)) { in lpfc_els_rcv_rscn()
8153 vport->fc_flag |= FC_RSCN_MODE; in lpfc_els_rcv_rscn()
8154 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8156 cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt; in lpfc_els_rcv_rscn()
8166 vport->fc_rscn_id_list[rscn_cnt] = pcmd; in lpfc_els_rcv_rscn()
8167 vport->fc_rscn_id_cnt++; in lpfc_els_rcv_rscn()
8168 /* If we zero, cmdiocb->cmd_dmabuf, the calling in lpfc_els_rcv_rscn()
8171 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8177 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8178 vport->port_state); in lpfc_els_rcv_rscn()
8180 vport->fc_flag |= FC_RSCN_DISCOVERY; in lpfc_els_rcv_rscn()
8181 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8186 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8187 vport->port_state); in lpfc_els_rcv_rscn()
8190 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8199 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8201 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8202 vport->fc_flag |= FC_RSCN_MODE; in lpfc_els_rcv_rscn()
8203 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8204 vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd; in lpfc_els_rcv_rscn()
8206 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8208 * If we zero, cmdiocb->cmd_dmabuf, the calling routine will in lpfc_els_rcv_rscn()
8211 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8221 * lpfc_els_handle_rscn - Handle rscn for a vport
8233 * 0 - Cleaned up rscn on the @vport
8234 * 1 - Wait for plogi to name server before proceed
8240 struct lpfc_hba *phba = vport->phba; in lpfc_els_handle_rscn()
8243 if (vport->load_flag & FC_UNLOADING) { in lpfc_els_handle_rscn()
8254 vport->fc_flag, 0, vport->fc_rscn_id_cnt, in lpfc_els_handle_rscn()
8255 vport->port_state, vport->num_disc_nodes, in lpfc_els_handle_rscn()
8256 vport->gidft_inp); in lpfc_els_handle_rscn()
8259 vport->fc_ns_retry = 0; in lpfc_els_handle_rscn()
8260 vport->num_disc_nodes = 0; in lpfc_els_handle_rscn()
8263 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_els_handle_rscn()
8269 if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) { in lpfc_els_handle_rscn()
8272 } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) { in lpfc_els_handle_rscn()
8281 ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE; in lpfc_els_handle_rscn()
8289 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_handle_rscn()
8292 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_handle_rscn()
8305 * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
8308 * @ndlp: pointer to a node-list data structure.
8311 * unsolicited event. An unsolicited FLOGI can be received in a point-to-
8326 * 0 - Successfully processed the unsolicited flogi
8327 * 1 - Failed to process the unsolicited flogi
8334 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_flogi()
8335 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_flogi()
8336 uint32_t *lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_flogi()
8337 union lpfc_wqe128 *wqe = &cmdiocb->wqe; in lpfc_els_rcv_flogi()
8346 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8355 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_els_rcv_flogi()
8357 did = bf_get(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest); in lpfc_els_rcv_flogi()
8375 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_els_rcv_flogi()
8379 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_els_rcv_flogi()
8380 mbox = mempool_alloc(phba->mbox_mem_pool, in lpfc_els_rcv_flogi()
8386 phba->cfg_topology, in lpfc_els_rcv_flogi()
8387 phba->cfg_link_speed); in lpfc_els_rcv_flogi()
8388 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_rcv_flogi()
8389 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_rcv_flogi()
8390 mbox->vport = vport; in lpfc_els_rcv_flogi()
8395 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_flogi()
8400 phba->link_flag |= LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8412 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8413 vport->fc_flag |= FC_PT2PT_PLOGI; in lpfc_els_rcv_flogi()
8414 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8421 vport->fc_myDID = PT2PT_LocalID; in lpfc_els_rcv_flogi()
8423 vport->fc_myDID = PT2PT_RemoteID; in lpfc_els_rcv_flogi()
8430 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8431 fc_flag = vport->fc_flag; in lpfc_els_rcv_flogi()
8432 port_state = vport->port_state; in lpfc_els_rcv_flogi()
8433 vport->fc_flag |= FC_PT2PT; in lpfc_els_rcv_flogi()
8434 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_els_rcv_flogi()
8437 * work-around. in lpfc_els_rcv_flogi()
8439 vport->rcv_flogi_cnt++; in lpfc_els_rcv_flogi()
8440 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8444 port_state, vport->port_state, in lpfc_els_rcv_flogi()
8445 fc_flag, vport->fc_flag); in lpfc_els_rcv_flogi()
8452 did = vport->fc_myDID; in lpfc_els_rcv_flogi()
8453 vport->fc_myDID = Fabric_DID; in lpfc_els_rcv_flogi()
8455 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_els_rcv_flogi()
8458 if (!(phba->hba_flag & HBA_FLOGI_ISSUED)) { in lpfc_els_rcv_flogi()
8459 phba->defer_flogi_acc_rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_flogi()
8460 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8461 phba->defer_flogi_acc_ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_flogi()
8462 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8464 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8469 phba->defer_flogi_acc_rx_id, in lpfc_els_rcv_flogi()
8470 phba->defer_flogi_acc_ox_id, phba->hba_flag); in lpfc_els_rcv_flogi()
8472 phba->defer_flogi_acc_flag = true; in lpfc_els_rcv_flogi()
8481 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8487 * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
8490 * @ndlp: pointer to a node-list data structure.
8500 * 0 - Successfully processed rnid iocb (currently always return 0)
8511 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rnid()
8512 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rnid()
8519 switch (rn->Format) { in lpfc_els_rcv_rnid()
8523 lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp); in lpfc_els_rcv_rnid()
8538 * lpfc_els_rcv_echo - Process an unsolicited echo iocb
8541 * @ndlp: pointer to a node-list data structure.
8544 * 0 - Successfully processed echo iocb (currently always return 0)
8552 pcmd = (uint8_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_echo()
8562 * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
8565 * @ndlp: pointer to a node-list data structure.
8572 * 0 - Successfully processed lirr iocb (currently always return 0)
8590 * lpfc_els_rcv_rrq - Process an unsolicited rrq iocb
8593 * @ndlp: pointer to a node-list data structure.
8610 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rcv_rrq()
8615 * lpfc_els_rsp_rls_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
8649 mb = &pmb->u.mb; in lpfc_els_rsp_rls_acc()
8651 ndlp = pmb->ctx_ndlp; in lpfc_els_rsp_rls_acc()
8652 rxid = (uint16_t)((unsigned long)(pmb->ctx_buf) & 0xffff); in lpfc_els_rsp_rls_acc()
8653 oxid = (uint16_t)(((unsigned long)(pmb->ctx_buf) >> 16) & 0xffff); in lpfc_els_rsp_rls_acc()
8654 pmb->ctx_buf = NULL; in lpfc_els_rsp_rls_acc()
8655 pmb->ctx_ndlp = NULL; in lpfc_els_rsp_rls_acc()
8657 if (mb->mbxStatus) { in lpfc_els_rsp_rls_acc()
8658 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8663 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rsp_rls_acc()
8665 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rls_acc()
8671 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8676 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rls_acc()
8677 wqe = &elsiocb->wqe; in lpfc_els_rsp_rls_acc()
8679 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, rxid); in lpfc_els_rsp_rls_acc()
8680 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, oxid); in lpfc_els_rsp_rls_acc()
8682 icmd = &elsiocb->iocb; in lpfc_els_rsp_rls_acc()
8683 icmd->ulpContext = rxid; in lpfc_els_rsp_rls_acc()
8684 icmd->unsli3.rcvsli3.ox_id = oxid; in lpfc_els_rsp_rls_acc()
8687 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rls_acc()
8692 rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt); in lpfc_els_rsp_rls_acc()
8693 rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt); in lpfc_els_rsp_rls_acc()
8694 rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt); in lpfc_els_rsp_rls_acc()
8695 rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt); in lpfc_els_rsp_rls_acc()
8696 rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord); in lpfc_els_rsp_rls_acc()
8697 rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt); in lpfc_els_rsp_rls_acc()
8698 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8700 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rsp_rls_acc()
8703 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rls_acc()
8704 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rls_acc()
8705 ndlp->nlp_rpi); in lpfc_els_rsp_rls_acc()
8706 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rls_acc()
8707 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rls_acc()
8708 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rls_acc()
8709 if (!elsiocb->ndlp) { in lpfc_els_rsp_rls_acc()
8723 * lpfc_els_rcv_rls - Process an unsolicited rls iocb
8726 * @ndlp: pointer to a node-list data structure.
8738 * 0 - Successfully processed rls iocb (currently always return 0)
8744 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rls()
8750 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rls()
8751 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rls()
8755 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC); in lpfc_els_rcv_rls()
8758 mbox->ctx_buf = (void *)((unsigned long) in lpfc_els_rcv_rls()
8760 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rls()
8761 if (!mbox->ctx_ndlp) in lpfc_els_rcv_rls()
8763 mbox->vport = vport; in lpfc_els_rcv_rls()
8764 mbox->mbox_cmpl = lpfc_els_rsp_rls_acc; in lpfc_els_rcv_rls()
8774 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_rls()
8787 * lpfc_els_rcv_rtv - Process an unsolicited rtv iocb
8790 * @ndlp: pointer to a node-list data structure.
8805 * 0 - Successfully processed rtv iocb (currently always return 0)
8814 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rtv()
8822 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rtv()
8823 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rtv()
8828 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rcv_rtv()
8830 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rcv_rtv()
8835 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rcv_rtv()
8841 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rcv_rtv()
8842 wqe = &elsiocb->wqe; in lpfc_els_rcv_rtv()
8843 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rcv_rtv()
8845 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rcv_rtv()
8848 icmd = &elsiocb->iocb; in lpfc_els_rcv_rtv()
8849 icmd->ulpContext = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_rtv()
8850 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_rtv()
8856 rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000); /* report msecs */ in lpfc_els_rcv_rtv()
8857 rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov); in lpfc_els_rcv_rtv()
8858 bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0); in lpfc_els_rcv_rtv()
8860 rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8863 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rcv_rtv()
8867 elsiocb->iotag, ulp_context, in lpfc_els_rcv_rtv()
8868 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rcv_rtv()
8869 ndlp->nlp_rpi, in lpfc_els_rcv_rtv()
8870 rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8871 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rcv_rtv()
8872 phba->fc_stat.elsXmitACC++; in lpfc_els_rcv_rtv()
8873 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rtv()
8874 if (!elsiocb->ndlp) { in lpfc_els_rcv_rtv()
8896 /* lpfc_issue_els_rrq - Process an unsolicited rrq iocb
8898 * @ndlp: pointer to a node-list data structure.
8906 * 0 - Successfully sent rrq els iocb.
8907 * 1 - Failed to send rrq els iocb.
8913 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rrq()
8930 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rrq()
8937 bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]); in lpfc_issue_els_rrq()
8938 bf_set(rrq_rxid, els_rrq, rrq->rxid); in lpfc_issue_els_rrq()
8939 bf_set(rrq_did, els_rrq, vport->fc_myDID); in lpfc_issue_els_rrq()
8940 els_rrq->rrq = cpu_to_be32(els_rrq->rrq); in lpfc_issue_els_rrq()
8941 els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg); in lpfc_issue_els_rrq()
8946 did, rrq->xritag, rrq->rxid); in lpfc_issue_els_rrq()
8947 elsiocb->context_un.rrq = rrq; in lpfc_issue_els_rrq()
8948 elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq; in lpfc_issue_els_rrq()
8950 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rrq()
8951 if (!elsiocb->ndlp) in lpfc_issue_els_rrq()
8967 * lpfc_send_rrq - Sends ELS RRQ if needed.
8981 struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport, in lpfc_send_rrq()
8982 rrq->nlp_DID); in lpfc_send_rrq()
8986 if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag)) in lpfc_send_rrq()
8987 return lpfc_issue_els_rrq(rrq->vport, ndlp, in lpfc_send_rrq()
8988 rrq->nlp_DID, rrq); in lpfc_send_rrq()
8994 * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
8998 * @ndlp: pointer to a node-list data structure.
9009 * 0 - Successfully issued ACC RPL ELS command
9010 * 1 - Failed to issue ACC RPL ELS command
9017 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rpl_acc()
9025 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rpl_acc()
9026 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rpl_acc()
9032 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rpl_acc()
9033 wqe = &elsiocb->wqe; in lpfc_els_rsp_rpl_acc()
9035 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rpl_acc()
9037 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rpl_acc()
9040 icmd = &elsiocb->iocb; in lpfc_els_rsp_rpl_acc()
9041 icmd->ulpContext = get_job_ulpcontext(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
9042 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
9045 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rpl_acc()
9055 rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_rpl_acc()
9056 memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname, in lpfc_els_rsp_rpl_acc()
9058 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_rpl_acc()
9064 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rpl_acc()
9065 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rpl_acc()
9066 ndlp->nlp_rpi); in lpfc_els_rsp_rpl_acc()
9067 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rpl_acc()
9068 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rpl_acc()
9069 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rpl_acc()
9070 if (!elsiocb->ndlp) { in lpfc_els_rsp_rpl_acc()
9086 * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
9089 * @ndlp: pointer to a node-list data structure.
9099 * 0 - Successfully processed rpl iocb (currently always return 0)
9112 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rpl()
9113 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_rpl()
9125 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rpl()
9126 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rpl()
9128 maxsize = be32_to_cpu(rpl->maxsize); in lpfc_els_rcv_rpl()
9131 if ((rpl->index == 0) && in lpfc_els_rcv_rpl()
9144 * lpfc_els_rcv_farp - Process an unsolicited farp request els command
9147 * @ndlp: pointer to a node-list data structure.
9165 * 0 - Either the FARP Match Mode not supported or successfully processed
9176 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farp()
9177 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_farp()
9178 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_farp()
9182 /* FARP-REQ received from DID <did> */ in lpfc_els_rcv_farp()
9184 "0601 FARP-REQ received from DID x%x\n", did); in lpfc_els_rcv_farp()
9186 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) { in lpfc_els_rcv_farp()
9192 if (fp->Mflags & FARP_MATCH_PORT) { in lpfc_els_rcv_farp()
9193 if (memcmp(&fp->RportName, &vport->fc_portname, in lpfc_els_rcv_farp()
9199 if (fp->Mflags & FARP_MATCH_NODE) { in lpfc_els_rcv_farp()
9200 if (memcmp(&fp->RnodeName, &vport->fc_nodename, in lpfc_els_rcv_farp()
9206 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_els_rcv_farp()
9207 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_farp()
9209 if (fp->Rflags & FARP_REQUEST_PLOGI) { in lpfc_els_rcv_farp()
9210 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_rcv_farp()
9213 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_rcv_farp()
9217 if (fp->Rflags & FARP_REQUEST_FARPR) in lpfc_els_rcv_farp()
9225 * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
9228 * @ndlp: pointer to a node-list data structure.
9236 * 0 - Successfully processed FARPR IOCB (currently always return 0)
9244 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farpr()
9246 /* FARP-RSP received from DID <did> */ in lpfc_els_rcv_farpr()
9248 "0600 FARP-RSP received from DID x%x\n", did); in lpfc_els_rcv_farpr()
9256 * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
9259 * @fan_ndlp: pointer to a node-list data structure.
9272 * 0 - Successfully processed fan iocb (currently always return 0).
9278 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fan()
9283 lp = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_fan()
9286 if ((vport == phba->pport) && in lpfc_els_rcv_fan()
9287 (vport->port_state == LPFC_LOCAL_CFG_LINK)) { in lpfc_els_rcv_fan()
9288 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName, in lpfc_els_rcv_fan()
9290 (memcmp(&phba->fc_fabparam.portName, &fp->FportName, in lpfc_els_rcv_fan()
9295 /* FAN verified - skip FLOGI */ in lpfc_els_rcv_fan()
9296 vport->fc_myDID = vport->fc_prevDID; in lpfc_els_rcv_fan()
9297 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_els_rcv_fan()
9302 vport->fc_prevDID, vport->fc_myDID); in lpfc_els_rcv_fan()
9311 * lpfc_els_rcv_edc - Process an unsolicited EDC iocb
9314 * @ndlp: pointer to a node-list data structure.
9317 * 0 - Successfully processed echo iocb (currently always return 0)
9323 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_edc()
9332 payload = cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_edc()
9335 bytes_remain = be32_to_cpu(edc_req->desc_len); in lpfc_els_rcv_edc()
9345 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_els_rcv_edc()
9346 phba->cgn_sig_freq = 0; in lpfc_els_rcv_edc()
9347 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_els_rcv_edc()
9352 tlv = edc_req->desc; in lpfc_els_rcv_edc()
9368 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_edc()
9388 be32_to_cpu(plnkflt->desc_tag), in lpfc_els_rcv_edc()
9389 be32_to_cpu(plnkflt->desc_len), in lpfc_els_rcv_edc()
9391 plnkflt->degrade_activate_threshold), in lpfc_els_rcv_edc()
9393 plnkflt->degrade_deactivate_threshold), in lpfc_els_rcv_edc()
9394 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_els_rcv_edc()
9410 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_els_rcv_edc()
9411 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_els_rcv_edc()
9417 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_els_rcv_edc()
9430 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_edc()
9443 * lpfc_els_timeout - Handler funciton to the els timer
9456 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout()
9460 spin_lock_irqsave(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9461 tmo_posted = vport->work_port_events & WORKER_ELS_TMO; in lpfc_els_timeout()
9462 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING))) in lpfc_els_timeout()
9463 vport->work_port_events |= WORKER_ELS_TMO; in lpfc_els_timeout()
9464 spin_unlock_irqrestore(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9466 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING))) in lpfc_els_timeout()
9473 * lpfc_els_timeout_handler - Process an els timeout event
9484 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout_handler()
9496 timeout = (uint32_t)(phba->fc_ratov << 1); in lpfc_els_timeout_handler()
9502 if (phba->pport->load_flag & FC_UNLOADING) in lpfc_els_timeout_handler()
9505 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9506 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9507 spin_lock(&pring->ring_lock); in lpfc_els_timeout_handler()
9509 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_timeout_handler()
9514 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_timeout_handler()
9517 cmd = &piocb->iocb; in lpfc_els_timeout_handler()
9518 iotag = cmd->ulpIoTag; in lpfc_els_timeout_handler()
9521 if ((piocb->cmd_flag & LPFC_IO_LIBDFC) != 0 || in lpfc_els_timeout_handler()
9527 if (piocb->vport != vport) in lpfc_els_timeout_handler()
9530 pcmd = piocb->cmd_dmabuf; in lpfc_els_timeout_handler()
9532 els_command = *(uint32_t *) (pcmd->virt); in lpfc_els_timeout_handler()
9539 if (piocb->drvrTimeout > 0) { in lpfc_els_timeout_handler()
9540 if (piocb->drvrTimeout >= timeout) in lpfc_els_timeout_handler()
9541 piocb->drvrTimeout -= timeout; in lpfc_els_timeout_handler()
9543 piocb->drvrTimeout = 0; in lpfc_els_timeout_handler()
9554 remote_ID = ndlp->nlp_DID; in lpfc_els_timeout_handler()
9556 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_timeout_handler()
9558 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9559 spin_unlock(&pring->ring_lock); in lpfc_els_timeout_handler()
9560 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9568 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9569 list_del_init(&piocb->dlist); in lpfc_els_timeout_handler()
9571 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9577 if (!list_empty(&pring->txcmplq)) in lpfc_els_timeout_handler()
9578 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_els_timeout_handler()
9579 mod_timer(&vport->els_tmofunc, in lpfc_els_timeout_handler()
9584 * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
9591 * the IOCBs with a non-NULL completion callback function, the callback
9608 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_cmd()
9623 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9628 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9632 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9633 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9635 mbx_tmo_err = test_bit(MBX_TMO_ERR, &phba->bit_flags); in lpfc_els_flush_cmd()
9637 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_flush_cmd()
9638 if (piocb->cmd_flag & LPFC_IO_LIBDFC && !mbx_tmo_err) in lpfc_els_flush_cmd()
9641 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9644 if (piocb->cmd_flag & LPFC_DRIVER_ABORTED && !mbx_tmo_err) in lpfc_els_flush_cmd()
9652 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9659 * and avoid any retry logic. in lpfc_els_flush_cmd()
9661 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_els_flush_cmd()
9662 piocb->cmd_cmpl = lpfc_cmpl_els_link_down; in lpfc_els_flush_cmd()
9665 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9668 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9669 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9670 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9674 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9675 list_del_init(&piocb->dlist); in lpfc_els_flush_cmd()
9677 list_move_tail(&piocb->list, &cancel_list); in lpfc_els_flush_cmd()
9681 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9695 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9696 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9697 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9702 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) { in lpfc_els_flush_cmd()
9705 if (piocb->cmd_flag & LPFC_IO_LIBDFC) in lpfc_els_flush_cmd()
9716 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9719 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9720 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9724 if (vport == phba->pport) { in lpfc_els_flush_cmd()
9726 &phba->fabric_iocb_list, list) { in lpfc_els_flush_cmd()
9727 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9728 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9732 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9733 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9734 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9744 * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
9765 spin_lock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9766 list_for_each_entry(vport, &phba->port_list, listentry) in lpfc_els_flush_all_cmd()
9768 spin_unlock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9774 * lpfc_send_els_failure_event - Posts an ELS command failure event
9787 struct lpfc_vport *vport = cmdiocbp->vport; in lpfc_send_els_failure_event()
9796 ndlp = cmdiocbp->ndlp; in lpfc_send_els_failure_event()
9806 memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9808 memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9810 pcmd = (uint32_t *)cmdiocbp->cmd_dmabuf->virt; in lpfc_send_els_failure_event()
9829 memcpy(fabric_event.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9831 memcpy(fabric_event.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9844 * lpfc_send_els_event - Posts unsolicited els event
9869 els_data = &logo_data->header; in lpfc_send_els_event()
9880 els_data->event_type = FC_REG_ELS_EVENT; in lpfc_send_els_event()
9883 els_data->subcategory = LPFC_EVENT_PLOGI_RCV; in lpfc_send_els_event()
9886 els_data->subcategory = LPFC_EVENT_PRLO_RCV; in lpfc_send_els_event()
9889 els_data->subcategory = LPFC_EVENT_ADISC_RCV; in lpfc_send_els_event()
9892 els_data->subcategory = LPFC_EVENT_LOGO_RCV; in lpfc_send_els_event()
9894 memcpy(logo_data->logo_wwpn, &payload[2], in lpfc_send_els_event()
9901 memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9902 memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9938 * lpfc_display_fpin_wwpn - Display WWPNs accessible by the attached port
9960 if (i == (cnt - 1)) in lpfc_display_fpin_wwpn()
9966 len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len, in lpfc_display_fpin_wwpn()
9987 cnt - i - 1); in lpfc_display_fpin_wwpn()
10000 * lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
10013 li_evt = be16_to_cpu(li->event_type); in lpfc_els_rcv_fpin_li()
10015 cnt = be32_to_cpu(li->pname_count); in lpfc_els_rcv_fpin_li()
10022 be64_to_cpu(li->detecting_wwpn), in lpfc_els_rcv_fpin_li()
10023 be64_to_cpu(li->attached_wwpn), in lpfc_els_rcv_fpin_li()
10024 be32_to_cpu(li->event_threshold), in lpfc_els_rcv_fpin_li()
10025 be32_to_cpu(li->event_count), cnt); in lpfc_els_rcv_fpin_li()
10027 lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt); in lpfc_els_rcv_fpin_li()
10031 * lpfc_els_rcv_fpin_del - Process an FPIN Delivery Event.
10045 del_rsn = be16_to_cpu(del->deli_reason_code); in lpfc_els_rcv_fpin_del()
10058 be64_to_cpu(del->detecting_wwpn), in lpfc_els_rcv_fpin_del()
10059 be64_to_cpu(del->attached_wwpn), in lpfc_els_rcv_fpin_del()
10069 * lpfc_els_rcv_fpin_peer_cgn - Process a FPIN Peer Congestion Event.
10082 pc_evt = be16_to_cpu(pc->event_type); in lpfc_els_rcv_fpin_peer_cgn()
10084 cnt = be32_to_cpu(pc->pname_count); in lpfc_els_rcv_fpin_peer_cgn()
10092 be32_to_cpu(pc->event_period), in lpfc_els_rcv_fpin_peer_cgn()
10093 be64_to_cpu(pc->detecting_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10094 be64_to_cpu(pc->attached_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10097 lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt); in lpfc_els_rcv_fpin_peer_cgn()
10101 * lpfc_els_rcv_fpin_cgn - Process an FPIN Congestion notification
10125 cgn_evt = be16_to_cpu(cgn->event_type); in lpfc_els_rcv_fpin_cgn()
10127 cgn_sev = cgn->severity; in lpfc_els_rcv_fpin_cgn()
10149 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10150 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) { in lpfc_els_rcv_fpin_cgn()
10152 atomic_inc(&phba->cgn_sync_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10158 atomic_inc(&phba->cgn_fabric_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10164 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10165 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) { in lpfc_els_rcv_fpin_cgn()
10167 atomic_inc(&phba->cgn_sync_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10173 atomic_inc(&phba->cgn_fabric_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10176 phba->cgn_fpin_frequency = in lpfc_els_rcv_fpin_cgn()
10177 be32_to_cpu(cgn->event_period); in lpfc_els_rcv_fpin_cgn()
10178 value = phba->cgn_fpin_frequency; in lpfc_els_rcv_fpin_cgn()
10179 if (phba->cgn_i) { in lpfc_els_rcv_fpin_cgn()
10181 phba->cgn_i->virt; in lpfc_els_rcv_fpin_cgn()
10182 cp->cgn_alarm_freq = in lpfc_els_rcv_fpin_cgn()
10184 cp->cgn_warn_freq = in lpfc_els_rcv_fpin_cgn()
10190 cp->cgn_info_crc = cpu_to_le32(crc); in lpfc_els_rcv_fpin_cgn()
10209 be32_to_cpu(cgn->event_period)); in lpfc_els_rcv_fpin_cgn()
10216 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fpin()
10225 if (vport->port_state < LPFC_DISC_AUTH) in lpfc_els_rcv_fpin()
10235 len = be32_to_cpu(fpin->desc_len); in lpfc_els_rcv_fpin()
10243 tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0]; in lpfc_els_rcv_fpin()
10245 bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc); in lpfc_els_rcv_fpin()
10246 bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len)); in lpfc_els_rcv_fpin()
10251 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_fpin()
10279 cnt = be32_to_cpu(tlv->desc_len); in lpfc_els_rcv_fpin()
10284 len -= (cnt + sizeof(struct fc_tlv_desc)); in lpfc_els_rcv_fpin()
10295 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_fpin()
10309 fpin->desc_len = cpu_to_be32(fpin_length); in lpfc_els_rcv_fpin()
10321 * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
10346 if (!vport || !elsiocb->cmd_dmabuf) in lpfc_els_unsol_buffer()
10350 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_buffer()
10351 payload = elsiocb->cmd_dmabuf->virt; in lpfc_els_unsol_buffer()
10352 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_buffer()
10353 payload_len = wcqe_cmpl->total_data_placed; in lpfc_els_unsol_buffer()
10355 payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_unsol_buffer()
10358 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0) in lpfc_els_unsol_buffer()
10374 if (vport->load_flag & FC_UNLOADING) in lpfc_els_unsol_buffer()
10378 if ((vport->fc_flag & FC_DISC_DELAYED) && in lpfc_els_unsol_buffer()
10391 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_unsol_buffer()
10392 } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) { in lpfc_els_unsol_buffer()
10397 phba->fc_stat.elsRcvFrame++; in lpfc_els_unsol_buffer()
10403 spin_lock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10404 if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { in lpfc_els_unsol_buffer()
10405 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10410 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10412 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_unsol_buffer()
10413 if (!elsiocb->ndlp) in lpfc_els_unsol_buffer()
10415 elsiocb->vport = vport; in lpfc_els_unsol_buffer()
10424 cmd, did, kref_read(&ndlp->kref), vport->port_state, in lpfc_els_unsol_buffer()
10425 vport->fc_flag, vport->fc_myDID, vport->fc_prevDID); in lpfc_els_unsol_buffer()
10428 if ((vport->port_state < LPFC_FABRIC_CFG_LINK) && in lpfc_els_unsol_buffer()
10430 !((cmd == ELS_CMD_PLOGI) && (vport->fc_flag & FC_PT2PT))) { in lpfc_els_unsol_buffer()
10440 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10442 phba->fc_stat.elsRcvPLOGI++; in lpfc_els_unsol_buffer()
10444 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_unsol_buffer()
10445 (phba->pport->fc_flag & FC_PT2PT)) { in lpfc_els_unsol_buffer()
10446 vport->fc_prevDID = vport->fc_myDID; in lpfc_els_unsol_buffer()
10451 vport->fc_myDID = in lpfc_els_unsol_buffer()
10453 &elsiocb->wqe.xmit_els_rsp); in lpfc_els_unsol_buffer()
10456 "%x\n", vport->fc_myDID, in lpfc_els_unsol_buffer()
10457 vport->fc_prevDID); in lpfc_els_unsol_buffer()
10463 if (vport->fc_flag & FC_DISC_DELAYED) { in lpfc_els_unsol_buffer()
10469 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10470 if (!(phba->pport->fc_flag & FC_PT2PT) || in lpfc_els_unsol_buffer()
10471 (phba->pport->fc_flag & FC_PT2PT_PLOGI)) { in lpfc_els_unsol_buffer()
10478 spin_lock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10479 ndlp->nlp_flag &= ~NLP_TARGET_REMOVE; in lpfc_els_unsol_buffer()
10480 spin_unlock_irq(&ndlp->lock); in lpfc_els_unsol_buffer()
10489 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10491 phba->fc_stat.elsRcvFLOGI++; in lpfc_els_unsol_buffer()
10496 if (vport->port_state >= LPFC_LOCAL_CFG_LINK && in lpfc_els_unsol_buffer()
10497 vport->fc_flag & FC_PT2PT && in lpfc_els_unsol_buffer()
10498 vport->rcv_flogi_cnt >= 1) { in lpfc_els_unsol_buffer()
10507 if (phba->defer_flogi_acc_flag) in lpfc_els_unsol_buffer()
10516 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10518 phba->fc_stat.elsRcvLOGO++; in lpfc_els_unsol_buffer()
10520 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10533 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10535 phba->fc_stat.elsRcvPRLO++; in lpfc_els_unsol_buffer()
10537 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10545 phba->fc_stat.elsRcvLCB++; in lpfc_els_unsol_buffer()
10549 phba->fc_stat.elsRcvRDP++; in lpfc_els_unsol_buffer()
10553 phba->fc_stat.elsRcvRSCN++; in lpfc_els_unsol_buffer()
10562 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10565 phba->fc_stat.elsRcvADISC++; in lpfc_els_unsol_buffer()
10566 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10577 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10579 phba->fc_stat.elsRcvPDISC++; in lpfc_els_unsol_buffer()
10580 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10591 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10593 phba->fc_stat.elsRcvFARPR++; in lpfc_els_unsol_buffer()
10599 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10601 phba->fc_stat.elsRcvFARP++; in lpfc_els_unsol_buffer()
10607 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10609 phba->fc_stat.elsRcvFAN++; in lpfc_els_unsol_buffer()
10616 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10618 phba->fc_stat.elsRcvPRLI++; in lpfc_els_unsol_buffer()
10619 if ((vport->port_state < LPFC_DISC_AUTH) && in lpfc_els_unsol_buffer()
10620 (vport->fc_flag & FC_FABRIC)) { in lpfc_els_unsol_buffer()
10630 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10632 phba->fc_stat.elsRcvLIRR++; in lpfc_els_unsol_buffer()
10641 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10643 phba->fc_stat.elsRcvRLS++; in lpfc_els_unsol_buffer()
10652 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10654 phba->fc_stat.elsRcvRPL++; in lpfc_els_unsol_buffer()
10663 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10665 phba->fc_stat.elsRcvRNID++; in lpfc_els_unsol_buffer()
10674 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10675 phba->fc_stat.elsRcvRTV++; in lpfc_els_unsol_buffer()
10684 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10686 phba->fc_stat.elsRcvRRQ++; in lpfc_els_unsol_buffer()
10695 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10697 phba->fc_stat.elsRcvECHO++; in lpfc_els_unsol_buffer()
10711 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10722 phba->fc_stat.elsRcvRDF++; in lpfc_els_unsol_buffer()
10738 cmd, did, vport->port_state); in lpfc_els_unsol_buffer()
10769 lpfc_nlp_put(elsiocb->ndlp); in lpfc_els_unsol_buffer()
10770 elsiocb->ndlp = NULL; in lpfc_els_unsol_buffer()
10777 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_els_unsol_buffer()
10782 phba->cfg_topology, in lpfc_els_unsol_buffer()
10783 phba->cfg_link_speed); in lpfc_els_unsol_buffer()
10784 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_unsol_buffer()
10785 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_unsol_buffer()
10786 mbox->vport = vport; in lpfc_els_unsol_buffer()
10789 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_unsol_buffer()
10795 if (vport && !(vport->load_flag & FC_UNLOADING)) in lpfc_els_unsol_buffer()
10801 phba->fc_stat.elsRcvDrop++; in lpfc_els_unsol_buffer()
10805 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
10820 struct lpfc_vport *vport = elsiocb->vport; in lpfc_els_unsol_event()
10824 struct lpfc_dmabuf *bdeBuf1 = elsiocb->cmd_dmabuf; in lpfc_els_unsol_event()
10825 struct lpfc_dmabuf *bdeBuf2 = elsiocb->bpl_dmabuf; in lpfc_els_unsol_event()
10828 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10829 elsiocb->rsp_dmabuf = NULL; in lpfc_els_unsol_event()
10830 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10832 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_event()
10836 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_event()
10837 bde_count = wcqe_cmpl->word3; in lpfc_els_unsol_event()
10839 bde_count = elsiocb->iocb.ulpBdeCount; in lpfc_els_unsol_event()
10846 phba->fc_stat.NoRcvBuf++; in lpfc_els_unsol_event()
10848 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) in lpfc_els_unsol_event()
10853 if (phba->sli_rev == LPFC_SLI_REV3) { in lpfc_els_unsol_event()
10854 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10855 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_unsol_event()
10858 if (icmd->unsli3.rcvsli3.vpi == 0xffff) in lpfc_els_unsol_event()
10859 vport = phba->pport; in lpfc_els_unsol_event()
10862 icmd->unsli3.rcvsli3.vpi); in lpfc_els_unsol_event()
10873 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_els_unsol_event()
10874 elsiocb->cmd_dmabuf = bdeBuf1; in lpfc_els_unsol_event()
10876 elsiocb->bpl_dmabuf = bdeBuf2; in lpfc_els_unsol_event()
10878 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10879 paddr = getPaddr(icmd->un.cont64[0].addrHigh, in lpfc_els_unsol_event()
10880 icmd->un.cont64[0].addrLow); in lpfc_els_unsol_event()
10881 elsiocb->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring, in lpfc_els_unsol_event()
10884 paddr = getPaddr(icmd->un.cont64[1].addrHigh, in lpfc_els_unsol_event()
10885 icmd->un.cont64[1].addrLow); in lpfc_els_unsol_event()
10886 elsiocb->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba, in lpfc_els_unsol_event()
10897 if (elsiocb->cmd_dmabuf) { in lpfc_els_unsol_event()
10898 lpfc_in_buf_free(phba, elsiocb->cmd_dmabuf); in lpfc_els_unsol_event()
10899 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10902 if (elsiocb->bpl_dmabuf) { in lpfc_els_unsol_event()
10903 lpfc_in_buf_free(phba, elsiocb->bpl_dmabuf); in lpfc_els_unsol_event()
10904 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10922 ndlp->nlp_type |= NLP_FABRIC; in lpfc_start_fdmi()
10929 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_start_fdmi()
10933 * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
10941 * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
10953 * bit is cleared and fc fabric parameters chenged, delay FC NPort in lpfc_do_scr_ns_plogi()
10956 spin_lock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
10957 if (vport->fc_flag & FC_DISC_DELAYED) { in lpfc_do_scr_ns_plogi()
10958 spin_unlock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
10960 "3334 Delay fc port discovery for %d secs\n", in lpfc_do_scr_ns_plogi()
10961 phba->fc_ratov); in lpfc_do_scr_ns_plogi()
10962 mod_timer(&vport->delayed_disc_tmo, in lpfc_do_scr_ns_plogi()
10963 jiffies + msecs_to_jiffies(1000 * phba->fc_ratov)); in lpfc_do_scr_ns_plogi()
10966 spin_unlock_irq(shost->host_lock); in lpfc_do_scr_ns_plogi()
10972 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_do_scr_ns_plogi()
10983 ndlp->nlp_type |= NLP_FABRIC; in lpfc_do_scr_ns_plogi()
10987 if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) { in lpfc_do_scr_ns_plogi()
10994 if ((phba->cfg_enable_SmartSAN || in lpfc_do_scr_ns_plogi()
10995 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) && in lpfc_do_scr_ns_plogi()
10996 (vport->load_flag & FC_ALLOW_FDMI)) in lpfc_do_scr_ns_plogi()
11001 * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
11015 struct lpfc_vport *vport = pmb->vport; in lpfc_cmpl_reg_new_vport()
11017 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_cmpl_reg_new_vport()
11018 MAILBOX_t *mb = &pmb->u.mb; in lpfc_cmpl_reg_new_vport()
11021 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11022 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11023 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11025 if (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
11028 " upd bit: x%x \n", mb->mbxStatus, in lpfc_cmpl_reg_new_vport()
11029 mb->un.varRegVpi.upd); in lpfc_cmpl_reg_new_vport()
11030 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_reg_new_vport()
11031 mb->un.varRegVpi.upd) in lpfc_cmpl_reg_new_vport()
11034 switch (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
11040 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11041 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_cmpl_reg_new_vport()
11042 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11045 /* If reg_vpi fail with invalid VPI status, re-init VPI */ in lpfc_cmpl_reg_new_vport()
11047 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11048 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11049 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11050 lpfc_init_vpi(phba, pmb, vport->vpi); in lpfc_cmpl_reg_new_vport()
11051 pmb->vport = vport; in lpfc_cmpl_reg_new_vport()
11052 pmb->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_cmpl_reg_new_vport()
11067 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11070 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11071 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_reg_new_vport()
11072 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11073 if (mb->mbxStatus == MBX_NOT_FINISHED) in lpfc_cmpl_reg_new_vport()
11075 if ((vport->port_type == LPFC_PHYSICAL_PORT) && in lpfc_cmpl_reg_new_vport()
11076 !(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG)) { in lpfc_cmpl_reg_new_vport()
11077 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11087 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11088 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_cmpl_reg_new_vport()
11089 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11090 if (vport == phba->pport) { in lpfc_cmpl_reg_new_vport()
11091 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11098 if (vport->port_state != LPFC_FDISC) in lpfc_cmpl_reg_new_vport()
11112 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_cmpl_reg_new_vport()
11117 * lpfc_register_new_vport - Register a new vport with a HBA
11120 * @ndlp: pointer to a node-list data structure.
11132 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_new_vport()
11135 mbox->vport = vport; in lpfc_register_new_vport()
11136 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_register_new_vport()
11137 if (!mbox->ctx_ndlp) { in lpfc_register_new_vport()
11138 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11142 mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport; in lpfc_register_new_vport()
11149 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11164 spin_lock_irq(shost->host_lock); in lpfc_register_new_vport()
11165 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_register_new_vport()
11166 spin_unlock_irq(shost->host_lock); in lpfc_register_new_vport()
11171 * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer
11174 * This routine cancels the retry delay timers to all the vports.
11185 link_state = phba->link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11187 phba->link_state = link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11192 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_cancel_all_vport_retry_delay_timer()
11203 * lpfc_retry_pport_discovery - Start timer to retry FLOGI.
11207 * start a timer to retry FLOGI for the physical port
11215 /* Cancel the all vports retry delay retry timers */ in lpfc_retry_pport_discovery()
11218 /* If fabric require FLOGI, then re-instantiate physical login */ in lpfc_retry_pport_discovery()
11219 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_retry_pport_discovery()
11223 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); in lpfc_retry_pport_discovery()
11224 spin_lock_irq(&ndlp->lock); in lpfc_retry_pport_discovery()
11225 ndlp->nlp_flag |= NLP_DELAY_TMO; in lpfc_retry_pport_discovery()
11226 spin_unlock_irq(&ndlp->lock); in lpfc_retry_pport_discovery()
11227 ndlp->nlp_last_elscmd = ELS_CMD_FLOGI; in lpfc_retry_pport_discovery()
11228 phba->pport->port_state = LPFC_FLOGI; in lpfc_retry_pport_discovery()
11233 * lpfc_fabric_login_reqd - Check if FLOGI required.
11257 * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
11280 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_fdisc()
11282 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_fdisc()
11286 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_fdisc()
11297 vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11302 list_for_each_entry(piocb, &phba->fabric_iocb_list, list) { in lpfc_cmpl_els_fdisc()
11303 lpfc_set_disctmo(piocb->vport); in lpfc_cmpl_els_fdisc()
11308 ulp_status, ulp_word4, vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11317 /* Check for retry */ in lpfc_cmpl_els_fdisc()
11329 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11330 vport->fc_flag &= ~FC_VPORT_CVL_RCVD; in lpfc_cmpl_els_fdisc()
11331 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD; in lpfc_cmpl_els_fdisc()
11332 vport->fc_flag |= FC_FABRIC; in lpfc_cmpl_els_fdisc()
11333 if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP) in lpfc_cmpl_els_fdisc()
11334 vport->fc_flag |= FC_PUBLIC_LOOP; in lpfc_cmpl_els_fdisc()
11335 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11337 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_fdisc()
11339 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_fdisc()
11342 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_fdisc()
11344 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_fdisc()
11346 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_fdisc()
11349 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_fdisc()
11355 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_fdisc()
11356 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_fdisc()
11357 !(np->nlp_flag & NLP_NPR_ADISC)) in lpfc_cmpl_els_fdisc()
11359 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_fdisc()
11360 np->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_cmpl_els_fdisc()
11361 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_fdisc()
11366 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11370 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11371 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cmpl_els_fdisc()
11372 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11373 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_cmpl_els_fdisc()
11375 vport->fc_flag |= FC_LOGO_RCVD_DID_CHNG; in lpfc_cmpl_els_fdisc()
11376 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_fdisc()
11377 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_fdisc()
11378 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) { in lpfc_cmpl_els_fdisc()
11380 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_fdisc()
11388 if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI) in lpfc_cmpl_els_fdisc()
11390 else if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI) in lpfc_cmpl_els_fdisc()
11402 if (vport->fc_vport && in lpfc_cmpl_els_fdisc()
11403 (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS)) in lpfc_cmpl_els_fdisc()
11413 * lpfc_issue_els_fdisc - Issue a fdisc iocb command
11415 * @ndlp: pointer to a node-list data structure.
11416 * @retry: number of retries to the command IOCB.
11428 * 0 - Successfully issued fdisc iocb command
11429 * 1 - Failed to issue fdisc iocb command
11433 uint8_t retry) in lpfc_issue_els_fdisc() argument
11435 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_fdisc()
11442 int did = ndlp->nlp_DID; in lpfc_issue_els_fdisc()
11445 vport->port_state = LPFC_FDISC; in lpfc_issue_els_fdisc()
11446 vport->fc_myDID = 0; in lpfc_issue_els_fdisc()
11448 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, in lpfc_issue_els_fdisc()
11457 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_fdisc()
11458 wqe = &elsiocb->wqe; in lpfc_issue_els_fdisc()
11459 bf_set(els_req64_sid, &wqe->els_req, 0); in lpfc_issue_els_fdisc()
11460 bf_set(els_req64_sp, &wqe->els_req, 1); in lpfc_issue_els_fdisc()
11462 icmd = &elsiocb->iocb; in lpfc_issue_els_fdisc()
11463 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_fdisc()
11464 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_fdisc()
11465 icmd->ulpCt_h = 1; in lpfc_issue_els_fdisc()
11466 icmd->ulpCt_l = 0; in lpfc_issue_els_fdisc()
11469 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_fdisc()
11472 memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_fdisc()
11475 sp->cmn.e_d_tov = 0; in lpfc_issue_els_fdisc()
11476 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_fdisc()
11477 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_fdisc()
11478 sp->cls1.classValid = 0; in lpfc_issue_els_fdisc()
11479 sp->cls2.seqDelivery = 1; in lpfc_issue_els_fdisc()
11480 sp->cls3.seqDelivery = 1; in lpfc_issue_els_fdisc()
11486 memcpy(pcmd, &vport->fc_portname, 8); in lpfc_issue_els_fdisc()
11489 memcpy(pcmd, &vport->fc_nodename, 8); in lpfc_issue_els_fdisc()
11490 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_fdisc()
11491 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_fdisc()
11494 phba->fc_stat.elsXmitFDISC++; in lpfc_issue_els_fdisc()
11495 elsiocb->cmd_cmpl = lpfc_cmpl_els_fdisc; in lpfc_issue_els_fdisc()
11501 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_fdisc()
11502 if (!elsiocb->ndlp) in lpfc_issue_els_fdisc()
11523 * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
11540 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_npiv_logo()
11546 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_npiv_logo()
11551 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_npiv_logo()
11555 irsp = &rspiocb->iocb; in lpfc_cmpl_els_npiv_logo()
11557 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_npiv_logo()
11568 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_npiv_logo()
11569 tmo, vport->num_disc_nodes, in lpfc_cmpl_els_npiv_logo()
11570 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_npiv_logo()
11571 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_npiv_logo()
11574 spin_lock_irq(shost->host_lock); in lpfc_cmpl_els_npiv_logo()
11575 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_cmpl_els_npiv_logo()
11576 vport->fc_flag &= ~FC_FABRIC; in lpfc_cmpl_els_npiv_logo()
11577 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_els_npiv_logo()
11581 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_npiv_logo()
11583 if (ndlp->logo_waitq) in lpfc_cmpl_els_npiv_logo()
11584 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_npiv_logo()
11585 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11586 ndlp->nlp_flag &= ~(NLP_ISSUE_LOGO | NLP_LOGO_SND); in lpfc_cmpl_els_npiv_logo()
11587 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_npiv_logo()
11588 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11597 * lpfc_issue_els_npiv_logo - Issue a logo off a vport
11599 * @ndlp: pointer to a node-list data structure.
11608 * 0 - Successfully issued logo off the @vport
11609 * 1 - Failed to issue logo off the @vport
11615 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_npiv_logo()
11621 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID, in lpfc_issue_els_npiv_logo()
11626 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_npiv_logo()
11631 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_npiv_logo()
11633 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_npiv_logo()
11637 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_issue_els_npiv_logo()
11639 elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo; in lpfc_issue_els_npiv_logo()
11640 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11641 ndlp->nlp_flag |= NLP_LOGO_SND; in lpfc_issue_els_npiv_logo()
11642 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11643 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_npiv_logo()
11644 if (!elsiocb->ndlp) { in lpfc_issue_els_npiv_logo()
11658 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11659 ndlp->nlp_flag &= ~NLP_LOGO_SND; in lpfc_issue_els_npiv_logo()
11660 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_npiv_logo()
11665 * lpfc_fabric_block_timeout - Handler function to the fabric block timer
11682 spin_lock_irqsave(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11683 tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11685 phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11686 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11694 * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
11712 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11714 if (atomic_read(&phba->fabric_iocb_count) == 0) { in lpfc_resume_fabric_iocbs()
11715 list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb), in lpfc_resume_fabric_iocbs()
11719 atomic_inc(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11721 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11723 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_resume_fabric_iocbs()
11724 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_resume_fabric_iocbs()
11725 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11727 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_resume_fabric_iocbs()
11729 iocb->vport->port_state, 0, 0); in lpfc_resume_fabric_iocbs()
11734 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_resume_fabric_iocbs()
11735 iocb->fabric_cmd_cmpl = NULL; in lpfc_resume_fabric_iocbs()
11736 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11738 iocb->wcqe_cmpl.parameter = IOERR_SLI_ABORTED; in lpfc_resume_fabric_iocbs()
11739 iocb->cmd_cmpl(phba, iocb, iocb); in lpfc_resume_fabric_iocbs()
11741 atomic_dec(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11748 * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
11759 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_unblock_fabric_iocbs()
11766 * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
11779 blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_block_fabric_iocbs()
11782 mod_timer(&phba->fabric_block_timer, in lpfc_block_fabric_iocbs()
11789 * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
11795 * callback function pointer (iocb->cmd_cmpl). The original iocb's callback
11796 * function pointer has been stored in iocb->fabric_cmd_cmpl. This callback
11809 WARN_ON((cmdiocb->cmd_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC); in lpfc_cmpl_fabric_iocb()
11832 BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0); in lpfc_cmpl_fabric_iocb()
11834 cmdiocb->cmd_cmpl = cmdiocb->fabric_cmd_cmpl; in lpfc_cmpl_fabric_iocb()
11835 cmdiocb->fabric_cmd_cmpl = NULL; in lpfc_cmpl_fabric_iocb()
11836 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_fabric_iocb()
11837 cmdiocb->cmd_cmpl(phba, cmdiocb, rspiocb); in lpfc_cmpl_fabric_iocb()
11839 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_fabric_iocb()
11840 if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) { in lpfc_cmpl_fabric_iocb()
11847 * lpfc_issue_fabric_iocb - Issue a fabric iocb command
11851 * This routine is used as the top-level API for issuing a fabric iocb command
11867 * IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
11868 * IOCB_ERROR - failed to issue fabric iocb
11877 BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1); in lpfc_issue_fabric_iocb()
11879 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11880 ready = atomic_read(&phba->fabric_iocb_count) == 0 && in lpfc_issue_fabric_iocb()
11881 !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_issue_fabric_iocb()
11885 atomic_inc(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11886 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11888 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_issue_fabric_iocb()
11889 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_issue_fabric_iocb()
11890 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11892 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_issue_fabric_iocb()
11894 iocb->vport->port_state, 0, 0); in lpfc_issue_fabric_iocb()
11899 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_issue_fabric_iocb()
11900 iocb->fabric_cmd_cmpl = NULL; in lpfc_issue_fabric_iocb()
11901 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11902 atomic_dec(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11905 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11906 list_add_tail(&iocb->list, &phba->fabric_iocb_list); in lpfc_issue_fabric_iocb()
11907 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11914 * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
11927 struct lpfc_hba *phba = vport->phba; in lpfc_fabric_abort_vport()
11930 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11931 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_vport()
11934 if (piocb->vport != vport) in lpfc_fabric_abort_vport()
11937 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_vport()
11939 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11947 * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
11948 * @ndlp: pointer to a node-list data structure.
11960 struct lpfc_hba *phba = ndlp->phba; in lpfc_fabric_abort_nport()
11969 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11970 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_nport()
11974 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_nport()
11977 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11985 * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
11999 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
12000 list_splice_init(&phba->fabric_iocb_list, &completions); in lpfc_fabric_abort_hba()
12001 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
12009 * lpfc_sli4_vport_delete_els_xri_aborted -Remove all ndlp references for vport
12018 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_vport_delete_els_xri_aborted()
12023 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
12025 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_vport_delete_els_xri_aborted()
12026 if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) { in lpfc_sli4_vport_delete_els_xri_aborted()
12027 lpfc_nlp_put(sglq_entry->ndlp); in lpfc_sli4_vport_delete_els_xri_aborted()
12028 ndlp = sglq_entry->ndlp; in lpfc_sli4_vport_delete_els_xri_aborted()
12029 sglq_entry->ndlp = NULL; in lpfc_sli4_vport_delete_els_xri_aborted()
12035 if ((vport->load_flag & FC_UNLOADING) && in lpfc_sli4_vport_delete_els_xri_aborted()
12036 ndlp->nlp_DID == Fabric_DID) { in lpfc_sli4_vport_delete_els_xri_aborted()
12037 list_del(&sglq_entry->list); in lpfc_sli4_vport_delete_els_xri_aborted()
12038 sglq_entry->state = SGL_FREED; in lpfc_sli4_vport_delete_els_xri_aborted()
12039 list_add_tail(&sglq_entry->list, in lpfc_sli4_vport_delete_els_xri_aborted()
12040 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_vport_delete_els_xri_aborted()
12044 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
12049 * lpfc_sli4_els_xri_aborted - Slow-path process of els xri abort
12053 * This routine is invoked by the worker thread to process a SLI4 slow-path
12071 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12073 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_els_xri_aborted()
12074 if (sglq_entry->sli4_xritag == xri) { in lpfc_sli4_els_xri_aborted()
12075 list_del(&sglq_entry->list); in lpfc_sli4_els_xri_aborted()
12076 ndlp = sglq_entry->ndlp; in lpfc_sli4_els_xri_aborted()
12077 sglq_entry->ndlp = NULL; in lpfc_sli4_els_xri_aborted()
12078 list_add_tail(&sglq_entry->list, in lpfc_sli4_els_xri_aborted()
12079 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_xri_aborted()
12080 sglq_entry->state = SGL_FREED; in lpfc_sli4_els_xri_aborted()
12081 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, in lpfc_sli4_els_xri_aborted()
12086 sglq_entry->sli4_lxritag, in lpfc_sli4_els_xri_aborted()
12092 if (pring && !list_empty(&pring->txq)) in lpfc_sli4_els_xri_aborted()
12097 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12102 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12104 if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) { in lpfc_sli4_els_xri_aborted()
12105 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12108 sglq_entry->state = SGL_XRI_ABORTED; in lpfc_sli4_els_xri_aborted()
12109 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12113 /* lpfc_sli_abts_recover_port - Recover a port that failed a BLS_ABORT req.
12131 phba = vport->phba; in lpfc_sli_abts_recover_port()
12132 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { in lpfc_sli_abts_recover_port()
12135 "rport in state 0x%x\n", ndlp->nlp_state); in lpfc_sli_abts_recover_port()
12142 shost->host_no, ndlp->nlp_DID, in lpfc_sli_abts_recover_port()
12143 vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, in lpfc_sli_abts_recover_port()
12144 ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12146 * The rport is not responding. Remove the FCP-2 flag to prevent in lpfc_sli_abts_recover_port()
12147 * an ADISC in the follow-up recovery code. in lpfc_sli_abts_recover_port()
12149 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12150 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_sli_abts_recover_port()
12151 ndlp->nlp_flag |= NLP_ISSUE_LOGO; in lpfc_sli_abts_recover_port()
12152 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12158 bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE); in lpfc_init_cs_ctl_bitmap()
12170 set_bit(i, vport->vmid_priority_range); in lpfc_vmid_set_cs_ctl_range()
12175 set_bit(ctcl_vmid, vport->vmid_priority_range); in lpfc_vmid_put_cs_ctl()
12182 i = find_first_bit(vport->vmid_priority_range, in lpfc_vmid_get_cs_ctl()
12188 clear_bit(i, vport->vmid_priority_range); in lpfc_vmid_get_cs_ctl()
12198 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_qfpa()
12203 struct lpfc_dmabuf *dmabuf = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_qfpa()
12208 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_qfpa()
12210 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_qfpa()
12214 pcmd = prsp->virt; in lpfc_cmpl_els_qfpa()
12229 if (!vport->qfpa_res) { in lpfc_cmpl_els_qfpa()
12230 max_desc = FCELSSIZE / sizeof(*vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12231 vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res), in lpfc_cmpl_els_qfpa()
12233 if (!vport->qfpa_res) in lpfc_cmpl_els_qfpa()
12239 memcpy(vport->qfpa_res, pcmd, len + 8); in lpfc_cmpl_els_qfpa()
12243 vmid_range = vport->vmid_priority.vmid_range; in lpfc_cmpl_els_qfpa()
12248 kfree(vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12251 vport->vmid_priority.vmid_range = vmid_range; in lpfc_cmpl_els_qfpa()
12253 vport->vmid_priority.num_descriptors = len; in lpfc_cmpl_els_qfpa()
12258 "local ve id=%d\n", desc->lo_range, in lpfc_cmpl_els_qfpa()
12259 desc->hi_range, desc->qos_priority, in lpfc_cmpl_els_qfpa()
12260 desc->local_ve_id); in lpfc_cmpl_els_qfpa()
12262 vmid_range->low = desc->lo_range << 1; in lpfc_cmpl_els_qfpa()
12263 if (desc->local_ve_id == QFPA_ODD_ONLY) in lpfc_cmpl_els_qfpa()
12264 vmid_range->low++; in lpfc_cmpl_els_qfpa()
12265 if (desc->qos_priority) in lpfc_cmpl_els_qfpa()
12266 vport->vmid_flag |= LPFC_VMID_QOS_ENABLED; in lpfc_cmpl_els_qfpa()
12267 vmid_range->qos = desc->qos_priority; in lpfc_cmpl_els_qfpa()
12269 vmid_range->high = desc->hi_range << 1; in lpfc_cmpl_els_qfpa()
12270 if ((desc->local_ve_id == QFPA_ODD_ONLY) || in lpfc_cmpl_els_qfpa()
12271 (desc->local_ve_id == QFPA_EVEN_ODD)) in lpfc_cmpl_els_qfpa()
12272 vmid_range->high++; in lpfc_cmpl_els_qfpa()
12275 for (i = 0; i < vport->vmid_priority.num_descriptors; i++) { in lpfc_cmpl_els_qfpa()
12277 vport->vmid_priority.vmid_range[i].low, in lpfc_cmpl_els_qfpa()
12278 vport->vmid_priority.vmid_range[i].high); in lpfc_cmpl_els_qfpa()
12281 vport->vmid_flag |= LPFC_VMID_QFPA_CMPL; in lpfc_cmpl_els_qfpa()
12289 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_qfpa()
12295 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_issue_els_qfpa()
12296 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_qfpa()
12297 return -ENXIO; in lpfc_issue_els_qfpa()
12300 ndlp->nlp_DID, ELS_CMD_QFPA); in lpfc_issue_els_qfpa()
12302 return -ENOMEM; in lpfc_issue_els_qfpa()
12304 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_qfpa()
12309 elsiocb->cmd_cmpl = lpfc_cmpl_els_qfpa; in lpfc_issue_els_qfpa()
12311 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_qfpa()
12312 if (!elsiocb->ndlp) { in lpfc_issue_els_qfpa()
12313 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_issue_els_qfpa()
12314 return -ENXIO; in lpfc_issue_els_qfpa()
12321 return -EIO; in lpfc_issue_els_qfpa()
12323 vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED; in lpfc_issue_els_qfpa()
12341 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_vmid_uvem()
12342 return -ENXIO; in lpfc_vmid_uvem()
12346 return -ENOMEM; in lpfc_vmid_uvem()
12354 vmid->host_vmid, instantiated); in lpfc_vmid_uvem()
12355 vmid_context->vmp = vmid; in lpfc_vmid_uvem()
12356 vmid_context->nlp = ndlp; in lpfc_vmid_uvem()
12357 vmid_context->instantiated = instantiated; in lpfc_vmid_uvem()
12358 elsiocb->vmid_tag.vmid_context = vmid_context; in lpfc_vmid_uvem()
12359 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_vmid_uvem()
12361 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_vmid_uvem()
12362 sizeof(vport->lpfc_vmid_host_uuid))) in lpfc_vmid_uvem()
12363 memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid, in lpfc_vmid_uvem()
12364 sizeof(vport->lpfc_vmid_host_uuid)); in lpfc_vmid_uvem()
12368 *len = cpu_to_be32(LPFC_UVEM_SIZE - 8); in lpfc_vmid_uvem()
12371 vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG); in lpfc_vmid_uvem()
12372 vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE); in lpfc_vmid_uvem()
12373 memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid, in lpfc_vmid_uvem()
12374 sizeof(vem_id_desc->vem_id)); in lpfc_vmid_uvem()
12377 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12378 inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE); in lpfc_vmid_uvem()
12379 memcpy(inst_desc->global_vem_id, vmid->host_vmid, in lpfc_vmid_uvem()
12380 sizeof(inst_desc->global_vem_id)); in lpfc_vmid_uvem()
12382 bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID); in lpfc_vmid_uvem()
12384 vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12386 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12388 inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12389 lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12391 inst_desc->word6 = cpu_to_be32(inst_desc->word6); in lpfc_vmid_uvem()
12393 elsiocb->cmd_cmpl = lpfc_cmpl_els_uvem; in lpfc_vmid_uvem()
12395 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_vmid_uvem()
12396 if (!elsiocb->ndlp) { in lpfc_vmid_uvem()
12397 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12401 ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0); in lpfc_vmid_uvem()
12403 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12411 return -EIO; in lpfc_vmid_uvem()
12418 struct lpfc_vport *vport = icmdiocb->vport; in lpfc_cmpl_els_uvem()
12421 icmdiocb->vmid_tag.vmid_context; in lpfc_cmpl_els_uvem()
12422 struct lpfc_nodelist *ndlp = icmdiocb->ndlp; in lpfc_cmpl_els_uvem()
12427 struct lpfc_dmabuf *dmabuf = icmdiocb->cmd_dmabuf; in lpfc_cmpl_els_uvem()
12430 vmid = vmid_context->vmp; in lpfc_cmpl_els_uvem()
12431 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_cmpl_els_uvem()
12434 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_uvem()
12437 pcmd = prsp->virt; in lpfc_cmpl_els_uvem()
12450 spin_lock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12452 vport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12453 phba->pport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12454 spin_unlock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12456 if (vmid_context->instantiated) { in lpfc_cmpl_els_uvem()
12457 write_lock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()
12458 vmid->flag |= LPFC_VMID_REGISTERED; in lpfc_cmpl_els_uvem()
12459 vmid->flag &= ~LPFC_VMID_REQ_REGISTER; in lpfc_cmpl_els_uvem()
12460 write_unlock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()