• Home
  • Raw
  • Download

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

4  * Copyright (C) 2017-2024 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
96 struct lpfc_hba *phba = vport->phba; in lpfc_els_chk_latt()
99 if (vport->port_state >= LPFC_VPORT_READY || in lpfc_els_chk_latt()
100 phba->link_state == LPFC_LINK_DOWN || in lpfc_els_chk_latt()
101 phba->sli_rev > LPFC_SLI_REV3) in lpfc_els_chk_latt()
105 if (lpfc_readl(phba->HAregaddr, &ha_copy)) in lpfc_els_chk_latt()
115 phba->pport->port_state); in lpfc_els_chk_latt()
117 /* CLEAR_LA should re-enable link attention events and in lpfc_els_chk_latt()
120 * will cleanup any left over in-progress discovery in lpfc_els_chk_latt()
123 set_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_els_chk_latt()
125 if (phba->link_state != LPFC_CLEAR_LA) in lpfc_els_chk_latt()
133 struct fc_els_ls_acc *rsp = buf->virt; in lpfc_is_els_acc_rsp()
135 if (rsp && rsp->la_cmd == ELS_LS_ACC) in lpfc_is_els_acc_rsp()
141 * lpfc_prep_els_iocb - Allocate and prepare a lpfc iocb data structure
145 * @retry: number of retries to the command when it fails.
146 * @ndlp: pointer to a node-list data structure.
150 * This routine is used for allocating a lpfc-IOCB data structure from
151 * the driver lpfc-IOCB free-list and prepare the IOCB with the parameters
153 * Link Service (ELS) commands. It is a generic lpfc-IOCB allocation
155 * routines and the ELS command-specific fields will be later set up by
166 * NULL - when els iocb data structure allocation/preparation failed
170 u16 cmd_size, u8 retry, in lpfc_prep_els_iocb() argument
174 struct lpfc_hba *phba = vport->phba; in lpfc_prep_els_iocb()
193 test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) && in lpfc_prep_els_iocb()
199 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
204 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
209 elsiocb->cmd_flag |= in lpfc_prep_els_iocb()
215 elsiocb->cmd_flag &= ~LPFC_FIP_ELS_ID_MASK; in lpfc_prep_els_iocb()
221 pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys); in lpfc_prep_els_iocb()
222 if (!pcmd || !pcmd->virt) in lpfc_prep_els_iocb()
225 INIT_LIST_HEAD(&pcmd->list); in lpfc_prep_els_iocb()
231 prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
232 &prsp->phys); in lpfc_prep_els_iocb()
233 if (!prsp || !prsp->virt) in lpfc_prep_els_iocb()
235 INIT_LIST_HEAD(&prsp->list); in lpfc_prep_els_iocb()
243 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI, in lpfc_prep_els_iocb()
244 &pbuflist->phys); in lpfc_prep_els_iocb()
245 if (!pbuflist || !pbuflist->virt) in lpfc_prep_els_iocb()
248 INIT_LIST_HEAD(&pbuflist->list); in lpfc_prep_els_iocb()
256 timeout = phba->fc_ratov; in lpfc_prep_els_iocb()
259 timeout = phba->fc_ratov * 2; in lpfc_prep_els_iocb()
263 elsiocb->num_bdes = 2; in lpfc_prep_els_iocb()
266 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_prep_els_iocb()
274 bpl = (struct ulp_bde64_le *)pbuflist->virt; in lpfc_prep_els_iocb()
275 bpl->addr_low = cpu_to_le32(putPaddrLow(pcmd->phys)); in lpfc_prep_els_iocb()
276 bpl->addr_high = cpu_to_le32(putPaddrHigh(pcmd->phys)); in lpfc_prep_els_iocb()
277 bpl->type_size = cpu_to_le32(cmd_size); in lpfc_prep_els_iocb()
278 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
282 bpl->addr_low = cpu_to_le32(putPaddrLow(prsp->phys)); in lpfc_prep_els_iocb()
283 bpl->addr_high = cpu_to_le32(putPaddrHigh(prsp->phys)); in lpfc_prep_els_iocb()
284 bpl->type_size = cpu_to_le32(FCELSSIZE); in lpfc_prep_els_iocb()
285 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64); in lpfc_prep_els_iocb()
288 elsiocb->cmd_dmabuf = pcmd; in lpfc_prep_els_iocb()
289 elsiocb->bpl_dmabuf = pbuflist; in lpfc_prep_els_iocb()
290 elsiocb->retry = retry; in lpfc_prep_els_iocb()
291 elsiocb->vport = vport; in lpfc_prep_els_iocb()
292 elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT; in lpfc_prep_els_iocb()
295 list_add(&prsp->list, &pcmd->list); in lpfc_prep_els_iocb()
302 elscmd, did, elsiocb->iotag, in lpfc_prep_els_iocb()
303 vport->port_state, ndlp->nlp_rpi, in lpfc_prep_els_iocb()
304 vport->fc_flag); in lpfc_prep_els_iocb()
311 elscmd, ndlp->nlp_DID, elsiocb->iotag, in lpfc_prep_els_iocb()
312 cmd_size, vport->port_state, in lpfc_prep_els_iocb()
313 ndlp->nlp_rpi, vport->fc_flag); in lpfc_prep_els_iocb()
320 lpfc_mbuf_free(phba, prsp->virt, prsp->phys); in lpfc_prep_els_iocb()
324 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys); in lpfc_prep_els_iocb()
334 * lpfc_issue_fabric_reglogin - Issue fabric registration login for a vport
346 * 0 - successfully issued fabric registration login for @vport
347 * -ENXIO -- failed to issue fabric registration login for @vport
352 struct lpfc_hba *phba = vport->phba; in lpfc_issue_fabric_reglogin()
359 sp = &phba->fc_fabparam; in lpfc_issue_fabric_reglogin()
366 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
372 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_fabric_reglogin()
374 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_issue_fabric_reglogin()
375 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
383 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_fabric_reglogin()
388 rc = lpfc_reg_rpi(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox, in lpfc_issue_fabric_reglogin()
389 ndlp->nlp_rpi); in lpfc_issue_fabric_reglogin()
395 mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login; in lpfc_issue_fabric_reglogin()
396 mbox->vport = vport; in lpfc_issue_fabric_reglogin()
400 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_fabric_reglogin()
401 if (!mbox->ctx_ndlp) { in lpfc_issue_fabric_reglogin()
426 return -ENXIO; in lpfc_issue_fabric_reglogin()
430 * lpfc_issue_reg_vfi - Register VFI for this vport's fabric login
437 * 0 - successfully issued REG_VFI for @vport
443 struct lpfc_hba *phba = vport->phba; in lpfc_issue_reg_vfi()
450 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_issue_reg_vfi()
451 !(phba->link_flag & LS_LOOPBACK_MODE) && in lpfc_issue_reg_vfi()
452 !test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_issue_reg_vfi()
455 rc = -ENODEV; in lpfc_issue_reg_vfi()
460 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vfi()
462 rc = -ENOMEM; in lpfc_issue_reg_vfi()
466 /* Supply CSP's only if we are fabric connect or pt-to-pt connect */ in lpfc_issue_reg_vfi()
467 if (test_bit(FC_FABRIC, &vport->fc_flag) || in lpfc_issue_reg_vfi()
468 test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_issue_reg_vfi()
471 rc = -ENOMEM; in lpfc_issue_reg_vfi()
474 dmabuf = mboxq->ctx_buf; in lpfc_issue_reg_vfi()
475 memcpy(dmabuf->virt, &phba->fc_fabparam, in lpfc_issue_reg_vfi()
479 vport->port_state = LPFC_FABRIC_CFG_LINK; in lpfc_issue_reg_vfi()
481 lpfc_reg_vfi(mboxq, vport, dmabuf->phys); in lpfc_issue_reg_vfi()
483 mboxq->ctx_buf = dmabuf; in lpfc_issue_reg_vfi()
488 mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi; in lpfc_issue_reg_vfi()
489 mboxq->vport = vport; in lpfc_issue_reg_vfi()
492 rc = -ENXIO; in lpfc_issue_reg_vfi()
507 * lpfc_issue_unreg_vfi - Unregister VFI for this vport's fabric login
514 * 0 - successfully issued REG_VFI for @vport
520 struct lpfc_hba *phba = vport->phba; in lpfc_issue_unreg_vfi()
524 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_unreg_vfi()
528 "HBA state x%x\n", phba->pport->port_state); in lpfc_issue_unreg_vfi()
529 return -ENOMEM; in lpfc_issue_unreg_vfi()
533 mboxq->vport = vport; in lpfc_issue_unreg_vfi()
534 mboxq->mbox_cmpl = lpfc_unregister_vfi_cmpl; in lpfc_issue_unreg_vfi()
541 rc, phba->pport->port_state); in lpfc_issue_unreg_vfi()
542 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_issue_unreg_vfi()
543 return -EIO; in lpfc_issue_unreg_vfi()
546 clear_bit(FC_VFI_REGISTERED, &vport->fc_flag); in lpfc_issue_unreg_vfi()
551 * lpfc_check_clean_addr_bit - Check whether assigned FCID is clean.
558 * 0. This function also set flag in the vport data structure to delay
564 * 0 - FCID and Fabric Nodename and Fabric portname is not changed.
565 * 1 - FCID or Fabric Nodename or Fabric portname is changed.
572 struct lpfc_hba *phba = vport->phba; in lpfc_check_clean_addr_bit()
575 if ((vport->fc_prevDID != vport->fc_myDID) || in lpfc_check_clean_addr_bit()
576 memcmp(&vport->fabric_portname, &sp->portName, in lpfc_check_clean_addr_bit()
578 memcmp(&vport->fabric_nodename, &sp->nodeName, in lpfc_check_clean_addr_bit()
580 (vport->vport_flag & FAWWPN_PARAM_CHG)) { in lpfc_check_clean_addr_bit()
582 vport->vport_flag &= ~FAWWPN_PARAM_CHG; in lpfc_check_clean_addr_bit()
590 * cleared delay nport discovery if in lpfc_check_clean_addr_bit()
591 * - vport->fc_prevDID != 0 (not initial discovery) OR in lpfc_check_clean_addr_bit()
592 * - lpfc_delay_discovery module parameter is set. in lpfc_check_clean_addr_bit()
594 if (fabric_param_changed && !sp->cmn.clean_address_bit && in lpfc_check_clean_addr_bit()
595 (vport->fc_prevDID || phba->cfg_delay_discovery)) in lpfc_check_clean_addr_bit()
596 set_bit(FC_DISC_DELAYED, &vport->fc_flag); in lpfc_check_clean_addr_bit()
603 * lpfc_cmpl_els_flogi_fabric - Completion function for flogi to a fabric port
605 * @ndlp: pointer to a node-list data structure.
620 * 0 - Success (currently, always return 0)
626 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_fabric()
631 set_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_flogi_fabric()
633 phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_cmpl_els_flogi_fabric()
634 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_cmpl_els_flogi_fabric()
635 phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000; in lpfc_cmpl_els_flogi_fabric()
637 phba->fc_edtovResol = sp->cmn.edtovResolution; in lpfc_cmpl_els_flogi_fabric()
638 phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000; in lpfc_cmpl_els_flogi_fabric()
640 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) in lpfc_cmpl_els_flogi_fabric()
641 set_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_els_flogi_fabric()
643 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_flogi_fabric()
644 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
645 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name)); in lpfc_cmpl_els_flogi_fabric()
646 ndlp->nlp_class_sup = 0; in lpfc_cmpl_els_flogi_fabric()
647 if (sp->cls1.classValid) in lpfc_cmpl_els_flogi_fabric()
648 ndlp->nlp_class_sup |= FC_COS_CLASS1; in lpfc_cmpl_els_flogi_fabric()
649 if (sp->cls2.classValid) in lpfc_cmpl_els_flogi_fabric()
650 ndlp->nlp_class_sup |= FC_COS_CLASS2; in lpfc_cmpl_els_flogi_fabric()
651 if (sp->cls3.classValid) in lpfc_cmpl_els_flogi_fabric()
652 ndlp->nlp_class_sup |= FC_COS_CLASS3; in lpfc_cmpl_els_flogi_fabric()
653 if (sp->cls4.classValid) in lpfc_cmpl_els_flogi_fabric()
654 ndlp->nlp_class_sup |= FC_COS_CLASS4; in lpfc_cmpl_els_flogi_fabric()
655 ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | in lpfc_cmpl_els_flogi_fabric()
656 sp->cmn.bbRcvSizeLsb; in lpfc_cmpl_els_flogi_fabric()
661 if (phba->cfg_enable_SmartSAN || in lpfc_cmpl_els_flogi_fabric()
662 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) { in lpfc_cmpl_els_flogi_fabric()
664 vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR; in lpfc_cmpl_els_flogi_fabric()
665 if (phba->cfg_enable_SmartSAN) in lpfc_cmpl_els_flogi_fabric()
666 vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR; in lpfc_cmpl_els_flogi_fabric()
668 vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR; in lpfc_cmpl_els_flogi_fabric()
670 vport->fdmi_hba_mask = 0; in lpfc_cmpl_els_flogi_fabric()
671 vport->fdmi_port_mask = 0; in lpfc_cmpl_els_flogi_fabric()
675 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_flogi_fabric()
677 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_fabric()
679 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_cmpl_els_flogi_fabric()
681 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_cmpl_els_flogi_fabric()
682 if (sp->cmn.response_multiple_NPort) { in lpfc_cmpl_els_flogi_fabric()
687 sp->cmn.response_multiple_NPort); in lpfc_cmpl_els_flogi_fabric()
688 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
689 phba->link_flag |= LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
690 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
697 "- configuring single port mode.\n"); in lpfc_cmpl_els_flogi_fabric()
698 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
699 phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED; in lpfc_cmpl_els_flogi_fabric()
700 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi_fabric()
708 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
709 (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)) { in lpfc_cmpl_els_flogi_fabric()
715 if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag)) in lpfc_cmpl_els_flogi_fabric()
720 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_flogi_fabric()
726 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_flogi_fabric()
727 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_flogi_fabric()
728 !test_bit(NLP_NPR_ADISC, &np->nlp_flag)) in lpfc_cmpl_els_flogi_fabric()
730 clear_bit(NLP_NPR_ADISC, &np->nlp_flag); in lpfc_cmpl_els_flogi_fabric()
735 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
738 set_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_cmpl_els_flogi_fabric()
745 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_els_flogi_fabric()
746 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi_fabric()
747 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_flogi_fabric()
749 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_flogi_fabric()
757 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi_fabric()
759 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED && in lpfc_cmpl_els_flogi_fabric()
760 test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) in lpfc_cmpl_els_flogi_fabric()
765 ndlp->nlp_type |= NLP_FABRIC; in lpfc_cmpl_els_flogi_fabric()
767 if ((!test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) && in lpfc_cmpl_els_flogi_fabric()
768 (vport->vpi_state & LPFC_VPI_REGISTERED)) { in lpfc_cmpl_els_flogi_fabric()
771 } else if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag)) in lpfc_cmpl_els_flogi_fabric()
776 vport->fc_prevDID, vport->fc_myDID); in lpfc_cmpl_els_flogi_fabric()
784 * lpfc_cmpl_els_flogi_nport - Completion function for flogi to an N_Port
786 * @ndlp: pointer to a node-list data structure.
791 * in a point-to-point topology. First, the @vport's N_Port Name is compared
800 * 0 - Success
801 * -ENXIO - Fail
807 struct lpfc_hba *phba = vport->phba; in lpfc_cmpl_els_flogi_nport()
811 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_flogi_nport()
812 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_els_flogi_nport()
813 set_bit(FC_PT2PT, &vport->fc_flag); in lpfc_cmpl_els_flogi_nport()
816 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; in lpfc_cmpl_els_flogi_nport()
819 if ((phba->sli_rev == LPFC_SLI_REV4) && phba->fc_topology_changed) { in lpfc_cmpl_els_flogi_nport()
821 clear_bit(FC_VFI_REGISTERED, &vport->fc_flag); in lpfc_cmpl_els_flogi_nport()
822 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi_nport()
825 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
826 sizeof(vport->fc_portname)); in lpfc_cmpl_els_flogi_nport()
830 set_bit(FC_PT2PT_PLOGI, &vport->fc_flag); in lpfc_cmpl_els_flogi_nport()
839 vport->fc_myDID = PT2PT_LocalID; in lpfc_cmpl_els_flogi_nport()
845 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
859 memcpy(&ndlp->nlp_portname, &sp->portName, in lpfc_cmpl_els_flogi_nport()
861 memcpy(&ndlp->nlp_nodename, &sp->nodeName, in lpfc_cmpl_els_flogi_nport()
865 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_flogi_nport()
867 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_cmpl_els_flogi_nport()
873 mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_cmpl_els_flogi_nport()
874 mbox->vport = vport; in lpfc_cmpl_els_flogi_nport()
877 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_cmpl_els_flogi_nport()
885 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) in lpfc_cmpl_els_flogi_nport()
888 /* Start discovery - this should just do CLEAR_LA */ in lpfc_cmpl_els_flogi_nport()
894 return -ENXIO; in lpfc_cmpl_els_flogi_nport()
898 * lpfc_cmpl_els_flogi - Completion callback function for flogi
903 * This routine is the top-level completion callback function for issuing
905 * the lpfc_els_retry() routine shall be invoked to retry the FLOGI. If
906 * retry has been made (either immediately or delayed with lpfc_els_retry()
908 * If the retry attempt has been given up (possibly reach the maximum
914 * this is a point-to-point topology or a fabric topology: if the Port ID
916 * point-to-point topology. The routine lpfc_cmpl_els_flogi_fabric() or
924 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_flogi()
925 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_flogi()
927 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_flogi()
939 if (!(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
947 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_flogi()
950 irsp = &rspiocb->iocb; in lpfc_cmpl_els_flogi()
951 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_flogi()
957 vport->port_state); in lpfc_cmpl_els_flogi()
964 if (test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) && in lpfc_cmpl_els_flogi()
965 (phba->fcf.fcf_flag & FCF_DISCOVERY)) { in lpfc_cmpl_els_flogi()
966 if (phba->link_state < LPFC_LINK_UP) in lpfc_cmpl_els_flogi()
968 if ((phba->fcoe_cvl_eventtag_attn == in lpfc_cmpl_els_flogi()
969 phba->fcoe_cvl_eventtag) && in lpfc_cmpl_els_flogi()
975 phba->fcoe_cvl_eventtag_attn = in lpfc_cmpl_els_flogi()
976 phba->fcoe_cvl_eventtag; in lpfc_cmpl_els_flogi()
981 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
984 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1000 phba->hba_flag, phba->fcf.fcf_flag); in lpfc_cmpl_els_flogi()
1002 /* Check for retry */ in lpfc_cmpl_els_flogi()
1017 if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag) && in lpfc_cmpl_els_flogi()
1018 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) in lpfc_cmpl_els_flogi()
1024 ulp_status, ulp_word4, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1025 tmo, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1040 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_flogi()
1041 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_els_flogi()
1042 clear_bit(FC_PT2PT_NO_NVME, &vport->fc_flag); in lpfc_cmpl_els_flogi()
1048 if (phba->alpa_map[0] == 0) in lpfc_cmpl_els_flogi()
1049 vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS; in lpfc_cmpl_els_flogi()
1050 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_flogi()
1051 (!test_bit(FC_VFI_REGISTERED, &vport->fc_flag) || in lpfc_cmpl_els_flogi()
1052 (vport->fc_prevDID != vport->fc_myDID) || in lpfc_cmpl_els_flogi()
1053 phba->fc_topology_changed)) { in lpfc_cmpl_els_flogi()
1054 if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag)) { in lpfc_cmpl_els_flogi()
1055 if (phba->fc_topology_changed) { in lpfc_cmpl_els_flogi()
1058 &vport->fc_flag); in lpfc_cmpl_els_flogi()
1059 phba->fc_topology_changed = 0; in lpfc_cmpl_els_flogi()
1073 clear_bit(FC_VPORT_CVL_RCVD, &vport->fc_flag); in lpfc_cmpl_els_flogi()
1074 clear_bit(FC_VPORT_LOGO_RCVD, &vport->fc_flag); in lpfc_cmpl_els_flogi()
1080 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_flogi()
1085 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_flogi()
1091 cmdiocb->iotag, cmdiocb->sli4_xritag, in lpfc_cmpl_els_flogi()
1092 ulp_word4, sp->cmn.e_d_tov, in lpfc_cmpl_els_flogi()
1093 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution, in lpfc_cmpl_els_flogi()
1094 vport->port_state, vport->fc_flag, in lpfc_cmpl_els_flogi()
1095 sp->cmn.priority_tagging, kref_read(&ndlp->kref)); in lpfc_cmpl_els_flogi()
1100 vport->vmid_flag = 0; in lpfc_cmpl_els_flogi()
1102 if (sp->cmn.priority_tagging) in lpfc_cmpl_els_flogi()
1103 vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA | in lpfc_cmpl_els_flogi()
1112 if (vport->port_state == LPFC_FLOGI) { in lpfc_cmpl_els_flogi()
1117 if (sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1120 else if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) in lpfc_cmpl_els_flogi()
1129 phba->fcf.current_rec.fcf_indx, in lpfc_cmpl_els_flogi()
1130 phba->fcf.current_rec.switch_name[0], in lpfc_cmpl_els_flogi()
1131 phba->fcf.current_rec.switch_name[1], in lpfc_cmpl_els_flogi()
1132 phba->fcf.current_rec.switch_name[2], in lpfc_cmpl_els_flogi()
1133 phba->fcf.current_rec.switch_name[3], in lpfc_cmpl_els_flogi()
1134 phba->fcf.current_rec.switch_name[4], in lpfc_cmpl_els_flogi()
1135 phba->fcf.current_rec.switch_name[5], in lpfc_cmpl_els_flogi()
1136 phba->fcf.current_rec.switch_name[6], in lpfc_cmpl_els_flogi()
1137 phba->fcf.current_rec.switch_name[7], in lpfc_cmpl_els_flogi()
1138 phba->fcf.current_rec.fabric_name[0], in lpfc_cmpl_els_flogi()
1139 phba->fcf.current_rec.fabric_name[1], in lpfc_cmpl_els_flogi()
1140 phba->fcf.current_rec.fabric_name[2], in lpfc_cmpl_els_flogi()
1141 phba->fcf.current_rec.fabric_name[3], in lpfc_cmpl_els_flogi()
1142 phba->fcf.current_rec.fabric_name[4], in lpfc_cmpl_els_flogi()
1143 phba->fcf.current_rec.fabric_name[5], in lpfc_cmpl_els_flogi()
1144 phba->fcf.current_rec.fabric_name[6], in lpfc_cmpl_els_flogi()
1145 phba->fcf.current_rec.fabric_name[7]); in lpfc_cmpl_els_flogi()
1148 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1149 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1150 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1151 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_cmpl_els_flogi()
1152 clear_bit(HBA_DEVLOSS_TMO, &phba->hba_flag); in lpfc_cmpl_els_flogi()
1153 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1158 if (test_bit(HBA_FIP_SUPPORT, &phba->hba_flag)) in lpfc_cmpl_els_flogi()
1163 phba->fcf.current_rec.fcf_indx); in lpfc_cmpl_els_flogi()
1164 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1165 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1166 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1167 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_cmpl_els_flogi()
1168 clear_bit(HBA_DEVLOSS_TMO, &phba->hba_flag); in lpfc_cmpl_els_flogi()
1169 phba->fcf.fcf_redisc_attempted = 0; /* reset */ in lpfc_cmpl_els_flogi()
1172 } else if (vport->port_state > LPFC_FLOGI && in lpfc_cmpl_els_flogi()
1173 test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_cmpl_els_flogi()
1179 if (!sp->cmn.fPort) in lpfc_cmpl_els_flogi()
1184 spin_lock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1185 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_cmpl_els_flogi()
1186 spin_unlock_irq(&phba->hbalock); in lpfc_cmpl_els_flogi()
1199 (phba->link_state != LPFC_CLEAR_LA)) { in lpfc_cmpl_els_flogi()
1205 clear_bit(HBA_FLOGI_OUTSTANDING, &phba->hba_flag); in lpfc_cmpl_els_flogi()
1212 * lpfc_cmpl_els_link_down - Completion callback function for ELS command
1227 pcmd = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_cmpl_els_link_down()
1237 cmdiocb->cmd_flag); in lpfc_cmpl_els_link_down()
1239 if (cmdiocb->cmd_flag & LPFC_IO_FABRIC) { in lpfc_cmpl_els_link_down()
1240 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_els_link_down()
1241 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_els_link_down()
1247 * lpfc_issue_els_flogi - Issue an flogi iocb command for a vport
1249 * @ndlp: pointer to a node-list data structure.
1250 * @retry: number of retries to the command IOCB.
1254 * of the FLOGI Request IOCB and the top-level callback function pointer
1264 * 0 - successfully issued flogi iocb for @vport
1265 * 1 - failed to issue flogi iocb for @vport
1269 uint8_t retry) in lpfc_issue_els_flogi() argument
1271 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_flogi()
1283 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_flogi()
1284 ndlp->nlp_DID, ELS_CMD_FLOGI); in lpfc_issue_els_flogi()
1289 wqe = &elsiocb->wqe; in lpfc_issue_els_flogi()
1290 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_flogi()
1291 icmd = &elsiocb->iocb; in lpfc_issue_els_flogi()
1296 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_flogi()
1300 sp->cmn.e_d_tov = 0; in lpfc_issue_els_flogi()
1301 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_flogi()
1302 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_flogi()
1303 sp->cls1.classValid = 0; in lpfc_issue_els_flogi()
1304 if (sp->cmn.fcphLow < FC_PH3) in lpfc_issue_els_flogi()
1305 sp->cmn.fcphLow = FC_PH3; in lpfc_issue_els_flogi()
1306 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_flogi()
1307 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_flogi()
1310 if (phba->cfg_vmid_priority_tagging) { in lpfc_issue_els_flogi()
1311 sp->cmn.priority_tagging = 1; in lpfc_issue_els_flogi()
1313 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_issue_els_flogi()
1314 sizeof(vport->lpfc_vmid_host_uuid))) { in lpfc_issue_els_flogi()
1315 memcpy(vport->lpfc_vmid_host_uuid, phba->wwpn, in lpfc_issue_els_flogi()
1316 sizeof(phba->wwpn)); in lpfc_issue_els_flogi()
1317 memcpy(&vport->lpfc_vmid_host_uuid[8], phba->wwnn, in lpfc_issue_els_flogi()
1318 sizeof(phba->wwnn)); in lpfc_issue_els_flogi()
1322 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1323 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == in lpfc_issue_els_flogi()
1327 bf_set(wqe_ct, &wqe->els_req.wqe_com, ct); in lpfc_issue_els_flogi()
1330 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, in lpfc_issue_els_flogi()
1331 phba->fcf.fcfi); in lpfc_issue_els_flogi()
1335 sp->cls2.classValid = 0; in lpfc_issue_els_flogi()
1336 sp->cls2.seqDelivery = 0; in lpfc_issue_els_flogi()
1338 /* Historical, setting sequential-delivery bit for SLI3 */ in lpfc_issue_els_flogi()
1339 sp->cls2.seqDelivery = (sp->cls2.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1340 sp->cls3.seqDelivery = (sp->cls3.classValid) ? 1 : 0; in lpfc_issue_els_flogi()
1341 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) { in lpfc_issue_els_flogi()
1342 sp->cmn.request_multiple_Nport = 1; in lpfc_issue_els_flogi()
1344 icmd->ulpCt_h = 1; in lpfc_issue_els_flogi()
1345 icmd->ulpCt_l = 0; in lpfc_issue_els_flogi()
1347 sp->cmn.request_multiple_Nport = 0; in lpfc_issue_els_flogi()
1350 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_issue_els_flogi()
1351 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_flogi()
1352 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_flogi()
1356 tmo = phba->fc_ratov; in lpfc_issue_els_flogi()
1357 phba->fc_ratov = LPFC_DISC_FLOGI_TMO; in lpfc_issue_els_flogi()
1359 phba->fc_ratov = tmo; in lpfc_issue_els_flogi()
1361 phba->fc_stat.elsXmitFLOGI++; in lpfc_issue_els_flogi()
1362 elsiocb->cmd_cmpl = lpfc_cmpl_els_flogi; in lpfc_issue_els_flogi()
1366 phba->sli3_options, 0, 0); in lpfc_issue_els_flogi()
1368 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_flogi()
1369 if (!elsiocb->ndlp) { in lpfc_issue_els_flogi()
1375 set_bit(HBA_FLOGI_ISSUED, &phba->hba_flag); in lpfc_issue_els_flogi()
1376 set_bit(HBA_FLOGI_OUTSTANDING, &phba->hba_flag); in lpfc_issue_els_flogi()
1380 clear_bit(HBA_FLOGI_ISSUED, &phba->hba_flag); in lpfc_issue_els_flogi()
1381 clear_bit(HBA_FLOGI_OUTSTANDING, &phba->hba_flag); in lpfc_issue_els_flogi()
1388 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_issue_els_flogi()
1391 if (phba->defer_flogi_acc.flag) { in lpfc_issue_els_flogi()
1397 did = vport->fc_myDID; in lpfc_issue_els_flogi()
1398 vport->fc_myDID = Fabric_DID; in lpfc_issue_els_flogi()
1402 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_flogi()
1405 phba->defer_flogi_acc.rx_id); in lpfc_issue_els_flogi()
1408 phba->defer_flogi_acc.ox_id); in lpfc_issue_els_flogi()
1411 icmd->ulpContext = phba->defer_flogi_acc.rx_id; in lpfc_issue_els_flogi()
1412 icmd->unsli3.rcvsli3.ox_id = in lpfc_issue_els_flogi()
1413 phba->defer_flogi_acc.ox_id; in lpfc_issue_els_flogi()
1419 phba->defer_flogi_acc.rx_id, in lpfc_issue_els_flogi()
1420 phba->defer_flogi_acc.ox_id, phba->hba_flag); in lpfc_issue_els_flogi()
1426 phba->defer_flogi_acc.flag = false; in lpfc_issue_els_flogi()
1431 if (phba->defer_flogi_acc.ndlp) { in lpfc_issue_els_flogi()
1432 lpfc_nlp_put(phba->defer_flogi_acc.ndlp); in lpfc_issue_els_flogi()
1433 phba->defer_flogi_acc.ndlp = NULL; in lpfc_issue_els_flogi()
1436 vport->fc_myDID = did; in lpfc_issue_els_flogi()
1443 * lpfc_els_abort_flogi - Abort all outstanding flogi iocbs
1454 * 0 - Successfully issued abort iocb on all outstanding flogis (Always 0)
1471 return -EIO; in lpfc_els_abort_flogi()
1477 spin_lock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1478 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_els_abort_flogi()
1481 ndlp = iocb->ndlp; in lpfc_els_abort_flogi()
1482 if (ndlp && ndlp->nlp_DID == Fabric_DID) { in lpfc_els_abort_flogi()
1483 if (test_bit(FC_PT2PT, &phba->pport->fc_flag) && in lpfc_els_abort_flogi()
1485 &phba->pport->fc_flag)) in lpfc_els_abort_flogi()
1486 iocb->fabric_cmd_cmpl = in lpfc_els_abort_flogi()
1496 spin_unlock_irq(&phba->hbalock); in lpfc_els_abort_flogi()
1502 * lpfc_initial_flogi - Issue an initial fabric login for a vport
1514 * 0 - failed to issue initial flogi for @vport
1515 * 1 - successfully issued initial flogi for @vport
1522 vport->port_state = LPFC_FLOGI; in lpfc_initial_flogi()
1533 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_flogi()
1540 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_initial_flogi()
1543 * transport or dev-loss-evt work is pending. in lpfc_initial_flogi()
1546 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_flogi()
1547 !test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) in lpfc_initial_flogi()
1555 * lpfc_initial_fdisc - Issue an initial fabric discovery for a vport
1567 * 0 - failed to issue initial fdisc for @vport
1568 * 1 - successfully issued initial fdisc for @vport
1584 ndlp->nlp_type |= NLP_FABRIC; in lpfc_initial_fdisc()
1592 * transport or dev-loss-evt work is pending. in lpfc_initial_fdisc()
1595 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_initial_fdisc()
1596 !test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) in lpfc_initial_fdisc()
1604 * lpfc_more_plogi - Check and issue remaining plogis for a vport
1611 * @vport (@vport->cfg_discovery_threads). The function also decrement
1617 if (vport->num_disc_nodes) in lpfc_more_plogi()
1618 vport->num_disc_nodes--; in lpfc_more_plogi()
1624 vport->num_disc_nodes, in lpfc_more_plogi()
1625 atomic_read(&vport->fc_plogi_cnt), in lpfc_more_plogi()
1626 vport->fc_flag, vport->port_state); in lpfc_more_plogi()
1628 if (test_bit(FC_NLP_MORE, &vport->fc_flag)) in lpfc_more_plogi()
1636 * lpfc_plogi_confirm_nport - Confirm plogi wwpn matches stored ndlp
1639 * @ndlp: pointer to a node-list data structure.
1657 * Note that before the @ndlp got "released", the keepDID from not-matching
1670 struct lpfc_vport *vport = ndlp->vport; in lpfc_plogi_confirm_nport()
1688 new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName); in lpfc_plogi_confirm_nport()
1694 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_plogi_confirm_nport()
1695 active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool, in lpfc_plogi_confirm_nport()
1699 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1705 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type, in lpfc_plogi_confirm_nport()
1706 (new_ndlp ? new_ndlp->nlp_DID : 0), in lpfc_plogi_confirm_nport()
1707 (new_ndlp ? new_ndlp->nlp_flag : 0), in lpfc_plogi_confirm_nport()
1708 (new_ndlp ? new_ndlp->nlp_fc4_type : 0)); in lpfc_plogi_confirm_nport()
1711 rc = memcmp(&ndlp->nlp_portname, name, in lpfc_plogi_confirm_nport()
1716 phba->active_rrq_pool); in lpfc_plogi_confirm_nport()
1719 new_ndlp = lpfc_nlp_init(vport, ndlp->nlp_DID); in lpfc_plogi_confirm_nport()
1723 phba->active_rrq_pool); in lpfc_plogi_confirm_nport()
1727 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1730 new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1731 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1740 keepDID = new_ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1747 if (test_bit(FC_FABRIC, &vport->fc_flag)) { in lpfc_plogi_confirm_nport()
1748 keep_nlp_fc4_type = new_ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1749 new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type; in lpfc_plogi_confirm_nport()
1753 new_ndlp->nlp_DID = ndlp->nlp_DID; in lpfc_plogi_confirm_nport()
1754 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state; in lpfc_plogi_confirm_nport()
1755 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_plogi_confirm_nport()
1756 memcpy(new_ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1757 ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1758 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1761 spin_lock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1762 spin_lock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1763 keep_new_nlp_flag = new_ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1764 keep_nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1765 new_ndlp->nlp_flag = ndlp->nlp_flag; in lpfc_plogi_confirm_nport()
1769 set_bit(NLP_UNREG_INP, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1771 clear_bit(NLP_UNREG_INP, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1775 set_bit(NLP_RPI_REGISTERED, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1777 clear_bit(NLP_RPI_REGISTERED, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1784 set_bit(NLP_DROPPED, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1786 clear_bit(NLP_DROPPED, &new_ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1788 ndlp->nlp_flag = keep_new_nlp_flag; in lpfc_plogi_confirm_nport()
1792 set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1794 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1798 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1800 clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1807 set_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1809 clear_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_plogi_confirm_nport()
1811 spin_unlock_irq(&new_ndlp->lock); in lpfc_plogi_confirm_nport()
1812 spin_unlock_irq(&ndlp->lock); in lpfc_plogi_confirm_nport()
1815 keep_nlp_state = new_ndlp->nlp_state; in lpfc_plogi_confirm_nport()
1816 lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state); in lpfc_plogi_confirm_nport()
1819 keep_nrport = new_ndlp->nrport; in lpfc_plogi_confirm_nport()
1820 new_ndlp->nrport = ndlp->nrport; in lpfc_plogi_confirm_nport()
1823 if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) { in lpfc_plogi_confirm_nport()
1830 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1836 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1837 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1839 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1841 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1843 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1848 new_ndlp->nlp_DID, keepDID); in lpfc_plogi_confirm_nport()
1855 ndlp->nlp_DID = keepDID; in lpfc_plogi_confirm_nport()
1856 ndlp->nlp_fc4_type = keep_nlp_fc4_type; in lpfc_plogi_confirm_nport()
1858 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1860 memcpy(ndlp->active_rrqs_xri_bitmap, in lpfc_plogi_confirm_nport()
1862 phba->cfg_rrq_xri_bitmap_sz); in lpfc_plogi_confirm_nport()
1867 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_plogi_confirm_nport()
1868 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) in lpfc_plogi_confirm_nport()
1871 ndlp->nrport = keep_nrport; in lpfc_plogi_confirm_nport()
1878 if (!ndlp->rport && (ndlp->nlp_state == NLP_STE_NPR_NODE)) in lpfc_plogi_confirm_nport()
1881 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_plogi_confirm_nport()
1884 phba->active_rrq_pool); in lpfc_plogi_confirm_nport()
1888 new_ndlp->nlp_DID, new_ndlp->nlp_flag, in lpfc_plogi_confirm_nport()
1889 new_ndlp->nlp_fc4_type); in lpfc_plogi_confirm_nport()
1895 * lpfc_end_rscn - Check and handle more rscn for a vport
1909 if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) { in lpfc_end_rscn()
1914 if (vport->fc_rscn_id_cnt || in lpfc_end_rscn()
1915 test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) in lpfc_end_rscn()
1918 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_end_rscn()
1923 * lpfc_cmpl_els_rrq - Completion handled for els RRQs.
1938 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_rrq()
1939 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rrq()
1945 rrq = cmdiocb->context_un.rrq; in lpfc_cmpl_els_rrq()
1946 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_rrq()
1958 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_rrq()
1959 get_wqe_tmo(cmdiocb), rrq->xritag, rrq->rxid); in lpfc_cmpl_els_rrq()
1962 /* Check for retry */ in lpfc_cmpl_els_rrq()
1967 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_rrq()
1971 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_rrq()
1975 lpfc_clr_rrq_active(phba, rrq->xritag, rrq); in lpfc_cmpl_els_rrq()
1981 * lpfc_cmpl_els_plogi - Completion callback function for plogi
1992 * retry shall be attempted by invoking the lpfc_els_retry() routine.
2004 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_plogi()
2014 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_plogi()
2020 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_plogi()
2023 irsp = &rspiocb->iocb; in lpfc_cmpl_els_plogi()
2024 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_plogi()
2043 disc = test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_plogi()
2049 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_plogi()
2050 ndlp->nlp_fc4_type, in lpfc_cmpl_els_plogi()
2052 disc, vport->num_disc_nodes); in lpfc_cmpl_els_plogi()
2056 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_plogi()
2061 /* Check for retry */ in lpfc_cmpl_els_plogi()
2065 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_plogi()
2072 (phba)->pport->cfg_log_verbose & LOG_ELS) in lpfc_cmpl_els_plogi()
2076 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_plogi()
2087 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2088 if ((test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag) || in lpfc_cmpl_els_plogi()
2089 test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag)) && in lpfc_cmpl_els_plogi()
2090 ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) { in lpfc_cmpl_els_plogi()
2091 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2099 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_plogi()
2100 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_plogi()
2101 if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) in lpfc_cmpl_els_plogi()
2104 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_plogi()
2111 prsp = list_get_first(&cmdiocb->cmd_dmabuf->list, in lpfc_cmpl_els_plogi()
2117 ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp); in lpfc_cmpl_els_plogi()
2119 sp = (struct serv_parm *)((u8 *)prsp->virt + in lpfc_cmpl_els_plogi()
2122 ndlp->vmid_support = 0; in lpfc_cmpl_els_plogi()
2123 if ((phba->cfg_vmid_app_header && sp->cmn.app_hdr_support) || in lpfc_cmpl_els_plogi()
2124 (phba->cfg_vmid_priority_tagging && in lpfc_cmpl_els_plogi()
2125 sp->cmn.priority_tagging)) { in lpfc_cmpl_els_plogi()
2128 sp->cmn.app_hdr_support, in lpfc_cmpl_els_plogi()
2129 sp->cmn.priority_tagging, in lpfc_cmpl_els_plogi()
2130 ndlp->nlp_DID); in lpfc_cmpl_els_plogi()
2132 ndlp->vmid_support = 1; in lpfc_cmpl_els_plogi()
2139 if (disc && vport->num_disc_nodes) { in lpfc_cmpl_els_plogi()
2143 if (vport->num_disc_nodes == 0) { in lpfc_cmpl_els_plogi()
2144 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_cmpl_els_plogi()
2154 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_plogi()
2158 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_plogi()
2166 * lpfc_issue_els_plogi - Issue an plogi iocb command for a vport
2169 * @retry: number of retries to the command IOCB.
2182 * 0 - Successfully issued a plogi for @vport
2183 * 1 - failed to issue a plogi for @vport
2186 lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry) in lpfc_issue_els_plogi() argument
2188 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_plogi()
2204 if ((test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) || in lpfc_issue_els_plogi()
2205 test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) && in lpfc_issue_els_plogi()
2206 ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) && in lpfc_issue_els_plogi()
2207 !test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) { in lpfc_issue_els_plogi()
2212 ndlp->nlp_defer_did, ndlp->nlp_DID, in lpfc_issue_els_plogi()
2213 ndlp->nlp_rpi, ndlp->nlp_flag, ndlp); in lpfc_issue_els_plogi()
2216 if (ndlp->nlp_defer_did == NLP_EVT_NOTHING_PENDING) in lpfc_issue_els_plogi()
2217 ndlp->nlp_defer_did = did; in lpfc_issue_els_plogi()
2222 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, in lpfc_issue_els_plogi()
2227 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_plogi()
2232 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_plogi()
2236 * If we are a N-port connected to a Fabric, fix-up paramm's so logins in lpfc_issue_els_plogi()
2239 if (test_bit(FC_FABRIC, &vport->fc_flag) && in lpfc_issue_els_plogi()
2240 !test_bit(FC_PUBLIC_LOOP, &vport->fc_flag)) in lpfc_issue_els_plogi()
2241 sp->cmn.altBbCredit = 1; in lpfc_issue_els_plogi()
2243 if (sp->cmn.fcphLow < FC_PH_4_3) in lpfc_issue_els_plogi()
2244 sp->cmn.fcphLow = FC_PH_4_3; in lpfc_issue_els_plogi()
2246 if (sp->cmn.fcphHigh < FC_PH3) in lpfc_issue_els_plogi()
2247 sp->cmn.fcphHigh = FC_PH3; in lpfc_issue_els_plogi()
2249 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_plogi()
2250 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_plogi()
2251 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_issue_els_plogi()
2254 ndlp->vmid_support = 0; in lpfc_issue_els_plogi()
2255 if (vport->vmid_priority_tagging) in lpfc_issue_els_plogi()
2256 sp->cmn.priority_tagging = 1; in lpfc_issue_els_plogi()
2257 else if (phba->cfg_vmid_app_header && in lpfc_issue_els_plogi()
2258 bf_get(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags)) in lpfc_issue_els_plogi()
2259 sp->cmn.app_hdr_support = 1; in lpfc_issue_els_plogi()
2268 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_issue_els_plogi()
2269 sp->cmn.valid_vendor_ver_level = 1; in lpfc_issue_els_plogi()
2270 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_issue_els_plogi()
2271 sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP); in lpfc_issue_els_plogi()
2274 phba->fc_stat.elsXmitPLOGI++; in lpfc_issue_els_plogi()
2275 elsiocb->cmd_cmpl = lpfc_cmpl_els_plogi; in lpfc_issue_els_plogi()
2279 did, kref_read(&ndlp->kref), 0); in lpfc_issue_els_plogi()
2280 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_plogi()
2281 if (!elsiocb->ndlp) { in lpfc_issue_els_plogi()
2297 * lpfc_cmpl_els_prli - Completion callback function for prli
2304 * status. If there is error status reported, PRLI retry shall be attempted
2313 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_prli()
2321 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_prli()
2323 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_prli()
2328 clear_bit(NLP_PRLI_SND, &ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2331 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2332 vport->fc_prli_sent--; in lpfc_cmpl_els_prli()
2333 ndlp->fc4_prli_sent--; in lpfc_cmpl_els_prli()
2334 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2339 ndlp->nlp_DID); in lpfc_cmpl_els_prli()
2345 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_prli()
2346 vport->num_disc_nodes, ndlp->fc4_prli_sent, in lpfc_cmpl_els_prli()
2347 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_prli()
2354 /* Check for retry */ in lpfc_cmpl_els_prli()
2363 if (test_bit(FC_FABRIC, &vport->fc_flag) || in lpfc_cmpl_els_prli()
2364 vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH) in lpfc_cmpl_els_prli()
2373 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_prli()
2374 ulp_word4, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2375 ndlp->fc4_prli_sent, ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2386 if ((ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_prli()
2387 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) || in lpfc_cmpl_els_prli()
2388 (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_cmpl_els_prli()
2389 test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag))) { in lpfc_cmpl_els_prli()
2393 ndlp->nlp_DID, ndlp->nlp_state, in lpfc_cmpl_els_prli()
2394 ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2402 if (test_bit(FC_PT2PT, &vport->fc_flag)) in lpfc_cmpl_els_prli()
2410 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2411 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) && in lpfc_cmpl_els_prli()
2412 !ndlp->fc4_prli_sent) { in lpfc_cmpl_els_prli()
2413 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_prli()
2414 if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) in lpfc_cmpl_els_prli()
2417 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_prli()
2439 * lpfc_issue_els_prli - Issue a prli iocb command for a vport
2441 * @ndlp: pointer to a node-list data structure.
2442 * @retry: number of retries to the command IOCB.
2455 * 0 - successfully issued prli iocb command for @vport
2456 * 1 - failed to issue prli iocb command for @vport
2460 uint8_t retry) in lpfc_issue_els_prli() argument
2463 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_prli()
2477 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2478 test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_issue_els_prli()
2479 vport->nvmei_support) in lpfc_issue_els_prli()
2480 ndlp->nlp_fc4_type |= NLP_FC4_NVME; in lpfc_issue_els_prli()
2481 local_nlp_type = ndlp->nlp_fc4_type; in lpfc_issue_els_prli()
2486 ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR); in lpfc_issue_els_prli()
2487 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR); in lpfc_issue_els_prli()
2488 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_issue_els_prli()
2489 clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag); in lpfc_issue_els_prli()
2490 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_issue_els_prli()
2491 ndlp->nvme_fb_size = 0; in lpfc_issue_els_prli()
2505 ndlp->nlp_fc4_type, ndlp->nlp_DID); in lpfc_issue_els_prli()
2512 if (phba->sli_rev == LPFC_SLI_REV3 && in lpfc_issue_els_prli()
2513 ndlp->nlp_fc4_type == NLP_FC4_NVME) { in lpfc_issue_els_prli()
2516 ndlp->nlp_type); in lpfc_issue_els_prli()
2521 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_prli()
2522 ndlp->nlp_DID, elscmd); in lpfc_issue_els_prli()
2526 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_prli()
2543 * set the following bits for FC-TAPE support. in lpfc_issue_els_prli()
2545 if (phba->vpd.rev.feaLevelHigh >= 0x02) { in lpfc_issue_els_prli()
2546 npr->ConfmComplAllowed = 1; in lpfc_issue_els_prli()
2547 npr->Retry = 1; in lpfc_issue_els_prli()
2548 npr->TaskRetryIdReq = 1; in lpfc_issue_els_prli()
2550 npr->estabImagePair = 1; in lpfc_issue_els_prli()
2551 npr->readXferRdyDis = 1; in lpfc_issue_els_prli()
2552 if (vport->cfg_first_burst_size) in lpfc_issue_els_prli()
2553 npr->writeXferRdyDis = 1; in lpfc_issue_els_prli()
2556 npr->prliType = PRLI_FCP_TYPE; in lpfc_issue_els_prli()
2557 npr->initiatorFunc = 1; in lpfc_issue_els_prli()
2558 elsiocb->cmd_flag |= LPFC_PRLI_FCP_REQ; in lpfc_issue_els_prli()
2560 /* Remove FCP type - processed. */ in lpfc_issue_els_prli()
2572 if (phba->nsler) { in lpfc_issue_els_prli()
2578 if ((phba->cfg_nvme_enable_fb) && in lpfc_issue_els_prli()
2579 !phba->nvmet_support) in lpfc_issue_els_prli()
2582 if (phba->nvmet_support) { in lpfc_issue_els_prli()
2590 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_issue_els_prli()
2591 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_issue_els_prli()
2592 elsiocb->cmd_flag |= LPFC_PRLI_NVME_REQ; in lpfc_issue_els_prli()
2594 /* Remove NVME type - processed. */ in lpfc_issue_els_prli()
2598 phba->fc_stat.elsXmitPRLI++; in lpfc_issue_els_prli()
2599 elsiocb->cmd_cmpl = lpfc_cmpl_els_prli; in lpfc_issue_els_prli()
2603 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_prli()
2604 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_prli()
2605 if (!elsiocb->ndlp) { in lpfc_issue_els_prli()
2621 set_bit(NLP_PRLI_SND, &ndlp->nlp_flag); in lpfc_issue_els_prli()
2622 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2623 vport->fc_prli_sent++; in lpfc_issue_els_prli()
2624 ndlp->fc4_prli_sent++; in lpfc_issue_els_prli()
2625 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_prli()
2630 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_issue_els_prli()
2638 * lpfc_rscn_disc - Perform rscn discovery for a vport
2656 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_rscn_disc()
2664 * lpfc_adisc_done - Complete the adisc phase of discovery
2676 struct lpfc_hba *phba = vport->phba; in lpfc_adisc_done()
2682 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_adisc_done()
2683 !test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_adisc_done()
2684 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_adisc_done()
2709 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_adisc_done()
2712 if (!test_bit(FC_ABORT_DISCOVERY, &vport->fc_flag)) { in lpfc_adisc_done()
2713 vport->num_disc_nodes = 0; in lpfc_adisc_done()
2715 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_adisc_done()
2717 if (!vport->num_disc_nodes) { in lpfc_adisc_done()
2718 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_adisc_done()
2723 vport->port_state = LPFC_VPORT_READY; in lpfc_adisc_done()
2729 * lpfc_more_adisc - Issue more adisc as needed
2740 if (vport->num_disc_nodes) in lpfc_more_adisc()
2741 vport->num_disc_nodes--; in lpfc_more_adisc()
2746 vport->num_disc_nodes, in lpfc_more_adisc()
2747 atomic_read(&vport->fc_adisc_cnt), in lpfc_more_adisc()
2748 vport->fc_flag, vport->port_state); in lpfc_more_adisc()
2750 if (test_bit(FC_NLP_MORE, &vport->fc_flag)) { in lpfc_more_adisc()
2755 if (!vport->num_disc_nodes) in lpfc_more_adisc()
2761 * lpfc_cmpl_els_adisc - Completion callback function for adisc
2780 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_adisc()
2788 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_adisc()
2790 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_adisc()
2795 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_adisc()
2799 irsp = &rspiocb->iocb; in lpfc_cmpl_els_adisc()
2800 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_adisc()
2801 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_adisc()
2807 ndlp->nlp_DID); in lpfc_cmpl_els_adisc()
2812 disc = test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_adisc()
2813 clear_bit(NLP_ADISC_SND, &ndlp->nlp_flag); in lpfc_cmpl_els_adisc()
2818 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_adisc()
2820 tmo, disc, vport->num_disc_nodes); in lpfc_cmpl_els_adisc()
2824 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_adisc()
2829 /* Check for retry */ in lpfc_cmpl_els_adisc()
2833 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_adisc()
2841 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_adisc()
2850 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2851 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_adisc()
2852 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_adisc()
2853 if (!test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) in lpfc_cmpl_els_adisc()
2856 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_adisc()
2867 if (disc && vport->num_disc_nodes) in lpfc_cmpl_els_adisc()
2876 * lpfc_issue_els_adisc - Issue an address discover iocb to an node on a vport
2878 * @ndlp: pointer to a node-list data structure.
2879 * @retry: number of retries to the command IOCB.
2891 * 0 - successfully issued adisc
2892 * 1 - failed to issue adisc
2896 uint8_t retry) in lpfc_issue_els_adisc() argument
2899 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_adisc()
2906 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_adisc()
2907 ndlp->nlp_DID, ELS_CMD_ADISC); in lpfc_issue_els_adisc()
2911 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_adisc()
2919 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_issue_els_adisc()
2920 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2921 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_adisc()
2922 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_adisc()
2924 phba->fc_stat.elsXmitADISC++; in lpfc_issue_els_adisc()
2925 elsiocb->cmd_cmpl = lpfc_cmpl_els_adisc; in lpfc_issue_els_adisc()
2926 set_bit(NLP_ADISC_SND, &ndlp->nlp_flag); in lpfc_issue_els_adisc()
2927 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_adisc()
2928 if (!elsiocb->ndlp) { in lpfc_issue_els_adisc()
2935 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_adisc()
2947 clear_bit(NLP_ADISC_SND, &ndlp->nlp_flag); in lpfc_issue_els_adisc()
2952 * lpfc_cmpl_els_logo - Completion callback function for logo
2966 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo()
2967 struct lpfc_vport *vport = ndlp->vport; in lpfc_cmpl_els_logo()
2976 cmdiocb->rsp_iocb = rspiocb; in lpfc_cmpl_els_logo()
2981 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_logo()
2985 irsp = &rspiocb->iocb; in lpfc_cmpl_els_logo()
2986 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_logo()
2987 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_logo()
2990 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
2991 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
2992 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_logo()
2994 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_logo()
2996 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_logo()
3001 ndlp->nlp_DID); in lpfc_cmpl_els_logo()
3008 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_logo()
3009 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo()
3010 ndlp->fc4_xpt_flags, ulp_status, ulp_word4, in lpfc_cmpl_els_logo()
3011 tmo, vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3021 * discovery. The PLOGI will retry. in lpfc_cmpl_els_logo()
3026 "2756 LOGO, No Retry DID:%06X " in lpfc_cmpl_els_logo()
3028 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3044 if (test_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag)) { in lpfc_cmpl_els_logo()
3045 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
3058 if (wake_up_waiter && ndlp->logo_waitq) in lpfc_cmpl_els_logo()
3059 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_logo()
3065 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) && in lpfc_cmpl_els_logo()
3068 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
3073 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3075 vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3089 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_logo()
3090 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
3101 * lpfc_issue_els_logo - Issue a logo to an node on a vport
3103 * @ndlp: pointer to a node-list data structure.
3104 * @retry: number of retries to the command IOCB.
3118 * 0 - successfully issued logo
3119 * 1 - failed to issue logo
3123 uint8_t retry) in lpfc_issue_els_logo() argument
3125 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_logo()
3131 if (test_bit(NLP_LOGO_SND, &ndlp->nlp_flag)) in lpfc_issue_els_logo()
3135 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_logo()
3136 ndlp->nlp_DID, ELS_CMD_LOGO); in lpfc_issue_els_logo()
3140 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_logo()
3145 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_logo()
3147 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_logo()
3149 phba->fc_stat.elsXmitLOGO++; in lpfc_issue_els_logo()
3150 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo; in lpfc_issue_els_logo()
3151 set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3152 clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3153 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_logo()
3154 if (!elsiocb->ndlp) { in lpfc_issue_els_logo()
3161 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_logo()
3170 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3171 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_issue_els_logo()
3172 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3177 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3182 * lpfc_cmpl_els_cmd - Completion callback function for generic els command
3200 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_cmd()
3209 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_cmd()
3213 irsp = &rspiocb->iocb; in lpfc_cmpl_els_cmd()
3214 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_cmd()
3215 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_cmd()
3230 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_cmd()
3237 * lpfc_reg_fab_ctrl_node - RPI register the fabric controller node.
3254 struct lpfc_hba *phba = vport->phba; in lpfc_reg_fab_ctrl_node()
3258 if (test_bit(NLP_RPI_REGISTERED, &fc_ndlp->nlp_flag)) in lpfc_reg_fab_ctrl_node()
3263 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3267 __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3268 ns_ndlp->nlp_state); in lpfc_reg_fab_ctrl_node()
3269 if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_reg_fab_ctrl_node()
3270 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3272 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_reg_fab_ctrl_node()
3277 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3278 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3279 return -ENOMEM; in lpfc_reg_fab_ctrl_node()
3281 rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3282 (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3284 rc = -EACCES; in lpfc_reg_fab_ctrl_node()
3288 set_bit(NLP_REG_LOGIN_SEND, &fc_ndlp->nlp_flag); in lpfc_reg_fab_ctrl_node()
3289 mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login; in lpfc_reg_fab_ctrl_node()
3290 mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp); in lpfc_reg_fab_ctrl_node()
3291 if (!mbox->ctx_ndlp) { in lpfc_reg_fab_ctrl_node()
3292 rc = -ENOMEM; in lpfc_reg_fab_ctrl_node()
3296 mbox->vport = vport; in lpfc_reg_fab_ctrl_node()
3299 rc = -ENODEV; in lpfc_reg_fab_ctrl_node()
3313 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3314 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3319 * lpfc_cmpl_els_disc_cmd - Completion callback function for Discovery ELS cmd
3333 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_disc_cmd()
3339 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_disc_cmd()
3346 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_disc_cmd()
3350 irsp = &rspiocb->iocb; in lpfc_cmpl_els_disc_cmd()
3351 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_disc_cmd()
3352 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_disc_cmd()
3362 iotag, ulp_status, ulp_word4, tmo, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3364 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_disc_cmd()
3368 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_disc_cmd()
3373 /* Only 1 retry for ELS Timeout only */ in lpfc_cmpl_els_disc_cmd()
3377 cmdiocb->retry++; in lpfc_cmpl_els_disc_cmd()
3378 if (cmdiocb->retry <= 1) { in lpfc_cmpl_els_disc_cmd()
3381 lpfc_issue_els_scr(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3384 lpfc_issue_els_edc(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3387 lpfc_issue_els_rdf(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3392 phba->fc_stat.elsRetryExceeded++; in lpfc_cmpl_els_disc_cmd()
3413 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_disc_cmd()
3417 prdf = (struct lpfc_els_rdf_rsp *)prsp->virt; in lpfc_cmpl_els_disc_cmd()
3424 i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++) in lpfc_cmpl_els_disc_cmd()
3430 prdf->reg_d1.desc_tags[i]), in lpfc_cmpl_els_disc_cmd()
3431 phba->cgn_reg_signal, in lpfc_cmpl_els_disc_cmd()
3432 phba->cgn_reg_fpin); in lpfc_cmpl_els_disc_cmd()
3444 * lpfc_issue_els_scr - Issue a scr to an node on a vport
3446 * @retry: retry counter for the command IOCB.
3460 * 0 - Successfully issued scr command
3461 * 1 - Failed to issue scr command
3464 lpfc_issue_els_scr(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_scr() argument
3467 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_scr()
3483 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_scr()
3484 ndlp->nlp_DID, ELS_CMD_SCR); in lpfc_issue_els_scr()
3488 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_scr()
3498 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_scr()
3505 ((SCR *) pcmd)->Function = SCR_FUNC_FULL; in lpfc_issue_els_scr()
3509 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_scr()
3511 phba->fc_stat.elsXmitSCR++; in lpfc_issue_els_scr()
3512 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_scr()
3513 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_scr()
3514 if (!elsiocb->ndlp) { in lpfc_issue_els_scr()
3521 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_scr()
3534 * lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
3537 * @retry: number of retries to the command IOCB.
3541 * in point-to-point mode. When sent to the Fabric Controller, it will
3549 * 0 - Successfully issued RSCN command
3550 * 1 - Failed to issue RSCN command
3553 lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rscn() argument
3556 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rscn()
3567 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_issue_els_rscn()
3568 !test_bit(FC_PUBLIC_LOOP, &vport->fc_flag)) in lpfc_issue_els_rscn()
3571 if (test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_issue_els_rscn()
3572 /* find any mapped nport - that would be the other nport */ in lpfc_issue_els_rscn()
3589 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rscn()
3590 ndlp->nlp_DID, ELS_CMD_RSCN_XMT); in lpfc_issue_els_rscn()
3595 event = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rscn()
3597 event->rscn.rscn_cmd = ELS_RSCN; in lpfc_issue_els_rscn()
3598 event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page); in lpfc_issue_els_rscn()
3599 event->rscn.rscn_plen = cpu_to_be16(cmdsize); in lpfc_issue_els_rscn()
3601 nportid = vport->fc_myDID; in lpfc_issue_els_rscn()
3603 event->portid.rscn_page_flags = 0; in lpfc_issue_els_rscn()
3604 event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16; in lpfc_issue_els_rscn()
3605 event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8; in lpfc_issue_els_rscn()
3606 event->portid.rscn_fid[2] = nportid & 0x000000FF; in lpfc_issue_els_rscn()
3608 phba->fc_stat.elsXmitRSCN++; in lpfc_issue_els_rscn()
3609 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_rscn()
3610 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rscn()
3611 if (!elsiocb->ndlp) { in lpfc_issue_els_rscn()
3618 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_rscn()
3631 * lpfc_issue_els_farpr - Issue a farp to an node on a vport
3634 * @retry: number of retries to the command IOCB.
3648 * 0 - Successfully issued farpr command
3649 * 1 - Failed to issue farpr command
3652 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry) in lpfc_issue_els_farpr() argument
3655 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_farpr()
3674 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_farpr()
3675 ndlp->nlp_DID, ELS_CMD_FARPR); in lpfc_issue_els_farpr()
3679 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_farpr()
3689 *lp++ = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_farpr()
3690 fp->Rflags = 0; in lpfc_issue_els_farpr()
3691 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE); in lpfc_issue_els_farpr()
3693 memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3694 memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3697 memcpy(&fp->OportName, &ondlp->nlp_portname, in lpfc_issue_els_farpr()
3699 memcpy(&fp->OnodeName, &ondlp->nlp_nodename, in lpfc_issue_els_farpr()
3705 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_farpr()
3707 phba->fc_stat.elsXmitFARPR++; in lpfc_issue_els_farpr()
3708 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_farpr()
3709 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_farpr()
3710 if (!elsiocb->ndlp) { in lpfc_issue_els_farpr()
3725 /* This will cause the callback-function lpfc_cmpl_els_cmd to in lpfc_issue_els_farpr()
3733 * lpfc_issue_els_rdf - Register for diagnostic functions from the fabric.
3735 * @retry: retry counter for the command IOCB.
3745 * 0 - Successfully issued rdf command
3746 * 1 - Failed to issue rdf command
3749 lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rdf() argument
3751 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rdf()
3764 return -ENODEV; in lpfc_issue_els_rdf()
3769 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_rdf()
3770 return -EACCES; in lpfc_issue_els_rdf()
3772 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rdf()
3773 ndlp->nlp_DID, ELS_CMD_RDF); in lpfc_issue_els_rdf()
3775 return -ENOMEM; in lpfc_issue_els_rdf()
3778 prdf = (struct lpfc_els_rdf_req *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rdf()
3780 prdf->rdf.fpin_cmd = ELS_RDF; in lpfc_issue_els_rdf()
3781 prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) - in lpfc_issue_els_rdf()
3783 prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER); in lpfc_issue_els_rdf()
3784 prdf->reg_d1.reg_desc.desc_len = cpu_to_be32( in lpfc_issue_els_rdf()
3785 FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1)); in lpfc_issue_els_rdf()
3786 prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT); in lpfc_issue_els_rdf()
3787 prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY); in lpfc_issue_els_rdf()
3788 prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY); in lpfc_issue_els_rdf()
3789 prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST); in lpfc_issue_els_rdf()
3790 prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION); in lpfc_issue_els_rdf()
3794 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_rdf()
3795 phba->cgn_reg_fpin); in lpfc_issue_els_rdf()
3797 phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ; in lpfc_issue_els_rdf()
3798 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_rdf()
3799 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rdf()
3800 if (!elsiocb->ndlp) { in lpfc_issue_els_rdf()
3802 return -EIO; in lpfc_issue_els_rdf()
3807 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_rdf()
3813 return -EIO; in lpfc_issue_els_rdf()
3819 * lpfc_els_rcv_rdf - Receive RDF ELS request from the fabric.
3822 * @ndlp: pointer to a node-list data structure.
3829 * 0 - Success
3830 * -EIO - Failed to process received RDF
3840 ndlp->nlp_DID, vport->fc_myDID); in lpfc_els_rcv_rdf()
3841 return -EIO; in lpfc_els_rcv_rdf()
3848 vport->fc_myDID); in lpfc_els_rcv_rdf()
3849 return -EIO; in lpfc_els_rcv_rdf()
3856 * lpfc_least_capable_settings - helper function for EDC rsp processing
3873 rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability); in lpfc_least_capable_settings()
3874 rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count); in lpfc_least_capable_settings()
3875 rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units); in lpfc_least_capable_settings()
3897 drv_sig_cap = phba->cgn_reg_signal; in lpfc_least_capable_settings()
3900 if (rsp_sig_freq_cyc > phba->cgn_sig_freq) in lpfc_least_capable_settings()
3901 phba->cgn_sig_freq = rsp_sig_freq_cyc; in lpfc_least_capable_settings()
3907 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_least_capable_settings()
3908 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3912 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3913 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3917 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM; in lpfc_least_capable_settings()
3918 phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE; in lpfc_least_capable_settings()
3921 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3922 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3930 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3931 phba->cgn_sig_freq = 0; in lpfc_least_capable_settings()
3932 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3939 * lpfc_cmpl_els_edc - Completion callback function for EDC
3968 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_edc()
3974 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_edc()
3978 irsp_iocb = &rspiocb->iocb; in lpfc_cmpl_els_edc()
3979 tmo = irsp_iocb->ulpTimeout; in lpfc_cmpl_els_edc()
3980 iotag = irsp_iocb->ulpIoTag; in lpfc_cmpl_els_edc()
3983 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
3992 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_edc()
3996 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_edc()
4004 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_edc()
4008 edc_rsp = prsp->virt; in lpfc_cmpl_els_edc()
4017 edc_rsp->acc_hdr.la_cmd, in lpfc_cmpl_els_edc()
4018 be32_to_cpu(edc_rsp->desc_list_len)); in lpfc_cmpl_els_edc()
4028 bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) - in lpfc_cmpl_els_edc()
4033 tlv = edc_rsp->desc; in lpfc_cmpl_els_edc()
4048 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_cmpl_els_edc()
4068 be32_to_cpu(plnkflt->desc_tag), in lpfc_cmpl_els_edc()
4069 be32_to_cpu(plnkflt->desc_len), in lpfc_cmpl_els_edc()
4071 plnkflt->degrade_activate_threshold), in lpfc_cmpl_els_edc()
4073 plnkflt->degrade_deactivate_threshold), in lpfc_cmpl_els_edc()
4074 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_cmpl_els_edc()
4095 be32_to_cpu(pcgd->desc_tag), in lpfc_cmpl_els_edc()
4096 be32_to_cpu(pcgd->desc_len), in lpfc_cmpl_els_edc()
4097 be32_to_cpu(pcgd->xmt_signal_capability), in lpfc_cmpl_els_edc()
4098 be16_to_cpu(pcgd->xmt_signal_frequency.count), in lpfc_cmpl_els_edc()
4099 be16_to_cpu(pcgd->xmt_signal_frequency.units), in lpfc_cmpl_els_edc()
4100 be32_to_cpu(pcgd->rcv_signal_capability), in lpfc_cmpl_els_edc()
4101 be16_to_cpu(pcgd->rcv_signal_frequency.count), in lpfc_cmpl_els_edc()
4102 be16_to_cpu(pcgd->rcv_signal_frequency.units)); in lpfc_cmpl_els_edc()
4118 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_cmpl_els_edc()
4125 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_cmpl_els_edc()
4126 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_cmpl_els_edc()
4127 phba->cgn_sig_freq = 0; in lpfc_cmpl_els_edc()
4129 "4202 EDC rsp error - sending RDF " in lpfc_cmpl_els_edc()
4136 lpfc_els_chk_latt(phba->pport); in lpfc_cmpl_els_edc()
4137 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4139 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_edc()
4149 lft->desc_tag = cpu_to_be32(ELS_DTAG_LNK_FAULT_CAP); in lpfc_format_edc_lft_desc()
4150 lft->desc_len = cpu_to_be32( in lpfc_format_edc_lft_desc()
4153 lft->degrade_activate_threshold = in lpfc_format_edc_lft_desc()
4154 cpu_to_be32(phba->degrade_activate_threshold); in lpfc_format_edc_lft_desc()
4155 lft->degrade_deactivate_threshold = in lpfc_format_edc_lft_desc()
4156 cpu_to_be32(phba->degrade_deactivate_threshold); in lpfc_format_edc_lft_desc()
4157 lft->fec_degrade_interval = cpu_to_be32(phba->fec_degrade_interval); in lpfc_format_edc_lft_desc()
4168 cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP); in lpfc_format_edc_cgn_desc()
4171 cgd->desc_len = cpu_to_be32( in lpfc_format_edc_cgn_desc()
4179 if (phba->cmf_active_mode == LPFC_CFG_OFF) { in lpfc_format_edc_cgn_desc()
4184 phba->cgn_sig_freq = 0; in lpfc_format_edc_cgn_desc()
4187 switch (phba->cgn_reg_signal) { in lpfc_format_edc_cgn_desc()
4189 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY); in lpfc_format_edc_cgn_desc()
4192 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM); in lpfc_format_edc_cgn_desc()
4202 cgd->rcv_signal_frequency.count = in lpfc_format_edc_cgn_desc()
4204 cgd->rcv_signal_frequency.units = in lpfc_format_edc_cgn_desc()
4211 if (!(phba->lmt & LMT_64Gb)) in lpfc_link_is_lds_capable()
4213 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_link_is_lds_capable()
4216 if (phba->sli4_hba.conf_trunk) { in lpfc_link_is_lds_capable()
4217 if (phba->trunk_link.phy_lnk_speed == LPFC_USER_LINK_SPEED_64G) in lpfc_link_is_lds_capable()
4219 } else if (phba->fc_linkspeed == LPFC_LINK_SPEED_64GHZ) { in lpfc_link_is_lds_capable()
4226 * lpfc_issue_els_edc - Exchange Diagnostic Capabilities with the fabric.
4228 * @retry: retry counter for the command iocb.
4230 * This routine issues an ELS EDC to the F-Port Controller to communicate
4244 * 0 - Successfully issued edc command
4245 * 1 - Failed to issue edc command
4248 lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_edc() argument
4250 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc()
4260 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_edc()
4261 return -EACCES; in lpfc_issue_els_edc()
4264 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_edc()
4265 return -ENODEV; in lpfc_issue_els_edc()
4267 cgn_desc_size = (phba->cgn_init_reg_signal) ? in lpfc_issue_els_edc()
4278 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_edc()
4279 ndlp->nlp_DID, ELS_CMD_EDC); in lpfc_issue_els_edc()
4284 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc()
4287 edc_req->desc_len = cpu_to_be32(cgn_desc_size + lft_desc_size); in lpfc_issue_els_edc()
4288 edc_req->edc_cmd = ELS_EDC; in lpfc_issue_els_edc()
4289 tlv = edc_req->desc; in lpfc_issue_els_edc()
4293 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_issue_els_edc()
4303 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_edc()
4304 phba->cgn_reg_fpin); in lpfc_issue_els_edc()
4306 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_edc()
4307 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc()
4308 if (!elsiocb->ndlp) { in lpfc_issue_els_edc()
4310 return -EIO; in lpfc_issue_els_edc()
4315 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_edc()
4328 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_issue_els_edc()
4329 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_issue_els_edc()
4335 * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
4337 * @nlp: pointer to a node-list data structure.
4339 * This routine cancels the timer with a delayed IOCB-command retry for
4341 * removes the ELS retry event if it presents. In addition, if the
4351 if (!test_and_clear_bit(NLP_DELAY_TMO, &nlp->nlp_flag)) in lpfc_cancel_retry_delay_tmo()
4353 del_timer_sync(&nlp->nlp_delayfunc); in lpfc_cancel_retry_delay_tmo()
4354 nlp->nlp_last_elscmd = 0; in lpfc_cancel_retry_delay_tmo()
4355 if (!list_empty(&nlp->els_retry_evt.evt_listp)) { in lpfc_cancel_retry_delay_tmo()
4356 list_del_init(&nlp->els_retry_evt.evt_listp); in lpfc_cancel_retry_delay_tmo()
4357 /* Decrement nlp reference count held for the delayed retry */ in lpfc_cancel_retry_delay_tmo()
4358 evtp = &nlp->els_retry_evt; in lpfc_cancel_retry_delay_tmo()
4359 lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1); in lpfc_cancel_retry_delay_tmo()
4361 if (test_and_clear_bit(NLP_NPR_2B_DISC, &nlp->nlp_flag)) { in lpfc_cancel_retry_delay_tmo()
4362 if (vport->num_disc_nodes) { in lpfc_cancel_retry_delay_tmo()
4363 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_cancel_retry_delay_tmo()
4369 if (vport->num_disc_nodes == 0) { in lpfc_cancel_retry_delay_tmo()
4371 &vport->fc_flag); in lpfc_cancel_retry_delay_tmo()
4382 * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
4385 * This routine is invoked by the ndlp delayed-function timer to check
4386 * whether there is any pending ELS retry event(s) with the node. If not, it
4399 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay()
4400 struct lpfc_hba *phba = vport->phba; in lpfc_els_retry_delay()
4402 struct lpfc_work_evt *evtp = &ndlp->els_retry_evt; in lpfc_els_retry_delay()
4408 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_els_retry_delay()
4409 if (!list_empty(&evtp->evt_listp)) { in lpfc_els_retry_delay()
4410 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4415 evtp->evt_arg1 = ndlp; in lpfc_els_retry_delay()
4416 evtp->evt = LPFC_EVT_ELS_RETRY; in lpfc_els_retry_delay()
4417 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_els_retry_delay()
4418 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4424 * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
4425 * @ndlp: pointer to a node-list data structure.
4427 * This routine is the worker-thread handler for processing the @ndlp delayed
4430 * function according to the delayed ELS command to retry the command.
4435 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay_handler()
4436 uint32_t cmd, retry; in lpfc_els_retry_delay_handler() local
4438 spin_lock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4439 cmd = ndlp->nlp_last_elscmd; in lpfc_els_retry_delay_handler()
4440 ndlp->nlp_last_elscmd = 0; in lpfc_els_retry_delay_handler()
4441 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4443 if (!test_and_clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) in lpfc_els_retry_delay_handler()
4451 del_timer_sync(&ndlp->nlp_delayfunc); in lpfc_els_retry_delay_handler()
4452 retry = ndlp->nlp_retry; in lpfc_els_retry_delay_handler()
4453 ndlp->nlp_retry = 0; in lpfc_els_retry_delay_handler()
4457 lpfc_issue_els_flogi(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4460 if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) { in lpfc_els_retry_delay_handler()
4461 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4466 if (!lpfc_issue_els_adisc(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4467 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4473 if (!lpfc_issue_els_prli(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4474 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4479 if (!lpfc_issue_els_logo(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4480 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4485 if (!test_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag)) in lpfc_els_retry_delay_handler()
4486 lpfc_issue_els_fdisc(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4493 * lpfc_link_reset - Issue link reset
4497 * For SLI-3 adapter, link attention interrupt is enabled before issuing
4501 * 0 - Link reset initiated successfully
4502 * 1 - Failed to initiate link reset
4507 struct lpfc_hba *phba = vport->phba; in lpfc_link_reset()
4514 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_link_reset()
4522 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_link_reset()
4523 spin_lock_irq(&phba->hbalock); in lpfc_link_reset()
4524 phba->sli.sli_flag |= LPFC_PROCESS_LA; in lpfc_link_reset()
4525 control = readl(phba->HCregaddr); in lpfc_link_reset()
4527 writel(control, phba->HCregaddr); in lpfc_link_reset()
4528 readl(phba->HCregaddr); /* flush */ in lpfc_link_reset()
4529 spin_unlock_irq(&phba->hbalock); in lpfc_link_reset()
4532 lpfc_init_link(phba, mbox, phba->cfg_topology, in lpfc_link_reset()
4533 phba->cfg_link_speed); in lpfc_link_reset()
4534 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_link_reset()
4535 mbox->vport = vport; in lpfc_link_reset()
4541 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_link_reset()
4549 * lpfc_els_retry - Make retry decision on an els command iocb
4554 * This routine makes a retry decision on an ELS command IOCB, which has
4558 * returned error status, it makes the decision whether a retry shall be
4559 * issued for the command, and whether a retry shall be made immediately or
4560 * delayed. In the former case, the corresponding ELS command issuing-function
4561 * is called to retry the command. In the later case, the ELS command shall
4566 * 0 - No retry of els command is made
4567 * 1 - Immediate or delayed retry of els command is made
4573 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_els_retry()
4574 union lpfc_wqe128 *irsp = &rspiocb->wqe; in lpfc_els_retry()
4575 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_els_retry()
4576 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_retry()
4579 int retry = 0, maxretry = lpfc_max_els_tries, delay = 0; in lpfc_els_retry() local
4592 if (pcmd && pcmd->virt) { in lpfc_els_retry()
4593 elscmd = (uint32_t *) (pcmd->virt); in lpfc_els_retry()
4598 did = ndlp->nlp_DID; in lpfc_els_retry()
4608 "Retry ELS: wd7:x%x wd4:x%x did:x%x", in lpfc_els_retry()
4615 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_retry()
4621 cmdiocb->sli4_lxritag, 0, 0); in lpfc_els_retry()
4627 if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0) in lpfc_els_retry()
4628 delay = 1000; in lpfc_els_retry()
4629 retry = 1; in lpfc_els_retry()
4634 "0124 Retry illegal cmd x%x " in lpfc_els_retry()
4635 "retry:x%x delay:x%x\n", in lpfc_els_retry()
4636 cmd, cmdiocb->retry, delay); in lpfc_els_retry()
4637 retry = 1; in lpfc_els_retry()
4638 /* All command's retry policy */ in lpfc_els_retry()
4640 if (cmdiocb->retry > 2) in lpfc_els_retry()
4641 delay = 1000; in lpfc_els_retry()
4646 retry = 1; in lpfc_els_retry()
4647 if (cmdiocb->retry > 100) in lpfc_els_retry()
4648 delay = 100; in lpfc_els_retry()
4653 delay = 100; in lpfc_els_retry()
4654 retry = 1; in lpfc_els_retry()
4663 delay = 100; in lpfc_els_retry()
4665 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_els_retry()
4666 /* State-command disagreement. The PRLI was in lpfc_els_retry()
4668 * some unexpected state change. Don't retry. in lpfc_els_retry()
4671 retry = 0; in lpfc_els_retry()
4674 retry = 1; in lpfc_els_retry()
4680 (cmdiocb->retry + 1) == maxretry) { in lpfc_els_retry()
4685 retry = 1; in lpfc_els_retry()
4686 delay = 100; in lpfc_els_retry()
4689 /* Retry ELS PLOGI command? in lpfc_els_retry()
4693 /* No retry if state change */ in lpfc_els_retry()
4695 ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_els_retry()
4697 retry = 1; in lpfc_els_retry()
4707 retry = 1; in lpfc_els_retry()
4715 retry = 1; in lpfc_els_retry()
4723 if (test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_els_retry()
4735 retry = 0; in lpfc_els_retry()
4736 set_bit(FC_PT2PT_NO_NVME, &vport->fc_flag); in lpfc_els_retry()
4745 * isn't really supported, don't retry and cause in lpfc_els_retry()
4761 delay = 1000; in lpfc_els_retry()
4764 retry = 1; in lpfc_els_retry()
4768 /* These explanation codes get no retry. */ in lpfc_els_retry()
4774 /* Limit the delay and retry action to a limited in lpfc_els_retry()
4776 * a retry is not expected. in lpfc_els_retry()
4781 delay = 1000; in lpfc_els_retry()
4783 retry = 1; in lpfc_els_retry()
4788 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4804 delay = 1000; in lpfc_els_retry()
4807 /* FDISC retry policy */ in lpfc_els_retry()
4809 if (cmdiocb->retry >= 32) in lpfc_els_retry()
4810 delay = 1000; in lpfc_els_retry()
4812 retry = 1; in lpfc_els_retry()
4818 * Logical Busy. We should delay every time. in lpfc_els_retry()
4823 delay = 1000; in lpfc_els_retry()
4824 retry = 1; in lpfc_els_retry()
4828 vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf; in lpfc_els_retry()
4829 retry = 1; in lpfc_els_retry()
4838 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4883 /* Do not give up. Retry PLOGI one more time and attempt in lpfc_els_retry()
4886 retry = 1; in lpfc_els_retry()
4887 delay = 100; in lpfc_els_retry()
4894 retry = 1; in lpfc_els_retry()
4897 (phba->fc_topology != LPFC_TOPOLOGY_LOOP) && in lpfc_els_retry()
4899 /* FLOGI retry policy */ in lpfc_els_retry()
4900 retry = 1; in lpfc_els_retry()
4901 /* retry FLOGI forever */ in lpfc_els_retry()
4902 if (phba->link_flag != LS_LOOPBACK_MODE) in lpfc_els_retry()
4907 if (cmdiocb->retry >= 100) in lpfc_els_retry()
4908 delay = 5000; in lpfc_els_retry()
4909 else if (cmdiocb->retry >= 32) in lpfc_els_retry()
4910 delay = 1000; in lpfc_els_retry()
4913 /* retry FDISCs every second up to devloss */ in lpfc_els_retry()
4914 retry = 1; in lpfc_els_retry()
4915 maxretry = vport->cfg_devloss_tmo; in lpfc_els_retry()
4916 delay = 1000; in lpfc_els_retry()
4919 cmdiocb->retry++; in lpfc_els_retry()
4920 if (maxretry && (cmdiocb->retry >= maxretry)) { in lpfc_els_retry()
4921 phba->fc_stat.elsRetryExceeded++; in lpfc_els_retry()
4922 retry = 0; in lpfc_els_retry()
4925 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_retry()
4926 retry = 0; in lpfc_els_retry()
4929 if (retry) { in lpfc_els_retry()
4932 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_els_retry()
4934 "2849 Stop retry ELS command " in lpfc_els_retry()
4937 cmdiocb->retry, delay); in lpfc_els_retry()
4942 /* Retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
4944 "0107 Retry ELS command x%x to remote " in lpfc_els_retry()
4946 cmd, did, cmdiocb->retry, delay); in lpfc_els_retry()
4955 if (timer_pending(&vport->fc_disctmo) || in lpfc_els_retry()
4956 test_bit(FC_RSCN_MODE, &vport->fc_flag)) in lpfc_els_retry()
4960 phba->fc_stat.elsXmitRetry++; in lpfc_els_retry()
4961 if (ndlp && delay) { in lpfc_els_retry()
4962 phba->fc_stat.elsDelayRetry++; in lpfc_els_retry()
4963 ndlp->nlp_retry = cmdiocb->retry; in lpfc_els_retry()
4965 /* delay is specified in milliseconds */ in lpfc_els_retry()
4966 mod_timer(&ndlp->nlp_delayfunc, in lpfc_els_retry()
4967 jiffies + msecs_to_jiffies(delay)); in lpfc_els_retry()
4968 set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_els_retry()
4970 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
4978 ndlp->nlp_last_elscmd = cmd; in lpfc_els_retry()
4984 lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
4987 lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
4991 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
4995 lpfc_issue_els_plogi(vport, did, cmdiocb->retry); in lpfc_els_retry()
4998 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5000 lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5004 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5006 lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5009 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5011 lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5015 /* No retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
5018 "0137 No retry ELS command x%x to remote " in lpfc_els_retry()
5022 cmdiocb->iotag); in lpfc_els_retry()
5026 "0108 No retry ELS command x%x to remote " in lpfc_els_retry()
5029 cmd, did, cmdiocb->retry, ulp_status, in lpfc_els_retry()
5030 ulp_word4, cmdiocb->iotag, in lpfc_els_retry()
5031 (ndlp ? ndlp->nlp_flag : 0)); in lpfc_els_retry()
5037 * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
5048 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5056 if (!list_empty(&buf_ptr1->list)) { in lpfc_els_free_data()
5057 list_remove_head(&buf_ptr1->list, buf_ptr, in lpfc_els_free_data()
5060 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_data()
5063 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys); in lpfc_els_free_data()
5069 * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
5078 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5083 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_bpl()
5089 * lpfc_els_free_iocb - Free a command iocb and its associated resources
5097 * cmd_dmabuf - reference to cmd.
5098 * cmd_dmabuf->next - reference to rsp
5099 * rsp_dmabuf - unused
5100 * bpl_dmabuf - reference to bpl
5113 * 0 - Success (currently, always return 0)
5121 elsiocb->ndlp = NULL; in lpfc_els_free_iocb()
5123 /* cmd_dmabuf = cmd, cmd_dmabuf->next = rsp, bpl_dmabuf = bpl */ in lpfc_els_free_iocb()
5124 if (elsiocb->cmd_dmabuf) { in lpfc_els_free_iocb()
5125 if (elsiocb->cmd_flag & LPFC_DELAY_MEM_FREE) { in lpfc_els_free_iocb()
5130 elsiocb->cmd_flag &= ~LPFC_DELAY_MEM_FREE; in lpfc_els_free_iocb()
5131 buf_ptr = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5132 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5135 spin_lock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5136 if (!list_empty(&buf_ptr->list)) { in lpfc_els_free_iocb()
5137 list_remove_head(&buf_ptr->list, in lpfc_els_free_iocb()
5140 INIT_LIST_HEAD(&buf_ptr1->list); in lpfc_els_free_iocb()
5141 list_add_tail(&buf_ptr1->list, in lpfc_els_free_iocb()
5142 &phba->elsbuf); in lpfc_els_free_iocb()
5143 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5145 INIT_LIST_HEAD(&buf_ptr->list); in lpfc_els_free_iocb()
5146 list_add_tail(&buf_ptr->list, &phba->elsbuf); in lpfc_els_free_iocb()
5147 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5148 spin_unlock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5151 buf_ptr1 = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5153 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5157 if (elsiocb->bpl_dmabuf) { in lpfc_els_free_iocb()
5158 buf_ptr = elsiocb->bpl_dmabuf; in lpfc_els_free_iocb()
5160 elsiocb->bpl_dmabuf = NULL; in lpfc_els_free_iocb()
5167 * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
5182 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo_acc()
5183 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_logo_acc()
5191 ulp_status, ulp_word4, ndlp->nlp_DID); in lpfc_cmpl_els_logo_acc()
5196 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_cmpl_els_logo_acc()
5197 ndlp->nlp_last_elscmd, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_logo_acc()
5198 ndlp->nlp_rpi); in lpfc_cmpl_els_logo_acc()
5205 if (ndlp->nlp_type & NLP_FABRIC && in lpfc_cmpl_els_logo_acc()
5206 ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK)) in lpfc_cmpl_els_logo_acc()
5209 if (ndlp->nlp_state == NLP_STE_NPR_NODE) { in lpfc_cmpl_els_logo_acc()
5210 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) in lpfc_cmpl_els_logo_acc()
5216 if (ndlp->nlp_last_elscmd == ELS_CMD_PRLO) { in lpfc_cmpl_els_logo_acc()
5217 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo_acc()
5218 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_logo_acc()
5220 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_cmpl_els_logo_acc()
5234 * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
5248 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_dflt_rpi()
5249 u32 mbx_flag = pmb->mbox_flag; in lpfc_mbx_cmpl_dflt_rpi()
5250 u32 mbx_cmd = pmb->u.mb.mbxCommand; in lpfc_mbx_cmpl_dflt_rpi()
5253 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_mbx_cmpl_dflt_rpi()
5256 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_dflt_rpi()
5257 kref_read(&ndlp->kref), ndlp, mbx_cmd, in lpfc_mbx_cmpl_dflt_rpi()
5265 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_dflt_rpi()
5267 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_mbx_cmpl_dflt_rpi()
5269 lpfc_drop_node(ndlp->vport, ndlp); in lpfc_mbx_cmpl_dflt_rpi()
5276 * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
5292 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rsp()
5293 struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL; in lpfc_cmpl_els_rsp()
5304 if (cmdiocb->context_un.mbox) in lpfc_cmpl_els_rsp()
5305 mbox = cmdiocb->context_un.mbox; in lpfc_cmpl_els_rsp()
5311 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_rsp()
5315 irsp = &rspiocb->iocb; in lpfc_cmpl_els_rsp()
5316 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_rsp()
5317 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_rsp()
5335 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5336 ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp); in lpfc_cmpl_els_rsp()
5339 test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag)) { in lpfc_cmpl_els_rsp()
5341 !test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_cmpl_els_rsp()
5342 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_cmpl_els_rsp()
5343 ndlp->nlp_state == in lpfc_cmpl_els_rsp()
5350 ndlp->nlp_DID, in lpfc_cmpl_els_rsp()
5351 ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5352 ndlp->nlp_rpi, in lpfc_cmpl_els_rsp()
5353 ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5361 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_cmpl_els_rsp()
5362 if (!mbox->ctx_ndlp) in lpfc_cmpl_els_rsp()
5365 mbox->vport = vport; in lpfc_cmpl_els_rsp()
5366 if (test_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag)) { in lpfc_cmpl_els_rsp()
5367 mbox->mbox_flag |= LPFC_MBX_IMED_UNREG; in lpfc_cmpl_els_rsp()
5368 mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; in lpfc_cmpl_els_rsp()
5370 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; in lpfc_cmpl_els_rsp()
5371 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_rsp()
5376 set_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5385 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5391 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5392 ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5400 clear_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5401 clear_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5407 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_els_rsp()
5408 vport && vport->port_type == LPFC_NPIV_PORT && in lpfc_cmpl_els_rsp()
5409 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_cmpl_els_rsp()
5410 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5411 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && in lpfc_cmpl_els_rsp()
5412 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_cmpl_els_rsp()
5431 * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
5435 * @ndlp: pointer to a node-list data structure.
5452 * 0 - Successfully issued acc response
5453 * 1 - Failed to issue acc response
5460 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_acc()
5464 union lpfc_wqe128 *oldwqe = &oldiocb->wqe; in lpfc_els_rsp_acc()
5476 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5477 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5479 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_els_rsp_acc()
5483 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5484 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5486 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5488 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5491 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5493 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5495 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5496 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5497 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5498 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5499 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5502 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5508 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5513 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5514 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5518 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5519 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5521 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5523 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5526 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5528 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5530 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5531 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5532 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5533 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5534 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5537 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5540 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_acc()
5548 memcpy(sp, &phba->fc_fabparam, in lpfc_els_rsp_acc()
5552 sp->cmn.fPort = 0; in lpfc_els_rsp_acc()
5555 sp->cls1.classValid = 0; in lpfc_els_rsp_acc()
5556 sp->cls2.classValid = 0; in lpfc_els_rsp_acc()
5557 sp->cls3.classValid = 0; in lpfc_els_rsp_acc()
5558 sp->cls4.classValid = 0; in lpfc_els_rsp_acc()
5561 memcpy(&sp->portName, &vport->fc_sparam.portName, in lpfc_els_rsp_acc()
5563 memcpy(&sp->nodeName, &vport->fc_sparam.nodeName, in lpfc_els_rsp_acc()
5566 memcpy(pcmd, &vport->fc_sparam, in lpfc_els_rsp_acc()
5569 sp->cmn.valid_vendor_ver_level = 0; in lpfc_els_rsp_acc()
5570 memset(sp->un.vendorVersion, 0, in lpfc_els_rsp_acc()
5571 sizeof(sp->un.vendorVersion)); in lpfc_els_rsp_acc()
5572 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_els_rsp_acc()
5577 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_els_rsp_acc()
5578 sp->cmn.valid_vendor_ver_level = 1; in lpfc_els_rsp_acc()
5579 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_els_rsp_acc()
5580 sp->un.vv.flags = in lpfc_els_rsp_acc()
5587 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5591 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5592 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO); in lpfc_els_rsp_acc()
5596 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5597 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5599 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5601 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5604 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5606 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5608 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5609 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5610 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5611 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5612 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5615 pcmd = (u8 *) elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5617 memcpy(pcmd, oldiocb->cmd_dmabuf->virt, in lpfc_els_rsp_acc()
5621 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; in lpfc_els_rsp_acc()
5625 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5629 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5630 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5634 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5635 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5637 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5639 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5642 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5644 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5646 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5647 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5648 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5649 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5650 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5653 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5656 rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_els_rsp_acc()
5658 /* FC-LS-5 specifies desc_list_len shall be set to 12 */ in lpfc_els_rsp_acc()
5659 rdf_resp->desc_list_len = cpu_to_be32(12); in lpfc_els_rsp_acc()
5661 /* FC-LS-5 specifies LS REQ Information descriptor */ in lpfc_els_rsp_acc()
5662 rdf_resp->lsri.desc_tag = cpu_to_be32(1); in lpfc_els_rsp_acc()
5663 rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32)); in lpfc_els_rsp_acc()
5664 rdf_resp->lsri.rqst_w0.cmd = ELS_RDF; in lpfc_els_rsp_acc()
5669 if (test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag)) { in lpfc_els_rsp_acc()
5670 if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) && in lpfc_els_rsp_acc()
5671 !test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_els_rsp_acc()
5672 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_els_rsp_acc()
5673 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc; in lpfc_els_rsp_acc()
5675 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_acc()
5678 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_acc()
5679 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_acc()
5680 if (!elsiocb->ndlp) { in lpfc_els_rsp_acc()
5697 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_els_rsp_acc()
5698 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_acc()
5699 ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_acc()
5704 * lpfc_els_rsp_reject - Prepare and issue a rjt response iocb command
5708 * @ndlp: pointer to a node-list data structure.
5722 * 0 - Successfully issued reject response
5723 * 1 - Failed to issue reject response
5731 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_reject()
5740 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_reject()
5741 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rsp_reject()
5745 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_reject()
5746 wqe = &elsiocb->wqe; in lpfc_els_rsp_reject()
5747 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_reject()
5749 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_reject()
5752 icmd = &elsiocb->iocb; in lpfc_els_rsp_reject()
5753 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_reject()
5754 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_reject()
5755 icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_reject()
5758 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_reject()
5765 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_reject()
5772 rejectError, elsiocb->iotag, in lpfc_els_rsp_reject()
5773 get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID, in lpfc_els_rsp_reject()
5774 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_els_rsp_reject()
5777 ndlp->nlp_DID, ndlp->nlp_flag, rejectError); in lpfc_els_rsp_reject()
5779 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rsp_reject()
5780 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_reject()
5781 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_reject()
5782 if (!elsiocb->ndlp) { in lpfc_els_rsp_reject()
5798 * lpfc_issue_els_edc_rsp - Exchange Diagnostic Capabilities with the fabric.
5803 * This routine issues an EDC ACC RSP to the F-Port Controller to communicate
5808 * 0 - Successfully issued edc rsp command
5809 * 1 - Failed to issue edc rsp command
5815 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc_rsp()
5831 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry, in lpfc_issue_els_edc_rsp()
5832 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_issue_els_edc_rsp()
5836 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_edc_rsp()
5837 wqe = &elsiocb->wqe; in lpfc_issue_els_edc_rsp()
5838 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_issue_els_edc_rsp()
5840 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_issue_els_edc_rsp()
5843 icmd = &elsiocb->iocb; in lpfc_issue_els_edc_rsp()
5844 cmd = &cmdiocb->iocb; in lpfc_issue_els_edc_rsp()
5845 icmd->ulpContext = cmd->ulpContext; /* Xri / rx_id */ in lpfc_issue_els_edc_rsp()
5846 icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id; in lpfc_issue_els_edc_rsp()
5849 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc_rsp()
5853 edc_rsp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_issue_els_edc_rsp()
5854 edc_rsp->desc_list_len = cpu_to_be32(sizeof(struct fc_els_lsri_desc) + in lpfc_issue_els_edc_rsp()
5856 edc_rsp->lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO); in lpfc_issue_els_edc_rsp()
5857 edc_rsp->lsri.desc_len = cpu_to_be32( in lpfc_issue_els_edc_rsp()
5859 edc_rsp->lsri.rqst_w0.cmd = ELS_EDC; in lpfc_issue_els_edc_rsp()
5860 tlv = edc_rsp->desc; in lpfc_issue_els_edc_rsp()
5868 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_issue_els_edc_rsp()
5869 kref_read(&ndlp->kref)); in lpfc_issue_els_edc_rsp()
5870 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_issue_els_edc_rsp()
5872 phba->fc_stat.elsXmitACC++; in lpfc_issue_els_edc_rsp()
5873 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc_rsp()
5874 if (!elsiocb->ndlp) { in lpfc_issue_els_edc_rsp()
5891 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_issue_els_edc_rsp()
5892 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_issue_els_edc_rsp()
5893 ndlp->nlp_rpi, vport->fc_flag); in lpfc_issue_els_edc_rsp()
5899 * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
5902 * @ndlp: pointer to a node-list data structure.
5914 * 0 - Successfully issued acc adisc response
5915 * 1 - Failed to issue adisc acc response
5921 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_adisc_acc()
5932 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_adisc_acc()
5933 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_adisc_acc()
5937 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_adisc_acc()
5938 wqe = &elsiocb->wqe; in lpfc_els_rsp_adisc_acc()
5940 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_adisc_acc()
5944 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_adisc_acc()
5947 icmd = &elsiocb->iocb; in lpfc_els_rsp_adisc_acc()
5948 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_adisc_acc()
5949 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_adisc_acc()
5950 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_adisc_acc()
5951 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_adisc_acc()
5952 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_adisc_acc()
5959 elsiocb->iotag, ulp_context, in lpfc_els_rsp_adisc_acc()
5960 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_adisc_acc()
5961 ndlp->nlp_rpi); in lpfc_els_rsp_adisc_acc()
5962 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_adisc_acc()
5968 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_els_rsp_adisc_acc()
5969 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
5970 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
5971 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_adisc_acc()
5975 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_adisc_acc()
5977 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_adisc_acc()
5978 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_adisc_acc()
5979 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_adisc_acc()
5980 if (!elsiocb->ndlp) { in lpfc_els_rsp_adisc_acc()
5996 * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
5999 * @ndlp: pointer to a node-list data structure.
6011 * 0 - Successfully issued acc prli response
6012 * 1 - Failed to issue acc prli response
6018 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_prli_acc()
6036 req_buf = oldiocb->cmd_dmabuf; in lpfc_els_rsp_prli_acc()
6037 req_payload = (((uint32_t *)req_buf->virt) + 1); in lpfc_els_rsp_prli_acc()
6056 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_prli_acc()
6057 ndlp->nlp_DID, elsrspcmd); in lpfc_els_rsp_prli_acc()
6061 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_prli_acc()
6062 wqe = &elsiocb->wqe; in lpfc_els_rsp_prli_acc()
6063 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_prli_acc()
6066 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_prli_acc()
6069 icmd = &elsiocb->iocb; in lpfc_els_rsp_prli_acc()
6070 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_prli_acc()
6071 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_prli_acc()
6072 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_prli_acc()
6073 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_prli_acc()
6074 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_prli_acc()
6081 elsiocb->iotag, ulp_context, in lpfc_els_rsp_prli_acc()
6082 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_prli_acc()
6083 ndlp->nlp_rpi); in lpfc_els_rsp_prli_acc()
6084 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_prli_acc()
6091 vpd = &phba->vpd; in lpfc_els_rsp_prli_acc()
6096 * is 3.20 or later, set the following bits for FC-TAPE in lpfc_els_rsp_prli_acc()
6100 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_els_rsp_prli_acc()
6101 (vpd->rev.feaLevelHigh >= 0x02)) { in lpfc_els_rsp_prli_acc()
6102 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6103 npr->Retry = 1; in lpfc_els_rsp_prli_acc()
6104 npr->TaskRetryIdReq = 1; in lpfc_els_rsp_prli_acc()
6106 npr->acceptRspCode = PRLI_REQ_EXECUTED; in lpfc_els_rsp_prli_acc()
6109 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_els_rsp_prli_acc()
6110 npr->estabImagePair = 1; in lpfc_els_rsp_prli_acc()
6112 npr->estabImagePair = 0; in lpfc_els_rsp_prli_acc()
6113 npr->readXferRdyDis = 1; in lpfc_els_rsp_prli_acc()
6114 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6115 npr->prliType = PRLI_FCP_TYPE; in lpfc_els_rsp_prli_acc()
6116 npr->initiatorFunc = 1; in lpfc_els_rsp_prli_acc()
6122 "retry %d task %d\n", in lpfc_els_rsp_prli_acc()
6123 npr->estabImagePair, in lpfc_els_rsp_prli_acc()
6124 npr->Retry, npr->TaskRetryIdReq); in lpfc_els_rsp_prli_acc()
6132 if (phba->nvmet_support) { in lpfc_els_rsp_prli_acc()
6135 if (phba->cfg_nvme_enable_fb) { in lpfc_els_rsp_prli_acc()
6143 phba->cfg_nvmet_fb_size); in lpfc_els_rsp_prli_acc()
6153 npr_nvme->word1, npr_nvme->word4, in lpfc_els_rsp_prli_acc()
6154 npr_nvme->word5, ndlp->nlp_flag, in lpfc_els_rsp_prli_acc()
6155 ndlp->nlp_fcp_info, ndlp->nlp_type); in lpfc_els_rsp_prli_acc()
6156 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_els_rsp_prli_acc()
6157 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_els_rsp_prli_acc()
6158 npr_nvme->word5 = cpu_to_be32(npr_nvme->word5); in lpfc_els_rsp_prli_acc()
6162 prli_fc4_req, ndlp->nlp_fc4_type, in lpfc_els_rsp_prli_acc()
6163 ndlp->nlp_DID); in lpfc_els_rsp_prli_acc()
6167 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_prli_acc()
6169 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_prli_acc()
6170 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_prli_acc()
6171 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_prli_acc()
6172 if (!elsiocb->ndlp) { in lpfc_els_rsp_prli_acc()
6188 * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
6192 * @ndlp: pointer to a node-list data structure.
6204 * 0 - Successfully issued acc rnid response
6205 * 1 - Failed to issue acc rnid response
6211 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rnid_acc()
6226 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rnid_acc()
6227 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rnid_acc()
6231 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rnid_acc()
6232 wqe = &elsiocb->wqe; in lpfc_els_rsp_rnid_acc()
6233 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rnid_acc()
6236 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rnid_acc()
6239 icmd = &elsiocb->iocb; in lpfc_els_rsp_rnid_acc()
6240 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_rnid_acc()
6241 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_rnid_acc()
6242 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_rnid_acc()
6243 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_rnid_acc()
6244 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_rnid_acc()
6250 elsiocb->iotag, ulp_context); in lpfc_els_rsp_rnid_acc()
6251 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rnid_acc()
6257 rn->Format = format; in lpfc_els_rsp_rnid_acc()
6258 rn->CommonLen = (2 * sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6259 memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6260 memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6263 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6266 rn->SpecificLen = sizeof(RNID_TOP_DISC); in lpfc_els_rsp_rnid_acc()
6267 memcpy(&rn->un.topologyDisc.portName, in lpfc_els_rsp_rnid_acc()
6268 &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6269 rn->un.topologyDisc.unitType = RNID_HBA; in lpfc_els_rsp_rnid_acc()
6270 rn->un.topologyDisc.physPort = 0; in lpfc_els_rsp_rnid_acc()
6271 rn->un.topologyDisc.attachedNodes = 0; in lpfc_els_rsp_rnid_acc()
6274 rn->CommonLen = 0; in lpfc_els_rsp_rnid_acc()
6275 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6281 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_rnid_acc()
6283 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rnid_acc()
6284 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rnid_acc()
6285 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rnid_acc()
6286 if (!elsiocb->ndlp) { in lpfc_els_rsp_rnid_acc()
6302 * lpfc_els_clear_rrq - Clear the rq that this rrq describes.
6305 * @ndlp: pointer to a node-list data structure.
6313 struct lpfc_hba *phba = vport->phba; in lpfc_els_clear_rrq()
6321 pcmd = (uint8_t *)iocb->cmd_dmabuf->virt; in lpfc_els_clear_rrq()
6324 rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg); in lpfc_els_clear_rrq()
6338 ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg); in lpfc_els_clear_rrq()
6339 if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq))) in lpfc_els_clear_rrq()
6343 prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID); in lpfc_els_clear_rrq()
6350 * lpfc_els_rsp_echo_acc - Issue echo acc response
6354 * @ndlp: pointer to a node-list data structure.
6357 * 0 - Successfully issued acc echo response
6358 * 1 - Failed to issue acc echo response
6364 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_echo_acc()
6373 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rsp_echo_acc()
6374 cmdsize = oldiocb->wcqe_cmpl.total_data_placed; in lpfc_els_rsp_echo_acc()
6376 cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_rsp_echo_acc()
6383 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_echo_acc()
6384 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_echo_acc()
6388 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_echo_acc()
6389 wqe = &elsiocb->wqe; in lpfc_els_rsp_echo_acc()
6390 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_echo_acc()
6393 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_echo_acc()
6396 icmd = &elsiocb->iocb; in lpfc_els_rsp_echo_acc()
6397 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_echo_acc()
6398 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_echo_acc()
6399 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_echo_acc()
6400 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_echo_acc()
6401 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_echo_acc()
6407 elsiocb->iotag, ulp_context); in lpfc_els_rsp_echo_acc()
6408 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_echo_acc()
6411 memcpy(pcmd, data, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_echo_acc()
6415 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_echo_acc()
6417 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_echo_acc()
6418 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_echo_acc()
6419 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_echo_acc()
6420 if (!elsiocb->ndlp) { in lpfc_els_rsp_echo_acc()
6436 * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
6444 * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
6461 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_adisc()
6463 if (ndlp->nlp_state != NLP_STE_NPR_NODE || in lpfc_els_disc_adisc()
6464 !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) in lpfc_els_disc_adisc()
6467 clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); in lpfc_els_disc_adisc()
6469 if (!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { in lpfc_els_disc_adisc()
6482 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_adisc()
6486 vport->num_disc_nodes++; in lpfc_els_disc_adisc()
6487 if (vport->num_disc_nodes >= in lpfc_els_disc_adisc()
6488 vport->cfg_discovery_threads) { in lpfc_els_disc_adisc()
6489 set_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_adisc()
6495 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_adisc()
6500 * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
6507 * incremented. If the num_disc_nodes reaches a pre-configured threshold
6525 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_plogi()
6526 if (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_els_disc_plogi()
6527 test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) && in lpfc_els_disc_plogi()
6528 !test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag) && in lpfc_els_disc_plogi()
6529 !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_els_disc_plogi()
6530 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_plogi()
6532 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_disc_plogi()
6534 vport->num_disc_nodes++; in lpfc_els_disc_plogi()
6535 if (vport->num_disc_nodes >= in lpfc_els_disc_plogi()
6536 vport->cfg_discovery_threads) { in lpfc_els_disc_plogi()
6537 set_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_plogi()
6545 sentplogi, vport->fc_flag); in lpfc_els_disc_plogi()
6550 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_plogi()
6559 desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG); in lpfc_rdp_res_link_service()
6560 desc->payload.els_req = word0; in lpfc_rdp_res_link_service()
6561 desc->length = cpu_to_be32(sizeof(desc->payload)); in lpfc_rdp_res_link_service()
6580 desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG); in lpfc_rdp_res_sfp_desc()
6587 if ((trasn_code_byte4->fc_sw_laser) || in lpfc_rdp_res_sfp_desc()
6588 (trasn_code_byte5->fc_sw_laser_sl) || in lpfc_rdp_res_sfp_desc()
6589 (trasn_code_byte5->fc_sw_laser_sn)) { /* check if its short WL */ in lpfc_rdp_res_sfp_desc()
6591 } else if (trasn_code_byte4->fc_lw_laser) { in lpfc_rdp_res_sfp_desc()
6619 desc->sfp_info.temperature = cpu_to_be16(temperature); in lpfc_rdp_res_sfp_desc()
6620 desc->sfp_info.rx_power = cpu_to_be16(rx_power); in lpfc_rdp_res_sfp_desc()
6621 desc->sfp_info.tx_bias = cpu_to_be16(tx_bias); in lpfc_rdp_res_sfp_desc()
6622 desc->sfp_info.tx_power = cpu_to_be16(tx_power); in lpfc_rdp_res_sfp_desc()
6623 desc->sfp_info.vcc = cpu_to_be16(vcc); in lpfc_rdp_res_sfp_desc()
6625 desc->sfp_info.flags = cpu_to_be16(flag); in lpfc_rdp_res_sfp_desc()
6626 desc->length = cpu_to_be32(sizeof(desc->sfp_info)); in lpfc_rdp_res_sfp_desc()
6637 desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG); in lpfc_rdp_res_link_error()
6641 desc->info.port_type = cpu_to_be32(type); in lpfc_rdp_res_link_error()
6643 desc->info.link_status.link_failure_cnt = in lpfc_rdp_res_link_error()
6644 cpu_to_be32(stat->linkFailureCnt); in lpfc_rdp_res_link_error()
6645 desc->info.link_status.loss_of_synch_cnt = in lpfc_rdp_res_link_error()
6646 cpu_to_be32(stat->lossSyncCnt); in lpfc_rdp_res_link_error()
6647 desc->info.link_status.loss_of_signal_cnt = in lpfc_rdp_res_link_error()
6648 cpu_to_be32(stat->lossSignalCnt); in lpfc_rdp_res_link_error()
6649 desc->info.link_status.primitive_seq_proto_err = in lpfc_rdp_res_link_error()
6650 cpu_to_be32(stat->primSeqErrCnt); in lpfc_rdp_res_link_error()
6651 desc->info.link_status.invalid_trans_word = in lpfc_rdp_res_link_error()
6652 cpu_to_be32(stat->invalidXmitWord); in lpfc_rdp_res_link_error()
6653 desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt); in lpfc_rdp_res_link_error()
6655 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_link_error()
6666 desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG); in lpfc_rdp_res_bbc_desc()
6668 bbCredit = vport->fc_sparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6669 (vport->fc_sparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6670 desc->bbc_info.port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6671 if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_rdp_res_bbc_desc()
6672 bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6673 (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6674 desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6676 desc->bbc_info.attached_port_bbc = 0; in lpfc_rdp_res_bbc_desc()
6679 desc->bbc_info.rtt = 0; in lpfc_rdp_res_bbc_desc()
6680 desc->length = cpu_to_be32(sizeof(desc->bbc_info)); in lpfc_rdp_res_bbc_desc()
6691 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_temp_desc()
6693 desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6694 desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6695 desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6696 desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6698 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6700 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6702 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6704 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6708 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_temp_desc()
6709 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_temp_desc()
6720 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_voltage_desc()
6722 desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6723 desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6724 desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6725 desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6727 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6729 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6731 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6733 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6737 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_voltage_desc()
6738 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_voltage_desc()
6749 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txbias_desc()
6751 desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6752 desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6753 desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6754 desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6756 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6758 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6760 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6762 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6766 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txbias_desc()
6767 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txbias_desc()
6778 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txpower_desc()
6780 desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6781 desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6782 desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6783 desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6785 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6787 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6789 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6791 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6795 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txpower_desc()
6796 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txpower_desc()
6808 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_rxpower_desc()
6810 desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6811 desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6812 desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6813 desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6815 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6817 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6819 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6821 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6825 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_rxpower_desc()
6826 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_rxpower_desc()
6834 desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG); in lpfc_rdp_res_opd_desc()
6835 memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16); in lpfc_rdp_res_opd_desc()
6836 memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16); in lpfc_rdp_res_opd_desc()
6837 memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16); in lpfc_rdp_res_opd_desc()
6838 memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4); in lpfc_rdp_res_opd_desc()
6839 memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8); in lpfc_rdp_res_opd_desc()
6840 desc->length = cpu_to_be32(sizeof(desc->opd_info)); in lpfc_rdp_res_opd_desc()
6849 desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG); in lpfc_rdp_res_fec_desc()
6851 desc->info.CorrectedBlocks = in lpfc_rdp_res_fec_desc()
6852 cpu_to_be32(stat->fecCorrBlkCount); in lpfc_rdp_res_fec_desc()
6853 desc->info.UncorrectableBlocks = in lpfc_rdp_res_fec_desc()
6854 cpu_to_be32(stat->fecUncorrBlkCount); in lpfc_rdp_res_fec_desc()
6856 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_fec_desc()
6867 desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG); in lpfc_rdp_res_speed()
6869 switch (phba->fc_linkspeed) { in lpfc_rdp_res_speed()
6905 desc->info.port_speed.speed = cpu_to_be16(rdp_speed); in lpfc_rdp_res_speed()
6907 if (phba->lmt & LMT_256Gb) in lpfc_rdp_res_speed()
6909 if (phba->lmt & LMT_128Gb) in lpfc_rdp_res_speed()
6911 if (phba->lmt & LMT_64Gb) in lpfc_rdp_res_speed()
6913 if (phba->lmt & LMT_32Gb) in lpfc_rdp_res_speed()
6915 if (phba->lmt & LMT_16Gb) in lpfc_rdp_res_speed()
6917 if (phba->lmt & LMT_10Gb) in lpfc_rdp_res_speed()
6919 if (phba->lmt & LMT_8Gb) in lpfc_rdp_res_speed()
6921 if (phba->lmt & LMT_4Gb) in lpfc_rdp_res_speed()
6923 if (phba->lmt & LMT_2Gb) in lpfc_rdp_res_speed()
6925 if (phba->lmt & LMT_1Gb) in lpfc_rdp_res_speed()
6930 if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO) in lpfc_rdp_res_speed()
6933 desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap); in lpfc_rdp_res_speed()
6934 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_speed()
6943 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_diag_port_names()
6945 memcpy(desc->port_names.wwnn, &vport->fc_nodename, in lpfc_rdp_res_diag_port_names()
6946 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_diag_port_names()
6948 memcpy(desc->port_names.wwpn, &vport->fc_portname, in lpfc_rdp_res_diag_port_names()
6949 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_diag_port_names()
6951 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_diag_port_names()
6960 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_attach_port_names()
6961 if (test_bit(FC_FABRIC, &vport->fc_flag)) { in lpfc_rdp_res_attach_port_names()
6962 memcpy(desc->port_names.wwnn, &vport->fabric_nodename, in lpfc_rdp_res_attach_port_names()
6963 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
6965 memcpy(desc->port_names.wwpn, &vport->fabric_portname, in lpfc_rdp_res_attach_port_names()
6966 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
6968 memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename, in lpfc_rdp_res_attach_port_names()
6969 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
6971 memcpy(desc->port_names.wwpn, &ndlp->nlp_portname, in lpfc_rdp_res_attach_port_names()
6972 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
6975 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_attach_port_names()
6983 struct lpfc_nodelist *ndlp = rdp_context->ndlp; in lpfc_els_rdp_cmpl()
6984 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_rdp_cmpl()
7004 lpfc_max_els_tries, rdp_context->ndlp, in lpfc_els_rdp_cmpl()
7005 rdp_context->ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rdp_cmpl()
7010 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7011 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7012 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7013 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7014 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7015 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7016 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7018 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7019 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7020 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7026 elsiocb->iotag, ulp_context, in lpfc_els_rdp_cmpl()
7027 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rdp_cmpl()
7028 ndlp->nlp_rpi); in lpfc_els_rdp_cmpl()
7029 rdp_res = (struct fc_rdp_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7030 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7035 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS); in lpfc_els_rdp_cmpl()
7036 phba->sfp_alarm |= *flag_ptr; in lpfc_els_rdp_cmpl()
7037 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS); in lpfc_els_rdp_cmpl()
7038 phba->sfp_warning |= *flag_ptr; in lpfc_els_rdp_cmpl()
7046 rdp_context->page_a0, rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7050 (len + pcmd), &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7056 &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7058 &rdp_context->link_stat, vport); in lpfc_els_rdp_cmpl()
7061 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7064 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7067 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7070 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7073 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7075 rdp_context->page_a0, vport); in lpfc_els_rdp_cmpl()
7077 rdp_res->length = cpu_to_be32(len - 8); in lpfc_els_rdp_cmpl()
7078 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7081 bpl = (struct ulp_bde64 *)elsiocb->bpl_dmabuf->virt; in lpfc_els_rdp_cmpl()
7082 bpl->tus.f.bdeSize = len; in lpfc_els_rdp_cmpl()
7083 bpl->tus.f.bdeFlags = 0; in lpfc_els_rdp_cmpl()
7084 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfc_els_rdp_cmpl()
7086 phba->fc_stat.elsXmitACC++; in lpfc_els_rdp_cmpl()
7087 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7088 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7104 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rdp_cmpl()
7108 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7109 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7110 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7111 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7112 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7114 &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7115 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7117 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7118 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7119 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7122 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7126 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_rdp_cmpl()
7128 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rdp_cmpl()
7129 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7130 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7131 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7156 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_rdp_info()
7165 mbox->vport = rdp_context->ndlp->vport; in lpfc_get_rdp_info()
7166 mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0; in lpfc_get_rdp_info()
7167 mbox->ctx_u.rdp = rdp_context; in lpfc_get_rdp_info()
7177 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_rdp_info()
7191 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_sfp_info_wait()
7200 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7202 virt = mp->virt; in lpfc_get_sfp_info_wait()
7203 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7204 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7205 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7206 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7207 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7208 mb->un.varWords[3] = DMP_SFF_PAGE_A0_SIZE / 4; in lpfc_get_sfp_info_wait()
7209 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7210 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7211 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7212 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7213 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7214 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7215 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7216 mbox->in_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7217 mbox->out_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7218 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7219 mbox->ext_buf = virt; in lpfc_get_sfp_info_wait()
7222 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A0_SIZE); in lpfc_get_sfp_info_wait()
7223 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7224 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7226 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7234 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_get_sfp_info_wait()
7235 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7239 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7244 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a0, in lpfc_get_sfp_info_wait()
7248 memset(mp->virt, 0, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7249 INIT_LIST_HEAD(&mp->list); in lpfc_get_sfp_info_wait()
7252 mbox->ctx_buf = mp; in lpfc_get_sfp_info_wait()
7253 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7255 bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_DUMP_MEMORY); in lpfc_get_sfp_info_wait()
7257 &mbox->u.mqe.un.mem_dump_type3, DMP_LMSD); in lpfc_get_sfp_info_wait()
7259 &mbox->u.mqe.un.mem_dump_type3, phba->sli4_hba.physical_port); in lpfc_get_sfp_info_wait()
7261 &mbox->u.mqe.un.mem_dump_type3, DMP_PAGE_A2); in lpfc_get_sfp_info_wait()
7262 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7263 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7264 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7265 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7266 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7267 mb->un.varWords[3] = DMP_SFF_PAGE_A2_SIZE / 4; in lpfc_get_sfp_info_wait()
7268 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7269 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7270 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7271 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7272 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7273 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7274 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7275 mbox->in_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7276 mbox->out_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7277 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7278 mbox->ext_buf = virt; in lpfc_get_sfp_info_wait()
7281 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7282 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7283 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7290 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7296 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a2, in lpfc_get_sfp_info_wait()
7300 if (mbox->mbox_flag & LPFC_MBX_WAKE) { in lpfc_get_sfp_info_wait()
7301 mbox->ctx_buf = mpsave; in lpfc_get_sfp_info_wait()
7308 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_sfp_info_wait()
7313 * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
7316 * @ndlp: pointer to a node-list data structure.
7320 * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
7326 * 0 - Sent the acc response
7327 * 1 - Sent the reject response.
7333 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rdp()
7341 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7342 bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_rdp()
7349 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7350 test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_els_rcv_rdp()
7356 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rdp()
7357 rdp_req = (struct fc_rdp_req_frame *) pcmd->virt; in lpfc_els_rcv_rdp()
7362 be32_to_cpu(rdp_req->rdp_des_length), in lpfc_els_rcv_rdp()
7363 be32_to_cpu(rdp_req->nport_id_desc.tag), in lpfc_els_rcv_rdp()
7364 be32_to_cpu(rdp_req->nport_id_desc.nport_id), in lpfc_els_rcv_rdp()
7365 be32_to_cpu(rdp_req->nport_id_desc.length)); in lpfc_els_rcv_rdp()
7368 be32_to_cpu(rdp_req->rdp_des_length)) in lpfc_els_rcv_rdp()
7370 if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag)) in lpfc_els_rcv_rdp()
7373 be32_to_cpu(rdp_req->nport_id_desc.length)) in lpfc_els_rcv_rdp()
7381 cmd = &cmdiocb->wqe; in lpfc_els_rcv_rdp()
7382 rdp_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rdp()
7383 if (!rdp_context->ndlp) { in lpfc_els_rcv_rdp()
7388 rdp_context->ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_rdp()
7389 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7390 rdp_context->rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_rdp()
7391 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7392 rdp_context->cmpl = lpfc_els_rdp_cmpl; in lpfc_els_rcv_rdp()
7394 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS, in lpfc_els_rcv_rdp()
7432 mb = &pmb->u.mb; in lpfc_els_lcb_rsp()
7433 lcb_context = pmb->ctx_u.lcb; in lpfc_els_lcb_rsp()
7434 ndlp = lcb_context->ndlp; in lpfc_els_lcb_rsp()
7435 memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u)); in lpfc_els_lcb_rsp()
7436 pmb->ctx_buf = NULL; in lpfc_els_lcb_rsp()
7439 &pmb->u.mqe.un.beacon_config.header.cfg_shdr; in lpfc_els_lcb_rsp()
7440 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_els_lcb_rsp()
7441 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_els_lcb_rsp()
7447 shdr_status, shdr_add_status, mb->mbxStatus); in lpfc_els_lcb_rsp()
7449 if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status || in lpfc_els_lcb_rsp()
7452 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7456 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7458 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7460 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_lcb_rsp()
7468 lcb_res = (struct fc_lcb_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7472 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7473 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7474 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7475 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7476 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7478 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7479 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7480 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7483 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7485 lcb_res->lcb_sub_command = lcb_context->sub_command; in lpfc_els_lcb_rsp()
7486 lcb_res->lcb_type = lcb_context->type; in lpfc_els_lcb_rsp()
7487 lcb_res->capability = lcb_context->capability; in lpfc_els_lcb_rsp()
7488 lcb_res->lcb_frequency = lcb_context->frequency; in lpfc_els_lcb_rsp()
7489 lcb_res->lcb_duration = lcb_context->duration; in lpfc_els_lcb_rsp()
7490 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7491 phba->fc_stat.elsXmitACC++; in lpfc_els_lcb_rsp()
7493 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7494 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7510 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7512 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_lcb_rsp()
7517 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7518 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7519 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7520 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7521 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7523 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7524 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7525 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7528 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7532 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_lcb_rsp()
7535 stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS; in lpfc_els_lcb_rsp()
7537 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7538 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_lcb_rsp()
7539 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7540 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7559 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_set_beacon()
7565 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_set_beacon()
7569 cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_set_beacon()
7570 len = sizeof(struct lpfc_mbx_set_beacon_config) - in lpfc_sli4_set_beacon()
7575 mbox->ctx_u.lcb = lcb_context; in lpfc_sli4_set_beacon()
7576 mbox->vport = phba->pport; in lpfc_sli4_set_beacon()
7577 mbox->mbox_cmpl = lpfc_els_lcb_rsp; in lpfc_sli4_set_beacon()
7578 bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7579 phba->sli4_hba.physical_port); in lpfc_sli4_set_beacon()
7580 bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7582 mbox->u.mqe.un.beacon_config.word5 = 0; /* Reserved */ in lpfc_sli4_set_beacon()
7590 if (phba->sli4_hba.pc_sli4_params.bv1s) { in lpfc_sli4_set_beacon()
7592 cfg_shdr->request.word9 = BEACON_VERSION_V1; in lpfc_sli4_set_beacon()
7593 lcb_context->capability |= LCB_CAPABILITY_DURATION; in lpfc_sli4_set_beacon()
7595 &mbox->u.mqe.un.beacon_config, 0); in lpfc_sli4_set_beacon()
7597 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7598 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7601 if (be16_to_cpu(lcb_context->duration) != 0) { in lpfc_sli4_set_beacon()
7602 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7605 cfg_shdr->request.word9 = BEACON_VERSION_V0; in lpfc_sli4_set_beacon()
7606 lcb_context->capability &= ~(LCB_CAPABILITY_DURATION); in lpfc_sli4_set_beacon()
7608 &mbox->u.mqe.un.beacon_config, beacon_state); in lpfc_sli4_set_beacon()
7610 &mbox->u.mqe.un.beacon_config, 1); in lpfc_sli4_set_beacon()
7612 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7613 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7618 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7627 * lpfc_els_rcv_lcb - Process an unsolicited LCB
7630 * @ndlp: pointer to a node-list data structure.
7637 * 0 - Sent the acc response
7638 * 1 - Sent the reject response.
7644 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_lcb()
7652 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_lcb()
7653 lp = (uint8_t *)pcmd->virt; in lpfc_els_rcv_lcb()
7654 beacon = (struct fc_lcb_request_frame *)pcmd->virt; in lpfc_els_rcv_lcb()
7660 beacon->lcb_command, in lpfc_els_rcv_lcb()
7661 beacon->lcb_sub_command, in lpfc_els_rcv_lcb()
7662 beacon->lcb_type, in lpfc_els_rcv_lcb()
7663 beacon->lcb_frequency, in lpfc_els_rcv_lcb()
7664 be16_to_cpu(beacon->lcb_duration)); in lpfc_els_rcv_lcb()
7666 if (beacon->lcb_sub_command != LPFC_LCB_ON && in lpfc_els_rcv_lcb()
7667 beacon->lcb_sub_command != LPFC_LCB_OFF) { in lpfc_els_rcv_lcb()
7672 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_lcb()
7673 test_bit(HBA_FCOE_MODE, &phba->hba_flag) || in lpfc_els_rcv_lcb()
7674 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_lcb()
7686 state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0; in lpfc_els_rcv_lcb()
7687 lcb_context->sub_command = beacon->lcb_sub_command; in lpfc_els_rcv_lcb()
7688 lcb_context->capability = 0; in lpfc_els_rcv_lcb()
7689 lcb_context->type = beacon->lcb_type; in lpfc_els_rcv_lcb()
7690 lcb_context->frequency = beacon->lcb_frequency; in lpfc_els_rcv_lcb()
7691 lcb_context->duration = beacon->lcb_duration; in lpfc_els_rcv_lcb()
7692 lcb_context->ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_lcb()
7693 lcb_context->rx_id = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_lcb()
7694 lcb_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_lcb()
7695 if (!lcb_context->ndlp) { in lpfc_els_rcv_lcb()
7701 lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT, in lpfc_els_rcv_lcb()
7720 * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
7732 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_rscn()
7735 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7736 if (vport->fc_rscn_flush) { in lpfc_els_flush_rscn()
7738 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7742 vport->fc_rscn_flush = 1; in lpfc_els_flush_rscn()
7743 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7745 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_els_flush_rscn()
7746 lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]); in lpfc_els_flush_rscn()
7747 vport->fc_rscn_id_list[i] = NULL; in lpfc_els_flush_rscn()
7749 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_flush_rscn()
7750 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_flush_rscn()
7751 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7752 vport->fc_rscn_id_cnt = 0; in lpfc_els_flush_rscn()
7753 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7756 vport->fc_rscn_flush = 0; in lpfc_els_flush_rscn()
7760 * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
7768 * None zero - The @did matched with a pending rscn
7769 * 0 - not able to match @did with a pending rscn
7787 if (test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) in lpfc_rscn_payload_check()
7790 spin_lock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7791 if (vport->fc_rscn_flush) { in lpfc_rscn_payload_check()
7793 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7797 vport->fc_rscn_flush = 1; in lpfc_rscn_payload_check()
7798 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7799 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_rscn_payload_check()
7800 lp = vport->fc_rscn_id_list[i]->virt; in lpfc_rscn_payload_check()
7802 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_rscn_payload_check()
7805 payload_len -= sizeof(uint32_t); in lpfc_rscn_payload_check()
7828 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7832 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7837 * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
7845 * 0 - Successful (currently alway return 0)
7853 list_for_each_entry_safe(ndlp, n, &vport->fc_nodes, nlp_listp) { in lpfc_rscn_recovery_check()
7854 if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) || in lpfc_rscn_recovery_check()
7855 !lpfc_rscn_payload_check(vport, ndlp->nlp_DID)) in lpfc_rscn_recovery_check()
7859 if (vport->phba->nvmet_support) in lpfc_rscn_recovery_check()
7865 switch (ndlp->nlp_state) { in lpfc_rscn_recovery_check()
7882 * lpfc_send_rscn_event - Send an RSCN event to management application
7899 pcmd = cmdiocb->cmd_dmabuf; in lpfc_send_rscn_event()
7900 payload_ptr = (uint32_t *) pcmd->virt; in lpfc_send_rscn_event()
7910 rscn_event_data->event_type = FC_REG_RSCN_EVENT; in lpfc_send_rscn_event()
7911 rscn_event_data->payload_length = payload_len; in lpfc_send_rscn_event()
7912 memcpy(rscn_event_data->rscn_payload, payload_ptr, in lpfc_send_rscn_event()
7925 * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
7928 * @ndlp: pointer to a node-list data structure.
7943 * 0 - Just sent the acc response
7944 * 1 - Sent the acc response and waited for name server completion
7951 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rscn()
7959 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rscn()
7960 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rscn()
7963 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_els_rcv_rscn()
7967 vport->fc_flag, payload_len, *lp, in lpfc_els_rcv_rscn()
7968 vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
7977 /* Check if RSCN is coming from a direct-connected remote NPort */ in lpfc_els_rcv_rscn()
7978 if (test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
7982 *lp, vport->fc_flag, payload_len); in lpfc_els_rcv_rscn()
7988 if (ndlp->nlp_fc4_type & NLP_FC4_NVME && in lpfc_els_rcv_rscn()
7989 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) in lpfc_els_rcv_rscn()
7997 if (vport->port_state <= LPFC_NS_QRY) { in lpfc_els_rcv_rscn()
8000 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8009 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_rcv_rscn()
8010 !(vport->cfg_peer_port_login)) { in lpfc_els_rcv_rscn()
8016 i -= sizeof(uint32_t); in lpfc_els_rcv_rscn()
8026 vport->fc_flag, payload_len, in lpfc_els_rcv_rscn()
8027 *lp, vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8030 ndlp->nlp_DID, vport->port_state, in lpfc_els_rcv_rscn()
8031 ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8036 if (test_bit(FC_DISC_TMO, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8037 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8038 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8046 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8047 if (vport->fc_rscn_flush) { in lpfc_els_rcv_rscn()
8049 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8050 set_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_rcv_rscn()
8056 vport->fc_rscn_flush = 1; in lpfc_els_rcv_rscn()
8057 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8059 rscn_cnt = vport->fc_rscn_id_cnt; in lpfc_els_rcv_rscn()
8061 * RSCN payload buffer, cmdiocb->cmd_dmabuf to process later. in lpfc_els_rcv_rscn()
8063 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) || in lpfc_els_rcv_rscn()
8064 test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8067 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8069 set_bit(FC_RSCN_DEFERRED, &vport->fc_flag); in lpfc_els_rcv_rscn()
8072 if (test_bit(FC_DISC_TMO, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8073 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8074 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8078 !test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8079 set_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_rcv_rscn()
8081 cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt; in lpfc_els_rcv_rscn()
8091 vport->fc_rscn_id_list[rscn_cnt] = pcmd; in lpfc_els_rcv_rscn()
8092 vport->fc_rscn_id_cnt++; in lpfc_els_rcv_rscn()
8093 /* If we zero, cmdiocb->cmd_dmabuf, the calling in lpfc_els_rcv_rscn()
8096 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8102 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8103 vport->port_state); in lpfc_els_rcv_rscn()
8105 set_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_rcv_rscn()
8110 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8111 vport->port_state); in lpfc_els_rcv_rscn()
8114 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8123 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8125 set_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_rcv_rscn()
8126 vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd; in lpfc_els_rcv_rscn()
8128 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8130 * If we zero, cmdiocb->cmd_dmabuf, the calling routine will in lpfc_els_rcv_rscn()
8133 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8143 * lpfc_els_handle_rscn - Handle rscn for a vport
8155 * 0 - Cleaned up rscn on the @vport
8156 * 1 - Wait for plogi to name server before proceed
8162 struct lpfc_hba *phba = vport->phba; in lpfc_els_handle_rscn()
8165 if (test_bit(FC_UNLOADING, &vport->load_flag)) { in lpfc_els_handle_rscn()
8176 vport->fc_flag, 0, vport->fc_rscn_id_cnt, in lpfc_els_handle_rscn()
8177 vport->port_state, vport->num_disc_nodes, in lpfc_els_handle_rscn()
8178 vport->gidft_inp); in lpfc_els_handle_rscn()
8181 vport->fc_ns_retry = 0; in lpfc_els_handle_rscn()
8182 vport->num_disc_nodes = 0; in lpfc_els_handle_rscn()
8185 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_els_handle_rscn()
8191 if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) { in lpfc_els_handle_rscn()
8194 } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) { in lpfc_els_handle_rscn()
8203 ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE; in lpfc_els_handle_rscn()
8211 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_handle_rscn()
8214 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_handle_rscn()
8227 * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
8230 * @ndlp: pointer to a node-list data structure.
8233 * unsolicited event. An unsolicited FLOGI can be received in a point-to-
8248 * 0 - Successfully processed the unsolicited flogi
8249 * 1 - Failed to process the unsolicited flogi
8256 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_flogi()
8257 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_flogi()
8258 uint32_t *lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_flogi()
8259 union lpfc_wqe128 *wqe = &cmdiocb->wqe; in lpfc_els_rcv_flogi()
8268 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8277 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_els_rcv_flogi()
8279 did = bf_get(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest); in lpfc_els_rcv_flogi()
8297 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_els_rcv_flogi()
8301 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_els_rcv_flogi()
8302 mbox = mempool_alloc(phba->mbox_mem_pool, in lpfc_els_rcv_flogi()
8308 phba->cfg_topology, in lpfc_els_rcv_flogi()
8309 phba->cfg_link_speed); in lpfc_els_rcv_flogi()
8310 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_rcv_flogi()
8311 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_rcv_flogi()
8312 mbox->vport = vport; in lpfc_els_rcv_flogi()
8317 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_flogi()
8322 phba->link_flag |= LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8334 set_bit(FC_PT2PT_PLOGI, &vport->fc_flag); in lpfc_els_rcv_flogi()
8341 vport->fc_myDID = PT2PT_LocalID; in lpfc_els_rcv_flogi()
8343 vport->fc_myDID = PT2PT_RemoteID; in lpfc_els_rcv_flogi()
8350 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8351 fc_flag = vport->fc_flag; in lpfc_els_rcv_flogi()
8352 port_state = vport->port_state; in lpfc_els_rcv_flogi()
8354 * work-around. in lpfc_els_rcv_flogi()
8356 vport->rcv_flogi_cnt++; in lpfc_els_rcv_flogi()
8357 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8358 set_bit(FC_PT2PT, &vport->fc_flag); in lpfc_els_rcv_flogi()
8359 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_els_rcv_flogi()
8360 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_els_rcv_flogi()
8364 port_state, vport->port_state, in lpfc_els_rcv_flogi()
8365 fc_flag, vport->fc_flag); in lpfc_els_rcv_flogi()
8372 did = vport->fc_myDID; in lpfc_els_rcv_flogi()
8373 vport->fc_myDID = Fabric_DID; in lpfc_els_rcv_flogi()
8375 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_els_rcv_flogi()
8378 if (!test_bit(HBA_FLOGI_ISSUED, &phba->hba_flag)) { in lpfc_els_rcv_flogi()
8379 phba->defer_flogi_acc.rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_flogi()
8380 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8381 phba->defer_flogi_acc.ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_flogi()
8382 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8384 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8389 phba->defer_flogi_acc.rx_id, in lpfc_els_rcv_flogi()
8390 phba->defer_flogi_acc.ox_id, phba->hba_flag); in lpfc_els_rcv_flogi()
8392 phba->defer_flogi_acc.flag = true; in lpfc_els_rcv_flogi()
8399 phba->defer_flogi_acc.ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_flogi()
8407 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8413 * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
8416 * @ndlp: pointer to a node-list data structure.
8426 * 0 - Successfully processed rnid iocb (currently always return 0)
8437 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rnid()
8438 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rnid()
8445 switch (rn->Format) { in lpfc_els_rcv_rnid()
8449 lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp); in lpfc_els_rcv_rnid()
8464 * lpfc_els_rcv_echo - Process an unsolicited echo iocb
8467 * @ndlp: pointer to a node-list data structure.
8470 * 0 - Successfully processed echo iocb (currently always return 0)
8478 pcmd = (uint8_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_echo()
8488 * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
8491 * @ndlp: pointer to a node-list data structure.
8498 * 0 - Successfully processed lirr iocb (currently always return 0)
8516 * lpfc_els_rcv_rrq - Process an unsolicited rrq iocb
8519 * @ndlp: pointer to a node-list data structure.
8536 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rcv_rrq()
8541 * lpfc_els_rsp_rls_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
8575 mb = &pmb->u.mb; in lpfc_els_rsp_rls_acc()
8577 ndlp = pmb->ctx_ndlp; in lpfc_els_rsp_rls_acc()
8578 rxid = (uint16_t)(pmb->ctx_u.ox_rx_id & 0xffff); in lpfc_els_rsp_rls_acc()
8579 oxid = (uint16_t)((pmb->ctx_u.ox_rx_id >> 16) & 0xffff); in lpfc_els_rsp_rls_acc()
8580 memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u)); in lpfc_els_rsp_rls_acc()
8581 pmb->ctx_ndlp = NULL; in lpfc_els_rsp_rls_acc()
8583 if (mb->mbxStatus) { in lpfc_els_rsp_rls_acc()
8584 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8589 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rsp_rls_acc()
8591 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rls_acc()
8597 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8602 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rls_acc()
8603 wqe = &elsiocb->wqe; in lpfc_els_rsp_rls_acc()
8605 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, rxid); in lpfc_els_rsp_rls_acc()
8606 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, oxid); in lpfc_els_rsp_rls_acc()
8608 icmd = &elsiocb->iocb; in lpfc_els_rsp_rls_acc()
8609 icmd->ulpContext = rxid; in lpfc_els_rsp_rls_acc()
8610 icmd->unsli3.rcvsli3.ox_id = oxid; in lpfc_els_rsp_rls_acc()
8613 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rls_acc()
8618 rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt); in lpfc_els_rsp_rls_acc()
8619 rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt); in lpfc_els_rsp_rls_acc()
8620 rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt); in lpfc_els_rsp_rls_acc()
8621 rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt); in lpfc_els_rsp_rls_acc()
8622 rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord); in lpfc_els_rsp_rls_acc()
8623 rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt); in lpfc_els_rsp_rls_acc()
8624 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8626 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rsp_rls_acc()
8629 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rls_acc()
8630 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rls_acc()
8631 ndlp->nlp_rpi); in lpfc_els_rsp_rls_acc()
8632 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rls_acc()
8633 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rls_acc()
8634 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rls_acc()
8635 if (!elsiocb->ndlp) { in lpfc_els_rsp_rls_acc()
8649 * lpfc_els_rcv_rls - Process an unsolicited rls iocb
8652 * @ndlp: pointer to a node-list data structure.
8664 * 0 - Successfully processed rls iocb (currently always return 0)
8670 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rls()
8676 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rls()
8677 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rls()
8681 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC); in lpfc_els_rcv_rls()
8684 mbox->ctx_u.ox_rx_id = ox_id << 16 | ctx; in lpfc_els_rcv_rls()
8685 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rls()
8686 if (!mbox->ctx_ndlp) in lpfc_els_rcv_rls()
8688 mbox->vport = vport; in lpfc_els_rcv_rls()
8689 mbox->mbox_cmpl = lpfc_els_rsp_rls_acc; in lpfc_els_rcv_rls()
8699 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_rls()
8712 * lpfc_els_rcv_rtv - Process an unsolicited rtv iocb
8715 * @ndlp: pointer to a node-list data structure.
8730 * 0 - Successfully processed rtv iocb (currently always return 0)
8739 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rtv()
8747 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rtv()
8748 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rtv()
8753 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rcv_rtv()
8755 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rcv_rtv()
8760 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rcv_rtv()
8766 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rcv_rtv()
8767 wqe = &elsiocb->wqe; in lpfc_els_rcv_rtv()
8768 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rcv_rtv()
8770 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rcv_rtv()
8773 icmd = &elsiocb->iocb; in lpfc_els_rcv_rtv()
8774 icmd->ulpContext = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_rtv()
8775 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_rtv()
8781 rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000); /* report msecs */ in lpfc_els_rcv_rtv()
8782 rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov); in lpfc_els_rcv_rtv()
8783 bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0); in lpfc_els_rcv_rtv()
8785 rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8788 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rcv_rtv()
8792 elsiocb->iotag, ulp_context, in lpfc_els_rcv_rtv()
8793 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rcv_rtv()
8794 ndlp->nlp_rpi, in lpfc_els_rcv_rtv()
8795 rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8796 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rcv_rtv()
8797 phba->fc_stat.elsXmitACC++; in lpfc_els_rcv_rtv()
8798 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rtv()
8799 if (!elsiocb->ndlp) { in lpfc_els_rcv_rtv()
8821 /* lpfc_issue_els_rrq - Process an unsolicited rrq iocb
8823 * @ndlp: pointer to a node-list data structure.
8831 * 0 - Successfully sent rrq els iocb.
8832 * 1 - Failed to send rrq els iocb.
8838 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rrq()
8855 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rrq()
8862 bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]); in lpfc_issue_els_rrq()
8863 bf_set(rrq_rxid, els_rrq, rrq->rxid); in lpfc_issue_els_rrq()
8864 bf_set(rrq_did, els_rrq, vport->fc_myDID); in lpfc_issue_els_rrq()
8865 els_rrq->rrq = cpu_to_be32(els_rrq->rrq); in lpfc_issue_els_rrq()
8866 els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg); in lpfc_issue_els_rrq()
8871 did, rrq->xritag, rrq->rxid); in lpfc_issue_els_rrq()
8872 elsiocb->context_un.rrq = rrq; in lpfc_issue_els_rrq()
8873 elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq; in lpfc_issue_els_rrq()
8875 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rrq()
8876 if (!elsiocb->ndlp) in lpfc_issue_els_rrq()
8892 * lpfc_send_rrq - Sends ELS RRQ if needed.
8906 struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport, in lpfc_send_rrq()
8907 rrq->nlp_DID); in lpfc_send_rrq()
8911 if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag)) in lpfc_send_rrq()
8912 return lpfc_issue_els_rrq(rrq->vport, ndlp, in lpfc_send_rrq()
8913 rrq->nlp_DID, rrq); in lpfc_send_rrq()
8919 * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
8923 * @ndlp: pointer to a node-list data structure.
8934 * 0 - Successfully issued ACC RPL ELS command
8935 * 1 - Failed to issue ACC RPL ELS command
8942 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rpl_acc()
8950 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rpl_acc()
8951 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rpl_acc()
8957 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rpl_acc()
8958 wqe = &elsiocb->wqe; in lpfc_els_rsp_rpl_acc()
8960 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rpl_acc()
8962 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rpl_acc()
8965 icmd = &elsiocb->iocb; in lpfc_els_rsp_rpl_acc()
8966 icmd->ulpContext = get_job_ulpcontext(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
8967 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
8970 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rpl_acc()
8980 rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_rpl_acc()
8981 memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname, in lpfc_els_rsp_rpl_acc()
8983 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_rpl_acc()
8989 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rpl_acc()
8990 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rpl_acc()
8991 ndlp->nlp_rpi); in lpfc_els_rsp_rpl_acc()
8992 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rpl_acc()
8993 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rpl_acc()
8994 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rpl_acc()
8995 if (!elsiocb->ndlp) { in lpfc_els_rsp_rpl_acc()
9011 * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
9014 * @ndlp: pointer to a node-list data structure.
9024 * 0 - Successfully processed rpl iocb (currently always return 0)
9037 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rpl()
9038 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_rpl()
9050 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rpl()
9051 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rpl()
9053 maxsize = be32_to_cpu(rpl->maxsize); in lpfc_els_rcv_rpl()
9056 if ((rpl->index == 0) && in lpfc_els_rcv_rpl()
9069 * lpfc_els_rcv_farp - Process an unsolicited farp request els command
9072 * @ndlp: pointer to a node-list data structure.
9090 * 0 - Either the FARP Match Mode not supported or successfully processed
9101 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farp()
9102 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_farp()
9103 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_farp()
9107 /* FARP-REQ received from DID <did> */ in lpfc_els_rcv_farp()
9109 "0601 FARP-REQ received from DID x%x\n", did); in lpfc_els_rcv_farp()
9111 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) { in lpfc_els_rcv_farp()
9117 if (fp->Mflags & FARP_MATCH_PORT) { in lpfc_els_rcv_farp()
9118 if (memcmp(&fp->RportName, &vport->fc_portname, in lpfc_els_rcv_farp()
9124 if (fp->Mflags & FARP_MATCH_NODE) { in lpfc_els_rcv_farp()
9125 if (memcmp(&fp->RnodeName, &vport->fc_nodename, in lpfc_els_rcv_farp()
9131 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_els_rcv_farp()
9132 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_farp()
9134 if (fp->Rflags & FARP_REQUEST_PLOGI) { in lpfc_els_rcv_farp()
9135 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_rcv_farp()
9138 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_rcv_farp()
9142 if (fp->Rflags & FARP_REQUEST_FARPR) in lpfc_els_rcv_farp()
9150 * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
9153 * @ndlp: pointer to a node-list data structure.
9161 * 0 - Successfully processed FARPR IOCB (currently always return 0)
9169 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farpr()
9171 /* FARP-RSP received from DID <did> */ in lpfc_els_rcv_farpr()
9173 "0600 FARP-RSP received from DID x%x\n", did); in lpfc_els_rcv_farpr()
9181 * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
9184 * @fan_ndlp: pointer to a node-list data structure.
9197 * 0 - Successfully processed fan iocb (currently always return 0).
9203 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fan()
9208 lp = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_fan()
9211 if ((vport == phba->pport) && in lpfc_els_rcv_fan()
9212 (vport->port_state == LPFC_LOCAL_CFG_LINK)) { in lpfc_els_rcv_fan()
9213 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName, in lpfc_els_rcv_fan()
9215 (memcmp(&phba->fc_fabparam.portName, &fp->FportName, in lpfc_els_rcv_fan()
9220 /* FAN verified - skip FLOGI */ in lpfc_els_rcv_fan()
9221 vport->fc_myDID = vport->fc_prevDID; in lpfc_els_rcv_fan()
9222 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_els_rcv_fan()
9227 vport->fc_prevDID, vport->fc_myDID); in lpfc_els_rcv_fan()
9236 * lpfc_els_rcv_edc - Process an unsolicited EDC iocb
9239 * @ndlp: pointer to a node-list data structure.
9242 * 0 - Successfully processed echo iocb (currently always return 0)
9248 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_edc()
9257 payload = cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_edc()
9260 bytes_remain = be32_to_cpu(edc_req->desc_len); in lpfc_els_rcv_edc()
9270 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_els_rcv_edc()
9271 phba->cgn_sig_freq = 0; in lpfc_els_rcv_edc()
9272 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_els_rcv_edc()
9277 tlv = edc_req->desc; in lpfc_els_rcv_edc()
9293 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_edc()
9313 be32_to_cpu(plnkflt->desc_tag), in lpfc_els_rcv_edc()
9314 be32_to_cpu(plnkflt->desc_len), in lpfc_els_rcv_edc()
9316 plnkflt->degrade_activate_threshold), in lpfc_els_rcv_edc()
9318 plnkflt->degrade_deactivate_threshold), in lpfc_els_rcv_edc()
9319 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_els_rcv_edc()
9335 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_els_rcv_edc()
9336 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_els_rcv_edc()
9342 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_els_rcv_edc()
9355 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_edc()
9368 * lpfc_els_timeout - Handler funciton to the els timer
9381 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout()
9385 spin_lock_irqsave(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9386 tmo_posted = vport->work_port_events & WORKER_ELS_TMO; in lpfc_els_timeout()
9387 if (!tmo_posted && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_timeout()
9388 vport->work_port_events |= WORKER_ELS_TMO; in lpfc_els_timeout()
9389 spin_unlock_irqrestore(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9391 if (!tmo_posted && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_timeout()
9398 * lpfc_els_timeout_handler - Process an els timeout event
9409 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout_handler()
9421 timeout = (uint32_t)(phba->fc_ratov << 1); in lpfc_els_timeout_handler()
9427 if (test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_els_timeout_handler()
9430 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9431 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9432 spin_lock(&pring->ring_lock); in lpfc_els_timeout_handler()
9434 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_timeout_handler()
9439 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_timeout_handler()
9442 cmd = &piocb->iocb; in lpfc_els_timeout_handler()
9443 iotag = cmd->ulpIoTag; in lpfc_els_timeout_handler()
9446 if ((piocb->cmd_flag & LPFC_IO_LIBDFC) != 0 || in lpfc_els_timeout_handler()
9452 if (piocb->vport != vport) in lpfc_els_timeout_handler()
9455 pcmd = piocb->cmd_dmabuf; in lpfc_els_timeout_handler()
9457 els_command = *(uint32_t *) (pcmd->virt); in lpfc_els_timeout_handler()
9464 if (piocb->drvrTimeout > 0) { in lpfc_els_timeout_handler()
9465 if (piocb->drvrTimeout >= timeout) in lpfc_els_timeout_handler()
9466 piocb->drvrTimeout -= timeout; in lpfc_els_timeout_handler()
9468 piocb->drvrTimeout = 0; in lpfc_els_timeout_handler()
9479 remote_ID = ndlp->nlp_DID; in lpfc_els_timeout_handler()
9481 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_timeout_handler()
9483 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9484 spin_unlock(&pring->ring_lock); in lpfc_els_timeout_handler()
9485 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9493 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9494 list_del_init(&piocb->dlist); in lpfc_els_timeout_handler()
9496 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9502 if (!list_empty(&pring->txcmplq)) in lpfc_els_timeout_handler()
9503 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_els_timeout_handler()
9504 mod_timer(&vport->els_tmofunc, in lpfc_els_timeout_handler()
9509 * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
9516 * the IOCBs with a non-NULL completion callback function, the callback
9533 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_cmd()
9548 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9553 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9557 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9558 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9560 mbx_tmo_err = test_bit(MBX_TMO_ERR, &phba->bit_flags); in lpfc_els_flush_cmd()
9562 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_flush_cmd()
9563 if (piocb->cmd_flag & LPFC_IO_LIBDFC && !mbx_tmo_err) in lpfc_els_flush_cmd()
9566 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9569 if (piocb->cmd_flag & LPFC_DRIVER_ABORTED && !mbx_tmo_err) in lpfc_els_flush_cmd()
9578 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9585 * and avoid any retry logic. in lpfc_els_flush_cmd()
9587 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_els_flush_cmd()
9588 piocb->cmd_cmpl = lpfc_cmpl_els_link_down; in lpfc_els_flush_cmd()
9591 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9594 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9595 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9596 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9600 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9601 list_del_init(&piocb->dlist); in lpfc_els_flush_cmd()
9602 if (mbx_tmo_err || !(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) in lpfc_els_flush_cmd()
9603 list_move_tail(&piocb->list, &cancel_list); in lpfc_els_flush_cmd()
9607 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9621 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9622 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9623 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9628 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) { in lpfc_els_flush_cmd()
9631 if (piocb->cmd_flag & LPFC_IO_LIBDFC) in lpfc_els_flush_cmd()
9642 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9645 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9646 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9650 if (vport == phba->pport) { in lpfc_els_flush_cmd()
9652 &phba->fabric_iocb_list, list) { in lpfc_els_flush_cmd()
9653 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9654 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9658 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9659 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9660 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9670 * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
9691 spin_lock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9692 list_for_each_entry(vport, &phba->port_list, listentry) in lpfc_els_flush_all_cmd()
9694 spin_unlock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9700 * lpfc_send_els_failure_event - Posts an ELS command failure event
9713 struct lpfc_vport *vport = cmdiocbp->vport; in lpfc_send_els_failure_event()
9722 ndlp = cmdiocbp->ndlp; in lpfc_send_els_failure_event()
9732 memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9734 memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9736 pcmd = (uint32_t *)cmdiocbp->cmd_dmabuf->virt; in lpfc_send_els_failure_event()
9755 memcpy(fabric_event.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9757 memcpy(fabric_event.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9770 * lpfc_send_els_event - Posts unsolicited els event
9795 els_data = &logo_data->header; in lpfc_send_els_event()
9806 els_data->event_type = FC_REG_ELS_EVENT; in lpfc_send_els_event()
9809 els_data->subcategory = LPFC_EVENT_PLOGI_RCV; in lpfc_send_els_event()
9812 els_data->subcategory = LPFC_EVENT_PRLO_RCV; in lpfc_send_els_event()
9815 els_data->subcategory = LPFC_EVENT_ADISC_RCV; in lpfc_send_els_event()
9818 els_data->subcategory = LPFC_EVENT_LOGO_RCV; in lpfc_send_els_event()
9820 memcpy(logo_data->logo_wwpn, &payload[2], in lpfc_send_els_event()
9827 memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9828 memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9864 * lpfc_display_fpin_wwpn - Display WWPNs accessible by the attached port
9886 if (i == (cnt - 1)) in lpfc_display_fpin_wwpn()
9892 len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len, in lpfc_display_fpin_wwpn()
9913 cnt - i - 1); in lpfc_display_fpin_wwpn()
9926 * lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
9939 li_evt = be16_to_cpu(li->event_type); in lpfc_els_rcv_fpin_li()
9941 cnt = be32_to_cpu(li->pname_count); in lpfc_els_rcv_fpin_li()
9948 be64_to_cpu(li->detecting_wwpn), in lpfc_els_rcv_fpin_li()
9949 be64_to_cpu(li->attached_wwpn), in lpfc_els_rcv_fpin_li()
9950 be32_to_cpu(li->event_threshold), in lpfc_els_rcv_fpin_li()
9951 be32_to_cpu(li->event_count), cnt); in lpfc_els_rcv_fpin_li()
9953 lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt); in lpfc_els_rcv_fpin_li()
9957 * lpfc_els_rcv_fpin_del - Process an FPIN Delivery Event.
9971 del_rsn = be16_to_cpu(del->deli_reason_code); in lpfc_els_rcv_fpin_del()
9984 be64_to_cpu(del->detecting_wwpn), in lpfc_els_rcv_fpin_del()
9985 be64_to_cpu(del->attached_wwpn), in lpfc_els_rcv_fpin_del()
9995 * lpfc_els_rcv_fpin_peer_cgn - Process a FPIN Peer Congestion Event.
10008 pc_evt = be16_to_cpu(pc->event_type); in lpfc_els_rcv_fpin_peer_cgn()
10010 cnt = be32_to_cpu(pc->pname_count); in lpfc_els_rcv_fpin_peer_cgn()
10013 phba->cgn_fpin_frequency = be32_to_cpu(pc->event_period); in lpfc_els_rcv_fpin_peer_cgn()
10021 be32_to_cpu(pc->event_period), in lpfc_els_rcv_fpin_peer_cgn()
10022 be64_to_cpu(pc->detecting_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10023 be64_to_cpu(pc->attached_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10026 lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt); in lpfc_els_rcv_fpin_peer_cgn()
10030 * lpfc_els_rcv_fpin_cgn - Process an FPIN Congestion notification
10054 cgn_evt = be16_to_cpu(cgn->event_type); in lpfc_els_rcv_fpin_cgn()
10056 cgn_sev = cgn->severity; in lpfc_els_rcv_fpin_cgn()
10078 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10079 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) { in lpfc_els_rcv_fpin_cgn()
10081 atomic_inc(&phba->cgn_sync_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10087 atomic_inc(&phba->cgn_fabric_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10093 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10094 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) { in lpfc_els_rcv_fpin_cgn()
10096 atomic_inc(&phba->cgn_sync_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10102 atomic_inc(&phba->cgn_fabric_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10105 phba->cgn_fpin_frequency = in lpfc_els_rcv_fpin_cgn()
10106 be32_to_cpu(cgn->event_period); in lpfc_els_rcv_fpin_cgn()
10107 value = phba->cgn_fpin_frequency; in lpfc_els_rcv_fpin_cgn()
10108 if (phba->cgn_i) { in lpfc_els_rcv_fpin_cgn()
10110 phba->cgn_i->virt; in lpfc_els_rcv_fpin_cgn()
10111 cp->cgn_alarm_freq = in lpfc_els_rcv_fpin_cgn()
10113 cp->cgn_warn_freq = in lpfc_els_rcv_fpin_cgn()
10119 cp->cgn_info_crc = cpu_to_le32(crc); in lpfc_els_rcv_fpin_cgn()
10138 be32_to_cpu(cgn->event_period)); in lpfc_els_rcv_fpin_cgn()
10145 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fpin()
10154 if (vport->port_state < LPFC_DISC_AUTH) in lpfc_els_rcv_fpin()
10164 len = be32_to_cpu(fpin->desc_len); in lpfc_els_rcv_fpin()
10172 tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0]; in lpfc_els_rcv_fpin()
10174 bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc); in lpfc_els_rcv_fpin()
10175 bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len)); in lpfc_els_rcv_fpin()
10180 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_fpin()
10208 cnt = be32_to_cpu(tlv->desc_len); in lpfc_els_rcv_fpin()
10213 len -= (cnt + sizeof(struct fc_tlv_desc)); in lpfc_els_rcv_fpin()
10224 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_fpin()
10238 fpin->desc_len = cpu_to_be32(fpin_length); in lpfc_els_rcv_fpin()
10250 * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
10275 if (!vport || !elsiocb->cmd_dmabuf) in lpfc_els_unsol_buffer()
10279 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_buffer()
10280 payload = elsiocb->cmd_dmabuf->virt; in lpfc_els_unsol_buffer()
10281 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_buffer()
10282 payload_len = wcqe_cmpl->total_data_placed; in lpfc_els_unsol_buffer()
10284 payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_unsol_buffer()
10287 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0) in lpfc_els_unsol_buffer()
10303 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_unsol_buffer()
10307 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag) && in lpfc_els_unsol_buffer()
10320 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_unsol_buffer()
10321 } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) { in lpfc_els_unsol_buffer()
10326 phba->fc_stat.elsRcvFrame++; in lpfc_els_unsol_buffer()
10332 if (test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) { in lpfc_els_unsol_buffer()
10338 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_unsol_buffer()
10339 if (!elsiocb->ndlp) in lpfc_els_unsol_buffer()
10341 elsiocb->vport = vport; in lpfc_els_unsol_buffer()
10350 cmd, did, kref_read(&ndlp->kref), vport->port_state, in lpfc_els_unsol_buffer()
10351 vport->fc_flag, vport->fc_myDID, vport->fc_prevDID); in lpfc_els_unsol_buffer()
10354 if ((vport->port_state < LPFC_FABRIC_CFG_LINK) && in lpfc_els_unsol_buffer()
10356 !((cmd == ELS_CMD_PLOGI) && test_bit(FC_PT2PT, &vport->fc_flag))) { in lpfc_els_unsol_buffer()
10366 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10368 phba->fc_stat.elsRcvPLOGI++; in lpfc_els_unsol_buffer()
10370 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_unsol_buffer()
10371 test_bit(FC_PT2PT, &phba->pport->fc_flag)) { in lpfc_els_unsol_buffer()
10372 vport->fc_prevDID = vport->fc_myDID; in lpfc_els_unsol_buffer()
10377 vport->fc_myDID = in lpfc_els_unsol_buffer()
10379 &elsiocb->wqe.xmit_els_rsp); in lpfc_els_unsol_buffer()
10382 "%x\n", vport->fc_myDID, in lpfc_els_unsol_buffer()
10383 vport->fc_prevDID); in lpfc_els_unsol_buffer()
10389 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag)) { in lpfc_els_unsol_buffer()
10395 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10396 if (!test_bit(FC_PT2PT, &phba->pport->fc_flag) || in lpfc_els_unsol_buffer()
10397 test_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag)) { in lpfc_els_unsol_buffer()
10404 clear_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10413 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10415 phba->fc_stat.elsRcvFLOGI++; in lpfc_els_unsol_buffer()
10420 if (vport->port_state >= LPFC_LOCAL_CFG_LINK && in lpfc_els_unsol_buffer()
10421 test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_els_unsol_buffer()
10422 vport->rcv_flogi_cnt >= 1) { in lpfc_els_unsol_buffer()
10431 if (phba->defer_flogi_acc.flag) in lpfc_els_unsol_buffer()
10440 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10442 phba->fc_stat.elsRcvLOGO++; in lpfc_els_unsol_buffer()
10444 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10457 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10459 phba->fc_stat.elsRcvPRLO++; in lpfc_els_unsol_buffer()
10461 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10469 phba->fc_stat.elsRcvLCB++; in lpfc_els_unsol_buffer()
10473 phba->fc_stat.elsRcvRDP++; in lpfc_els_unsol_buffer()
10477 phba->fc_stat.elsRcvRSCN++; in lpfc_els_unsol_buffer()
10486 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10489 phba->fc_stat.elsRcvADISC++; in lpfc_els_unsol_buffer()
10490 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10501 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10503 phba->fc_stat.elsRcvPDISC++; in lpfc_els_unsol_buffer()
10504 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10515 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10517 phba->fc_stat.elsRcvFARPR++; in lpfc_els_unsol_buffer()
10523 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10525 phba->fc_stat.elsRcvFARP++; in lpfc_els_unsol_buffer()
10531 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10533 phba->fc_stat.elsRcvFAN++; in lpfc_els_unsol_buffer()
10540 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10542 phba->fc_stat.elsRcvPRLI++; in lpfc_els_unsol_buffer()
10543 if ((vport->port_state < LPFC_DISC_AUTH) && in lpfc_els_unsol_buffer()
10544 test_bit(FC_FABRIC, &vport->fc_flag)) { in lpfc_els_unsol_buffer()
10554 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10556 phba->fc_stat.elsRcvLIRR++; in lpfc_els_unsol_buffer()
10565 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10567 phba->fc_stat.elsRcvRLS++; in lpfc_els_unsol_buffer()
10576 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10578 phba->fc_stat.elsRcvRPL++; in lpfc_els_unsol_buffer()
10587 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10589 phba->fc_stat.elsRcvRNID++; in lpfc_els_unsol_buffer()
10598 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10599 phba->fc_stat.elsRcvRTV++; in lpfc_els_unsol_buffer()
10608 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10610 phba->fc_stat.elsRcvRRQ++; in lpfc_els_unsol_buffer()
10619 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10621 phba->fc_stat.elsRcvECHO++; in lpfc_els_unsol_buffer()
10636 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10647 phba->fc_stat.elsRcvRDF++; in lpfc_els_unsol_buffer()
10663 cmd, did, vport->port_state); in lpfc_els_unsol_buffer()
10694 lpfc_nlp_put(elsiocb->ndlp); in lpfc_els_unsol_buffer()
10695 elsiocb->ndlp = NULL; in lpfc_els_unsol_buffer()
10702 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_els_unsol_buffer()
10707 phba->cfg_topology, in lpfc_els_unsol_buffer()
10708 phba->cfg_link_speed); in lpfc_els_unsol_buffer()
10709 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_unsol_buffer()
10710 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_unsol_buffer()
10711 mbox->vport = vport; in lpfc_els_unsol_buffer()
10714 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_unsol_buffer()
10720 if (vport && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_unsol_buffer()
10726 phba->fc_stat.elsRcvDrop++; in lpfc_els_unsol_buffer()
10730 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
10745 struct lpfc_vport *vport = elsiocb->vport; in lpfc_els_unsol_event()
10749 struct lpfc_dmabuf *bdeBuf1 = elsiocb->cmd_dmabuf; in lpfc_els_unsol_event()
10750 struct lpfc_dmabuf *bdeBuf2 = elsiocb->bpl_dmabuf; in lpfc_els_unsol_event()
10753 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10754 elsiocb->rsp_dmabuf = NULL; in lpfc_els_unsol_event()
10755 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10757 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_event()
10761 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_event()
10762 bde_count = wcqe_cmpl->word3; in lpfc_els_unsol_event()
10764 bde_count = elsiocb->iocb.ulpBdeCount; in lpfc_els_unsol_event()
10771 phba->fc_stat.NoRcvBuf++; in lpfc_els_unsol_event()
10773 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) in lpfc_els_unsol_event()
10778 if (phba->sli_rev == LPFC_SLI_REV3) { in lpfc_els_unsol_event()
10779 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10780 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_unsol_event()
10783 if (icmd->unsli3.rcvsli3.vpi == 0xffff) in lpfc_els_unsol_event()
10784 vport = phba->pport; in lpfc_els_unsol_event()
10787 icmd->unsli3.rcvsli3.vpi); in lpfc_els_unsol_event()
10798 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_els_unsol_event()
10799 elsiocb->cmd_dmabuf = bdeBuf1; in lpfc_els_unsol_event()
10801 elsiocb->bpl_dmabuf = bdeBuf2; in lpfc_els_unsol_event()
10803 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10804 paddr = getPaddr(icmd->un.cont64[0].addrHigh, in lpfc_els_unsol_event()
10805 icmd->un.cont64[0].addrLow); in lpfc_els_unsol_event()
10806 elsiocb->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring, in lpfc_els_unsol_event()
10809 paddr = getPaddr(icmd->un.cont64[1].addrHigh, in lpfc_els_unsol_event()
10810 icmd->un.cont64[1].addrLow); in lpfc_els_unsol_event()
10811 elsiocb->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba, in lpfc_els_unsol_event()
10822 if (elsiocb->cmd_dmabuf) { in lpfc_els_unsol_event()
10823 lpfc_in_buf_free(phba, elsiocb->cmd_dmabuf); in lpfc_els_unsol_event()
10824 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10827 if (elsiocb->bpl_dmabuf) { in lpfc_els_unsol_event()
10828 lpfc_in_buf_free(phba, elsiocb->bpl_dmabuf); in lpfc_els_unsol_event()
10829 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10847 ndlp->nlp_type |= NLP_FABRIC; in lpfc_start_fdmi()
10854 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_start_fdmi()
10858 * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
10866 * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
10877 * bit is cleared and fc fabric parameters chenged, delay FC NPort in lpfc_do_scr_ns_plogi()
10880 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag)) { in lpfc_do_scr_ns_plogi()
10882 "3334 Delay fc port discovery for %d secs\n", in lpfc_do_scr_ns_plogi()
10883 phba->fc_ratov); in lpfc_do_scr_ns_plogi()
10884 mod_timer(&vport->delayed_disc_tmo, in lpfc_do_scr_ns_plogi()
10885 jiffies + msecs_to_jiffies(1000 * phba->fc_ratov)); in lpfc_do_scr_ns_plogi()
10893 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_do_scr_ns_plogi()
10904 ndlp->nlp_type |= NLP_FABRIC; in lpfc_do_scr_ns_plogi()
10908 if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) { in lpfc_do_scr_ns_plogi()
10915 if ((phba->cfg_enable_SmartSAN || in lpfc_do_scr_ns_plogi()
10916 phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT) && in lpfc_do_scr_ns_plogi()
10917 test_bit(FC_ALLOW_FDMI, &vport->load_flag)) in lpfc_do_scr_ns_plogi()
10922 * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
10936 struct lpfc_vport *vport = pmb->vport; in lpfc_cmpl_reg_new_vport()
10938 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_cmpl_reg_new_vport()
10939 MAILBOX_t *mb = &pmb->u.mb; in lpfc_cmpl_reg_new_vport()
10942 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10944 if (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
10947 " upd bit: x%x \n", mb->mbxStatus, in lpfc_cmpl_reg_new_vport()
10948 mb->un.varRegVpi.upd); in lpfc_cmpl_reg_new_vport()
10949 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_reg_new_vport()
10950 mb->un.varRegVpi.upd) in lpfc_cmpl_reg_new_vport()
10953 switch (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
10959 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10960 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10963 /* If reg_vpi fail with invalid VPI status, re-init VPI */ in lpfc_cmpl_reg_new_vport()
10965 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10966 lpfc_init_vpi(phba, pmb, vport->vpi); in lpfc_cmpl_reg_new_vport()
10967 pmb->vport = vport; in lpfc_cmpl_reg_new_vport()
10968 pmb->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_cmpl_reg_new_vport()
10983 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
10986 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10987 if (mb->mbxStatus == MBX_NOT_FINISHED) in lpfc_cmpl_reg_new_vport()
10989 if ((vport->port_type == LPFC_PHYSICAL_PORT) && in lpfc_cmpl_reg_new_vport()
10990 !test_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag)) { in lpfc_cmpl_reg_new_vport()
10991 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11001 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11002 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_cmpl_reg_new_vport()
11003 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11004 if (vport == phba->pport) { in lpfc_cmpl_reg_new_vport()
11005 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11012 if (vport->port_state != LPFC_FDISC) in lpfc_cmpl_reg_new_vport()
11026 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_cmpl_reg_new_vport()
11033 vport->vmid_flag = vport->phba->pport->vmid_flag; in lpfc_cmpl_reg_new_vport()
11039 * lpfc_register_new_vport - Register a new vport with a HBA
11042 * @ndlp: pointer to a node-list data structure.
11053 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_new_vport()
11056 mbox->vport = vport; in lpfc_register_new_vport()
11057 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_register_new_vport()
11058 if (!mbox->ctx_ndlp) { in lpfc_register_new_vport()
11059 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11063 mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport; in lpfc_register_new_vport()
11070 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11085 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_register_new_vport()
11090 * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer
11093 * This routine cancels the retry delay timers to all the vports.
11104 link_state = phba->link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11106 phba->link_state = link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11111 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_cancel_all_vport_retry_delay_timer()
11122 * lpfc_retry_pport_discovery - Start timer to retry FLOGI.
11126 * start a timer to retry FLOGI for the physical port
11134 /* Cancel the all vports retry delay retry timers */ in lpfc_retry_pport_discovery()
11137 /* If fabric require FLOGI, then re-instantiate physical login */ in lpfc_retry_pport_discovery()
11138 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_retry_pport_discovery()
11142 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); in lpfc_retry_pport_discovery()
11143 set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_retry_pport_discovery()
11144 ndlp->nlp_last_elscmd = ELS_CMD_FLOGI; in lpfc_retry_pport_discovery()
11145 phba->pport->port_state = LPFC_FLOGI; in lpfc_retry_pport_discovery()
11150 * lpfc_fabric_login_reqd - Check if FLOGI required.
11174 * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
11197 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_fdisc()
11198 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_fdisc()
11202 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_fdisc()
11213 vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11218 list_for_each_entry(piocb, &phba->fabric_iocb_list, list) { in lpfc_cmpl_els_fdisc()
11219 lpfc_set_disctmo(piocb->vport); in lpfc_cmpl_els_fdisc()
11224 ulp_status, ulp_word4, vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11233 /* Check for retry */ in lpfc_cmpl_els_fdisc()
11245 clear_bit(FC_VPORT_CVL_RCVD, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11246 clear_bit(FC_VPORT_LOGO_RCVD, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11247 set_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11248 if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP) in lpfc_cmpl_els_fdisc()
11249 set_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11251 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_fdisc()
11253 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_fdisc()
11259 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_fdisc()
11261 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_fdisc()
11263 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_fdisc()
11266 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_fdisc()
11272 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_fdisc()
11273 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_fdisc()
11274 !test_bit(NLP_NPR_ADISC, &np->nlp_flag)) in lpfc_cmpl_els_fdisc()
11276 clear_bit(NLP_NPR_ADISC, &np->nlp_flag); in lpfc_cmpl_els_fdisc()
11281 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11285 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11286 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11287 set_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11289 set_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11290 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_fdisc()
11291 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_fdisc()
11293 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_fdisc()
11301 if (test_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag)) in lpfc_cmpl_els_fdisc()
11303 else if (test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) in lpfc_cmpl_els_fdisc()
11315 if (vport->fc_vport && in lpfc_cmpl_els_fdisc()
11316 (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS)) in lpfc_cmpl_els_fdisc()
11326 * lpfc_issue_els_fdisc - Issue a fdisc iocb command
11328 * @ndlp: pointer to a node-list data structure.
11329 * @retry: number of retries to the command IOCB.
11341 * 0 - Successfully issued fdisc iocb command
11342 * 1 - Failed to issue fdisc iocb command
11346 uint8_t retry) in lpfc_issue_els_fdisc() argument
11348 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_fdisc()
11355 int did = ndlp->nlp_DID; in lpfc_issue_els_fdisc()
11358 vport->port_state = LPFC_FDISC; in lpfc_issue_els_fdisc()
11359 vport->fc_myDID = 0; in lpfc_issue_els_fdisc()
11361 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, in lpfc_issue_els_fdisc()
11370 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_fdisc()
11371 wqe = &elsiocb->wqe; in lpfc_issue_els_fdisc()
11372 bf_set(els_req64_sid, &wqe->els_req, 0); in lpfc_issue_els_fdisc()
11373 bf_set(els_req64_sp, &wqe->els_req, 1); in lpfc_issue_els_fdisc()
11375 icmd = &elsiocb->iocb; in lpfc_issue_els_fdisc()
11376 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_fdisc()
11377 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_fdisc()
11378 icmd->ulpCt_h = 1; in lpfc_issue_els_fdisc()
11379 icmd->ulpCt_l = 0; in lpfc_issue_els_fdisc()
11382 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_fdisc()
11385 memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_fdisc()
11388 sp->cmn.e_d_tov = 0; in lpfc_issue_els_fdisc()
11389 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_fdisc()
11390 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_fdisc()
11391 sp->cls1.classValid = 0; in lpfc_issue_els_fdisc()
11392 sp->cls2.seqDelivery = 1; in lpfc_issue_els_fdisc()
11393 sp->cls3.seqDelivery = 1; in lpfc_issue_els_fdisc()
11399 memcpy(pcmd, &vport->fc_portname, 8); in lpfc_issue_els_fdisc()
11402 memcpy(pcmd, &vport->fc_nodename, 8); in lpfc_issue_els_fdisc()
11403 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_fdisc()
11404 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_fdisc()
11407 phba->fc_stat.elsXmitFDISC++; in lpfc_issue_els_fdisc()
11408 elsiocb->cmd_cmpl = lpfc_cmpl_els_fdisc; in lpfc_issue_els_fdisc()
11414 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_fdisc()
11415 if (!elsiocb->ndlp) in lpfc_issue_els_fdisc()
11436 * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
11453 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_npiv_logo()
11458 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_npiv_logo()
11463 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_npiv_logo()
11467 irsp = &rspiocb->iocb; in lpfc_cmpl_els_npiv_logo()
11469 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_npiv_logo()
11480 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_npiv_logo()
11481 tmo, vport->num_disc_nodes, in lpfc_cmpl_els_npiv_logo()
11482 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_npiv_logo()
11483 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_npiv_logo()
11486 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_cmpl_els_npiv_logo()
11487 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_npiv_logo()
11491 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) { in lpfc_cmpl_els_npiv_logo()
11493 if (ndlp->logo_waitq) in lpfc_cmpl_els_npiv_logo()
11494 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_npiv_logo()
11495 clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_cmpl_els_npiv_logo()
11496 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_cmpl_els_npiv_logo()
11497 spin_lock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11498 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO; in lpfc_cmpl_els_npiv_logo()
11499 spin_unlock_irq(&ndlp->lock); in lpfc_cmpl_els_npiv_logo()
11508 * lpfc_issue_els_npiv_logo - Issue a logo off a vport
11510 * @ndlp: pointer to a node-list data structure.
11519 * 0 - Successfully issued logo off the @vport
11520 * 1 - Failed to issue logo off the @vport
11526 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_npiv_logo()
11532 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID, in lpfc_issue_els_npiv_logo()
11537 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_npiv_logo()
11542 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_npiv_logo()
11544 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_npiv_logo()
11548 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_issue_els_npiv_logo()
11550 elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo; in lpfc_issue_els_npiv_logo()
11551 set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_npiv_logo()
11552 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_npiv_logo()
11553 if (!elsiocb->ndlp) { in lpfc_issue_els_npiv_logo()
11567 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_npiv_logo()
11572 * lpfc_fabric_block_timeout - Handler function to the fabric block timer
11589 spin_lock_irqsave(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11590 tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11592 phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11593 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11601 * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
11619 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11621 if (atomic_read(&phba->fabric_iocb_count) == 0) { in lpfc_resume_fabric_iocbs()
11622 list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb), in lpfc_resume_fabric_iocbs()
11626 atomic_inc(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11628 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11630 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_resume_fabric_iocbs()
11631 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_resume_fabric_iocbs()
11632 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11634 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_resume_fabric_iocbs()
11636 iocb->vport->port_state, 0, 0); in lpfc_resume_fabric_iocbs()
11641 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_resume_fabric_iocbs()
11642 iocb->fabric_cmd_cmpl = NULL; in lpfc_resume_fabric_iocbs()
11643 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11645 iocb->wcqe_cmpl.parameter = IOERR_SLI_ABORTED; in lpfc_resume_fabric_iocbs()
11646 iocb->cmd_cmpl(phba, iocb, iocb); in lpfc_resume_fabric_iocbs()
11648 atomic_dec(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11655 * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
11666 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_unblock_fabric_iocbs()
11673 * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
11686 blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_block_fabric_iocbs()
11689 mod_timer(&phba->fabric_block_timer, in lpfc_block_fabric_iocbs()
11696 * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
11702 * callback function pointer (iocb->cmd_cmpl). The original iocb's callback
11703 * function pointer has been stored in iocb->fabric_cmd_cmpl. This callback
11716 WARN_ON((cmdiocb->cmd_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC); in lpfc_cmpl_fabric_iocb()
11739 BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0); in lpfc_cmpl_fabric_iocb()
11741 cmdiocb->cmd_cmpl = cmdiocb->fabric_cmd_cmpl; in lpfc_cmpl_fabric_iocb()
11742 cmdiocb->fabric_cmd_cmpl = NULL; in lpfc_cmpl_fabric_iocb()
11743 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_fabric_iocb()
11744 cmdiocb->cmd_cmpl(phba, cmdiocb, rspiocb); in lpfc_cmpl_fabric_iocb()
11746 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_fabric_iocb()
11747 if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) { in lpfc_cmpl_fabric_iocb()
11754 * lpfc_issue_fabric_iocb - Issue a fabric iocb command
11758 * This routine is used as the top-level API for issuing a fabric iocb command
11774 * IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
11775 * IOCB_ERROR - failed to issue fabric iocb
11784 BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1); in lpfc_issue_fabric_iocb()
11786 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11787 ready = atomic_read(&phba->fabric_iocb_count) == 0 && in lpfc_issue_fabric_iocb()
11788 !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_issue_fabric_iocb()
11792 atomic_inc(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11793 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11795 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_issue_fabric_iocb()
11796 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_issue_fabric_iocb()
11797 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11799 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_issue_fabric_iocb()
11801 iocb->vport->port_state, 0, 0); in lpfc_issue_fabric_iocb()
11806 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_issue_fabric_iocb()
11807 iocb->fabric_cmd_cmpl = NULL; in lpfc_issue_fabric_iocb()
11808 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11809 atomic_dec(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11812 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11813 list_add_tail(&iocb->list, &phba->fabric_iocb_list); in lpfc_issue_fabric_iocb()
11814 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11821 * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
11834 struct lpfc_hba *phba = vport->phba; in lpfc_fabric_abort_vport()
11837 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11838 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_vport()
11841 if (piocb->vport != vport) in lpfc_fabric_abort_vport()
11844 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_vport()
11846 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11854 * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
11855 * @ndlp: pointer to a node-list data structure.
11867 struct lpfc_hba *phba = ndlp->phba; in lpfc_fabric_abort_nport()
11876 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11877 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_nport()
11881 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_nport()
11884 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11892 * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
11906 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
11907 list_splice_init(&phba->fabric_iocb_list, &completions); in lpfc_fabric_abort_hba()
11908 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
11916 * lpfc_sli4_vport_delete_els_xri_aborted -Remove all ndlp references for vport
11925 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_vport_delete_els_xri_aborted()
11930 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
11932 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_vport_delete_els_xri_aborted()
11933 if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) { in lpfc_sli4_vport_delete_els_xri_aborted()
11934 lpfc_nlp_put(sglq_entry->ndlp); in lpfc_sli4_vport_delete_els_xri_aborted()
11935 ndlp = sglq_entry->ndlp; in lpfc_sli4_vport_delete_els_xri_aborted()
11936 sglq_entry->ndlp = NULL; in lpfc_sli4_vport_delete_els_xri_aborted()
11942 if (test_bit(FC_UNLOADING, &vport->load_flag) && in lpfc_sli4_vport_delete_els_xri_aborted()
11943 ndlp->nlp_DID == Fabric_DID) { in lpfc_sli4_vport_delete_els_xri_aborted()
11944 list_del(&sglq_entry->list); in lpfc_sli4_vport_delete_els_xri_aborted()
11945 sglq_entry->state = SGL_FREED; in lpfc_sli4_vport_delete_els_xri_aborted()
11946 list_add_tail(&sglq_entry->list, in lpfc_sli4_vport_delete_els_xri_aborted()
11947 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_vport_delete_els_xri_aborted()
11951 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
11956 * lpfc_sli4_els_xri_aborted - Slow-path process of els xri abort
11960 * This routine is invoked by the worker thread to process a SLI4 slow-path
11978 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
11980 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_els_xri_aborted()
11981 if (sglq_entry->sli4_xritag == xri) { in lpfc_sli4_els_xri_aborted()
11982 list_del(&sglq_entry->list); in lpfc_sli4_els_xri_aborted()
11983 ndlp = sglq_entry->ndlp; in lpfc_sli4_els_xri_aborted()
11984 sglq_entry->ndlp = NULL; in lpfc_sli4_els_xri_aborted()
11985 list_add_tail(&sglq_entry->list, in lpfc_sli4_els_xri_aborted()
11986 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_xri_aborted()
11987 sglq_entry->state = SGL_FREED; in lpfc_sli4_els_xri_aborted()
11988 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, in lpfc_sli4_els_xri_aborted()
11993 sglq_entry->sli4_lxritag, in lpfc_sli4_els_xri_aborted()
11999 if (pring && !list_empty(&pring->txq)) in lpfc_sli4_els_xri_aborted()
12004 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12009 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12011 if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) { in lpfc_sli4_els_xri_aborted()
12012 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12015 sglq_entry->state = SGL_XRI_ABORTED; in lpfc_sli4_els_xri_aborted()
12016 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12020 /* lpfc_sli_abts_recover_port - Recover a port that failed a BLS_ABORT req.
12038 phba = vport->phba; in lpfc_sli_abts_recover_port()
12039 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { in lpfc_sli_abts_recover_port()
12042 "rport in state 0x%x\n", ndlp->nlp_state); in lpfc_sli_abts_recover_port()
12049 shost->host_no, ndlp->nlp_DID, in lpfc_sli_abts_recover_port()
12050 vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, in lpfc_sli_abts_recover_port()
12051 ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12053 * The rport is not responding. Remove the FCP-2 flag to prevent in lpfc_sli_abts_recover_port()
12054 * an ADISC in the follow-up recovery code. in lpfc_sli_abts_recover_port()
12056 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12057 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_sli_abts_recover_port()
12058 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12059 set_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12065 bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE); in lpfc_init_cs_ctl_bitmap()
12077 set_bit(i, vport->vmid_priority_range); in lpfc_vmid_set_cs_ctl_range()
12082 set_bit(ctcl_vmid, vport->vmid_priority_range); in lpfc_vmid_put_cs_ctl()
12089 i = find_first_bit(vport->vmid_priority_range, in lpfc_vmid_get_cs_ctl()
12095 clear_bit(i, vport->vmid_priority_range); in lpfc_vmid_get_cs_ctl()
12105 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_qfpa()
12110 struct lpfc_dmabuf *dmabuf = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_qfpa()
12115 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_qfpa()
12117 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_qfpa()
12121 pcmd = prsp->virt; in lpfc_cmpl_els_qfpa()
12136 if (!vport->qfpa_res) { in lpfc_cmpl_els_qfpa()
12137 max_desc = FCELSSIZE / sizeof(*vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12138 vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res), in lpfc_cmpl_els_qfpa()
12140 if (!vport->qfpa_res) in lpfc_cmpl_els_qfpa()
12146 memcpy(vport->qfpa_res, pcmd, len + 8); in lpfc_cmpl_els_qfpa()
12150 vmid_range = vport->vmid_priority.vmid_range; in lpfc_cmpl_els_qfpa()
12155 kfree(vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12158 vport->vmid_priority.vmid_range = vmid_range; in lpfc_cmpl_els_qfpa()
12160 vport->vmid_priority.num_descriptors = len; in lpfc_cmpl_els_qfpa()
12165 "local ve id=%d\n", desc->lo_range, in lpfc_cmpl_els_qfpa()
12166 desc->hi_range, desc->qos_priority, in lpfc_cmpl_els_qfpa()
12167 desc->local_ve_id); in lpfc_cmpl_els_qfpa()
12169 vmid_range->low = desc->lo_range << 1; in lpfc_cmpl_els_qfpa()
12170 if (desc->local_ve_id == QFPA_ODD_ONLY) in lpfc_cmpl_els_qfpa()
12171 vmid_range->low++; in lpfc_cmpl_els_qfpa()
12172 if (desc->qos_priority) in lpfc_cmpl_els_qfpa()
12173 vport->vmid_flag |= LPFC_VMID_QOS_ENABLED; in lpfc_cmpl_els_qfpa()
12174 vmid_range->qos = desc->qos_priority; in lpfc_cmpl_els_qfpa()
12176 vmid_range->high = desc->hi_range << 1; in lpfc_cmpl_els_qfpa()
12177 if ((desc->local_ve_id == QFPA_ODD_ONLY) || in lpfc_cmpl_els_qfpa()
12178 (desc->local_ve_id == QFPA_EVEN_ODD)) in lpfc_cmpl_els_qfpa()
12179 vmid_range->high++; in lpfc_cmpl_els_qfpa()
12182 for (i = 0; i < vport->vmid_priority.num_descriptors; i++) { in lpfc_cmpl_els_qfpa()
12184 vport->vmid_priority.vmid_range[i].low, in lpfc_cmpl_els_qfpa()
12185 vport->vmid_priority.vmid_range[i].high); in lpfc_cmpl_els_qfpa()
12188 vport->vmid_flag |= LPFC_VMID_QFPA_CMPL; in lpfc_cmpl_els_qfpa()
12196 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_qfpa()
12202 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_issue_els_qfpa()
12203 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_qfpa()
12204 return -ENXIO; in lpfc_issue_els_qfpa()
12207 ndlp->nlp_DID, ELS_CMD_QFPA); in lpfc_issue_els_qfpa()
12209 return -ENOMEM; in lpfc_issue_els_qfpa()
12211 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_qfpa()
12216 elsiocb->cmd_cmpl = lpfc_cmpl_els_qfpa; in lpfc_issue_els_qfpa()
12218 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_qfpa()
12219 if (!elsiocb->ndlp) { in lpfc_issue_els_qfpa()
12220 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_issue_els_qfpa()
12221 return -ENXIO; in lpfc_issue_els_qfpa()
12228 return -EIO; in lpfc_issue_els_qfpa()
12230 vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED; in lpfc_issue_els_qfpa()
12248 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_vmid_uvem()
12249 return -ENXIO; in lpfc_vmid_uvem()
12253 return -ENOMEM; in lpfc_vmid_uvem()
12261 vmid->host_vmid, instantiated); in lpfc_vmid_uvem()
12262 vmid_context->vmp = vmid; in lpfc_vmid_uvem()
12263 vmid_context->nlp = ndlp; in lpfc_vmid_uvem()
12264 vmid_context->instantiated = instantiated; in lpfc_vmid_uvem()
12265 elsiocb->vmid_tag.vmid_context = vmid_context; in lpfc_vmid_uvem()
12266 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_vmid_uvem()
12268 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_vmid_uvem()
12269 sizeof(vport->lpfc_vmid_host_uuid))) in lpfc_vmid_uvem()
12270 memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid, in lpfc_vmid_uvem()
12271 sizeof(vport->lpfc_vmid_host_uuid)); in lpfc_vmid_uvem()
12275 *len = cpu_to_be32(LPFC_UVEM_SIZE - 8); in lpfc_vmid_uvem()
12278 vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG); in lpfc_vmid_uvem()
12279 vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE); in lpfc_vmid_uvem()
12280 memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid, in lpfc_vmid_uvem()
12281 sizeof(vem_id_desc->vem_id)); in lpfc_vmid_uvem()
12284 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12285 inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE); in lpfc_vmid_uvem()
12286 memcpy(inst_desc->global_vem_id, vmid->host_vmid, in lpfc_vmid_uvem()
12287 sizeof(inst_desc->global_vem_id)); in lpfc_vmid_uvem()
12289 bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID); in lpfc_vmid_uvem()
12291 vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12293 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12295 inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12296 lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12298 inst_desc->word6 = cpu_to_be32(inst_desc->word6); in lpfc_vmid_uvem()
12300 elsiocb->cmd_cmpl = lpfc_cmpl_els_uvem; in lpfc_vmid_uvem()
12302 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_vmid_uvem()
12303 if (!elsiocb->ndlp) { in lpfc_vmid_uvem()
12304 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12308 ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0); in lpfc_vmid_uvem()
12310 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12318 return -EIO; in lpfc_vmid_uvem()
12325 struct lpfc_vport *vport = icmdiocb->vport; in lpfc_cmpl_els_uvem()
12328 icmdiocb->vmid_tag.vmid_context; in lpfc_cmpl_els_uvem()
12329 struct lpfc_nodelist *ndlp = icmdiocb->ndlp; in lpfc_cmpl_els_uvem()
12334 struct lpfc_dmabuf *dmabuf = icmdiocb->cmd_dmabuf; in lpfc_cmpl_els_uvem()
12337 vmid = vmid_context->vmp; in lpfc_cmpl_els_uvem()
12338 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_cmpl_els_uvem()
12341 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_uvem()
12344 pcmd = prsp->virt; in lpfc_cmpl_els_uvem()
12357 spin_lock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12359 vport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12360 phba->pport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12361 spin_unlock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12363 if (vmid_context->instantiated) { in lpfc_cmpl_els_uvem()
12364 write_lock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()
12365 vmid->flag |= LPFC_VMID_REGISTERED; in lpfc_cmpl_els_uvem()
12366 vmid->flag &= ~LPFC_VMID_REQ_REGISTER; in lpfc_cmpl_els_uvem()
12367 write_unlock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()