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, cmdiocb->iotag); 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 if (test_and_clear_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags)) in lpfc_cmpl_els_logo()
2997 ndlp->nlp_DID); in lpfc_cmpl_els_logo()
3004 ndlp->nlp_DID, iotag, in lpfc_cmpl_els_logo()
3005 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_logo()
3006 ndlp->fc4_xpt_flags, ulp_status, ulp_word4, in lpfc_cmpl_els_logo()
3007 tmo, vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3017 * discovery. The PLOGI will retry. in lpfc_cmpl_els_logo()
3022 "2756 LOGO, No Retry DID:%06X " in lpfc_cmpl_els_logo()
3024 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3041 if (wake_up_waiter && ndlp->logo_waitq) in lpfc_cmpl_els_logo()
3042 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_logo()
3048 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) && in lpfc_cmpl_els_logo()
3051 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
3056 ndlp->nlp_DID, ulp_status, in lpfc_cmpl_els_logo()
3058 vport->num_disc_nodes); in lpfc_cmpl_els_logo()
3072 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_cmpl_els_logo()
3073 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo()
3084 * lpfc_issue_els_logo - Issue a logo to an node on a vport
3086 * @ndlp: pointer to a node-list data structure.
3087 * @retry: number of retries to the command IOCB.
3101 * 0 - successfully issued logo
3102 * 1 - failed to issue logo
3106 uint8_t retry) in lpfc_issue_els_logo() argument
3108 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_logo()
3114 if (test_bit(NLP_LOGO_SND, &ndlp->nlp_flag)) in lpfc_issue_els_logo()
3118 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_logo()
3119 ndlp->nlp_DID, ELS_CMD_LOGO); in lpfc_issue_els_logo()
3123 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_logo()
3128 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_logo()
3130 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_logo()
3132 phba->fc_stat.elsXmitLOGO++; in lpfc_issue_els_logo()
3133 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo; in lpfc_issue_els_logo()
3134 set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3135 clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3136 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_logo()
3137 if (!elsiocb->ndlp) { in lpfc_issue_els_logo()
3144 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_logo()
3153 spin_lock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3154 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_issue_els_logo()
3155 spin_unlock_irq(&ndlp->lock); in lpfc_issue_els_logo()
3160 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_logo()
3165 * lpfc_cmpl_els_cmd - Completion callback function for generic els command
3183 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_cmd()
3192 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_cmd()
3196 irsp = &rspiocb->iocb; in lpfc_cmpl_els_cmd()
3197 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_cmd()
3198 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_cmd()
3213 free_ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_cmd()
3220 * lpfc_reg_fab_ctrl_node - RPI register the fabric controller node.
3237 struct lpfc_hba *phba = vport->phba; in lpfc_reg_fab_ctrl_node()
3241 if (test_bit(NLP_RPI_REGISTERED, &fc_ndlp->nlp_flag)) in lpfc_reg_fab_ctrl_node()
3246 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3250 __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3251 ns_ndlp->nlp_state); in lpfc_reg_fab_ctrl_node()
3252 if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_reg_fab_ctrl_node()
3253 return -ENODEV; in lpfc_reg_fab_ctrl_node()
3255 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_reg_fab_ctrl_node()
3260 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3261 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3262 return -ENOMEM; in lpfc_reg_fab_ctrl_node()
3264 rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID, in lpfc_reg_fab_ctrl_node()
3265 (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3267 rc = -EACCES; in lpfc_reg_fab_ctrl_node()
3271 set_bit(NLP_REG_LOGIN_SEND, &fc_ndlp->nlp_flag); in lpfc_reg_fab_ctrl_node()
3272 mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login; in lpfc_reg_fab_ctrl_node()
3273 mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp); in lpfc_reg_fab_ctrl_node()
3274 if (!mbox->ctx_ndlp) { in lpfc_reg_fab_ctrl_node()
3275 rc = -ENOMEM; in lpfc_reg_fab_ctrl_node()
3279 mbox->vport = vport; in lpfc_reg_fab_ctrl_node()
3282 rc = -ENODEV; in lpfc_reg_fab_ctrl_node()
3296 fc_ndlp->nlp_DID, fc_ndlp->nlp_state, in lpfc_reg_fab_ctrl_node()
3297 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi); in lpfc_reg_fab_ctrl_node()
3302 * lpfc_cmpl_els_disc_cmd - Completion callback function for Discovery ELS cmd
3316 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_disc_cmd()
3322 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_disc_cmd()
3329 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_disc_cmd()
3333 irsp = &rspiocb->iocb; in lpfc_cmpl_els_disc_cmd()
3334 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_disc_cmd()
3335 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_disc_cmd()
3345 iotag, ulp_status, ulp_word4, tmo, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3347 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_disc_cmd()
3351 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_disc_cmd()
3356 /* Only 1 retry for ELS Timeout only */ in lpfc_cmpl_els_disc_cmd()
3360 cmdiocb->retry++; in lpfc_cmpl_els_disc_cmd()
3361 if (cmdiocb->retry <= 1) { in lpfc_cmpl_els_disc_cmd()
3364 lpfc_issue_els_scr(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3367 lpfc_issue_els_edc(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3370 lpfc_issue_els_rdf(vport, cmdiocb->retry); in lpfc_cmpl_els_disc_cmd()
3375 phba->fc_stat.elsRetryExceeded++; in lpfc_cmpl_els_disc_cmd()
3396 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_disc_cmd()
3400 prdf = (struct lpfc_els_rdf_rsp *)prsp->virt; in lpfc_cmpl_els_disc_cmd()
3407 i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++) in lpfc_cmpl_els_disc_cmd()
3413 prdf->reg_d1.desc_tags[i]), in lpfc_cmpl_els_disc_cmd()
3414 phba->cgn_reg_signal, in lpfc_cmpl_els_disc_cmd()
3415 phba->cgn_reg_fpin); in lpfc_cmpl_els_disc_cmd()
3427 * lpfc_issue_els_scr - Issue a scr to an node on a vport
3429 * @retry: retry counter for the command IOCB.
3443 * 0 - Successfully issued scr command
3444 * 1 - Failed to issue scr command
3447 lpfc_issue_els_scr(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_scr() argument
3450 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_scr()
3466 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_scr()
3467 ndlp->nlp_DID, ELS_CMD_SCR); in lpfc_issue_els_scr()
3471 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_scr()
3481 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_scr()
3488 ((SCR *) pcmd)->Function = SCR_FUNC_FULL; in lpfc_issue_els_scr()
3492 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_scr()
3494 phba->fc_stat.elsXmitSCR++; in lpfc_issue_els_scr()
3495 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_scr()
3496 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_scr()
3497 if (!elsiocb->ndlp) { in lpfc_issue_els_scr()
3504 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_scr()
3517 * lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
3520 * @retry: number of retries to the command IOCB.
3524 * in point-to-point mode. When sent to the Fabric Controller, it will
3532 * 0 - Successfully issued RSCN command
3533 * 1 - Failed to issue RSCN command
3536 lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rscn() argument
3539 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rscn()
3550 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_issue_els_rscn()
3551 !test_bit(FC_PUBLIC_LOOP, &vport->fc_flag)) in lpfc_issue_els_rscn()
3554 if (test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_issue_els_rscn()
3555 /* find any mapped nport - that would be the other nport */ in lpfc_issue_els_rscn()
3572 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rscn()
3573 ndlp->nlp_DID, ELS_CMD_RSCN_XMT); in lpfc_issue_els_rscn()
3578 event = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rscn()
3580 event->rscn.rscn_cmd = ELS_RSCN; in lpfc_issue_els_rscn()
3581 event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page); in lpfc_issue_els_rscn()
3582 event->rscn.rscn_plen = cpu_to_be16(cmdsize); in lpfc_issue_els_rscn()
3584 nportid = vport->fc_myDID; in lpfc_issue_els_rscn()
3586 event->portid.rscn_page_flags = 0; in lpfc_issue_els_rscn()
3587 event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16; in lpfc_issue_els_rscn()
3588 event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8; in lpfc_issue_els_rscn()
3589 event->portid.rscn_fid[2] = nportid & 0x000000FF; in lpfc_issue_els_rscn()
3591 phba->fc_stat.elsXmitRSCN++; in lpfc_issue_els_rscn()
3592 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_rscn()
3593 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rscn()
3594 if (!elsiocb->ndlp) { in lpfc_issue_els_rscn()
3601 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_rscn()
3614 * lpfc_issue_els_farpr - Issue a farp to an node on a vport
3617 * @retry: number of retries to the command IOCB.
3631 * 0 - Successfully issued farpr command
3632 * 1 - Failed to issue farpr command
3635 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry) in lpfc_issue_els_farpr() argument
3638 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_farpr()
3657 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_farpr()
3658 ndlp->nlp_DID, ELS_CMD_FARPR); in lpfc_issue_els_farpr()
3662 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_farpr()
3672 *lp++ = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_farpr()
3673 fp->Rflags = 0; in lpfc_issue_els_farpr()
3674 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE); in lpfc_issue_els_farpr()
3676 memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3677 memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_issue_els_farpr()
3680 memcpy(&fp->OportName, &ondlp->nlp_portname, in lpfc_issue_els_farpr()
3682 memcpy(&fp->OnodeName, &ondlp->nlp_nodename, in lpfc_issue_els_farpr()
3688 ndlp->nlp_DID, 0, 0); in lpfc_issue_els_farpr()
3690 phba->fc_stat.elsXmitFARPR++; in lpfc_issue_els_farpr()
3691 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd; in lpfc_issue_els_farpr()
3692 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_farpr()
3693 if (!elsiocb->ndlp) { in lpfc_issue_els_farpr()
3708 /* This will cause the callback-function lpfc_cmpl_els_cmd to in lpfc_issue_els_farpr()
3716 * lpfc_issue_els_rdf - Register for diagnostic functions from the fabric.
3718 * @retry: retry counter for the command IOCB.
3728 * 0 - Successfully issued rdf command
3729 * 1 - Failed to issue rdf command
3732 lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_rdf() argument
3734 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rdf()
3747 return -ENODEV; in lpfc_issue_els_rdf()
3752 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_rdf()
3753 return -EACCES; in lpfc_issue_els_rdf()
3755 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_rdf()
3756 ndlp->nlp_DID, ELS_CMD_RDF); in lpfc_issue_els_rdf()
3758 return -ENOMEM; in lpfc_issue_els_rdf()
3761 prdf = (struct lpfc_els_rdf_req *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rdf()
3763 prdf->rdf.fpin_cmd = ELS_RDF; in lpfc_issue_els_rdf()
3764 prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) - in lpfc_issue_els_rdf()
3766 prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER); in lpfc_issue_els_rdf()
3767 prdf->reg_d1.reg_desc.desc_len = cpu_to_be32( in lpfc_issue_els_rdf()
3768 FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1)); in lpfc_issue_els_rdf()
3769 prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT); in lpfc_issue_els_rdf()
3770 prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY); in lpfc_issue_els_rdf()
3771 prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY); in lpfc_issue_els_rdf()
3772 prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST); in lpfc_issue_els_rdf()
3773 prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION); in lpfc_issue_els_rdf()
3777 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_rdf()
3778 phba->cgn_reg_fpin); in lpfc_issue_els_rdf()
3780 phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ; in lpfc_issue_els_rdf()
3781 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_rdf()
3782 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rdf()
3783 if (!elsiocb->ndlp) { in lpfc_issue_els_rdf()
3785 return -EIO; in lpfc_issue_els_rdf()
3790 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_rdf()
3796 return -EIO; in lpfc_issue_els_rdf()
3802 * lpfc_els_rcv_rdf - Receive RDF ELS request from the fabric.
3805 * @ndlp: pointer to a node-list data structure.
3812 * 0 - Success
3813 * -EIO - Failed to process received RDF
3823 ndlp->nlp_DID, vport->fc_myDID); in lpfc_els_rcv_rdf()
3824 return -EIO; in lpfc_els_rcv_rdf()
3831 vport->fc_myDID); in lpfc_els_rcv_rdf()
3832 return -EIO; in lpfc_els_rcv_rdf()
3839 * lpfc_least_capable_settings - helper function for EDC rsp processing
3856 rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability); in lpfc_least_capable_settings()
3857 rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count); in lpfc_least_capable_settings()
3858 rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units); in lpfc_least_capable_settings()
3880 drv_sig_cap = phba->cgn_reg_signal; in lpfc_least_capable_settings()
3883 if (rsp_sig_freq_cyc > phba->cgn_sig_freq) in lpfc_least_capable_settings()
3884 phba->cgn_sig_freq = rsp_sig_freq_cyc; in lpfc_least_capable_settings()
3890 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_least_capable_settings()
3891 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3895 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3896 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3900 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM; in lpfc_least_capable_settings()
3901 phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE; in lpfc_least_capable_settings()
3904 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY; in lpfc_least_capable_settings()
3905 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3913 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_least_capable_settings()
3914 phba->cgn_sig_freq = 0; in lpfc_least_capable_settings()
3915 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_least_capable_settings()
3922 * lpfc_cmpl_els_edc - Completion callback function for EDC
3951 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_edc()
3957 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_edc()
3961 irsp_iocb = &rspiocb->iocb; in lpfc_cmpl_els_edc()
3962 tmo = irsp_iocb->ulpTimeout; in lpfc_cmpl_els_edc()
3963 iotag = irsp_iocb->ulpIoTag; in lpfc_cmpl_els_edc()
3966 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
3975 pcmd = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_edc()
3979 pdata = (u32 *)pcmd->virt; in lpfc_cmpl_els_edc()
3987 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_edc()
3991 edc_rsp = prsp->virt; in lpfc_cmpl_els_edc()
4000 edc_rsp->acc_hdr.la_cmd, in lpfc_cmpl_els_edc()
4001 be32_to_cpu(edc_rsp->desc_list_len)); in lpfc_cmpl_els_edc()
4011 bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) - in lpfc_cmpl_els_edc()
4016 tlv = edc_rsp->desc; in lpfc_cmpl_els_edc()
4031 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_cmpl_els_edc()
4051 be32_to_cpu(plnkflt->desc_tag), in lpfc_cmpl_els_edc()
4052 be32_to_cpu(plnkflt->desc_len), in lpfc_cmpl_els_edc()
4054 plnkflt->degrade_activate_threshold), in lpfc_cmpl_els_edc()
4056 plnkflt->degrade_deactivate_threshold), in lpfc_cmpl_els_edc()
4057 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_cmpl_els_edc()
4078 be32_to_cpu(pcgd->desc_tag), in lpfc_cmpl_els_edc()
4079 be32_to_cpu(pcgd->desc_len), in lpfc_cmpl_els_edc()
4080 be32_to_cpu(pcgd->xmt_signal_capability), in lpfc_cmpl_els_edc()
4081 be16_to_cpu(pcgd->xmt_signal_frequency.count), in lpfc_cmpl_els_edc()
4082 be16_to_cpu(pcgd->xmt_signal_frequency.units), in lpfc_cmpl_els_edc()
4083 be32_to_cpu(pcgd->rcv_signal_capability), in lpfc_cmpl_els_edc()
4084 be16_to_cpu(pcgd->rcv_signal_frequency.count), in lpfc_cmpl_els_edc()
4085 be16_to_cpu(pcgd->rcv_signal_frequency.units)); in lpfc_cmpl_els_edc()
4101 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_cmpl_els_edc()
4108 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_cmpl_els_edc()
4109 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_cmpl_els_edc()
4110 phba->cgn_sig_freq = 0; in lpfc_cmpl_els_edc()
4112 "4202 EDC rsp error - sending RDF " in lpfc_cmpl_els_edc()
4119 lpfc_els_chk_latt(phba->pport); in lpfc_cmpl_els_edc()
4120 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD, in lpfc_cmpl_els_edc()
4122 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_cmpl_els_edc()
4132 lft->desc_tag = cpu_to_be32(ELS_DTAG_LNK_FAULT_CAP); in lpfc_format_edc_lft_desc()
4133 lft->desc_len = cpu_to_be32( in lpfc_format_edc_lft_desc()
4136 lft->degrade_activate_threshold = in lpfc_format_edc_lft_desc()
4137 cpu_to_be32(phba->degrade_activate_threshold); in lpfc_format_edc_lft_desc()
4138 lft->degrade_deactivate_threshold = in lpfc_format_edc_lft_desc()
4139 cpu_to_be32(phba->degrade_deactivate_threshold); in lpfc_format_edc_lft_desc()
4140 lft->fec_degrade_interval = cpu_to_be32(phba->fec_degrade_interval); in lpfc_format_edc_lft_desc()
4151 cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP); in lpfc_format_edc_cgn_desc()
4154 cgd->desc_len = cpu_to_be32( in lpfc_format_edc_cgn_desc()
4162 if (phba->cmf_active_mode == LPFC_CFG_OFF) { in lpfc_format_edc_cgn_desc()
4167 phba->cgn_sig_freq = 0; in lpfc_format_edc_cgn_desc()
4170 switch (phba->cgn_reg_signal) { in lpfc_format_edc_cgn_desc()
4172 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY); in lpfc_format_edc_cgn_desc()
4175 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM); in lpfc_format_edc_cgn_desc()
4185 cgd->rcv_signal_frequency.count = in lpfc_format_edc_cgn_desc()
4187 cgd->rcv_signal_frequency.units = in lpfc_format_edc_cgn_desc()
4194 if (!(phba->lmt & LMT_64Gb)) in lpfc_link_is_lds_capable()
4196 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_link_is_lds_capable()
4199 if (phba->sli4_hba.conf_trunk) { in lpfc_link_is_lds_capable()
4200 if (phba->trunk_link.phy_lnk_speed == LPFC_USER_LINK_SPEED_64G) in lpfc_link_is_lds_capable()
4202 } else if (phba->fc_linkspeed == LPFC_LINK_SPEED_64GHZ) { in lpfc_link_is_lds_capable()
4209 * lpfc_issue_els_edc - Exchange Diagnostic Capabilities with the fabric.
4211 * @retry: retry counter for the command iocb.
4213 * This routine issues an ELS EDC to the F-Port Controller to communicate
4227 * 0 - Successfully issued edc command
4228 * 1 - Failed to issue edc command
4231 lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry) in lpfc_issue_els_edc() argument
4233 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc()
4243 if (vport->port_type == LPFC_NPIV_PORT) in lpfc_issue_els_edc()
4244 return -EACCES; in lpfc_issue_els_edc()
4247 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_edc()
4248 return -ENODEV; in lpfc_issue_els_edc()
4250 cgn_desc_size = (phba->cgn_init_reg_signal) ? in lpfc_issue_els_edc()
4261 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, in lpfc_issue_els_edc()
4262 ndlp->nlp_DID, ELS_CMD_EDC); in lpfc_issue_els_edc()
4267 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc()
4270 edc_req->desc_len = cpu_to_be32(cgn_desc_size + lft_desc_size); in lpfc_issue_els_edc()
4271 edc_req->edc_cmd = ELS_EDC; in lpfc_issue_els_edc()
4272 tlv = edc_req->desc; in lpfc_issue_els_edc()
4276 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_issue_els_edc()
4286 ndlp->nlp_DID, phba->cgn_reg_signal, in lpfc_issue_els_edc()
4287 phba->cgn_reg_fpin); in lpfc_issue_els_edc()
4289 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd; in lpfc_issue_els_edc()
4290 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc()
4291 if (!elsiocb->ndlp) { in lpfc_issue_els_edc()
4293 return -EIO; in lpfc_issue_els_edc()
4298 ndlp->nlp_DID, kref_read(&ndlp->kref), 0); in lpfc_issue_els_edc()
4311 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM; in lpfc_issue_els_edc()
4312 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_issue_els_edc()
4318 * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
4320 * @nlp: pointer to a node-list data structure.
4322 * This routine cancels the timer with a delayed IOCB-command retry for
4324 * removes the ELS retry event if it presents. In addition, if the
4334 if (!test_and_clear_bit(NLP_DELAY_TMO, &nlp->nlp_flag)) in lpfc_cancel_retry_delay_tmo()
4336 del_timer_sync(&nlp->nlp_delayfunc); in lpfc_cancel_retry_delay_tmo()
4337 nlp->nlp_last_elscmd = 0; in lpfc_cancel_retry_delay_tmo()
4338 if (!list_empty(&nlp->els_retry_evt.evt_listp)) { in lpfc_cancel_retry_delay_tmo()
4339 list_del_init(&nlp->els_retry_evt.evt_listp); in lpfc_cancel_retry_delay_tmo()
4340 /* Decrement nlp reference count held for the delayed retry */ in lpfc_cancel_retry_delay_tmo()
4341 evtp = &nlp->els_retry_evt; in lpfc_cancel_retry_delay_tmo()
4342 lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1); in lpfc_cancel_retry_delay_tmo()
4344 if (test_and_clear_bit(NLP_NPR_2B_DISC, &nlp->nlp_flag)) { in lpfc_cancel_retry_delay_tmo()
4345 if (vport->num_disc_nodes) { in lpfc_cancel_retry_delay_tmo()
4346 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_cancel_retry_delay_tmo()
4352 if (vport->num_disc_nodes == 0) { in lpfc_cancel_retry_delay_tmo()
4354 &vport->fc_flag); in lpfc_cancel_retry_delay_tmo()
4365 * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
4368 * This routine is invoked by the ndlp delayed-function timer to check
4369 * whether there is any pending ELS retry event(s) with the node. If not, it
4382 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay()
4383 struct lpfc_hba *phba = vport->phba; in lpfc_els_retry_delay()
4385 struct lpfc_work_evt *evtp = &ndlp->els_retry_evt; in lpfc_els_retry_delay()
4391 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_els_retry_delay()
4392 if (!list_empty(&evtp->evt_listp)) { in lpfc_els_retry_delay()
4393 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4398 evtp->evt_arg1 = ndlp; in lpfc_els_retry_delay()
4399 evtp->evt = LPFC_EVT_ELS_RETRY; in lpfc_els_retry_delay()
4400 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_els_retry_delay()
4401 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_els_retry_delay()
4407 * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
4408 * @ndlp: pointer to a node-list data structure.
4410 * This routine is the worker-thread handler for processing the @ndlp delayed
4413 * function according to the delayed ELS command to retry the command.
4418 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_retry_delay_handler()
4419 uint32_t cmd, retry; in lpfc_els_retry_delay_handler() local
4421 spin_lock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4422 cmd = ndlp->nlp_last_elscmd; in lpfc_els_retry_delay_handler()
4423 ndlp->nlp_last_elscmd = 0; in lpfc_els_retry_delay_handler()
4424 spin_unlock_irq(&ndlp->lock); in lpfc_els_retry_delay_handler()
4426 if (!test_and_clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) in lpfc_els_retry_delay_handler()
4434 del_timer_sync(&ndlp->nlp_delayfunc); in lpfc_els_retry_delay_handler()
4435 retry = ndlp->nlp_retry; in lpfc_els_retry_delay_handler()
4436 ndlp->nlp_retry = 0; in lpfc_els_retry_delay_handler()
4440 lpfc_issue_els_flogi(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4443 if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) { in lpfc_els_retry_delay_handler()
4444 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4449 if (!lpfc_issue_els_adisc(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4450 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4456 if (!lpfc_issue_els_prli(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4457 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4462 if (!lpfc_issue_els_logo(vport, ndlp, retry)) { in lpfc_els_retry_delay_handler()
4463 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry_delay_handler()
4468 if (!test_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag)) in lpfc_els_retry_delay_handler()
4469 lpfc_issue_els_fdisc(vport, ndlp, retry); in lpfc_els_retry_delay_handler()
4476 * lpfc_link_reset - Issue link reset
4480 * For SLI-3 adapter, link attention interrupt is enabled before issuing
4484 * 0 - Link reset initiated successfully
4485 * 1 - Failed to initiate link reset
4490 struct lpfc_hba *phba = vport->phba; in lpfc_link_reset()
4497 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_link_reset()
4505 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_link_reset()
4506 spin_lock_irq(&phba->hbalock); in lpfc_link_reset()
4507 phba->sli.sli_flag |= LPFC_PROCESS_LA; in lpfc_link_reset()
4508 control = readl(phba->HCregaddr); in lpfc_link_reset()
4510 writel(control, phba->HCregaddr); in lpfc_link_reset()
4511 readl(phba->HCregaddr); /* flush */ in lpfc_link_reset()
4512 spin_unlock_irq(&phba->hbalock); in lpfc_link_reset()
4515 lpfc_init_link(phba, mbox, phba->cfg_topology, in lpfc_link_reset()
4516 phba->cfg_link_speed); in lpfc_link_reset()
4517 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_link_reset()
4518 mbox->vport = vport; in lpfc_link_reset()
4524 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_link_reset()
4532 * lpfc_els_retry - Make retry decision on an els command iocb
4537 * This routine makes a retry decision on an ELS command IOCB, which has
4541 * returned error status, it makes the decision whether a retry shall be
4542 * issued for the command, and whether a retry shall be made immediately or
4543 * delayed. In the former case, the corresponding ELS command issuing-function
4544 * is called to retry the command. In the later case, the ELS command shall
4549 * 0 - No retry of els command is made
4550 * 1 - Immediate or delayed retry of els command is made
4556 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_els_retry()
4557 union lpfc_wqe128 *irsp = &rspiocb->wqe; in lpfc_els_retry()
4558 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_els_retry()
4559 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_retry()
4562 int retry = 0, maxretry = lpfc_max_els_tries, delay = 0; in lpfc_els_retry() local
4576 if (pcmd && pcmd->virt) { in lpfc_els_retry()
4577 elscmd = (uint32_t *) (pcmd->virt); in lpfc_els_retry()
4582 did = ndlp->nlp_DID; in lpfc_els_retry()
4592 "Retry ELS: wd7:x%x wd4:x%x did:x%x", in lpfc_els_retry()
4599 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_retry()
4605 cmdiocb->sli4_lxritag, 0, 0); in lpfc_els_retry()
4611 if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0) in lpfc_els_retry()
4612 delay = 1000; in lpfc_els_retry()
4613 retry = 1; in lpfc_els_retry()
4618 "0124 Retry illegal cmd x%x " in lpfc_els_retry()
4619 "retry:x%x delay:x%x\n", in lpfc_els_retry()
4620 cmd, cmdiocb->retry, delay); in lpfc_els_retry()
4621 retry = 1; in lpfc_els_retry()
4622 /* All command's retry policy */ in lpfc_els_retry()
4624 if (cmdiocb->retry > 2) in lpfc_els_retry()
4625 delay = 1000; in lpfc_els_retry()
4630 retry = 1; in lpfc_els_retry()
4631 if (cmdiocb->retry > 100) in lpfc_els_retry()
4632 delay = 100; in lpfc_els_retry()
4637 delay = 100; in lpfc_els_retry()
4638 retry = 1; in lpfc_els_retry()
4647 delay = 100; in lpfc_els_retry()
4649 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_els_retry()
4650 /* State-command disagreement. The PRLI was in lpfc_els_retry()
4652 * some unexpected state change. Don't retry. in lpfc_els_retry()
4655 retry = 0; in lpfc_els_retry()
4658 retry = 1; in lpfc_els_retry()
4664 (cmdiocb->retry + 1) == maxretry) { in lpfc_els_retry()
4669 retry = 1; in lpfc_els_retry()
4670 delay = 100; in lpfc_els_retry()
4673 /* Retry ELS PLOGI command? in lpfc_els_retry()
4677 /* No retry if state change */ in lpfc_els_retry()
4679 ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_els_retry()
4681 retry = 1; in lpfc_els_retry()
4691 retry = 1; in lpfc_els_retry()
4699 retry = 1; in lpfc_els_retry()
4707 if (test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_els_retry()
4719 retry = 0; in lpfc_els_retry()
4720 set_bit(FC_PT2PT_NO_NVME, &vport->fc_flag); in lpfc_els_retry()
4729 * isn't really supported, don't retry and cause in lpfc_els_retry()
4745 delay = 1000; in lpfc_els_retry()
4748 retry = 1; in lpfc_els_retry()
4752 /* These explanation codes get no retry. */ in lpfc_els_retry()
4758 /* Limit the delay and retry action to a limited in lpfc_els_retry()
4760 * a retry is not expected. in lpfc_els_retry()
4765 delay = 1000; in lpfc_els_retry()
4767 retry = 1; in lpfc_els_retry()
4772 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4789 delay = 1000; in lpfc_els_retry()
4794 * security settings end-to-end. Reduce in lpfc_els_retry()
4795 * the retry count to allow lpfc to clear in lpfc_els_retry()
4802 /* FDISC retry policy */ in lpfc_els_retry()
4804 if (cmdiocb->retry >= 32) in lpfc_els_retry()
4805 delay = 1000; in lpfc_els_retry()
4807 retry = 1; in lpfc_els_retry()
4813 * Logical Busy. We should delay every time. in lpfc_els_retry()
4818 delay = 1000; in lpfc_els_retry()
4819 retry = 1; in lpfc_els_retry()
4823 vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf; in lpfc_els_retry()
4824 retry = 1; in lpfc_els_retry()
4834 * security settings end-to-end. Reduce in lpfc_els_retry()
4835 * the retry count to allow lpfc to clear in lpfc_els_retry()
4839 delay = 1000; in lpfc_els_retry()
4840 retry = 1; in lpfc_els_retry()
4847 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_retry()
4892 /* Do not give up. Retry PLOGI one more time and attempt in lpfc_els_retry()
4895 retry = 1; in lpfc_els_retry()
4896 delay = 100; in lpfc_els_retry()
4903 retry = 1; in lpfc_els_retry()
4906 (phba->fc_topology != LPFC_TOPOLOGY_LOOP) && in lpfc_els_retry()
4908 /* FLOGI retry policy */ in lpfc_els_retry()
4909 retry = 1; in lpfc_els_retry()
4910 /* retry FLOGI forever */ in lpfc_els_retry()
4911 if (phba->link_flag != LS_LOOPBACK_MODE) in lpfc_els_retry()
4916 if (cmdiocb->retry >= 100) in lpfc_els_retry()
4917 delay = 5000; in lpfc_els_retry()
4918 else if (cmdiocb->retry >= 32) in lpfc_els_retry()
4919 delay = 1000; in lpfc_els_retry()
4922 /* retry FDISCs every second up to devloss */ in lpfc_els_retry()
4923 retry = 1; in lpfc_els_retry()
4924 maxretry = vport->cfg_devloss_tmo; in lpfc_els_retry()
4925 delay = 1000; in lpfc_els_retry()
4928 cmdiocb->retry++; in lpfc_els_retry()
4929 if (maxretry && (cmdiocb->retry >= maxretry)) { in lpfc_els_retry()
4930 phba->fc_stat.elsRetryExceeded++; in lpfc_els_retry()
4931 retry = 0; in lpfc_els_retry()
4934 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_retry()
4935 retry = 0; in lpfc_els_retry()
4938 if (retry) { in lpfc_els_retry()
4941 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_els_retry()
4943 "2849 Stop retry ELS command " in lpfc_els_retry()
4946 cmdiocb->retry, delay); in lpfc_els_retry()
4951 /* Retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
4953 "0107 Retry ELS command x%x to remote " in lpfc_els_retry()
4955 cmd, did, cmdiocb->retry, delay); in lpfc_els_retry()
4964 if (timer_pending(&vport->fc_disctmo) || in lpfc_els_retry()
4965 test_bit(FC_RSCN_MODE, &vport->fc_flag)) in lpfc_els_retry()
4969 phba->fc_stat.elsXmitRetry++; in lpfc_els_retry()
4970 if (ndlp && delay) { in lpfc_els_retry()
4971 phba->fc_stat.elsDelayRetry++; in lpfc_els_retry()
4972 ndlp->nlp_retry = cmdiocb->retry; in lpfc_els_retry()
4974 /* delay is specified in milliseconds */ in lpfc_els_retry()
4975 mod_timer(&ndlp->nlp_delayfunc, in lpfc_els_retry()
4976 jiffies + msecs_to_jiffies(delay)); in lpfc_els_retry()
4977 set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_els_retry()
4979 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
4987 ndlp->nlp_last_elscmd = cmd; in lpfc_els_retry()
4993 lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
4996 lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5000 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5004 lpfc_issue_els_plogi(vport, did, cmdiocb->retry); in lpfc_els_retry()
5007 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5009 lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5013 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5015 lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5018 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_retry()
5020 lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry); in lpfc_els_retry()
5024 /* No retry ELS command <elsCmd> to remote NPORT <did> */ in lpfc_els_retry()
5027 "0137 No retry ELS command x%x to remote " in lpfc_els_retry()
5031 cmdiocb->iotag); in lpfc_els_retry()
5035 "0108 No retry ELS command x%x to remote " in lpfc_els_retry()
5038 cmd, did, cmdiocb->retry, ulp_status, in lpfc_els_retry()
5039 ulp_word4, cmdiocb->iotag, in lpfc_els_retry()
5040 (ndlp ? ndlp->nlp_flag : 0)); in lpfc_els_retry()
5046 * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
5057 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5065 if (!list_empty(&buf_ptr1->list)) { in lpfc_els_free_data()
5066 list_remove_head(&buf_ptr1->list, buf_ptr, in lpfc_els_free_data()
5069 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_data()
5072 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys); in lpfc_els_free_data()
5078 * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
5087 * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
5092 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys); in lpfc_els_free_bpl()
5098 * lpfc_els_free_iocb - Free a command iocb and its associated resources
5106 * cmd_dmabuf - reference to cmd.
5107 * cmd_dmabuf->next - reference to rsp
5108 * rsp_dmabuf - unused
5109 * bpl_dmabuf - reference to bpl
5122 * 0 - Success (currently, always return 0)
5130 elsiocb->ndlp = NULL; in lpfc_els_free_iocb()
5132 /* cmd_dmabuf = cmd, cmd_dmabuf->next = rsp, bpl_dmabuf = bpl */ in lpfc_els_free_iocb()
5133 if (elsiocb->cmd_dmabuf) { in lpfc_els_free_iocb()
5134 if (elsiocb->cmd_flag & LPFC_DELAY_MEM_FREE) { in lpfc_els_free_iocb()
5139 elsiocb->cmd_flag &= ~LPFC_DELAY_MEM_FREE; in lpfc_els_free_iocb()
5140 buf_ptr = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5141 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5144 spin_lock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5145 if (!list_empty(&buf_ptr->list)) { in lpfc_els_free_iocb()
5146 list_remove_head(&buf_ptr->list, in lpfc_els_free_iocb()
5149 INIT_LIST_HEAD(&buf_ptr1->list); in lpfc_els_free_iocb()
5150 list_add_tail(&buf_ptr1->list, in lpfc_els_free_iocb()
5151 &phba->elsbuf); in lpfc_els_free_iocb()
5152 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5154 INIT_LIST_HEAD(&buf_ptr->list); in lpfc_els_free_iocb()
5155 list_add_tail(&buf_ptr->list, &phba->elsbuf); in lpfc_els_free_iocb()
5156 phba->elsbuf_cnt++; in lpfc_els_free_iocb()
5157 spin_unlock_irq(&phba->hbalock); in lpfc_els_free_iocb()
5160 buf_ptr1 = elsiocb->cmd_dmabuf; in lpfc_els_free_iocb()
5162 elsiocb->cmd_dmabuf = NULL; in lpfc_els_free_iocb()
5166 if (elsiocb->bpl_dmabuf) { in lpfc_els_free_iocb()
5167 buf_ptr = elsiocb->bpl_dmabuf; in lpfc_els_free_iocb()
5169 elsiocb->bpl_dmabuf = NULL; in lpfc_els_free_iocb()
5176 * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
5191 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_logo_acc()
5192 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_logo_acc()
5200 ulp_status, ulp_word4, ndlp->nlp_DID); in lpfc_cmpl_els_logo_acc()
5205 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_cmpl_els_logo_acc()
5206 ndlp->nlp_last_elscmd, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_logo_acc()
5207 ndlp->nlp_rpi); in lpfc_cmpl_els_logo_acc()
5214 if (ndlp->nlp_type & NLP_FABRIC && in lpfc_cmpl_els_logo_acc()
5215 ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK)) in lpfc_cmpl_els_logo_acc()
5218 if (ndlp->nlp_state == NLP_STE_NPR_NODE) { in lpfc_cmpl_els_logo_acc()
5219 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) in lpfc_cmpl_els_logo_acc()
5225 if (ndlp->nlp_last_elscmd == ELS_CMD_PRLO) { in lpfc_cmpl_els_logo_acc()
5226 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_cmpl_els_logo_acc()
5227 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_logo_acc()
5229 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_cmpl_els_logo_acc()
5243 * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
5257 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_dflt_rpi()
5258 u32 mbx_flag = pmb->mbox_flag; in lpfc_mbx_cmpl_dflt_rpi()
5259 u32 mbx_cmd = pmb->u.mb.mbxCommand; in lpfc_mbx_cmpl_dflt_rpi()
5262 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_mbx_cmpl_dflt_rpi()
5265 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_dflt_rpi()
5266 kref_read(&ndlp->kref), ndlp, mbx_cmd, in lpfc_mbx_cmpl_dflt_rpi()
5274 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_dflt_rpi()
5276 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_mbx_cmpl_dflt_rpi()
5278 lpfc_drop_node(ndlp->vport, ndlp); in lpfc_mbx_cmpl_dflt_rpi()
5285 * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
5301 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_rsp()
5302 struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL; in lpfc_cmpl_els_rsp()
5313 if (cmdiocb->context_un.mbox) in lpfc_cmpl_els_rsp()
5314 mbox = cmdiocb->context_un.mbox; in lpfc_cmpl_els_rsp()
5320 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_rsp()
5324 irsp = &rspiocb->iocb; in lpfc_cmpl_els_rsp()
5325 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_rsp()
5326 iotag = irsp->ulpIoTag; in lpfc_cmpl_els_rsp()
5344 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5345 ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp); in lpfc_cmpl_els_rsp()
5348 test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag)) { in lpfc_cmpl_els_rsp()
5350 !test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_cmpl_els_rsp()
5351 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_cmpl_els_rsp()
5352 ndlp->nlp_state == in lpfc_cmpl_els_rsp()
5359 ndlp->nlp_DID, in lpfc_cmpl_els_rsp()
5360 ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5361 ndlp->nlp_rpi, in lpfc_cmpl_els_rsp()
5362 ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5370 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_cmpl_els_rsp()
5371 if (!mbox->ctx_ndlp) in lpfc_cmpl_els_rsp()
5374 mbox->vport = vport; in lpfc_cmpl_els_rsp()
5375 if (test_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag)) { in lpfc_cmpl_els_rsp()
5376 mbox->mbox_flag |= LPFC_MBX_IMED_UNREG; in lpfc_cmpl_els_rsp()
5377 mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi; in lpfc_cmpl_els_rsp()
5379 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login; in lpfc_cmpl_els_rsp()
5380 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_cmpl_els_rsp()
5385 set_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5394 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5400 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_cmpl_els_rsp()
5401 ndlp->nlp_rpi); in lpfc_cmpl_els_rsp()
5409 clear_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5410 clear_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag); in lpfc_cmpl_els_rsp()
5416 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_els_rsp()
5417 vport && vport->port_type == LPFC_NPIV_PORT && in lpfc_cmpl_els_rsp()
5418 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) { in lpfc_cmpl_els_rsp()
5419 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE && in lpfc_cmpl_els_rsp()
5420 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE && in lpfc_cmpl_els_rsp()
5421 ndlp->nlp_state != NLP_STE_PRLI_ISSUE) { in lpfc_cmpl_els_rsp()
5440 * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
5444 * @ndlp: pointer to a node-list data structure.
5461 * 0 - Successfully issued acc response
5462 * 1 - Failed to issue acc response
5469 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_acc()
5473 union lpfc_wqe128 *oldwqe = &oldiocb->wqe; in lpfc_els_rsp_acc()
5485 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5486 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5488 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_els_rsp_acc()
5492 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5493 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5495 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5497 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5500 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5502 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5504 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5505 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5506 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5507 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5508 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5511 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5517 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5522 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5523 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5527 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5528 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5530 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5532 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5535 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5537 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5539 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5540 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5541 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5542 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5543 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5546 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5549 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_acc()
5557 memcpy(sp, &phba->fc_fabparam, in lpfc_els_rsp_acc()
5561 sp->cmn.fPort = 0; in lpfc_els_rsp_acc()
5564 sp->cls1.classValid = 0; in lpfc_els_rsp_acc()
5565 sp->cls2.classValid = 0; in lpfc_els_rsp_acc()
5566 sp->cls3.classValid = 0; in lpfc_els_rsp_acc()
5567 sp->cls4.classValid = 0; in lpfc_els_rsp_acc()
5570 memcpy(&sp->portName, &vport->fc_sparam.portName, in lpfc_els_rsp_acc()
5572 memcpy(&sp->nodeName, &vport->fc_sparam.nodeName, in lpfc_els_rsp_acc()
5575 memcpy(pcmd, &vport->fc_sparam, in lpfc_els_rsp_acc()
5578 sp->cmn.valid_vendor_ver_level = 0; in lpfc_els_rsp_acc()
5579 memset(sp->un.vendorVersion, 0, in lpfc_els_rsp_acc()
5580 sizeof(sp->un.vendorVersion)); in lpfc_els_rsp_acc()
5581 sp->cmn.bbRcvSizeMsb &= 0xF; in lpfc_els_rsp_acc()
5586 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) { in lpfc_els_rsp_acc()
5587 sp->cmn.valid_vendor_ver_level = 1; in lpfc_els_rsp_acc()
5588 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID); in lpfc_els_rsp_acc()
5589 sp->un.vv.flags = in lpfc_els_rsp_acc()
5596 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5600 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5601 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO); in lpfc_els_rsp_acc()
5605 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5606 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5608 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5610 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5613 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5615 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5617 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5618 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5619 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5620 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5621 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5624 pcmd = (u8 *) elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5626 memcpy(pcmd, oldiocb->cmd_dmabuf->virt, in lpfc_els_rsp_acc()
5630 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED; in lpfc_els_rsp_acc()
5634 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_els_rsp_acc()
5638 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, in lpfc_els_rsp_acc()
5639 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_acc()
5643 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_acc()
5644 wqe = &elsiocb->wqe; in lpfc_els_rsp_acc()
5646 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5648 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5651 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_acc()
5653 &oldwqe->xmit_els_rsp.wqe_com)); in lpfc_els_rsp_acc()
5655 icmd = &elsiocb->iocb; in lpfc_els_rsp_acc()
5656 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_acc()
5657 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_acc()
5658 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_acc()
5659 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_acc()
5662 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_acc()
5665 rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_els_rsp_acc()
5667 /* FC-LS-5 specifies desc_list_len shall be set to 12 */ in lpfc_els_rsp_acc()
5668 rdf_resp->desc_list_len = cpu_to_be32(12); in lpfc_els_rsp_acc()
5670 /* FC-LS-5 specifies LS REQ Information descriptor */ in lpfc_els_rsp_acc()
5671 rdf_resp->lsri.desc_tag = cpu_to_be32(1); in lpfc_els_rsp_acc()
5672 rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32)); in lpfc_els_rsp_acc()
5673 rdf_resp->lsri.rqst_w0.cmd = ELS_RDF; in lpfc_els_rsp_acc()
5678 if (test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag)) { in lpfc_els_rsp_acc()
5679 if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) && in lpfc_els_rsp_acc()
5680 !test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_els_rsp_acc()
5681 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_els_rsp_acc()
5682 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc; in lpfc_els_rsp_acc()
5684 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_acc()
5687 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_acc()
5688 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_acc()
5689 if (!elsiocb->ndlp) { in lpfc_els_rsp_acc()
5706 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_els_rsp_acc()
5707 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_acc()
5708 ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_acc()
5713 * lpfc_els_rsp_reject - Prepare and issue a rjt response iocb command
5717 * @ndlp: pointer to a node-list data structure.
5731 * 0 - Successfully issued reject response
5732 * 1 - Failed to issue reject response
5740 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_reject()
5749 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_reject()
5750 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rsp_reject()
5754 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_reject()
5755 wqe = &elsiocb->wqe; in lpfc_els_rsp_reject()
5756 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_reject()
5758 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_reject()
5761 icmd = &elsiocb->iocb; in lpfc_els_rsp_reject()
5762 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_reject()
5763 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_reject()
5764 icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_reject()
5767 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_reject()
5774 elsiocb->context_un.mbox = mbox; in lpfc_els_rsp_reject()
5781 rejectError, elsiocb->iotag, in lpfc_els_rsp_reject()
5782 get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID, in lpfc_els_rsp_reject()
5783 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_els_rsp_reject()
5786 ndlp->nlp_DID, ndlp->nlp_flag, rejectError); in lpfc_els_rsp_reject()
5788 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rsp_reject()
5789 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_reject()
5790 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_reject()
5791 if (!elsiocb->ndlp) { in lpfc_els_rsp_reject()
5807 * lpfc_issue_els_edc_rsp - Exchange Diagnostic Capabilities with the fabric.
5812 * This routine issues an EDC ACC RSP to the F-Port Controller to communicate
5817 * 0 - Successfully issued edc rsp command
5818 * 1 - Failed to issue edc rsp command
5824 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_edc_rsp()
5840 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry, in lpfc_issue_els_edc_rsp()
5841 ndlp, ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_issue_els_edc_rsp()
5845 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_edc_rsp()
5846 wqe = &elsiocb->wqe; in lpfc_issue_els_edc_rsp()
5847 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_issue_els_edc_rsp()
5849 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_issue_els_edc_rsp()
5852 icmd = &elsiocb->iocb; in lpfc_issue_els_edc_rsp()
5853 cmd = &cmdiocb->iocb; in lpfc_issue_els_edc_rsp()
5854 icmd->ulpContext = cmd->ulpContext; /* Xri / rx_id */ in lpfc_issue_els_edc_rsp()
5855 icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id; in lpfc_issue_els_edc_rsp()
5858 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_edc_rsp()
5862 edc_rsp->acc_hdr.la_cmd = ELS_LS_ACC; in lpfc_issue_els_edc_rsp()
5863 edc_rsp->desc_list_len = cpu_to_be32(sizeof(struct fc_els_lsri_desc) + in lpfc_issue_els_edc_rsp()
5865 edc_rsp->lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO); in lpfc_issue_els_edc_rsp()
5866 edc_rsp->lsri.desc_len = cpu_to_be32( in lpfc_issue_els_edc_rsp()
5868 edc_rsp->lsri.rqst_w0.cmd = ELS_EDC; in lpfc_issue_els_edc_rsp()
5869 tlv = edc_rsp->desc; in lpfc_issue_els_edc_rsp()
5877 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_issue_els_edc_rsp()
5878 kref_read(&ndlp->kref)); in lpfc_issue_els_edc_rsp()
5879 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_issue_els_edc_rsp()
5881 phba->fc_stat.elsXmitACC++; in lpfc_issue_els_edc_rsp()
5882 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_edc_rsp()
5883 if (!elsiocb->ndlp) { in lpfc_issue_els_edc_rsp()
5900 rc, elsiocb->iotag, elsiocb->sli4_xritag, in lpfc_issue_els_edc_rsp()
5901 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_issue_els_edc_rsp()
5902 ndlp->nlp_rpi, vport->fc_flag); in lpfc_issue_els_edc_rsp()
5908 * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
5911 * @ndlp: pointer to a node-list data structure.
5923 * 0 - Successfully issued acc adisc response
5924 * 1 - Failed to issue adisc acc response
5930 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_adisc_acc()
5941 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_adisc_acc()
5942 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_adisc_acc()
5946 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_adisc_acc()
5947 wqe = &elsiocb->wqe; in lpfc_els_rsp_adisc_acc()
5949 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_adisc_acc()
5953 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_adisc_acc()
5956 icmd = &elsiocb->iocb; in lpfc_els_rsp_adisc_acc()
5957 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_adisc_acc()
5958 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_adisc_acc()
5959 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_adisc_acc()
5960 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_adisc_acc()
5961 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_adisc_acc()
5968 elsiocb->iotag, ulp_context, in lpfc_els_rsp_adisc_acc()
5969 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_adisc_acc()
5970 ndlp->nlp_rpi); in lpfc_els_rsp_adisc_acc()
5971 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_adisc_acc()
5977 ap->hardAL_PA = phba->fc_pref_ALPA; in lpfc_els_rsp_adisc_acc()
5978 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
5979 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_adisc_acc()
5980 ap->DID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_adisc_acc()
5984 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_adisc_acc()
5986 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_adisc_acc()
5987 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_adisc_acc()
5988 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_adisc_acc()
5989 if (!elsiocb->ndlp) { in lpfc_els_rsp_adisc_acc()
6005 * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
6008 * @ndlp: pointer to a node-list data structure.
6020 * 0 - Successfully issued acc prli response
6021 * 1 - Failed to issue acc prli response
6027 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_prli_acc()
6045 req_buf = oldiocb->cmd_dmabuf; in lpfc_els_rsp_prli_acc()
6046 req_payload = (((uint32_t *)req_buf->virt) + 1); in lpfc_els_rsp_prli_acc()
6065 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_prli_acc()
6066 ndlp->nlp_DID, elsrspcmd); in lpfc_els_rsp_prli_acc()
6070 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_prli_acc()
6071 wqe = &elsiocb->wqe; in lpfc_els_rsp_prli_acc()
6072 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_prli_acc()
6075 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_prli_acc()
6078 icmd = &elsiocb->iocb; in lpfc_els_rsp_prli_acc()
6079 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_prli_acc()
6080 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_prli_acc()
6081 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_prli_acc()
6082 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_prli_acc()
6083 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_prli_acc()
6090 elsiocb->iotag, ulp_context, in lpfc_els_rsp_prli_acc()
6091 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_prli_acc()
6092 ndlp->nlp_rpi); in lpfc_els_rsp_prli_acc()
6093 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_prli_acc()
6100 vpd = &phba->vpd; in lpfc_els_rsp_prli_acc()
6105 * is 3.20 or later, set the following bits for FC-TAPE in lpfc_els_rsp_prli_acc()
6109 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_els_rsp_prli_acc()
6110 (vpd->rev.feaLevelHigh >= 0x02)) { in lpfc_els_rsp_prli_acc()
6111 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6112 npr->Retry = 1; in lpfc_els_rsp_prli_acc()
6113 npr->TaskRetryIdReq = 1; in lpfc_els_rsp_prli_acc()
6115 npr->acceptRspCode = PRLI_REQ_EXECUTED; in lpfc_els_rsp_prli_acc()
6118 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_els_rsp_prli_acc()
6119 npr->estabImagePair = 1; in lpfc_els_rsp_prli_acc()
6121 npr->estabImagePair = 0; in lpfc_els_rsp_prli_acc()
6122 npr->readXferRdyDis = 1; in lpfc_els_rsp_prli_acc()
6123 npr->ConfmComplAllowed = 1; in lpfc_els_rsp_prli_acc()
6124 npr->prliType = PRLI_FCP_TYPE; in lpfc_els_rsp_prli_acc()
6125 npr->initiatorFunc = 1; in lpfc_els_rsp_prli_acc()
6131 "retry %d task %d\n", in lpfc_els_rsp_prli_acc()
6132 npr->estabImagePair, in lpfc_els_rsp_prli_acc()
6133 npr->Retry, npr->TaskRetryIdReq); in lpfc_els_rsp_prli_acc()
6141 if (phba->nvmet_support) { in lpfc_els_rsp_prli_acc()
6144 if (phba->cfg_nvme_enable_fb) { in lpfc_els_rsp_prli_acc()
6152 phba->cfg_nvmet_fb_size); in lpfc_els_rsp_prli_acc()
6162 npr_nvme->word1, npr_nvme->word4, in lpfc_els_rsp_prli_acc()
6163 npr_nvme->word5, ndlp->nlp_flag, in lpfc_els_rsp_prli_acc()
6164 ndlp->nlp_fcp_info, ndlp->nlp_type); in lpfc_els_rsp_prli_acc()
6165 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1); in lpfc_els_rsp_prli_acc()
6166 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4); in lpfc_els_rsp_prli_acc()
6167 npr_nvme->word5 = cpu_to_be32(npr_nvme->word5); in lpfc_els_rsp_prli_acc()
6171 prli_fc4_req, ndlp->nlp_fc4_type, in lpfc_els_rsp_prli_acc()
6172 ndlp->nlp_DID); in lpfc_els_rsp_prli_acc()
6176 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_prli_acc()
6178 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_prli_acc()
6179 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_prli_acc()
6180 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_prli_acc()
6181 if (!elsiocb->ndlp) { in lpfc_els_rsp_prli_acc()
6197 * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
6201 * @ndlp: pointer to a node-list data structure.
6213 * 0 - Successfully issued acc rnid response
6214 * 1 - Failed to issue acc rnid response
6220 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rnid_acc()
6235 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rnid_acc()
6236 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rnid_acc()
6240 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rnid_acc()
6241 wqe = &elsiocb->wqe; in lpfc_els_rsp_rnid_acc()
6242 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rnid_acc()
6245 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rnid_acc()
6248 icmd = &elsiocb->iocb; in lpfc_els_rsp_rnid_acc()
6249 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_rnid_acc()
6250 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_rnid_acc()
6251 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_rnid_acc()
6252 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_rnid_acc()
6253 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_rnid_acc()
6259 elsiocb->iotag, ulp_context); in lpfc_els_rsp_rnid_acc()
6260 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rnid_acc()
6266 rn->Format = format; in lpfc_els_rsp_rnid_acc()
6267 rn->CommonLen = (2 * sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6268 memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6269 memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6272 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6275 rn->SpecificLen = sizeof(RNID_TOP_DISC); in lpfc_els_rsp_rnid_acc()
6276 memcpy(&rn->un.topologyDisc.portName, in lpfc_els_rsp_rnid_acc()
6277 &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_els_rsp_rnid_acc()
6278 rn->un.topologyDisc.unitType = RNID_HBA; in lpfc_els_rsp_rnid_acc()
6279 rn->un.topologyDisc.physPort = 0; in lpfc_els_rsp_rnid_acc()
6280 rn->un.topologyDisc.attachedNodes = 0; in lpfc_els_rsp_rnid_acc()
6283 rn->CommonLen = 0; in lpfc_els_rsp_rnid_acc()
6284 rn->SpecificLen = 0; in lpfc_els_rsp_rnid_acc()
6290 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_rnid_acc()
6292 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rnid_acc()
6293 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rnid_acc()
6294 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rnid_acc()
6295 if (!elsiocb->ndlp) { in lpfc_els_rsp_rnid_acc()
6311 * lpfc_els_clear_rrq - Clear the rq that this rrq describes.
6314 * @ndlp: pointer to a node-list data structure.
6322 struct lpfc_hba *phba = vport->phba; in lpfc_els_clear_rrq()
6330 pcmd = (uint8_t *)iocb->cmd_dmabuf->virt; in lpfc_els_clear_rrq()
6333 rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg); in lpfc_els_clear_rrq()
6347 ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg); in lpfc_els_clear_rrq()
6348 if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq))) in lpfc_els_clear_rrq()
6352 prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID); in lpfc_els_clear_rrq()
6359 * lpfc_els_rsp_echo_acc - Issue echo acc response
6363 * @ndlp: pointer to a node-list data structure.
6366 * 0 - Successfully issued acc echo response
6367 * 1 - Failed to issue acc echo response
6373 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_echo_acc()
6382 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rsp_echo_acc()
6383 cmdsize = oldiocb->wcqe_cmpl.total_data_placed; in lpfc_els_rsp_echo_acc()
6385 cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_rsp_echo_acc()
6392 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_echo_acc()
6393 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_echo_acc()
6397 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_echo_acc()
6398 wqe = &elsiocb->wqe; in lpfc_els_rsp_echo_acc()
6399 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_echo_acc()
6402 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_echo_acc()
6405 icmd = &elsiocb->iocb; in lpfc_els_rsp_echo_acc()
6406 oldcmd = &oldiocb->iocb; in lpfc_els_rsp_echo_acc()
6407 icmd->ulpContext = oldcmd->ulpContext; /* Xri / rx_id */ in lpfc_els_rsp_echo_acc()
6408 ulp_context = elsiocb->iocb.ulpContext; in lpfc_els_rsp_echo_acc()
6409 icmd->unsli3.rcvsli3.ox_id = in lpfc_els_rsp_echo_acc()
6410 oldcmd->unsli3.rcvsli3.ox_id; in lpfc_els_rsp_echo_acc()
6416 elsiocb->iotag, ulp_context); in lpfc_els_rsp_echo_acc()
6417 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_echo_acc()
6420 memcpy(pcmd, data, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_echo_acc()
6424 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_els_rsp_echo_acc()
6426 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_echo_acc()
6427 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_echo_acc()
6428 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_echo_acc()
6429 if (!elsiocb->ndlp) { in lpfc_els_rsp_echo_acc()
6445 * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
6453 * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
6470 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_adisc()
6472 if (ndlp->nlp_state != NLP_STE_NPR_NODE || in lpfc_els_disc_adisc()
6473 !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) in lpfc_els_disc_adisc()
6476 clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); in lpfc_els_disc_adisc()
6478 if (!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) { in lpfc_els_disc_adisc()
6491 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_adisc()
6495 vport->num_disc_nodes++; in lpfc_els_disc_adisc()
6496 if (vport->num_disc_nodes >= in lpfc_els_disc_adisc()
6497 vport->cfg_discovery_threads) { in lpfc_els_disc_adisc()
6498 set_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_adisc()
6504 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_adisc()
6509 * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
6516 * incremented. If the num_disc_nodes reaches a pre-configured threshold
6534 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_els_disc_plogi()
6535 if (ndlp->nlp_state == NLP_STE_NPR_NODE && in lpfc_els_disc_plogi()
6536 test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) && in lpfc_els_disc_plogi()
6537 !test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag) && in lpfc_els_disc_plogi()
6538 !test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_els_disc_plogi()
6539 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_disc_plogi()
6541 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_disc_plogi()
6543 vport->num_disc_nodes++; in lpfc_els_disc_plogi()
6544 if (vport->num_disc_nodes >= in lpfc_els_disc_plogi()
6545 vport->cfg_discovery_threads) { in lpfc_els_disc_plogi()
6546 set_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_plogi()
6554 sentplogi, vport->fc_flag); in lpfc_els_disc_plogi()
6559 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_els_disc_plogi()
6568 desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG); in lpfc_rdp_res_link_service()
6569 desc->payload.els_req = word0; in lpfc_rdp_res_link_service()
6570 desc->length = cpu_to_be32(sizeof(desc->payload)); in lpfc_rdp_res_link_service()
6589 desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG); in lpfc_rdp_res_sfp_desc()
6596 if ((trasn_code_byte4->fc_sw_laser) || in lpfc_rdp_res_sfp_desc()
6597 (trasn_code_byte5->fc_sw_laser_sl) || in lpfc_rdp_res_sfp_desc()
6598 (trasn_code_byte5->fc_sw_laser_sn)) { /* check if its short WL */ in lpfc_rdp_res_sfp_desc()
6600 } else if (trasn_code_byte4->fc_lw_laser) { in lpfc_rdp_res_sfp_desc()
6628 desc->sfp_info.temperature = cpu_to_be16(temperature); in lpfc_rdp_res_sfp_desc()
6629 desc->sfp_info.rx_power = cpu_to_be16(rx_power); in lpfc_rdp_res_sfp_desc()
6630 desc->sfp_info.tx_bias = cpu_to_be16(tx_bias); in lpfc_rdp_res_sfp_desc()
6631 desc->sfp_info.tx_power = cpu_to_be16(tx_power); in lpfc_rdp_res_sfp_desc()
6632 desc->sfp_info.vcc = cpu_to_be16(vcc); in lpfc_rdp_res_sfp_desc()
6634 desc->sfp_info.flags = cpu_to_be16(flag); in lpfc_rdp_res_sfp_desc()
6635 desc->length = cpu_to_be32(sizeof(desc->sfp_info)); in lpfc_rdp_res_sfp_desc()
6646 desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG); in lpfc_rdp_res_link_error()
6650 desc->info.port_type = cpu_to_be32(type); in lpfc_rdp_res_link_error()
6652 desc->info.link_status.link_failure_cnt = in lpfc_rdp_res_link_error()
6653 cpu_to_be32(stat->linkFailureCnt); in lpfc_rdp_res_link_error()
6654 desc->info.link_status.loss_of_synch_cnt = in lpfc_rdp_res_link_error()
6655 cpu_to_be32(stat->lossSyncCnt); in lpfc_rdp_res_link_error()
6656 desc->info.link_status.loss_of_signal_cnt = in lpfc_rdp_res_link_error()
6657 cpu_to_be32(stat->lossSignalCnt); in lpfc_rdp_res_link_error()
6658 desc->info.link_status.primitive_seq_proto_err = in lpfc_rdp_res_link_error()
6659 cpu_to_be32(stat->primSeqErrCnt); in lpfc_rdp_res_link_error()
6660 desc->info.link_status.invalid_trans_word = in lpfc_rdp_res_link_error()
6661 cpu_to_be32(stat->invalidXmitWord); in lpfc_rdp_res_link_error()
6662 desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt); in lpfc_rdp_res_link_error()
6664 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_link_error()
6675 desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG); in lpfc_rdp_res_bbc_desc()
6677 bbCredit = vport->fc_sparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6678 (vport->fc_sparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6679 desc->bbc_info.port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6680 if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) { in lpfc_rdp_res_bbc_desc()
6681 bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb | in lpfc_rdp_res_bbc_desc()
6682 (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8); in lpfc_rdp_res_bbc_desc()
6683 desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit); in lpfc_rdp_res_bbc_desc()
6685 desc->bbc_info.attached_port_bbc = 0; in lpfc_rdp_res_bbc_desc()
6688 desc->bbc_info.rtt = 0; in lpfc_rdp_res_bbc_desc()
6689 desc->length = cpu_to_be32(sizeof(desc->bbc_info)); in lpfc_rdp_res_bbc_desc()
6700 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_temp_desc()
6702 desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6703 desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM]; in lpfc_rdp_res_oed_temp_desc()
6704 desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6705 desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING]; in lpfc_rdp_res_oed_temp_desc()
6707 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6709 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6711 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6713 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE) in lpfc_rdp_res_oed_temp_desc()
6717 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_temp_desc()
6718 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_temp_desc()
6729 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_voltage_desc()
6731 desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6732 desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM]; in lpfc_rdp_res_oed_voltage_desc()
6733 desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6734 desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING]; in lpfc_rdp_res_oed_voltage_desc()
6736 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6738 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6740 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6742 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE) in lpfc_rdp_res_oed_voltage_desc()
6746 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_voltage_desc()
6747 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_voltage_desc()
6758 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txbias_desc()
6760 desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6761 desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM]; in lpfc_rdp_res_oed_txbias_desc()
6762 desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6763 desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING]; in lpfc_rdp_res_oed_txbias_desc()
6765 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6767 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6769 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6771 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS) in lpfc_rdp_res_oed_txbias_desc()
6775 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txbias_desc()
6776 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txbias_desc()
6787 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_txpower_desc()
6789 desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6790 desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_txpower_desc()
6791 desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6792 desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_txpower_desc()
6794 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6796 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6798 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6800 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER) in lpfc_rdp_res_oed_txpower_desc()
6804 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_txpower_desc()
6805 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_txpower_desc()
6817 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG); in lpfc_rdp_res_oed_rxpower_desc()
6819 desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6820 desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM]; in lpfc_rdp_res_oed_rxpower_desc()
6821 desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6822 desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING]; in lpfc_rdp_res_oed_rxpower_desc()
6824 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6826 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6828 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6830 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER) in lpfc_rdp_res_oed_rxpower_desc()
6834 desc->oed_info.function_flags = cpu_to_be32(flags); in lpfc_rdp_res_oed_rxpower_desc()
6835 desc->length = cpu_to_be32(sizeof(desc->oed_info)); in lpfc_rdp_res_oed_rxpower_desc()
6843 desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG); in lpfc_rdp_res_opd_desc()
6844 memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16); in lpfc_rdp_res_opd_desc()
6845 memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16); in lpfc_rdp_res_opd_desc()
6846 memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16); in lpfc_rdp_res_opd_desc()
6847 memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4); in lpfc_rdp_res_opd_desc()
6848 memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8); in lpfc_rdp_res_opd_desc()
6849 desc->length = cpu_to_be32(sizeof(desc->opd_info)); in lpfc_rdp_res_opd_desc()
6858 desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG); in lpfc_rdp_res_fec_desc()
6860 desc->info.CorrectedBlocks = in lpfc_rdp_res_fec_desc()
6861 cpu_to_be32(stat->fecCorrBlkCount); in lpfc_rdp_res_fec_desc()
6862 desc->info.UncorrectableBlocks = in lpfc_rdp_res_fec_desc()
6863 cpu_to_be32(stat->fecUncorrBlkCount); in lpfc_rdp_res_fec_desc()
6865 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_fec_desc()
6876 desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG); in lpfc_rdp_res_speed()
6878 switch (phba->fc_linkspeed) { in lpfc_rdp_res_speed()
6914 desc->info.port_speed.speed = cpu_to_be16(rdp_speed); in lpfc_rdp_res_speed()
6916 if (phba->lmt & LMT_256Gb) in lpfc_rdp_res_speed()
6918 if (phba->lmt & LMT_128Gb) in lpfc_rdp_res_speed()
6920 if (phba->lmt & LMT_64Gb) in lpfc_rdp_res_speed()
6922 if (phba->lmt & LMT_32Gb) in lpfc_rdp_res_speed()
6924 if (phba->lmt & LMT_16Gb) in lpfc_rdp_res_speed()
6926 if (phba->lmt & LMT_10Gb) in lpfc_rdp_res_speed()
6928 if (phba->lmt & LMT_8Gb) in lpfc_rdp_res_speed()
6930 if (phba->lmt & LMT_4Gb) in lpfc_rdp_res_speed()
6932 if (phba->lmt & LMT_2Gb) in lpfc_rdp_res_speed()
6934 if (phba->lmt & LMT_1Gb) in lpfc_rdp_res_speed()
6939 if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO) in lpfc_rdp_res_speed()
6942 desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap); in lpfc_rdp_res_speed()
6943 desc->length = cpu_to_be32(sizeof(desc->info)); in lpfc_rdp_res_speed()
6952 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_diag_port_names()
6954 memcpy(desc->port_names.wwnn, &vport->fc_nodename, in lpfc_rdp_res_diag_port_names()
6955 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_diag_port_names()
6957 memcpy(desc->port_names.wwpn, &vport->fc_portname, in lpfc_rdp_res_diag_port_names()
6958 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_diag_port_names()
6960 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_diag_port_names()
6969 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG); in lpfc_rdp_res_attach_port_names()
6970 if (test_bit(FC_FABRIC, &vport->fc_flag)) { in lpfc_rdp_res_attach_port_names()
6971 memcpy(desc->port_names.wwnn, &vport->fabric_nodename, in lpfc_rdp_res_attach_port_names()
6972 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
6974 memcpy(desc->port_names.wwpn, &vport->fabric_portname, in lpfc_rdp_res_attach_port_names()
6975 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
6977 memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename, in lpfc_rdp_res_attach_port_names()
6978 sizeof(desc->port_names.wwnn)); in lpfc_rdp_res_attach_port_names()
6980 memcpy(desc->port_names.wwpn, &ndlp->nlp_portname, in lpfc_rdp_res_attach_port_names()
6981 sizeof(desc->port_names.wwpn)); in lpfc_rdp_res_attach_port_names()
6984 desc->length = cpu_to_be32(sizeof(desc->port_names)); in lpfc_rdp_res_attach_port_names()
6992 struct lpfc_nodelist *ndlp = rdp_context->ndlp; in lpfc_els_rdp_cmpl()
6993 struct lpfc_vport *vport = ndlp->vport; in lpfc_els_rdp_cmpl()
7013 lpfc_max_els_tries, rdp_context->ndlp, in lpfc_els_rdp_cmpl()
7014 rdp_context->ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rdp_cmpl()
7019 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7020 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7021 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7022 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7023 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7024 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7025 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7027 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7028 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7029 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7035 elsiocb->iotag, ulp_context, in lpfc_els_rdp_cmpl()
7036 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rdp_cmpl()
7037 ndlp->nlp_rpi); in lpfc_els_rdp_cmpl()
7038 rdp_res = (struct fc_rdp_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7039 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7044 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS); in lpfc_els_rdp_cmpl()
7045 phba->sfp_alarm |= *flag_ptr; in lpfc_els_rdp_cmpl()
7046 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS); in lpfc_els_rdp_cmpl()
7047 phba->sfp_warning |= *flag_ptr; in lpfc_els_rdp_cmpl()
7055 rdp_context->page_a0, rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7059 (len + pcmd), &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7065 &rdp_context->link_stat); in lpfc_els_rdp_cmpl()
7067 &rdp_context->link_stat, vport); 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()
7076 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7079 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7082 rdp_context->page_a2); in lpfc_els_rdp_cmpl()
7084 rdp_context->page_a0, vport); in lpfc_els_rdp_cmpl()
7086 rdp_res->length = cpu_to_be32(len - 8); in lpfc_els_rdp_cmpl()
7087 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7090 bpl = (struct ulp_bde64 *)elsiocb->bpl_dmabuf->virt; in lpfc_els_rdp_cmpl()
7091 bpl->tus.f.bdeSize = len; in lpfc_els_rdp_cmpl()
7092 bpl->tus.f.bdeFlags = 0; in lpfc_els_rdp_cmpl()
7093 bpl->tus.w = le32_to_cpu(bpl->tus.w); in lpfc_els_rdp_cmpl()
7095 phba->fc_stat.elsXmitACC++; in lpfc_els_rdp_cmpl()
7096 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7097 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7113 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_rdp_cmpl()
7117 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rdp_cmpl()
7118 wqe = &elsiocb->wqe; in lpfc_els_rdp_cmpl()
7119 /* ox-id of the frame */ in lpfc_els_rdp_cmpl()
7120 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7121 rdp_context->ox_id); in lpfc_els_rdp_cmpl()
7123 &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rdp_cmpl()
7124 rdp_context->rx_id); in lpfc_els_rdp_cmpl()
7126 icmd = &elsiocb->iocb; in lpfc_els_rdp_cmpl()
7127 icmd->ulpContext = rdp_context->rx_id; in lpfc_els_rdp_cmpl()
7128 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id; in lpfc_els_rdp_cmpl()
7131 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rdp_cmpl()
7135 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_rdp_cmpl()
7137 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_rdp_cmpl()
7138 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rdp_cmpl()
7139 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rdp_cmpl()
7140 if (!elsiocb->ndlp) { in lpfc_els_rdp_cmpl()
7165 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_rdp_info()
7174 mbox->vport = rdp_context->ndlp->vport; in lpfc_get_rdp_info()
7175 mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0; in lpfc_get_rdp_info()
7176 mbox->ctx_u.rdp = rdp_context; in lpfc_get_rdp_info()
7186 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_rdp_info()
7200 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_get_sfp_info_wait()
7209 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7211 virt = mp->virt; in lpfc_get_sfp_info_wait()
7212 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7213 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7214 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7215 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7216 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7217 mb->un.varWords[3] = DMP_SFF_PAGE_A0_SIZE / 4; in lpfc_get_sfp_info_wait()
7218 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7219 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7220 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7221 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7222 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7223 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7224 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7225 mbox->in_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7226 mbox->out_ext_byte_len = DMP_SFF_PAGE_A0_SIZE; in lpfc_get_sfp_info_wait()
7227 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7228 mbox->ext_buf = virt; in lpfc_get_sfp_info_wait()
7231 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A0_SIZE); in lpfc_get_sfp_info_wait()
7232 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7233 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7235 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7243 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_get_sfp_info_wait()
7244 mp = mbox->ctx_buf; in lpfc_get_sfp_info_wait()
7248 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7253 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a0, in lpfc_get_sfp_info_wait()
7257 memset(mp->virt, 0, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7258 INIT_LIST_HEAD(&mp->list); in lpfc_get_sfp_info_wait()
7261 mbox->ctx_buf = mp; in lpfc_get_sfp_info_wait()
7262 mbox->vport = phba->pport; in lpfc_get_sfp_info_wait()
7264 bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_DUMP_MEMORY); in lpfc_get_sfp_info_wait()
7266 &mbox->u.mqe.un.mem_dump_type3, DMP_LMSD); in lpfc_get_sfp_info_wait()
7268 &mbox->u.mqe.un.mem_dump_type3, phba->sli4_hba.physical_port); in lpfc_get_sfp_info_wait()
7270 &mbox->u.mqe.un.mem_dump_type3, DMP_PAGE_A2); in lpfc_get_sfp_info_wait()
7271 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_get_sfp_info_wait()
7272 mb = &mbox->u.mb; in lpfc_get_sfp_info_wait()
7273 mb->un.varDmp.cv = 1; in lpfc_get_sfp_info_wait()
7274 mb->un.varDmp.co = 1; in lpfc_get_sfp_info_wait()
7275 mb->un.varWords[2] = 0; in lpfc_get_sfp_info_wait()
7276 mb->un.varWords[3] = DMP_SFF_PAGE_A2_SIZE / 4; in lpfc_get_sfp_info_wait()
7277 mb->un.varWords[4] = 0; in lpfc_get_sfp_info_wait()
7278 mb->un.varWords[5] = 0; in lpfc_get_sfp_info_wait()
7279 mb->un.varWords[6] = 0; in lpfc_get_sfp_info_wait()
7280 mb->un.varWords[7] = 0; in lpfc_get_sfp_info_wait()
7281 mb->un.varWords[8] = 0; in lpfc_get_sfp_info_wait()
7282 mb->un.varWords[9] = 0; in lpfc_get_sfp_info_wait()
7283 mb->un.varWords[10] = 0; in lpfc_get_sfp_info_wait()
7284 mbox->in_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7285 mbox->out_ext_byte_len = DMP_SFF_PAGE_A2_SIZE; in lpfc_get_sfp_info_wait()
7286 mbox->mbox_offset_word = 5; in lpfc_get_sfp_info_wait()
7287 mbox->ext_buf = virt; in lpfc_get_sfp_info_wait()
7290 &mbox->u.mqe.un.mem_dump_type3, DMP_SFF_PAGE_A2_SIZE); in lpfc_get_sfp_info_wait()
7291 mbox->u.mqe.un.mem_dump_type3.addr_lo = putPaddrLow(mp->phys); in lpfc_get_sfp_info_wait()
7292 mbox->u.mqe.un.mem_dump_type3.addr_hi = putPaddrHigh(mp->phys); in lpfc_get_sfp_info_wait()
7299 if (bf_get(lpfc_mqe_status, &mbox->u.mqe)) { in lpfc_get_sfp_info_wait()
7305 lpfc_sli_bemem_bcopy(mp->virt, &rdp_context->page_a2, in lpfc_get_sfp_info_wait()
7309 if (mbox->mbox_flag & LPFC_MBX_WAKE) { in lpfc_get_sfp_info_wait()
7310 mbox->ctx_buf = mpsave; in lpfc_get_sfp_info_wait()
7317 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_get_sfp_info_wait()
7322 * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
7325 * @ndlp: pointer to a node-list data structure.
7329 * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
7335 * 0 - Sent the acc response
7336 * 1 - Sent the reject response.
7342 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rdp()
7350 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7351 bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_rdp()
7358 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_rdp()
7359 test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_els_rcv_rdp()
7365 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rdp()
7366 rdp_req = (struct fc_rdp_req_frame *) pcmd->virt; in lpfc_els_rcv_rdp()
7371 be32_to_cpu(rdp_req->rdp_des_length), in lpfc_els_rcv_rdp()
7372 be32_to_cpu(rdp_req->nport_id_desc.tag), in lpfc_els_rcv_rdp()
7373 be32_to_cpu(rdp_req->nport_id_desc.nport_id), in lpfc_els_rcv_rdp()
7374 be32_to_cpu(rdp_req->nport_id_desc.length)); in lpfc_els_rcv_rdp()
7377 be32_to_cpu(rdp_req->rdp_des_length)) in lpfc_els_rcv_rdp()
7379 if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag)) in lpfc_els_rcv_rdp()
7382 be32_to_cpu(rdp_req->nport_id_desc.length)) in lpfc_els_rcv_rdp()
7390 cmd = &cmdiocb->wqe; in lpfc_els_rcv_rdp()
7391 rdp_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rdp()
7392 if (!rdp_context->ndlp) { in lpfc_els_rcv_rdp()
7397 rdp_context->ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_rdp()
7398 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7399 rdp_context->rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_rdp()
7400 &cmd->xmit_els_rsp.wqe_com); in lpfc_els_rcv_rdp()
7401 rdp_context->cmpl = lpfc_els_rdp_cmpl; in lpfc_els_rcv_rdp()
7403 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS, in lpfc_els_rcv_rdp()
7441 mb = &pmb->u.mb; in lpfc_els_lcb_rsp()
7442 lcb_context = pmb->ctx_u.lcb; in lpfc_els_lcb_rsp()
7443 ndlp = lcb_context->ndlp; in lpfc_els_lcb_rsp()
7444 memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u)); in lpfc_els_lcb_rsp()
7445 pmb->ctx_buf = NULL; in lpfc_els_lcb_rsp()
7448 &pmb->u.mqe.un.beacon_config.header.cfg_shdr; in lpfc_els_lcb_rsp()
7449 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_els_lcb_rsp()
7450 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_els_lcb_rsp()
7456 shdr_status, shdr_add_status, mb->mbxStatus); in lpfc_els_lcb_rsp()
7458 if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status || in lpfc_els_lcb_rsp()
7461 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7465 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_lcb_rsp()
7467 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7469 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_lcb_rsp()
7477 lcb_res = (struct fc_lcb_res_frame *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7481 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7482 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7483 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7484 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7485 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7487 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7488 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7489 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7492 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7494 lcb_res->lcb_sub_command = lcb_context->sub_command; in lpfc_els_lcb_rsp()
7495 lcb_res->lcb_type = lcb_context->type; in lpfc_els_lcb_rsp()
7496 lcb_res->capability = lcb_context->capability; in lpfc_els_lcb_rsp()
7497 lcb_res->lcb_frequency = lcb_context->frequency; in lpfc_els_lcb_rsp()
7498 lcb_res->lcb_duration = lcb_context->duration; in lpfc_els_lcb_rsp()
7499 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7500 phba->fc_stat.elsXmitACC++; in lpfc_els_lcb_rsp()
7502 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7503 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7519 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_lcb_rsp()
7521 ndlp->nlp_DID, ELS_CMD_LS_RJT); in lpfc_els_lcb_rsp()
7526 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_lcb_rsp()
7527 wqe = &elsiocb->wqe; in lpfc_els_lcb_rsp()
7528 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id); in lpfc_els_lcb_rsp()
7529 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_lcb_rsp()
7530 lcb_context->ox_id); in lpfc_els_lcb_rsp()
7532 icmd = &elsiocb->iocb; in lpfc_els_lcb_rsp()
7533 icmd->ulpContext = lcb_context->rx_id; in lpfc_els_lcb_rsp()
7534 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id; in lpfc_els_lcb_rsp()
7537 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_lcb_rsp()
7541 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC; in lpfc_els_lcb_rsp()
7544 stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS; in lpfc_els_lcb_rsp()
7546 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_lcb_rsp()
7547 phba->fc_stat.elsXmitLSRJT++; in lpfc_els_lcb_rsp()
7548 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_lcb_rsp()
7549 if (!elsiocb->ndlp) { in lpfc_els_lcb_rsp()
7568 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_set_beacon()
7574 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_set_beacon()
7578 cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr; in lpfc_sli4_set_beacon()
7579 len = sizeof(struct lpfc_mbx_set_beacon_config) - in lpfc_sli4_set_beacon()
7584 mbox->ctx_u.lcb = lcb_context; in lpfc_sli4_set_beacon()
7585 mbox->vport = phba->pport; in lpfc_sli4_set_beacon()
7586 mbox->mbox_cmpl = lpfc_els_lcb_rsp; in lpfc_sli4_set_beacon()
7587 bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7588 phba->sli4_hba.physical_port); in lpfc_sli4_set_beacon()
7589 bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7591 mbox->u.mqe.un.beacon_config.word5 = 0; /* Reserved */ in lpfc_sli4_set_beacon()
7599 if (phba->sli4_hba.pc_sli4_params.bv1s) { in lpfc_sli4_set_beacon()
7601 cfg_shdr->request.word9 = BEACON_VERSION_V1; in lpfc_sli4_set_beacon()
7602 lcb_context->capability |= LCB_CAPABILITY_DURATION; in lpfc_sli4_set_beacon()
7604 &mbox->u.mqe.un.beacon_config, 0); in lpfc_sli4_set_beacon()
7606 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7607 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7610 if (be16_to_cpu(lcb_context->duration) != 0) { in lpfc_sli4_set_beacon()
7611 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7614 cfg_shdr->request.word9 = BEACON_VERSION_V0; in lpfc_sli4_set_beacon()
7615 lcb_context->capability &= ~(LCB_CAPABILITY_DURATION); in lpfc_sli4_set_beacon()
7617 &mbox->u.mqe.un.beacon_config, beacon_state); in lpfc_sli4_set_beacon()
7619 &mbox->u.mqe.un.beacon_config, 1); in lpfc_sli4_set_beacon()
7621 &mbox->u.mqe.un.beacon_config, in lpfc_sli4_set_beacon()
7622 be16_to_cpu(lcb_context->duration)); in lpfc_sli4_set_beacon()
7627 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_sli4_set_beacon()
7636 * lpfc_els_rcv_lcb - Process an unsolicited LCB
7639 * @ndlp: pointer to a node-list data structure.
7646 * 0 - Sent the acc response
7647 * 1 - Sent the reject response.
7653 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_lcb()
7661 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_lcb()
7662 lp = (uint8_t *)pcmd->virt; in lpfc_els_rcv_lcb()
7663 beacon = (struct fc_lcb_request_frame *)pcmd->virt; in lpfc_els_rcv_lcb()
7669 beacon->lcb_command, in lpfc_els_rcv_lcb()
7670 beacon->lcb_sub_command, in lpfc_els_rcv_lcb()
7671 beacon->lcb_type, in lpfc_els_rcv_lcb()
7672 beacon->lcb_frequency, in lpfc_els_rcv_lcb()
7673 be16_to_cpu(beacon->lcb_duration)); in lpfc_els_rcv_lcb()
7675 if (beacon->lcb_sub_command != LPFC_LCB_ON && in lpfc_els_rcv_lcb()
7676 beacon->lcb_sub_command != LPFC_LCB_OFF) { in lpfc_els_rcv_lcb()
7681 if (phba->sli_rev < LPFC_SLI_REV4 || in lpfc_els_rcv_lcb()
7682 test_bit(HBA_FCOE_MODE, &phba->hba_flag) || in lpfc_els_rcv_lcb()
7683 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < in lpfc_els_rcv_lcb()
7695 state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0; in lpfc_els_rcv_lcb()
7696 lcb_context->sub_command = beacon->lcb_sub_command; in lpfc_els_rcv_lcb()
7697 lcb_context->capability = 0; in lpfc_els_rcv_lcb()
7698 lcb_context->type = beacon->lcb_type; in lpfc_els_rcv_lcb()
7699 lcb_context->frequency = beacon->lcb_frequency; in lpfc_els_rcv_lcb()
7700 lcb_context->duration = beacon->lcb_duration; in lpfc_els_rcv_lcb()
7701 lcb_context->ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_lcb()
7702 lcb_context->rx_id = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_lcb()
7703 lcb_context->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_lcb()
7704 if (!lcb_context->ndlp) { in lpfc_els_rcv_lcb()
7710 lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT, in lpfc_els_rcv_lcb()
7729 * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
7741 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_rscn()
7744 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7745 if (vport->fc_rscn_flush) { in lpfc_els_flush_rscn()
7747 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7751 vport->fc_rscn_flush = 1; in lpfc_els_flush_rscn()
7752 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7754 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_els_flush_rscn()
7755 lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]); in lpfc_els_flush_rscn()
7756 vport->fc_rscn_id_list[i] = NULL; in lpfc_els_flush_rscn()
7758 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_flush_rscn()
7759 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_flush_rscn()
7760 spin_lock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7761 vport->fc_rscn_id_cnt = 0; in lpfc_els_flush_rscn()
7762 spin_unlock_irq(shost->host_lock); in lpfc_els_flush_rscn()
7765 vport->fc_rscn_flush = 0; in lpfc_els_flush_rscn()
7769 * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
7777 * None zero - The @did matched with a pending rscn
7778 * 0 - not able to match @did with a pending rscn
7796 if (test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) in lpfc_rscn_payload_check()
7799 spin_lock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7800 if (vport->fc_rscn_flush) { in lpfc_rscn_payload_check()
7802 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7806 vport->fc_rscn_flush = 1; in lpfc_rscn_payload_check()
7807 spin_unlock_irq(shost->host_lock); in lpfc_rscn_payload_check()
7808 for (i = 0; i < vport->fc_rscn_id_cnt; i++) { in lpfc_rscn_payload_check()
7809 lp = vport->fc_rscn_id_list[i]->virt; in lpfc_rscn_payload_check()
7811 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_rscn_payload_check()
7814 payload_len -= sizeof(uint32_t); in lpfc_rscn_payload_check()
7837 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7841 vport->fc_rscn_flush = 0; in lpfc_rscn_payload_check()
7846 * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
7854 * 0 - Successful (currently alway return 0)
7862 list_for_each_entry_safe(ndlp, n, &vport->fc_nodes, nlp_listp) { in lpfc_rscn_recovery_check()
7863 if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) || in lpfc_rscn_recovery_check()
7864 !lpfc_rscn_payload_check(vport, ndlp->nlp_DID)) in lpfc_rscn_recovery_check()
7868 if (vport->phba->nvmet_support) in lpfc_rscn_recovery_check()
7874 switch (ndlp->nlp_state) { in lpfc_rscn_recovery_check()
7891 * lpfc_send_rscn_event - Send an RSCN event to management application
7908 pcmd = cmdiocb->cmd_dmabuf; in lpfc_send_rscn_event()
7909 payload_ptr = (uint32_t *) pcmd->virt; in lpfc_send_rscn_event()
7919 rscn_event_data->event_type = FC_REG_RSCN_EVENT; in lpfc_send_rscn_event()
7920 rscn_event_data->payload_length = payload_len; in lpfc_send_rscn_event()
7921 memcpy(rscn_event_data->rscn_payload, payload_ptr, in lpfc_send_rscn_event()
7934 * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
7937 * @ndlp: pointer to a node-list data structure.
7952 * 0 - Just sent the acc response
7953 * 1 - Sent the acc response and waited for name server completion
7960 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rscn()
7968 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rscn()
7969 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rscn()
7972 payload_len -= sizeof(uint32_t); /* take off word 0 */ in lpfc_els_rcv_rscn()
7976 vport->fc_flag, payload_len, *lp, in lpfc_els_rcv_rscn()
7977 vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
7986 /* Check if RSCN is coming from a direct-connected remote NPort */ in lpfc_els_rcv_rscn()
7987 if (test_bit(FC_PT2PT, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
7991 *lp, vport->fc_flag, payload_len); in lpfc_els_rcv_rscn()
7997 if (ndlp->nlp_fc4_type & NLP_FC4_NVME && in lpfc_els_rcv_rscn()
7998 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) in lpfc_els_rcv_rscn()
8006 if (vport->port_state <= LPFC_NS_QRY) { in lpfc_els_rcv_rscn()
8009 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8018 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_rcv_rscn()
8019 !(vport->cfg_peer_port_login)) { in lpfc_els_rcv_rscn()
8025 i -= sizeof(uint32_t); in lpfc_els_rcv_rscn()
8035 vport->fc_flag, payload_len, in lpfc_els_rcv_rscn()
8036 *lp, vport->fc_rscn_id_cnt); in lpfc_els_rcv_rscn()
8039 ndlp->nlp_DID, vport->port_state, in lpfc_els_rcv_rscn()
8040 ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8045 if (test_bit(FC_DISC_TMO, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8046 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8047 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8055 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8056 if (vport->fc_rscn_flush) { in lpfc_els_rcv_rscn()
8058 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8059 set_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_rcv_rscn()
8065 vport->fc_rscn_flush = 1; in lpfc_els_rcv_rscn()
8066 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_rscn()
8068 rscn_cnt = vport->fc_rscn_id_cnt; in lpfc_els_rcv_rscn()
8070 * RSCN payload buffer, cmdiocb->cmd_dmabuf to process later. in lpfc_els_rcv_rscn()
8072 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) || in lpfc_els_rcv_rscn()
8073 test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8076 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8078 set_bit(FC_RSCN_DEFERRED, &vport->fc_flag); in lpfc_els_rcv_rscn()
8081 if (test_bit(FC_DISC_TMO, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8082 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_els_rcv_rscn()
8083 mod_timer(&vport->fc_disctmo, in lpfc_els_rcv_rscn()
8087 !test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) { in lpfc_els_rcv_rscn()
8088 set_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_rcv_rscn()
8090 cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt; in lpfc_els_rcv_rscn()
8100 vport->fc_rscn_id_list[rscn_cnt] = pcmd; in lpfc_els_rcv_rscn()
8101 vport->fc_rscn_id_cnt++; in lpfc_els_rcv_rscn()
8102 /* If we zero, cmdiocb->cmd_dmabuf, the calling in lpfc_els_rcv_rscn()
8105 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8111 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8112 vport->port_state); in lpfc_els_rcv_rscn()
8114 set_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_els_rcv_rscn()
8119 vport->fc_rscn_id_cnt, vport->fc_flag, in lpfc_els_rcv_rscn()
8120 vport->port_state); in lpfc_els_rcv_rscn()
8123 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8132 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag); in lpfc_els_rcv_rscn()
8134 set_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_els_rcv_rscn()
8135 vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd; in lpfc_els_rcv_rscn()
8137 vport->fc_rscn_flush = 0; in lpfc_els_rcv_rscn()
8139 * If we zero, cmdiocb->cmd_dmabuf, the calling routine will in lpfc_els_rcv_rscn()
8142 cmdiocb->cmd_dmabuf = NULL; in lpfc_els_rcv_rscn()
8152 * lpfc_els_handle_rscn - Handle rscn for a vport
8164 * 0 - Cleaned up rscn on the @vport
8165 * 1 - Wait for plogi to name server before proceed
8171 struct lpfc_hba *phba = vport->phba; in lpfc_els_handle_rscn()
8174 if (test_bit(FC_UNLOADING, &vport->load_flag)) { in lpfc_els_handle_rscn()
8185 vport->fc_flag, 0, vport->fc_rscn_id_cnt, in lpfc_els_handle_rscn()
8186 vport->port_state, vport->num_disc_nodes, in lpfc_els_handle_rscn()
8187 vport->gidft_inp); in lpfc_els_handle_rscn()
8190 vport->fc_ns_retry = 0; in lpfc_els_handle_rscn()
8191 vport->num_disc_nodes = 0; in lpfc_els_handle_rscn()
8194 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_els_handle_rscn()
8200 if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) { in lpfc_els_handle_rscn()
8203 } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) { in lpfc_els_handle_rscn()
8212 ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE; in lpfc_els_handle_rscn()
8220 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_handle_rscn()
8223 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_handle_rscn()
8236 * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
8239 * @ndlp: pointer to a node-list data structure.
8242 * unsolicited event. An unsolicited FLOGI can be received in a point-to-
8257 * 0 - Successfully processed the unsolicited flogi
8258 * 1 - Failed to process the unsolicited flogi
8265 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_flogi()
8266 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_flogi()
8267 uint32_t *lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_flogi()
8268 union lpfc_wqe128 *wqe = &cmdiocb->wqe; in lpfc_els_rcv_flogi()
8277 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8286 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_els_rcv_flogi()
8288 did = bf_get(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest); in lpfc_els_rcv_flogi()
8306 rc = memcmp(&vport->fc_portname, &sp->portName, in lpfc_els_rcv_flogi()
8310 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_els_rcv_flogi()
8311 mbox = mempool_alloc(phba->mbox_mem_pool, in lpfc_els_rcv_flogi()
8317 phba->cfg_topology, in lpfc_els_rcv_flogi()
8318 phba->cfg_link_speed); in lpfc_els_rcv_flogi()
8319 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_rcv_flogi()
8320 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_rcv_flogi()
8321 mbox->vport = vport; in lpfc_els_rcv_flogi()
8326 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_flogi()
8331 phba->link_flag |= LS_EXTERNAL_LOOPBACK; in lpfc_els_rcv_flogi()
8343 set_bit(FC_PT2PT_PLOGI, &vport->fc_flag); in lpfc_els_rcv_flogi()
8350 vport->fc_myDID = PT2PT_LocalID; in lpfc_els_rcv_flogi()
8352 vport->fc_myDID = PT2PT_RemoteID; in lpfc_els_rcv_flogi()
8359 spin_lock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8360 fc_flag = vport->fc_flag; in lpfc_els_rcv_flogi()
8361 port_state = vport->port_state; in lpfc_els_rcv_flogi()
8363 * work-around. in lpfc_els_rcv_flogi()
8365 vport->rcv_flogi_cnt++; in lpfc_els_rcv_flogi()
8366 spin_unlock_irq(shost->host_lock); in lpfc_els_rcv_flogi()
8367 set_bit(FC_PT2PT, &vport->fc_flag); in lpfc_els_rcv_flogi()
8368 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_els_rcv_flogi()
8369 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_els_rcv_flogi()
8373 port_state, vport->port_state, in lpfc_els_rcv_flogi()
8374 fc_flag, vport->fc_flag); in lpfc_els_rcv_flogi()
8381 did = vport->fc_myDID; in lpfc_els_rcv_flogi()
8382 vport->fc_myDID = Fabric_DID; in lpfc_els_rcv_flogi()
8384 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm)); in lpfc_els_rcv_flogi()
8387 if (!test_bit(HBA_FLOGI_ISSUED, &phba->hba_flag)) { in lpfc_els_rcv_flogi()
8388 phba->defer_flogi_acc.rx_id = bf_get(wqe_ctxt_tag, in lpfc_els_rcv_flogi()
8389 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8390 phba->defer_flogi_acc.ox_id = bf_get(wqe_rcvoxid, in lpfc_els_rcv_flogi()
8391 &wqe->xmit_els_rsp.wqe_com); in lpfc_els_rcv_flogi()
8393 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8398 phba->defer_flogi_acc.rx_id, in lpfc_els_rcv_flogi()
8399 phba->defer_flogi_acc.ox_id, phba->hba_flag); in lpfc_els_rcv_flogi()
8401 phba->defer_flogi_acc.flag = true; in lpfc_els_rcv_flogi()
8408 phba->defer_flogi_acc.ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_flogi()
8416 vport->fc_myDID = did; in lpfc_els_rcv_flogi()
8422 * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
8425 * @ndlp: pointer to a node-list data structure.
8435 * 0 - Successfully processed rnid iocb (currently always return 0)
8446 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rnid()
8447 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rnid()
8454 switch (rn->Format) { in lpfc_els_rcv_rnid()
8458 lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp); in lpfc_els_rcv_rnid()
8473 * lpfc_els_rcv_echo - Process an unsolicited echo iocb
8476 * @ndlp: pointer to a node-list data structure.
8479 * 0 - Successfully processed echo iocb (currently always return 0)
8487 pcmd = (uint8_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_echo()
8497 * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
8500 * @ndlp: pointer to a node-list data structure.
8507 * 0 - Successfully processed lirr iocb (currently always return 0)
8525 * lpfc_els_rcv_rrq - Process an unsolicited rrq iocb
8528 * @ndlp: pointer to a node-list data structure.
8545 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_rcv_rrq()
8550 * lpfc_els_rsp_rls_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
8584 mb = &pmb->u.mb; in lpfc_els_rsp_rls_acc()
8586 ndlp = pmb->ctx_ndlp; in lpfc_els_rsp_rls_acc()
8587 rxid = (uint16_t)(pmb->ctx_u.ox_rx_id & 0xffff); in lpfc_els_rsp_rls_acc()
8588 oxid = (uint16_t)((pmb->ctx_u.ox_rx_id >> 16) & 0xffff); in lpfc_els_rsp_rls_acc()
8589 memset(&pmb->ctx_u, 0, sizeof(pmb->ctx_u)); in lpfc_els_rsp_rls_acc()
8590 pmb->ctx_ndlp = NULL; in lpfc_els_rsp_rls_acc()
8592 if (mb->mbxStatus) { in lpfc_els_rsp_rls_acc()
8593 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8598 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rsp_rls_acc()
8600 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rls_acc()
8606 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8611 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rls_acc()
8612 wqe = &elsiocb->wqe; in lpfc_els_rsp_rls_acc()
8614 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, rxid); in lpfc_els_rsp_rls_acc()
8615 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, oxid); in lpfc_els_rsp_rls_acc()
8617 icmd = &elsiocb->iocb; in lpfc_els_rsp_rls_acc()
8618 icmd->ulpContext = rxid; in lpfc_els_rsp_rls_acc()
8619 icmd->unsli3.rcvsli3.ox_id = oxid; in lpfc_els_rsp_rls_acc()
8622 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rls_acc()
8627 rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt); in lpfc_els_rsp_rls_acc()
8628 rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt); in lpfc_els_rsp_rls_acc()
8629 rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt); in lpfc_els_rsp_rls_acc()
8630 rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt); in lpfc_els_rsp_rls_acc()
8631 rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord); in lpfc_els_rsp_rls_acc()
8632 rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt); in lpfc_els_rsp_rls_acc()
8633 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_els_rsp_rls_acc()
8635 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rsp_rls_acc()
8638 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rls_acc()
8639 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rls_acc()
8640 ndlp->nlp_rpi); in lpfc_els_rsp_rls_acc()
8641 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rls_acc()
8642 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rls_acc()
8643 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rls_acc()
8644 if (!elsiocb->ndlp) { in lpfc_els_rsp_rls_acc()
8658 * lpfc_els_rcv_rls - Process an unsolicited rls iocb
8661 * @ndlp: pointer to a node-list data structure.
8673 * 0 - Successfully processed rls iocb (currently always return 0)
8679 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rls()
8685 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rls()
8686 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rls()
8690 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC); in lpfc_els_rcv_rls()
8693 mbox->ctx_u.ox_rx_id = ox_id << 16 | ctx; in lpfc_els_rcv_rls()
8694 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rls()
8695 if (!mbox->ctx_ndlp) in lpfc_els_rcv_rls()
8697 mbox->vport = vport; in lpfc_els_rcv_rls()
8698 mbox->mbox_cmpl = lpfc_els_rsp_rls_acc; in lpfc_els_rcv_rls()
8708 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_rcv_rls()
8721 * lpfc_els_rcv_rtv - Process an unsolicited rtv iocb
8724 * @ndlp: pointer to a node-list data structure.
8739 * 0 - Successfully processed rtv iocb (currently always return 0)
8748 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_rtv()
8756 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rtv()
8757 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) in lpfc_els_rcv_rtv()
8762 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize, in lpfc_els_rcv_rtv()
8764 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rcv_rtv()
8769 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_els_rcv_rtv()
8775 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rcv_rtv()
8776 wqe = &elsiocb->wqe; in lpfc_els_rcv_rtv()
8777 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rcv_rtv()
8779 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rcv_rtv()
8782 icmd = &elsiocb->iocb; in lpfc_els_rcv_rtv()
8783 icmd->ulpContext = get_job_ulpcontext(phba, cmdiocb); in lpfc_els_rcv_rtv()
8784 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, cmdiocb); in lpfc_els_rcv_rtv()
8790 rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000); /* report msecs */ in lpfc_els_rcv_rtv()
8791 rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov); in lpfc_els_rcv_rtv()
8792 bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0); in lpfc_els_rcv_rtv()
8794 rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8797 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS, in lpfc_els_rcv_rtv()
8801 elsiocb->iotag, ulp_context, in lpfc_els_rcv_rtv()
8802 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rcv_rtv()
8803 ndlp->nlp_rpi, in lpfc_els_rcv_rtv()
8804 rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov); in lpfc_els_rcv_rtv()
8805 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rcv_rtv()
8806 phba->fc_stat.elsXmitACC++; in lpfc_els_rcv_rtv()
8807 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rcv_rtv()
8808 if (!elsiocb->ndlp) { in lpfc_els_rcv_rtv()
8830 /* lpfc_issue_els_rrq - Process an unsolicited rrq iocb
8832 * @ndlp: pointer to a node-list data structure.
8840 * 0 - Successfully sent rrq els iocb.
8841 * 1 - Failed to send rrq els iocb.
8847 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_rrq()
8864 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_rrq()
8871 bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]); in lpfc_issue_els_rrq()
8872 bf_set(rrq_rxid, els_rrq, rrq->rxid); in lpfc_issue_els_rrq()
8873 bf_set(rrq_did, els_rrq, vport->fc_myDID); in lpfc_issue_els_rrq()
8874 els_rrq->rrq = cpu_to_be32(els_rrq->rrq); in lpfc_issue_els_rrq()
8875 els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg); in lpfc_issue_els_rrq()
8880 did, rrq->xritag, rrq->rxid); in lpfc_issue_els_rrq()
8881 elsiocb->context_un.rrq = rrq; in lpfc_issue_els_rrq()
8882 elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq; in lpfc_issue_els_rrq()
8884 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_rrq()
8885 if (!elsiocb->ndlp) in lpfc_issue_els_rrq()
8901 * lpfc_send_rrq - Sends ELS RRQ if needed.
8915 struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport, in lpfc_send_rrq()
8916 rrq->nlp_DID); in lpfc_send_rrq()
8920 if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag)) in lpfc_send_rrq()
8921 return lpfc_issue_els_rrq(rrq->vport, ndlp, in lpfc_send_rrq()
8922 rrq->nlp_DID, rrq); in lpfc_send_rrq()
8928 * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
8932 * @ndlp: pointer to a node-list data structure.
8943 * 0 - Successfully issued ACC RPL ELS command
8944 * 1 - Failed to issue ACC RPL ELS command
8951 struct lpfc_hba *phba = vport->phba; in lpfc_els_rsp_rpl_acc()
8959 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp, in lpfc_els_rsp_rpl_acc()
8960 ndlp->nlp_DID, ELS_CMD_ACC); in lpfc_els_rsp_rpl_acc()
8966 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_rsp_rpl_acc()
8967 wqe = &elsiocb->wqe; in lpfc_els_rsp_rpl_acc()
8969 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, in lpfc_els_rsp_rpl_acc()
8971 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, in lpfc_els_rsp_rpl_acc()
8974 icmd = &elsiocb->iocb; in lpfc_els_rsp_rpl_acc()
8975 icmd->ulpContext = get_job_ulpcontext(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
8976 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, oldiocb); in lpfc_els_rsp_rpl_acc()
8979 pcmd = elsiocb->cmd_dmabuf->virt; in lpfc_els_rsp_rpl_acc()
8989 rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID); in lpfc_els_rsp_rpl_acc()
8990 memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname, in lpfc_els_rsp_rpl_acc()
8992 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t)); in lpfc_els_rsp_rpl_acc()
8998 elsiocb->iotag, ulp_context, in lpfc_els_rsp_rpl_acc()
8999 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, in lpfc_els_rsp_rpl_acc()
9000 ndlp->nlp_rpi); in lpfc_els_rsp_rpl_acc()
9001 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp; in lpfc_els_rsp_rpl_acc()
9002 phba->fc_stat.elsXmitACC++; in lpfc_els_rsp_rpl_acc()
9003 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_rsp_rpl_acc()
9004 if (!elsiocb->ndlp) { in lpfc_els_rsp_rpl_acc()
9020 * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
9023 * @ndlp: pointer to a node-list data structure.
9033 * 0 - Successfully processed rpl iocb (currently always return 0)
9046 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) && in lpfc_els_rcv_rpl()
9047 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_rpl()
9059 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_rpl()
9060 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_rpl()
9062 maxsize = be32_to_cpu(rpl->maxsize); in lpfc_els_rcv_rpl()
9065 if ((rpl->index == 0) && in lpfc_els_rcv_rpl()
9078 * lpfc_els_rcv_farp - Process an unsolicited farp request els command
9081 * @ndlp: pointer to a node-list data structure.
9099 * 0 - Either the FARP Match Mode not supported or successfully processed
9110 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farp()
9111 pcmd = cmdiocb->cmd_dmabuf; in lpfc_els_rcv_farp()
9112 lp = (uint32_t *) pcmd->virt; in lpfc_els_rcv_farp()
9116 /* FARP-REQ received from DID <did> */ in lpfc_els_rcv_farp()
9118 "0601 FARP-REQ received from DID x%x\n", did); in lpfc_els_rcv_farp()
9120 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) { in lpfc_els_rcv_farp()
9126 if (fp->Mflags & FARP_MATCH_PORT) { in lpfc_els_rcv_farp()
9127 if (memcmp(&fp->RportName, &vport->fc_portname, in lpfc_els_rcv_farp()
9133 if (fp->Mflags & FARP_MATCH_NODE) { in lpfc_els_rcv_farp()
9134 if (memcmp(&fp->RnodeName, &vport->fc_nodename, in lpfc_els_rcv_farp()
9140 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || in lpfc_els_rcv_farp()
9141 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) { in lpfc_els_rcv_farp()
9143 if (fp->Rflags & FARP_REQUEST_PLOGI) { in lpfc_els_rcv_farp()
9144 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_els_rcv_farp()
9147 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_els_rcv_farp()
9151 if (fp->Rflags & FARP_REQUEST_FARPR) in lpfc_els_rcv_farp()
9159 * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
9162 * @ndlp: pointer to a node-list data structure.
9170 * 0 - Successfully processed FARPR IOCB (currently always return 0)
9178 did = get_job_els_rsp64_did(vport->phba, cmdiocb); in lpfc_els_rcv_farpr()
9180 /* FARP-RSP received from DID <did> */ in lpfc_els_rcv_farpr()
9182 "0600 FARP-RSP received from DID x%x\n", did); in lpfc_els_rcv_farpr()
9190 * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
9193 * @fan_ndlp: pointer to a node-list data structure.
9206 * 0 - Successfully processed fan iocb (currently always return 0).
9212 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fan()
9217 lp = (uint32_t *)cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_fan()
9220 if ((vport == phba->pport) && in lpfc_els_rcv_fan()
9221 (vport->port_state == LPFC_LOCAL_CFG_LINK)) { in lpfc_els_rcv_fan()
9222 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName, in lpfc_els_rcv_fan()
9224 (memcmp(&phba->fc_fabparam.portName, &fp->FportName, in lpfc_els_rcv_fan()
9229 /* FAN verified - skip FLOGI */ in lpfc_els_rcv_fan()
9230 vport->fc_myDID = vport->fc_prevDID; in lpfc_els_rcv_fan()
9231 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_els_rcv_fan()
9236 vport->fc_prevDID, vport->fc_myDID); in lpfc_els_rcv_fan()
9245 * lpfc_els_rcv_edc - Process an unsolicited EDC iocb
9248 * @ndlp: pointer to a node-list data structure.
9251 * 0 - Successfully processed echo iocb (currently always return 0)
9257 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_edc()
9266 payload = cmdiocb->cmd_dmabuf->virt; in lpfc_els_rcv_edc()
9269 bytes_remain = be32_to_cpu(edc_req->desc_len); in lpfc_els_rcv_edc()
9279 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED; in lpfc_els_rcv_edc()
9280 phba->cgn_sig_freq = 0; in lpfc_els_rcv_edc()
9281 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN; in lpfc_els_rcv_edc()
9286 tlv = edc_req->desc; in lpfc_els_rcv_edc()
9302 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_edc()
9322 be32_to_cpu(plnkflt->desc_tag), in lpfc_els_rcv_edc()
9323 be32_to_cpu(plnkflt->desc_len), in lpfc_els_rcv_edc()
9325 plnkflt->degrade_activate_threshold), in lpfc_els_rcv_edc()
9327 plnkflt->degrade_deactivate_threshold), in lpfc_els_rcv_edc()
9328 be32_to_cpu(plnkflt->fec_degrade_interval)); in lpfc_els_rcv_edc()
9344 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_els_rcv_edc()
9345 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_els_rcv_edc()
9351 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency; in lpfc_els_rcv_edc()
9364 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_edc()
9377 * lpfc_els_timeout - Handler funciton to the els timer
9390 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout()
9394 spin_lock_irqsave(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9395 tmo_posted = vport->work_port_events & WORKER_ELS_TMO; in lpfc_els_timeout()
9396 if (!tmo_posted && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_timeout()
9397 vport->work_port_events |= WORKER_ELS_TMO; in lpfc_els_timeout()
9398 spin_unlock_irqrestore(&vport->work_port_lock, iflag); in lpfc_els_timeout()
9400 if (!tmo_posted && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_timeout()
9407 * lpfc_els_timeout_handler - Process an els timeout event
9418 struct lpfc_hba *phba = vport->phba; in lpfc_els_timeout_handler()
9430 timeout = (uint32_t)(phba->fc_ratov << 1); in lpfc_els_timeout_handler()
9436 if (test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_els_timeout_handler()
9439 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9440 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9441 spin_lock(&pring->ring_lock); in lpfc_els_timeout_handler()
9443 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_timeout_handler()
9448 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_els_timeout_handler()
9451 cmd = &piocb->iocb; in lpfc_els_timeout_handler()
9452 iotag = cmd->ulpIoTag; in lpfc_els_timeout_handler()
9455 if ((piocb->cmd_flag & LPFC_IO_LIBDFC) != 0 || in lpfc_els_timeout_handler()
9461 if (piocb->vport != vport) in lpfc_els_timeout_handler()
9464 pcmd = piocb->cmd_dmabuf; in lpfc_els_timeout_handler()
9466 els_command = *(uint32_t *) (pcmd->virt); in lpfc_els_timeout_handler()
9473 if (piocb->drvrTimeout > 0) { in lpfc_els_timeout_handler()
9474 if (piocb->drvrTimeout >= timeout) in lpfc_els_timeout_handler()
9475 piocb->drvrTimeout -= timeout; in lpfc_els_timeout_handler()
9477 piocb->drvrTimeout = 0; in lpfc_els_timeout_handler()
9488 remote_ID = ndlp->nlp_DID; in lpfc_els_timeout_handler()
9490 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_timeout_handler()
9492 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_timeout_handler()
9493 spin_unlock(&pring->ring_lock); in lpfc_els_timeout_handler()
9494 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9502 spin_lock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9503 list_del_init(&piocb->dlist); in lpfc_els_timeout_handler()
9505 spin_unlock_irq(&phba->hbalock); in lpfc_els_timeout_handler()
9511 if (!list_empty(&pring->txcmplq)) in lpfc_els_timeout_handler()
9512 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_els_timeout_handler()
9513 mod_timer(&vport->els_tmofunc, in lpfc_els_timeout_handler()
9518 * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
9525 * the IOCBs with a non-NULL completion callback function, the callback
9542 struct lpfc_hba *phba = vport->phba; in lpfc_els_flush_cmd()
9557 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9562 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9566 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9567 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9569 mbx_tmo_err = test_bit(MBX_TMO_ERR, &phba->bit_flags); in lpfc_els_flush_cmd()
9571 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) { in lpfc_els_flush_cmd()
9576 piocb->iotag, piocb->cmd_flag, in lpfc_els_flush_cmd()
9578 (piocb->vport == vport), in lpfc_els_flush_cmd()
9579 phba->sli.sli_flag); in lpfc_els_flush_cmd()
9581 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9584 if ((phba->sli.sli_flag & LPFC_SLI_ACTIVE) && !mbx_tmo_err) { in lpfc_els_flush_cmd()
9585 if (piocb->cmd_flag & LPFC_IO_LIBDFC) in lpfc_els_flush_cmd()
9587 if (piocb->cmd_flag & LPFC_DRIVER_ABORTED) in lpfc_els_flush_cmd()
9597 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9604 * and avoid any retry logic. in lpfc_els_flush_cmd()
9606 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_els_flush_cmd()
9607 piocb->cmd_cmpl = lpfc_cmpl_els_link_down; in lpfc_els_flush_cmd()
9610 list_add_tail(&piocb->dlist, &abort_list); in lpfc_els_flush_cmd()
9613 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9614 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9615 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9619 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9620 list_del_init(&piocb->dlist); in lpfc_els_flush_cmd()
9621 if (mbx_tmo_err || !(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) in lpfc_els_flush_cmd()
9622 list_move_tail(&piocb->list, &cancel_list); in lpfc_els_flush_cmd()
9626 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9640 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9641 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9642 spin_lock(&pring->ring_lock); in lpfc_els_flush_cmd()
9647 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) { in lpfc_els_flush_cmd()
9650 if (piocb->cmd_flag & LPFC_IO_LIBDFC) in lpfc_els_flush_cmd()
9661 if (piocb->vport != vport) in lpfc_els_flush_cmd()
9664 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9665 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9669 if (vport == phba->pport) { in lpfc_els_flush_cmd()
9671 &phba->fabric_iocb_list, list) { in lpfc_els_flush_cmd()
9672 list_del_init(&piocb->list); in lpfc_els_flush_cmd()
9673 list_add_tail(&piocb->list, &abort_list); in lpfc_els_flush_cmd()
9677 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_flush_cmd()
9678 spin_unlock(&pring->ring_lock); in lpfc_els_flush_cmd()
9679 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_els_flush_cmd()
9689 * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
9710 spin_lock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9711 list_for_each_entry(vport, &phba->port_list, listentry) in lpfc_els_flush_all_cmd()
9713 spin_unlock_irq(&phba->port_list_lock); in lpfc_els_flush_all_cmd()
9719 * lpfc_send_els_failure_event - Posts an ELS command failure event
9732 struct lpfc_vport *vport = cmdiocbp->vport; in lpfc_send_els_failure_event()
9741 ndlp = cmdiocbp->ndlp; in lpfc_send_els_failure_event()
9751 memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9753 memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9755 pcmd = (uint32_t *)cmdiocbp->cmd_dmabuf->virt; in lpfc_send_els_failure_event()
9774 memcpy(fabric_event.wwpn, &ndlp->nlp_portname, in lpfc_send_els_failure_event()
9776 memcpy(fabric_event.wwnn, &ndlp->nlp_nodename, in lpfc_send_els_failure_event()
9789 * lpfc_send_els_event - Posts unsolicited els event
9814 els_data = &logo_data->header; in lpfc_send_els_event()
9825 els_data->event_type = FC_REG_ELS_EVENT; in lpfc_send_els_event()
9828 els_data->subcategory = LPFC_EVENT_PLOGI_RCV; in lpfc_send_els_event()
9831 els_data->subcategory = LPFC_EVENT_PRLO_RCV; in lpfc_send_els_event()
9834 els_data->subcategory = LPFC_EVENT_ADISC_RCV; in lpfc_send_els_event()
9837 els_data->subcategory = LPFC_EVENT_LOGO_RCV; in lpfc_send_els_event()
9839 memcpy(logo_data->logo_wwpn, &payload[2], in lpfc_send_els_event()
9846 memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9847 memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name)); in lpfc_send_els_event()
9883 * lpfc_display_fpin_wwpn - Display WWPNs accessible by the attached port
9905 if (i == (cnt - 1)) in lpfc_display_fpin_wwpn()
9911 len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len, in lpfc_display_fpin_wwpn()
9932 cnt - i - 1); in lpfc_display_fpin_wwpn()
9945 * lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
9958 li_evt = be16_to_cpu(li->event_type); in lpfc_els_rcv_fpin_li()
9960 cnt = be32_to_cpu(li->pname_count); in lpfc_els_rcv_fpin_li()
9967 be64_to_cpu(li->detecting_wwpn), in lpfc_els_rcv_fpin_li()
9968 be64_to_cpu(li->attached_wwpn), in lpfc_els_rcv_fpin_li()
9969 be32_to_cpu(li->event_threshold), in lpfc_els_rcv_fpin_li()
9970 be32_to_cpu(li->event_count), cnt); in lpfc_els_rcv_fpin_li()
9972 lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt); in lpfc_els_rcv_fpin_li()
9976 * lpfc_els_rcv_fpin_del - Process an FPIN Delivery Event.
9990 del_rsn = be16_to_cpu(del->deli_reason_code); in lpfc_els_rcv_fpin_del()
10003 be64_to_cpu(del->detecting_wwpn), in lpfc_els_rcv_fpin_del()
10004 be64_to_cpu(del->attached_wwpn), in lpfc_els_rcv_fpin_del()
10014 * lpfc_els_rcv_fpin_peer_cgn - Process a FPIN Peer Congestion Event.
10027 pc_evt = be16_to_cpu(pc->event_type); in lpfc_els_rcv_fpin_peer_cgn()
10029 cnt = be32_to_cpu(pc->pname_count); in lpfc_els_rcv_fpin_peer_cgn()
10032 phba->cgn_fpin_frequency = be32_to_cpu(pc->event_period); in lpfc_els_rcv_fpin_peer_cgn()
10040 be32_to_cpu(pc->event_period), in lpfc_els_rcv_fpin_peer_cgn()
10041 be64_to_cpu(pc->detecting_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10042 be64_to_cpu(pc->attached_wwpn), in lpfc_els_rcv_fpin_peer_cgn()
10045 lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt); in lpfc_els_rcv_fpin_peer_cgn()
10049 * lpfc_els_rcv_fpin_cgn - Process an FPIN Congestion notification
10073 cgn_evt = be16_to_cpu(cgn->event_type); in lpfc_els_rcv_fpin_cgn()
10075 cgn_sev = cgn->severity; in lpfc_els_rcv_fpin_cgn()
10097 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10098 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) { in lpfc_els_rcv_fpin_cgn()
10100 atomic_inc(&phba->cgn_sync_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10106 atomic_inc(&phba->cgn_fabric_alarm_cnt); in lpfc_els_rcv_fpin_cgn()
10112 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_els_rcv_fpin_cgn()
10113 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) { in lpfc_els_rcv_fpin_cgn()
10115 atomic_inc(&phba->cgn_sync_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10121 atomic_inc(&phba->cgn_fabric_warn_cnt); in lpfc_els_rcv_fpin_cgn()
10124 phba->cgn_fpin_frequency = in lpfc_els_rcv_fpin_cgn()
10125 be32_to_cpu(cgn->event_period); in lpfc_els_rcv_fpin_cgn()
10126 value = phba->cgn_fpin_frequency; in lpfc_els_rcv_fpin_cgn()
10127 if (phba->cgn_i) { in lpfc_els_rcv_fpin_cgn()
10129 phba->cgn_i->virt; in lpfc_els_rcv_fpin_cgn()
10130 cp->cgn_alarm_freq = in lpfc_els_rcv_fpin_cgn()
10132 cp->cgn_warn_freq = in lpfc_els_rcv_fpin_cgn()
10138 cp->cgn_info_crc = cpu_to_le32(crc); in lpfc_els_rcv_fpin_cgn()
10157 be32_to_cpu(cgn->event_period)); in lpfc_els_rcv_fpin_cgn()
10164 struct lpfc_hba *phba = vport->phba; in lpfc_els_rcv_fpin()
10173 if (vport->port_state < LPFC_DISC_AUTH) in lpfc_els_rcv_fpin()
10183 len = be32_to_cpu(fpin->desc_len); in lpfc_els_rcv_fpin()
10191 tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0]; in lpfc_els_rcv_fpin()
10193 bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc); in lpfc_els_rcv_fpin()
10194 bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len)); in lpfc_els_rcv_fpin()
10199 dtag = be32_to_cpu(tlv->desc_tag); in lpfc_els_rcv_fpin()
10227 cnt = be32_to_cpu(tlv->desc_len); in lpfc_els_rcv_fpin()
10232 len -= (cnt + sizeof(struct fc_tlv_desc)); in lpfc_els_rcv_fpin()
10243 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv); in lpfc_els_rcv_fpin()
10257 fpin->desc_len = cpu_to_be32(fpin_length); in lpfc_els_rcv_fpin()
10269 * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
10294 if (!vport || !elsiocb->cmd_dmabuf) in lpfc_els_unsol_buffer()
10298 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_buffer()
10299 payload = elsiocb->cmd_dmabuf->virt; in lpfc_els_unsol_buffer()
10300 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_buffer()
10301 payload_len = wcqe_cmpl->total_data_placed; in lpfc_els_unsol_buffer()
10303 payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len; in lpfc_els_unsol_buffer()
10306 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0) in lpfc_els_unsol_buffer()
10322 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_unsol_buffer()
10326 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag) && in lpfc_els_unsol_buffer()
10339 ndlp->nlp_type |= NLP_FABRIC; in lpfc_els_unsol_buffer()
10340 } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) { in lpfc_els_unsol_buffer()
10345 phba->fc_stat.elsRcvFrame++; in lpfc_els_unsol_buffer()
10351 if (test_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag)) { in lpfc_els_unsol_buffer()
10357 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_els_unsol_buffer()
10358 if (!elsiocb->ndlp) in lpfc_els_unsol_buffer()
10360 elsiocb->vport = vport; in lpfc_els_unsol_buffer()
10369 cmd, did, kref_read(&ndlp->kref), vport->port_state, in lpfc_els_unsol_buffer()
10370 vport->fc_flag, vport->fc_myDID, vport->fc_prevDID); in lpfc_els_unsol_buffer()
10373 if ((vport->port_state < LPFC_FABRIC_CFG_LINK) && in lpfc_els_unsol_buffer()
10375 !((cmd == ELS_CMD_PLOGI) && test_bit(FC_PT2PT, &vport->fc_flag))) { in lpfc_els_unsol_buffer()
10385 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10387 phba->fc_stat.elsRcvPLOGI++; in lpfc_els_unsol_buffer()
10389 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_els_unsol_buffer()
10390 test_bit(FC_PT2PT, &phba->pport->fc_flag)) { in lpfc_els_unsol_buffer()
10391 vport->fc_prevDID = vport->fc_myDID; in lpfc_els_unsol_buffer()
10396 vport->fc_myDID = in lpfc_els_unsol_buffer()
10398 &elsiocb->wqe.xmit_els_rsp); in lpfc_els_unsol_buffer()
10401 "%x\n", vport->fc_myDID, in lpfc_els_unsol_buffer()
10402 vport->fc_prevDID); in lpfc_els_unsol_buffer()
10408 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag)) { in lpfc_els_unsol_buffer()
10414 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10415 if (!test_bit(FC_PT2PT, &phba->pport->fc_flag) || in lpfc_els_unsol_buffer()
10416 test_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag)) { in lpfc_els_unsol_buffer()
10430 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10432 phba->fc_stat.elsRcvFLOGI++; in lpfc_els_unsol_buffer()
10437 if (vport->port_state >= LPFC_LOCAL_CFG_LINK && in lpfc_els_unsol_buffer()
10438 test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_els_unsol_buffer()
10439 vport->rcv_flogi_cnt >= 1) { in lpfc_els_unsol_buffer()
10448 if (phba->defer_flogi_acc.flag) in lpfc_els_unsol_buffer()
10457 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10459 phba->fc_stat.elsRcvLOGO++; in lpfc_els_unsol_buffer()
10461 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10474 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10476 phba->fc_stat.elsRcvPRLO++; in lpfc_els_unsol_buffer()
10478 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10486 phba->fc_stat.elsRcvLCB++; in lpfc_els_unsol_buffer()
10490 phba->fc_stat.elsRcvRDP++; in lpfc_els_unsol_buffer()
10494 phba->fc_stat.elsRcvRSCN++; in lpfc_els_unsol_buffer()
10503 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10506 phba->fc_stat.elsRcvADISC++; in lpfc_els_unsol_buffer()
10507 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10518 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10520 phba->fc_stat.elsRcvPDISC++; in lpfc_els_unsol_buffer()
10521 if (vport->port_state < LPFC_DISC_AUTH) { in lpfc_els_unsol_buffer()
10532 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10534 phba->fc_stat.elsRcvFARPR++; in lpfc_els_unsol_buffer()
10540 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10542 phba->fc_stat.elsRcvFARP++; in lpfc_els_unsol_buffer()
10548 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10550 phba->fc_stat.elsRcvFAN++; in lpfc_els_unsol_buffer()
10557 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10559 phba->fc_stat.elsRcvPRLI++; in lpfc_els_unsol_buffer()
10560 if ((vport->port_state < LPFC_DISC_AUTH) && in lpfc_els_unsol_buffer()
10561 test_bit(FC_FABRIC, &vport->fc_flag)) { in lpfc_els_unsol_buffer()
10571 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10573 phba->fc_stat.elsRcvLIRR++; in lpfc_els_unsol_buffer()
10582 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10584 phba->fc_stat.elsRcvRLS++; in lpfc_els_unsol_buffer()
10593 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10595 phba->fc_stat.elsRcvRPL++; in lpfc_els_unsol_buffer()
10604 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10606 phba->fc_stat.elsRcvRNID++; in lpfc_els_unsol_buffer()
10615 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10616 phba->fc_stat.elsRcvRTV++; in lpfc_els_unsol_buffer()
10625 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10627 phba->fc_stat.elsRcvRRQ++; in lpfc_els_unsol_buffer()
10636 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10638 phba->fc_stat.elsRcvECHO++; in lpfc_els_unsol_buffer()
10653 did, vport->port_state, ndlp->nlp_flag); in lpfc_els_unsol_buffer()
10664 phba->fc_stat.elsRcvRDF++; in lpfc_els_unsol_buffer()
10680 cmd, did, vport->port_state); in lpfc_els_unsol_buffer()
10711 lpfc_nlp_put(elsiocb->ndlp); in lpfc_els_unsol_buffer()
10712 elsiocb->ndlp = NULL; in lpfc_els_unsol_buffer()
10719 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_els_unsol_buffer()
10724 phba->cfg_topology, in lpfc_els_unsol_buffer()
10725 phba->cfg_link_speed); in lpfc_els_unsol_buffer()
10726 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_els_unsol_buffer()
10727 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_els_unsol_buffer()
10728 mbox->vport = vport; in lpfc_els_unsol_buffer()
10731 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_els_unsol_buffer()
10737 if (vport && !test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_els_unsol_buffer()
10743 phba->fc_stat.elsRcvDrop++; in lpfc_els_unsol_buffer()
10747 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
10762 struct lpfc_vport *vport = elsiocb->vport; in lpfc_els_unsol_event()
10766 struct lpfc_dmabuf *bdeBuf1 = elsiocb->cmd_dmabuf; in lpfc_els_unsol_event()
10767 struct lpfc_dmabuf *bdeBuf2 = elsiocb->bpl_dmabuf; in lpfc_els_unsol_event()
10770 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10771 elsiocb->rsp_dmabuf = NULL; in lpfc_els_unsol_event()
10772 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10774 wcqe_cmpl = &elsiocb->wcqe_cmpl; in lpfc_els_unsol_event()
10778 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_els_unsol_event()
10779 bde_count = wcqe_cmpl->word3; in lpfc_els_unsol_event()
10781 bde_count = elsiocb->iocb.ulpBdeCount; in lpfc_els_unsol_event()
10788 phba->fc_stat.NoRcvBuf++; in lpfc_els_unsol_event()
10790 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) in lpfc_els_unsol_event()
10795 if (phba->sli_rev == LPFC_SLI_REV3) { in lpfc_els_unsol_event()
10796 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10797 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_els_unsol_event()
10800 if (icmd->unsli3.rcvsli3.vpi == 0xffff) in lpfc_els_unsol_event()
10801 vport = phba->pport; in lpfc_els_unsol_event()
10804 icmd->unsli3.rcvsli3.vpi); in lpfc_els_unsol_event()
10815 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) { in lpfc_els_unsol_event()
10816 elsiocb->cmd_dmabuf = bdeBuf1; in lpfc_els_unsol_event()
10818 elsiocb->bpl_dmabuf = bdeBuf2; in lpfc_els_unsol_event()
10820 icmd = &elsiocb->iocb; in lpfc_els_unsol_event()
10821 paddr = getPaddr(icmd->un.cont64[0].addrHigh, in lpfc_els_unsol_event()
10822 icmd->un.cont64[0].addrLow); in lpfc_els_unsol_event()
10823 elsiocb->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring, in lpfc_els_unsol_event()
10826 paddr = getPaddr(icmd->un.cont64[1].addrHigh, in lpfc_els_unsol_event()
10827 icmd->un.cont64[1].addrLow); in lpfc_els_unsol_event()
10828 elsiocb->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba, in lpfc_els_unsol_event()
10839 if (elsiocb->cmd_dmabuf) { in lpfc_els_unsol_event()
10840 lpfc_in_buf_free(phba, elsiocb->cmd_dmabuf); in lpfc_els_unsol_event()
10841 elsiocb->cmd_dmabuf = NULL; in lpfc_els_unsol_event()
10844 if (elsiocb->bpl_dmabuf) { in lpfc_els_unsol_event()
10845 lpfc_in_buf_free(phba, elsiocb->bpl_dmabuf); in lpfc_els_unsol_event()
10846 elsiocb->bpl_dmabuf = NULL; in lpfc_els_unsol_event()
10864 ndlp->nlp_type |= NLP_FABRIC; in lpfc_start_fdmi()
10871 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_start_fdmi()
10875 * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
10883 * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
10894 * bit is cleared and fc fabric parameters chenged, delay FC NPort in lpfc_do_scr_ns_plogi()
10897 if (test_bit(FC_DISC_DELAYED, &vport->fc_flag)) { in lpfc_do_scr_ns_plogi()
10899 "3334 Delay fc port discovery for %d secs\n", in lpfc_do_scr_ns_plogi()
10900 phba->fc_ratov); in lpfc_do_scr_ns_plogi()
10901 mod_timer(&vport->delayed_disc_tmo, in lpfc_do_scr_ns_plogi()
10902 jiffies + msecs_to_jiffies(1000 * phba->fc_ratov)); in lpfc_do_scr_ns_plogi()
10910 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_do_scr_ns_plogi()
10921 ndlp->nlp_type |= NLP_FABRIC; in lpfc_do_scr_ns_plogi()
10925 if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) { in lpfc_do_scr_ns_plogi()
10932 if ((phba->cfg_enable_SmartSAN || in lpfc_do_scr_ns_plogi()
10933 phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT) && in lpfc_do_scr_ns_plogi()
10934 test_bit(FC_ALLOW_FDMI, &vport->load_flag)) in lpfc_do_scr_ns_plogi()
10939 * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
10953 struct lpfc_vport *vport = pmb->vport; in lpfc_cmpl_reg_new_vport()
10955 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_cmpl_reg_new_vport()
10956 MAILBOX_t *mb = &pmb->u.mb; in lpfc_cmpl_reg_new_vport()
10959 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10961 if (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
10964 " upd bit: x%x \n", mb->mbxStatus, in lpfc_cmpl_reg_new_vport()
10965 mb->un.varRegVpi.upd); in lpfc_cmpl_reg_new_vport()
10966 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_cmpl_reg_new_vport()
10967 mb->un.varRegVpi.upd) in lpfc_cmpl_reg_new_vport()
10970 switch (mb->mbxStatus) { in lpfc_cmpl_reg_new_vport()
10976 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10977 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10980 /* If reg_vpi fail with invalid VPI status, re-init VPI */ in lpfc_cmpl_reg_new_vport()
10982 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
10983 lpfc_init_vpi(phba, pmb, vport->vpi); in lpfc_cmpl_reg_new_vport()
10984 pmb->vport = vport; in lpfc_cmpl_reg_new_vport()
10985 pmb->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_cmpl_reg_new_vport()
11000 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11003 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_reg_new_vport()
11004 if (mb->mbxStatus == MBX_NOT_FINISHED) in lpfc_cmpl_reg_new_vport()
11006 if ((vport->port_type == LPFC_PHYSICAL_PORT) && in lpfc_cmpl_reg_new_vport()
11007 !test_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag)) { in lpfc_cmpl_reg_new_vport()
11008 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11018 spin_lock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11019 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_cmpl_reg_new_vport()
11020 spin_unlock_irq(shost->host_lock); in lpfc_cmpl_reg_new_vport()
11021 if (vport == phba->pport) { in lpfc_cmpl_reg_new_vport()
11022 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_cmpl_reg_new_vport()
11029 if (vport->port_state != LPFC_FDISC) in lpfc_cmpl_reg_new_vport()
11043 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_cmpl_reg_new_vport()
11050 vport->vmid_flag = vport->phba->pport->vmid_flag; in lpfc_cmpl_reg_new_vport()
11056 * lpfc_register_new_vport - Register a new vport with a HBA
11059 * @ndlp: pointer to a node-list data structure.
11070 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_new_vport()
11073 mbox->vport = vport; in lpfc_register_new_vport()
11074 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_register_new_vport()
11075 if (!mbox->ctx_ndlp) { in lpfc_register_new_vport()
11076 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11080 mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport; in lpfc_register_new_vport()
11087 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_register_new_vport()
11102 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_register_new_vport()
11107 * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer
11110 * This routine cancels the retry delay timers to all the vports.
11121 link_state = phba->link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11123 phba->link_state = link_state; in lpfc_cancel_all_vport_retry_delay_timer()
11128 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_cancel_all_vport_retry_delay_timer()
11139 * lpfc_retry_pport_discovery - Start timer to retry FLOGI.
11143 * start a timer to retry FLOGI for the physical port
11151 /* Cancel the all vports retry delay retry timers */ in lpfc_retry_pport_discovery()
11154 /* If fabric require FLOGI, then re-instantiate physical login */ in lpfc_retry_pport_discovery()
11155 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_retry_pport_discovery()
11159 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000)); in lpfc_retry_pport_discovery()
11160 set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_retry_pport_discovery()
11161 ndlp->nlp_last_elscmd = ELS_CMD_FLOGI; in lpfc_retry_pport_discovery()
11162 phba->pport->port_state = LPFC_FLOGI; in lpfc_retry_pport_discovery()
11167 * lpfc_fabric_login_reqd - Check if FLOGI required.
11191 * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
11214 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_fdisc()
11215 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_fdisc()
11219 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp; in lpfc_cmpl_els_fdisc()
11230 vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11235 list_for_each_entry(piocb, &phba->fabric_iocb_list, list) { in lpfc_cmpl_els_fdisc()
11236 lpfc_set_disctmo(piocb->vport); in lpfc_cmpl_els_fdisc()
11241 ulp_status, ulp_word4, vport->fc_prevDID); in lpfc_cmpl_els_fdisc()
11250 /* Check for retry */ in lpfc_cmpl_els_fdisc()
11262 clear_bit(FC_VPORT_CVL_RCVD, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11263 clear_bit(FC_VPORT_LOGO_RCVD, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11264 set_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11265 if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP) in lpfc_cmpl_els_fdisc()
11266 set_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11268 vport->fc_myDID = ulp_word4 & Mask_DID; in lpfc_cmpl_els_fdisc()
11270 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_fdisc()
11276 sp = prsp->virt + sizeof(uint32_t); in lpfc_cmpl_els_fdisc()
11278 memcpy(&vport->fabric_portname, &sp->portName, in lpfc_cmpl_els_fdisc()
11280 memcpy(&vport->fabric_nodename, &sp->nodeName, in lpfc_cmpl_els_fdisc()
11283 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_fdisc()
11289 &vport->fc_nodes, nlp_listp) { in lpfc_cmpl_els_fdisc()
11290 if ((np->nlp_state != NLP_STE_NPR_NODE) || in lpfc_cmpl_els_fdisc()
11291 !test_bit(NLP_NPR_ADISC, &np->nlp_flag)) in lpfc_cmpl_els_fdisc()
11293 clear_bit(NLP_NPR_ADISC, &np->nlp_flag); in lpfc_cmpl_els_fdisc()
11298 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11302 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11303 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cmpl_els_fdisc()
11304 set_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11306 set_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag); in lpfc_cmpl_els_fdisc()
11307 } else if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_cmpl_els_fdisc()
11308 !test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) { in lpfc_cmpl_els_fdisc()
11310 * Driver needs to re-reg VPI in order for f/w in lpfc_cmpl_els_fdisc()
11318 if (test_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag)) in lpfc_cmpl_els_fdisc()
11320 else if (test_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag)) in lpfc_cmpl_els_fdisc()
11332 if (vport->fc_vport && in lpfc_cmpl_els_fdisc()
11333 (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS)) in lpfc_cmpl_els_fdisc()
11343 * lpfc_issue_els_fdisc - Issue a fdisc iocb command
11345 * @ndlp: pointer to a node-list data structure.
11346 * @retry: number of retries to the command IOCB.
11358 * 0 - Successfully issued fdisc iocb command
11359 * 1 - Failed to issue fdisc iocb command
11363 uint8_t retry) in lpfc_issue_els_fdisc() argument
11365 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_fdisc()
11372 int did = ndlp->nlp_DID; in lpfc_issue_els_fdisc()
11375 vport->port_state = LPFC_FDISC; in lpfc_issue_els_fdisc()
11376 vport->fc_myDID = 0; in lpfc_issue_els_fdisc()
11378 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, in lpfc_issue_els_fdisc()
11387 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_issue_els_fdisc()
11388 wqe = &elsiocb->wqe; in lpfc_issue_els_fdisc()
11389 bf_set(els_req64_sid, &wqe->els_req, 0); in lpfc_issue_els_fdisc()
11390 bf_set(els_req64_sp, &wqe->els_req, 1); in lpfc_issue_els_fdisc()
11392 icmd = &elsiocb->iocb; in lpfc_issue_els_fdisc()
11393 icmd->un.elsreq64.myID = 0; in lpfc_issue_els_fdisc()
11394 icmd->un.elsreq64.fl = 1; in lpfc_issue_els_fdisc()
11395 icmd->ulpCt_h = 1; in lpfc_issue_els_fdisc()
11396 icmd->ulpCt_l = 0; in lpfc_issue_els_fdisc()
11399 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_fdisc()
11402 memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm)); in lpfc_issue_els_fdisc()
11405 sp->cmn.e_d_tov = 0; in lpfc_issue_els_fdisc()
11406 sp->cmn.w2.r_a_tov = 0; in lpfc_issue_els_fdisc()
11407 sp->cmn.virtual_fabric_support = 0; in lpfc_issue_els_fdisc()
11408 sp->cls1.classValid = 0; in lpfc_issue_els_fdisc()
11409 sp->cls2.seqDelivery = 1; in lpfc_issue_els_fdisc()
11410 sp->cls3.seqDelivery = 1; in lpfc_issue_els_fdisc()
11416 memcpy(pcmd, &vport->fc_portname, 8); in lpfc_issue_els_fdisc()
11419 memcpy(pcmd, &vport->fc_nodename, 8); in lpfc_issue_els_fdisc()
11420 sp->cmn.valid_vendor_ver_level = 0; in lpfc_issue_els_fdisc()
11421 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion)); in lpfc_issue_els_fdisc()
11424 phba->fc_stat.elsXmitFDISC++; in lpfc_issue_els_fdisc()
11425 elsiocb->cmd_cmpl = lpfc_cmpl_els_fdisc; in lpfc_issue_els_fdisc()
11431 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_fdisc()
11432 if (!elsiocb->ndlp) in lpfc_issue_els_fdisc()
11453 * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
11470 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_npiv_logo()
11475 ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_npiv_logo()
11480 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_cmpl_els_npiv_logo()
11484 irsp = &rspiocb->iocb; in lpfc_cmpl_els_npiv_logo()
11486 tmo = irsp->ulpTimeout; in lpfc_cmpl_els_npiv_logo()
11497 ndlp->nlp_DID, ulp_status, ulp_word4, in lpfc_cmpl_els_npiv_logo()
11498 tmo, vport->num_disc_nodes, in lpfc_cmpl_els_npiv_logo()
11499 kref_read(&ndlp->kref), ndlp->nlp_flag, in lpfc_cmpl_els_npiv_logo()
11500 ndlp->fc4_xpt_flags); in lpfc_cmpl_els_npiv_logo()
11503 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_cmpl_els_npiv_logo()
11504 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_cmpl_els_npiv_logo()
11508 if (test_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags)) { in lpfc_cmpl_els_npiv_logo()
11510 if (ndlp->logo_waitq) in lpfc_cmpl_els_npiv_logo()
11511 wake_up(ndlp->logo_waitq); in lpfc_cmpl_els_npiv_logo()
11512 clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_cmpl_els_npiv_logo()
11513 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_cmpl_els_npiv_logo()
11514 clear_bit(NLP_WAIT_FOR_LOGO, &ndlp->save_flags); in lpfc_cmpl_els_npiv_logo()
11523 * lpfc_issue_els_npiv_logo - Issue a logo off a vport
11525 * @ndlp: pointer to a node-list data structure.
11534 * 0 - Successfully issued logo off the @vport
11535 * 1 - Failed to issue logo off the @vport
11541 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_npiv_logo()
11547 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID, in lpfc_issue_els_npiv_logo()
11552 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_npiv_logo()
11557 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID); in lpfc_issue_els_npiv_logo()
11559 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name)); in lpfc_issue_els_npiv_logo()
11563 ndlp->nlp_DID, ndlp->nlp_flag, 0); in lpfc_issue_els_npiv_logo()
11565 elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo; in lpfc_issue_els_npiv_logo()
11566 set_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_npiv_logo()
11567 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_npiv_logo()
11568 if (!elsiocb->ndlp) { in lpfc_issue_els_npiv_logo()
11582 clear_bit(NLP_LOGO_SND, &ndlp->nlp_flag); in lpfc_issue_els_npiv_logo()
11587 * lpfc_fabric_block_timeout - Handler function to the fabric block timer
11604 spin_lock_irqsave(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11605 tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11607 phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO; in lpfc_fabric_block_timeout()
11608 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); in lpfc_fabric_block_timeout()
11616 * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
11634 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11636 if (atomic_read(&phba->fabric_iocb_count) == 0) { in lpfc_resume_fabric_iocbs()
11637 list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb), in lpfc_resume_fabric_iocbs()
11641 atomic_inc(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11643 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_resume_fabric_iocbs()
11645 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_resume_fabric_iocbs()
11646 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_resume_fabric_iocbs()
11647 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11649 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_resume_fabric_iocbs()
11651 iocb->vport->port_state, 0, 0); in lpfc_resume_fabric_iocbs()
11656 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_resume_fabric_iocbs()
11657 iocb->fabric_cmd_cmpl = NULL; in lpfc_resume_fabric_iocbs()
11658 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_resume_fabric_iocbs()
11660 iocb->wcqe_cmpl.parameter = IOERR_SLI_ABORTED; in lpfc_resume_fabric_iocbs()
11661 iocb->cmd_cmpl(phba, iocb, iocb); in lpfc_resume_fabric_iocbs()
11663 atomic_dec(&phba->fabric_iocb_count); in lpfc_resume_fabric_iocbs()
11670 * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
11681 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_unblock_fabric_iocbs()
11688 * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
11701 blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_block_fabric_iocbs()
11704 mod_timer(&phba->fabric_block_timer, in lpfc_block_fabric_iocbs()
11711 * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
11717 * callback function pointer (iocb->cmd_cmpl). The original iocb's callback
11718 * function pointer has been stored in iocb->fabric_cmd_cmpl. This callback
11731 WARN_ON((cmdiocb->cmd_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC); in lpfc_cmpl_fabric_iocb()
11754 BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0); in lpfc_cmpl_fabric_iocb()
11756 cmdiocb->cmd_cmpl = cmdiocb->fabric_cmd_cmpl; in lpfc_cmpl_fabric_iocb()
11757 cmdiocb->fabric_cmd_cmpl = NULL; in lpfc_cmpl_fabric_iocb()
11758 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_cmpl_fabric_iocb()
11759 cmdiocb->cmd_cmpl(phba, cmdiocb, rspiocb); in lpfc_cmpl_fabric_iocb()
11761 atomic_dec(&phba->fabric_iocb_count); in lpfc_cmpl_fabric_iocb()
11762 if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) { in lpfc_cmpl_fabric_iocb()
11769 * lpfc_issue_fabric_iocb - Issue a fabric iocb command
11773 * This routine is used as the top-level API for issuing a fabric iocb command
11789 * IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
11790 * IOCB_ERROR - failed to issue fabric iocb
11799 BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1); in lpfc_issue_fabric_iocb()
11801 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11802 ready = atomic_read(&phba->fabric_iocb_count) == 0 && in lpfc_issue_fabric_iocb()
11803 !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_issue_fabric_iocb()
11807 atomic_inc(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11808 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11810 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl; in lpfc_issue_fabric_iocb()
11811 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb; in lpfc_issue_fabric_iocb()
11812 iocb->cmd_flag |= LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11814 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD, in lpfc_issue_fabric_iocb()
11816 iocb->vport->port_state, 0, 0); in lpfc_issue_fabric_iocb()
11821 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl; in lpfc_issue_fabric_iocb()
11822 iocb->fabric_cmd_cmpl = NULL; in lpfc_issue_fabric_iocb()
11823 iocb->cmd_flag &= ~LPFC_IO_FABRIC; in lpfc_issue_fabric_iocb()
11824 atomic_dec(&phba->fabric_iocb_count); in lpfc_issue_fabric_iocb()
11827 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11828 list_add_tail(&iocb->list, &phba->fabric_iocb_list); in lpfc_issue_fabric_iocb()
11829 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_issue_fabric_iocb()
11836 * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
11849 struct lpfc_hba *phba = vport->phba; in lpfc_fabric_abort_vport()
11852 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11853 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_vport()
11856 if (piocb->vport != vport) in lpfc_fabric_abort_vport()
11859 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_vport()
11861 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_vport()
11869 * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
11870 * @ndlp: pointer to a node-list data structure.
11882 struct lpfc_hba *phba = ndlp->phba; in lpfc_fabric_abort_nport()
11891 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11892 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list, in lpfc_fabric_abort_nport()
11896 list_move_tail(&piocb->list, &completions); in lpfc_fabric_abort_nport()
11899 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_nport()
11907 * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
11921 spin_lock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
11922 list_splice_init(&phba->fabric_iocb_list, &completions); in lpfc_fabric_abort_hba()
11923 spin_unlock_irq(&phba->hbalock); in lpfc_fabric_abort_hba()
11931 * lpfc_sli4_vport_delete_els_xri_aborted -Remove all ndlp references for vport
11940 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_vport_delete_els_xri_aborted()
11945 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
11947 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_vport_delete_els_xri_aborted()
11948 if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) { in lpfc_sli4_vport_delete_els_xri_aborted()
11949 lpfc_nlp_put(sglq_entry->ndlp); in lpfc_sli4_vport_delete_els_xri_aborted()
11950 ndlp = sglq_entry->ndlp; in lpfc_sli4_vport_delete_els_xri_aborted()
11951 sglq_entry->ndlp = NULL; in lpfc_sli4_vport_delete_els_xri_aborted()
11957 if (test_bit(FC_UNLOADING, &vport->load_flag) && in lpfc_sli4_vport_delete_els_xri_aborted()
11958 ndlp->nlp_DID == Fabric_DID) { in lpfc_sli4_vport_delete_els_xri_aborted()
11959 list_del(&sglq_entry->list); in lpfc_sli4_vport_delete_els_xri_aborted()
11960 sglq_entry->state = SGL_FREED; in lpfc_sli4_vport_delete_els_xri_aborted()
11961 list_add_tail(&sglq_entry->list, in lpfc_sli4_vport_delete_els_xri_aborted()
11962 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_vport_delete_els_xri_aborted()
11966 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_vport_delete_els_xri_aborted()
11971 * lpfc_sli4_els_xri_aborted - Slow-path process of els xri abort
11975 * This routine is invoked by the worker thread to process a SLI4 slow-path
11993 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
11995 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { in lpfc_sli4_els_xri_aborted()
11996 if (sglq_entry->sli4_xritag == xri) { in lpfc_sli4_els_xri_aborted()
11997 list_del(&sglq_entry->list); in lpfc_sli4_els_xri_aborted()
11998 ndlp = sglq_entry->ndlp; in lpfc_sli4_els_xri_aborted()
11999 sglq_entry->ndlp = NULL; in lpfc_sli4_els_xri_aborted()
12000 list_add_tail(&sglq_entry->list, in lpfc_sli4_els_xri_aborted()
12001 &phba->sli4_hba.lpfc_els_sgl_list); in lpfc_sli4_els_xri_aborted()
12002 sglq_entry->state = SGL_FREED; in lpfc_sli4_els_xri_aborted()
12003 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, in lpfc_sli4_els_xri_aborted()
12008 sglq_entry->sli4_lxritag, in lpfc_sli4_els_xri_aborted()
12014 if (pring && !list_empty(&pring->txq)) in lpfc_sli4_els_xri_aborted()
12019 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag); in lpfc_sli4_els_xri_aborted()
12024 spin_lock_irqsave(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12026 if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) { in lpfc_sli4_els_xri_aborted()
12027 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12030 sglq_entry->state = SGL_XRI_ABORTED; in lpfc_sli4_els_xri_aborted()
12031 spin_unlock_irqrestore(&phba->hbalock, iflag); in lpfc_sli4_els_xri_aborted()
12035 /* lpfc_sli_abts_recover_port - Recover a port that failed a BLS_ABORT req.
12053 phba = vport->phba; in lpfc_sli_abts_recover_port()
12054 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { in lpfc_sli_abts_recover_port()
12057 "rport in state 0x%x\n", ndlp->nlp_state); in lpfc_sli_abts_recover_port()
12064 shost->host_no, ndlp->nlp_DID, in lpfc_sli_abts_recover_port()
12065 vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, in lpfc_sli_abts_recover_port()
12066 ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12068 * The rport is not responding. Remove the FCP-2 flag to prevent in lpfc_sli_abts_recover_port()
12069 * an ADISC in the follow-up recovery code. in lpfc_sli_abts_recover_port()
12071 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12072 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; in lpfc_sli_abts_recover_port()
12073 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_sli_abts_recover_port()
12074 set_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag); in lpfc_sli_abts_recover_port()
12080 bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE); in lpfc_init_cs_ctl_bitmap()
12092 set_bit(i, vport->vmid_priority_range); in lpfc_vmid_set_cs_ctl_range()
12097 set_bit(ctcl_vmid, vport->vmid_priority_range); in lpfc_vmid_put_cs_ctl()
12104 i = find_first_bit(vport->vmid_priority_range, in lpfc_vmid_get_cs_ctl()
12110 clear_bit(i, vport->vmid_priority_range); in lpfc_vmid_get_cs_ctl()
12120 struct lpfc_vport *vport = cmdiocb->vport; in lpfc_cmpl_els_qfpa()
12125 struct lpfc_dmabuf *dmabuf = cmdiocb->cmd_dmabuf; in lpfc_cmpl_els_qfpa()
12130 struct lpfc_nodelist *ndlp = cmdiocb->ndlp; in lpfc_cmpl_els_qfpa()
12132 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_qfpa()
12136 pcmd = prsp->virt; in lpfc_cmpl_els_qfpa()
12151 if (!vport->qfpa_res) { in lpfc_cmpl_els_qfpa()
12152 max_desc = FCELSSIZE / sizeof(*vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12153 vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res), in lpfc_cmpl_els_qfpa()
12155 if (!vport->qfpa_res) in lpfc_cmpl_els_qfpa()
12161 memcpy(vport->qfpa_res, pcmd, len + 8); in lpfc_cmpl_els_qfpa()
12165 vmid_range = vport->vmid_priority.vmid_range; in lpfc_cmpl_els_qfpa()
12170 kfree(vport->qfpa_res); in lpfc_cmpl_els_qfpa()
12173 vport->vmid_priority.vmid_range = vmid_range; in lpfc_cmpl_els_qfpa()
12175 vport->vmid_priority.num_descriptors = len; in lpfc_cmpl_els_qfpa()
12180 "local ve id=%d\n", desc->lo_range, in lpfc_cmpl_els_qfpa()
12181 desc->hi_range, desc->qos_priority, in lpfc_cmpl_els_qfpa()
12182 desc->local_ve_id); in lpfc_cmpl_els_qfpa()
12184 vmid_range->low = desc->lo_range << 1; in lpfc_cmpl_els_qfpa()
12185 if (desc->local_ve_id == QFPA_ODD_ONLY) in lpfc_cmpl_els_qfpa()
12186 vmid_range->low++; in lpfc_cmpl_els_qfpa()
12187 if (desc->qos_priority) in lpfc_cmpl_els_qfpa()
12188 vport->vmid_flag |= LPFC_VMID_QOS_ENABLED; in lpfc_cmpl_els_qfpa()
12189 vmid_range->qos = desc->qos_priority; in lpfc_cmpl_els_qfpa()
12191 vmid_range->high = desc->hi_range << 1; in lpfc_cmpl_els_qfpa()
12192 if ((desc->local_ve_id == QFPA_ODD_ONLY) || in lpfc_cmpl_els_qfpa()
12193 (desc->local_ve_id == QFPA_EVEN_ODD)) in lpfc_cmpl_els_qfpa()
12194 vmid_range->high++; in lpfc_cmpl_els_qfpa()
12197 for (i = 0; i < vport->vmid_priority.num_descriptors; i++) { in lpfc_cmpl_els_qfpa()
12199 vport->vmid_priority.vmid_range[i].low, in lpfc_cmpl_els_qfpa()
12200 vport->vmid_priority.vmid_range[i].high); in lpfc_cmpl_els_qfpa()
12203 vport->vmid_flag |= LPFC_VMID_QFPA_CMPL; in lpfc_cmpl_els_qfpa()
12211 struct lpfc_hba *phba = vport->phba; in lpfc_issue_els_qfpa()
12217 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_issue_els_qfpa()
12218 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_issue_els_qfpa()
12219 return -ENXIO; in lpfc_issue_els_qfpa()
12222 ndlp->nlp_DID, ELS_CMD_QFPA); in lpfc_issue_els_qfpa()
12224 return -ENOMEM; in lpfc_issue_els_qfpa()
12226 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_issue_els_qfpa()
12231 elsiocb->cmd_cmpl = lpfc_cmpl_els_qfpa; in lpfc_issue_els_qfpa()
12233 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_issue_els_qfpa()
12234 if (!elsiocb->ndlp) { in lpfc_issue_els_qfpa()
12235 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_issue_els_qfpa()
12236 return -ENXIO; in lpfc_issue_els_qfpa()
12243 return -EIO; in lpfc_issue_els_qfpa()
12245 vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED; in lpfc_issue_els_qfpa()
12263 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_vmid_uvem()
12264 return -ENXIO; in lpfc_vmid_uvem()
12268 return -ENOMEM; in lpfc_vmid_uvem()
12276 vmid->host_vmid, instantiated); in lpfc_vmid_uvem()
12277 vmid_context->vmp = vmid; in lpfc_vmid_uvem()
12278 vmid_context->nlp = ndlp; in lpfc_vmid_uvem()
12279 vmid_context->instantiated = instantiated; in lpfc_vmid_uvem()
12280 elsiocb->vmid_tag.vmid_context = vmid_context; in lpfc_vmid_uvem()
12281 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt; in lpfc_vmid_uvem()
12283 if (!memchr_inv(vport->lpfc_vmid_host_uuid, 0, in lpfc_vmid_uvem()
12284 sizeof(vport->lpfc_vmid_host_uuid))) in lpfc_vmid_uvem()
12285 memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid, in lpfc_vmid_uvem()
12286 sizeof(vport->lpfc_vmid_host_uuid)); in lpfc_vmid_uvem()
12290 *len = cpu_to_be32(LPFC_UVEM_SIZE - 8); in lpfc_vmid_uvem()
12293 vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG); in lpfc_vmid_uvem()
12294 vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE); in lpfc_vmid_uvem()
12295 memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid, in lpfc_vmid_uvem()
12296 sizeof(vem_id_desc->vem_id)); in lpfc_vmid_uvem()
12299 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12300 inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE); in lpfc_vmid_uvem()
12301 memcpy(inst_desc->global_vem_id, vmid->host_vmid, in lpfc_vmid_uvem()
12302 sizeof(inst_desc->global_vem_id)); in lpfc_vmid_uvem()
12304 bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID); in lpfc_vmid_uvem()
12306 vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12308 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12310 inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG); in lpfc_vmid_uvem()
12311 lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid); in lpfc_vmid_uvem()
12313 inst_desc->word6 = cpu_to_be32(inst_desc->word6); in lpfc_vmid_uvem()
12315 elsiocb->cmd_cmpl = lpfc_cmpl_els_uvem; in lpfc_vmid_uvem()
12317 elsiocb->ndlp = lpfc_nlp_get(ndlp); in lpfc_vmid_uvem()
12318 if (!elsiocb->ndlp) { in lpfc_vmid_uvem()
12319 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12323 ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0); in lpfc_vmid_uvem()
12325 lpfc_els_free_iocb(vport->phba, elsiocb); in lpfc_vmid_uvem()
12333 return -EIO; in lpfc_vmid_uvem()
12340 struct lpfc_vport *vport = icmdiocb->vport; in lpfc_cmpl_els_uvem()
12343 icmdiocb->vmid_tag.vmid_context; in lpfc_cmpl_els_uvem()
12344 struct lpfc_nodelist *ndlp = icmdiocb->ndlp; in lpfc_cmpl_els_uvem()
12349 struct lpfc_dmabuf *dmabuf = icmdiocb->cmd_dmabuf; in lpfc_cmpl_els_uvem()
12352 vmid = vmid_context->vmp; in lpfc_cmpl_els_uvem()
12353 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) in lpfc_cmpl_els_uvem()
12356 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list); in lpfc_cmpl_els_uvem()
12359 pcmd = prsp->virt; in lpfc_cmpl_els_uvem()
12372 spin_lock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12374 vport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12375 phba->pport->vmid_flag |= LPFC_VMID_IN_USE; in lpfc_cmpl_els_uvem()
12376 spin_unlock(&phba->hbalock); in lpfc_cmpl_els_uvem()
12378 if (vmid_context->instantiated) { in lpfc_cmpl_els_uvem()
12379 write_lock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()
12380 vmid->flag |= LPFC_VMID_REGISTERED; in lpfc_cmpl_els_uvem()
12381 vmid->flag &= ~LPFC_VMID_REQ_REGISTER; in lpfc_cmpl_els_uvem()
12382 write_unlock(&vport->vmid_lock); in lpfc_cmpl_els_uvem()