Lines Matching +full:timeout +full:- +full:lta
4 * Copyright (C) 2017-2023 Broadcom. All Rights Reserved. The term *
6 * Copyright (C) 2004-2016 Emulex. All rights reserved. *
9 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
17 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
53 /* AlpaArray for assignment of scsid for scan-down and bind_method */
81 if (ndlp->nlp_fc4_type || in lpfc_valid_xpt_node()
82 ndlp->nlp_type & NLP_FABRIC) in lpfc_valid_xpt_node()
100 return -EINVAL; in lpfc_rport_invalid()
103 rdata = rport->dd_data; in lpfc_rport_invalid()
106 __func__, rport, rport->scsi_target_id); in lpfc_rport_invalid()
107 return -EINVAL; in lpfc_rport_invalid()
110 ndlp = rdata->pnode; in lpfc_rport_invalid()
111 if (!rdata->pnode) { in lpfc_rport_invalid()
113 __func__, rport, rport->scsi_target_id); in lpfc_rport_invalid()
114 return -EINVAL; in lpfc_rport_invalid()
117 if (!ndlp->vport) { in lpfc_rport_invalid()
119 "SID x%x\n", __func__, ndlp, ndlp->nlp_DID, rport, in lpfc_rport_invalid()
120 rport->scsi_target_id); in lpfc_rport_invalid()
121 return -EINVAL; in lpfc_rport_invalid()
136 rdata = rport->dd_data; in lpfc_terminate_rport_io()
137 ndlp = rdata->pnode; in lpfc_terminate_rport_io()
138 vport = ndlp->vport; in lpfc_terminate_rport_io()
141 ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); in lpfc_terminate_rport_io()
143 if (ndlp->nlp_sid != NLP_NO_SID) in lpfc_terminate_rport_io()
144 lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); in lpfc_terminate_rport_io()
159 ndlp = ((struct lpfc_rport_data *)rport->dd_data)->pnode; in lpfc_dev_loss_tmo_callbk()
163 vport = ndlp->vport; in lpfc_dev_loss_tmo_callbk()
164 phba = vport->phba; in lpfc_dev_loss_tmo_callbk()
168 ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); in lpfc_dev_loss_tmo_callbk()
170 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_callbk()
173 ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag, in lpfc_dev_loss_tmo_callbk()
174 vport->load_flag, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_callbk()
175 ndlp->nlp_state, ndlp->fc4_xpt_flags); in lpfc_dev_loss_tmo_callbk()
178 if ((vport->load_flag & FC_UNLOADING) || in lpfc_dev_loss_tmo_callbk()
179 !(phba->hba_flag & HBA_SETUP)) { in lpfc_dev_loss_tmo_callbk()
180 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
181 ndlp->rport = NULL; in lpfc_dev_loss_tmo_callbk()
187 if (ndlp->fc4_xpt_flags & (NLP_XPT_REGD | SCSI_XPT_REGD)) { in lpfc_dev_loss_tmo_callbk()
188 ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
190 /* NVME transport-registered rports need the in lpfc_dev_loss_tmo_callbk()
193 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_callbk()
194 ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
195 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
197 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
203 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD) && in lpfc_dev_loss_tmo_callbk()
204 !(ndlp->nlp_flag & NLP_DROPPED)) { in lpfc_dev_loss_tmo_callbk()
205 ndlp->nlp_flag |= NLP_DROPPED; in lpfc_dev_loss_tmo_callbk()
206 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
211 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
215 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) in lpfc_dev_loss_tmo_callbk()
218 if (rport->port_name != wwn_to_u64(ndlp->nlp_portname.u.wwn)) in lpfc_dev_loss_tmo_callbk()
221 rport->port_name, in lpfc_dev_loss_tmo_callbk()
222 wwn_to_u64(ndlp->nlp_portname.u.wwn)); in lpfc_dev_loss_tmo_callbk()
224 evtp = &ndlp->dev_loss_evt; in lpfc_dev_loss_tmo_callbk()
226 if (!list_empty(&evtp->evt_listp)) { in lpfc_dev_loss_tmo_callbk()
229 rport->port_name); in lpfc_dev_loss_tmo_callbk()
233 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
234 ndlp->nlp_flag |= NLP_IN_DEV_LOSS; in lpfc_dev_loss_tmo_callbk()
239 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_dev_loss_tmo_callbk()
240 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_dev_loss_tmo_callbk()
246 ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
247 ((struct lpfc_rport_data *)rport->dd_data)->pnode = NULL; in lpfc_dev_loss_tmo_callbk()
248 ndlp->rport = NULL; in lpfc_dev_loss_tmo_callbk()
249 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
251 if (phba->worker_thread) { in lpfc_dev_loss_tmo_callbk()
255 evtp->evt_arg1 = lpfc_nlp_get(ndlp); in lpfc_dev_loss_tmo_callbk()
257 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
258 if (evtp->evt_arg1) { in lpfc_dev_loss_tmo_callbk()
259 evtp->evt = LPFC_EVT_DEV_LOSS; in lpfc_dev_loss_tmo_callbk()
260 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_dev_loss_tmo_callbk()
261 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
265 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
267 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_callbk()
270 "%d\n", __func__, ndlp->nlp_DID, in lpfc_dev_loss_tmo_callbk()
271 ndlp->rport, ndlp->nlp_flag, in lpfc_dev_loss_tmo_callbk()
272 vport->load_flag, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_callbk()
273 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) { in lpfc_dev_loss_tmo_callbk()
274 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
276 ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; in lpfc_dev_loss_tmo_callbk()
277 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
285 * lpfc_check_inactive_vmid_one - VMID inactivity checker for a vport
295 u64 *lta; in lpfc_check_inactive_vmid_one() local
299 write_lock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
301 if (!vport->cur_vmid_cnt) in lpfc_check_inactive_vmid_one()
305 hash_for_each(vport->hash_table, bucket, vmp, hnode) { in lpfc_check_inactive_vmid_one()
307 if (vmp->flag & LPFC_VMID_REGISTERED) { in lpfc_check_inactive_vmid_one()
311 /* if last access time is less than timeout */ in lpfc_check_inactive_vmid_one()
312 lta = per_cpu_ptr(vmp->last_io_time, cpu); in lpfc_check_inactive_vmid_one()
313 if (!lta) in lpfc_check_inactive_vmid_one()
315 difftime = (jiffies) - (*lta); in lpfc_check_inactive_vmid_one()
316 if ((vport->vmid_inactivity_timeout * in lpfc_check_inactive_vmid_one()
327 vmp->flag = LPFC_VMID_DE_REGISTER; in lpfc_check_inactive_vmid_one()
328 write_unlock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
329 if (vport->vmid_priority_tagging) in lpfc_check_inactive_vmid_one()
338 write_lock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
342 vport->cur_vmid_cnt--; in lpfc_check_inactive_vmid_one()
343 ht->flag = LPFC_VMID_SLOT_FREE; in lpfc_check_inactive_vmid_one()
344 free_percpu(ht->last_io_time); in lpfc_check_inactive_vmid_one()
345 ht->last_io_time = NULL; in lpfc_check_inactive_vmid_one()
346 hash_del(&ht->hnode); in lpfc_check_inactive_vmid_one()
352 write_unlock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
356 * lpfc_check_inactive_vmid - VMID inactivity checker
375 for (i = 0; i <= phba->max_vports; i++) { in lpfc_check_inactive_vmid()
377 vport = phba->pport; in lpfc_check_inactive_vmid()
389 * lpfc_check_nlp_post_devloss - Check to restore ndlp refcnt after devloss
403 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_check_nlp_post_devloss()
404 if (ndlp->save_flags & NLP_IN_RECOV_POST_DEV_LOSS) { in lpfc_check_nlp_post_devloss()
405 ndlp->save_flags &= ~NLP_IN_RECOV_POST_DEV_LOSS; in lpfc_check_nlp_post_devloss()
406 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_check_nlp_post_devloss()
409 "8438 Devloss timeout reversed on DID x%x " in lpfc_check_nlp_post_devloss()
412 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, in lpfc_check_nlp_post_devloss()
413 ndlp->nlp_flag, vport->port_state); in lpfc_check_nlp_post_devloss()
414 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_check_nlp_post_devloss()
416 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_check_nlp_post_devloss()
420 * lpfc_dev_loss_tmo_handler - Remote node devloss timeout handler
423 * This function is called from the worker thread when devloss timeout timer
427 * when devloss timeout happened to this @ndlp.
441 vport = ndlp->vport; in lpfc_dev_loss_tmo_handler()
442 name = (uint8_t *)&ndlp->nlp_portname; in lpfc_dev_loss_tmo_handler()
443 phba = vport->phba; in lpfc_dev_loss_tmo_handler()
445 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_dev_loss_tmo_handler()
450 ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_sid); in lpfc_dev_loss_tmo_handler()
452 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_handler()
454 __func__, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
455 ndlp->fc4_xpt_flags, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
458 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
460 "0284 Devloss timeout Ignored on " in lpfc_dev_loss_tmo_handler()
465 ndlp->nlp_DID); in lpfc_dev_loss_tmo_handler()
467 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
468 ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; in lpfc_dev_loss_tmo_handler()
469 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
474 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_dev_loss_tmo_handler()
475 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
481 switch (ndlp->nlp_DID) { in lpfc_dev_loss_tmo_handler()
483 fc_vport = vport->fc_vport; in lpfc_dev_loss_tmo_handler()
486 if (fc_vport->vport_state == in lpfc_dev_loss_tmo_handler()
491 if (phba->hba_flag & HBA_FLOGI_OUTSTANDING) in lpfc_dev_loss_tmo_handler()
496 if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) in lpfc_dev_loss_tmo_handler()
502 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
503 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
511 if (ndlp->nlp_DID & Fabric_DID_MASK) { in lpfc_dev_loss_tmo_handler()
512 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
513 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
518 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
527 "8436 Devloss timeout marked on " in lpfc_dev_loss_tmo_handler()
530 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
531 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
532 vport->port_state); in lpfc_dev_loss_tmo_handler()
533 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
534 ndlp->save_flags |= NLP_IN_RECOV_POST_DEV_LOSS; in lpfc_dev_loss_tmo_handler()
535 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
536 } else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
543 "8437 Devloss timeout ignored on " in lpfc_dev_loss_tmo_handler()
546 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
547 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
548 vport->port_state); in lpfc_dev_loss_tmo_handler()
552 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
553 ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; in lpfc_dev_loss_tmo_handler()
554 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
559 if (ndlp->nlp_sid != NLP_NO_SID) { in lpfc_dev_loss_tmo_handler()
561 lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); in lpfc_dev_loss_tmo_handler()
566 "0203 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
571 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
572 ndlp->nlp_state, ndlp->nlp_rpi, in lpfc_dev_loss_tmo_handler()
573 kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
576 "0204 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
581 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
582 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_dev_loss_tmo_handler()
584 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
585 ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS; in lpfc_dev_loss_tmo_handler()
586 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
591 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
592 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_dev_loss_tmo_handler()
596 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_handler()
612 for (i = 0; i <= phba->max_vports; i++) { in lpfc_check_vmid_qfpa_issue()
614 vport = phba->pport; in lpfc_check_vmid_qfpa_issue()
620 if (vport->vmid_flag & LPFC_VMID_ISSUE_QFPA) { in lpfc_check_vmid_qfpa_issue()
622 vport->vmid_flag &= ~LPFC_VMID_ISSUE_QFPA; in lpfc_check_vmid_qfpa_issue()
629 * lpfc_sli4_post_dev_loss_tmo_handler - SLI4 post devloss timeout handler
631 * @fcf_inuse: SLI4 FCF in-use state reported from devloss timeout handler.
632 * @nlp_did: remote node identifer with devloss timeout.
635 * timeout handler and releasing the reference count for the ndlp with
636 * which the devloss timeout was handled for SLI4 host. For the devloss
637 * timeout of the last remote node which had been in use of FCF, when this
639 * in-use of FCF. When devloss timeout to the last remote using the FCF,
641 * failover process, the in-use FCF shall be unregistered. If the FIP
642 * engine is in FCF discovery process, the devloss timeout state shall
644 * process to unregister the in-use FCF.
650 /* If devloss timeout happened to a remote node when FCF had no in lpfc_sli4_post_dev_loss_tmo_handler()
651 * longer been in-use, do nothing. in lpfc_sli4_post_dev_loss_tmo_handler()
656 if ((phba->hba_flag & HBA_FIP_SUPPORT) && !lpfc_fcf_inuse(phba)) { in lpfc_sli4_post_dev_loss_tmo_handler()
657 spin_lock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
658 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_sli4_post_dev_loss_tmo_handler()
659 if (phba->hba_flag & HBA_DEVLOSS_TMO) { in lpfc_sli4_post_dev_loss_tmo_handler()
660 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
663 phba->hba_flag |= HBA_DEVLOSS_TMO; in lpfc_sli4_post_dev_loss_tmo_handler()
668 if (phba->fcf.fcf_flag & FCF_REDISC_PROG) { in lpfc_sli4_post_dev_loss_tmo_handler()
669 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
675 if (!(phba->hba_flag & (FCF_TS_INPROG | FCF_RR_INPROG))) { in lpfc_sli4_post_dev_loss_tmo_handler()
676 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
679 "unreg in-use FCF and rescan.\n"); in lpfc_sli4_post_dev_loss_tmo_handler()
680 /* Unregister in-use FCF and rescan */ in lpfc_sli4_post_dev_loss_tmo_handler()
684 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
685 if (phba->hba_flag & FCF_TS_INPROG) in lpfc_sli4_post_dev_loss_tmo_handler()
688 if (phba->hba_flag & FCF_RR_INPROG) in lpfc_sli4_post_dev_loss_tmo_handler()
697 * lpfc_alloc_fast_evt - Allocates data structure for posting event
711 if (atomic_read(&phba->fast_event_count) > LPFC_MAX_EVT_COUNT) in lpfc_alloc_fast_evt()
717 atomic_inc(&phba->fast_event_count); in lpfc_alloc_fast_evt()
718 INIT_LIST_HEAD(&ret->work_evt.evt_listp); in lpfc_alloc_fast_evt()
719 ret->work_evt.evt = LPFC_EVT_FASTPATH_MGMT_EVT; in lpfc_alloc_fast_evt()
725 * lpfc_free_fast_evt - Frees event data structure
736 atomic_dec(&phba->fast_event_count); in lpfc_free_fast_evt()
741 * lpfc_send_fastpath_evt - Posts events generated from fast path
762 evt_category = (unsigned long) fast_evt_data->un.fabric_evt.event_type; in lpfc_send_fastpath_evt()
763 evt_sub_category = (unsigned long) fast_evt_data->un. in lpfc_send_fastpath_evt()
765 shost = lpfc_shost_from_vport(fast_evt_data->vport); in lpfc_send_fastpath_evt()
768 evt_data = (char *) &fast_evt_data->un.read_check_error; in lpfc_send_fastpath_evt()
769 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
773 evt_data = (char *) &fast_evt_data->un.fabric_evt; in lpfc_send_fastpath_evt()
774 evt_data_size = sizeof(fast_evt_data->un.fabric_evt); in lpfc_send_fastpath_evt()
783 evt_data = (char *) &fast_evt_data->un.scsi_evt; in lpfc_send_fastpath_evt()
784 evt_data_size = sizeof(fast_evt_data->un.scsi_evt); in lpfc_send_fastpath_evt()
787 evt_data = (char *) &fast_evt_data->un.check_cond_evt; in lpfc_send_fastpath_evt()
788 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
792 evt_data = (char *) &fast_evt_data->un.queue_depth_evt; in lpfc_send_fastpath_evt()
793 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
805 if (phba->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_send_fastpath_evt()
826 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
827 while (!list_empty(&phba->work_list)) { in lpfc_work_list_done()
828 list_remove_head((&phba->work_list), evtp, typeof(*evtp), in lpfc_work_list_done()
830 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
831 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_list_done()
833 switch (evtp->evt) { in lpfc_work_list_done()
835 ndlp = (struct lpfc_nodelist *) (evtp->evt_arg1); in lpfc_work_list_done()
846 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
852 nlp_did = ndlp->nlp_DID; in lpfc_work_list_done()
854 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_list_done()
860 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
862 lpfc_sli_abts_recover_port(ndlp->vport, ndlp); in lpfc_work_list_done()
871 if (phba->link_state < LPFC_LINK_DOWN) in lpfc_work_list_done()
872 *(int *) (evtp->evt_arg1) = lpfc_online(phba); in lpfc_work_list_done()
874 *(int *) (evtp->evt_arg1) = 0; in lpfc_work_list_done()
875 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
878 if (phba->link_state >= LPFC_LINK_DOWN) in lpfc_work_list_done()
880 *(int *)(evtp->evt_arg1) = 0; in lpfc_work_list_done()
881 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
886 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
889 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
896 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
899 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
903 *(int *)(evtp->evt_arg1) in lpfc_work_list_done()
904 = (phba->pport->stopped) in lpfc_work_list_done()
907 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
914 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_work_list_done()
920 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
922 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
936 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_done()
937 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
938 ha_copy = phba->work_ha; in lpfc_work_done()
939 phba->work_ha = 0; in lpfc_work_done()
940 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
945 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC && !hba_pci_err) in lpfc_work_done()
952 if (phba->fw_dump_cmpl) { in lpfc_work_done()
953 complete(phba->fw_dump_cmpl); in lpfc_work_done()
954 phba->fw_dump_cmpl = NULL; in lpfc_work_done()
966 if (phba->pport->work_port_events & in lpfc_work_done()
969 phba->pport->work_port_events &= in lpfc_work_done()
972 if (phba->pport->work_port_events & in lpfc_work_done()
975 phba->pport->work_port_events &= in lpfc_work_done()
981 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) { in lpfc_work_done()
982 if (phba->hba_flag & HBA_RRQ_ACTIVE) in lpfc_work_done()
984 if (phba->hba_flag & ELS_XRI_ABORT_EVENT) in lpfc_work_done()
986 if (phba->hba_flag & ASYNC_EVENT) in lpfc_work_done()
988 if (phba->hba_flag & HBA_POST_RECEIVE_BUFFER) { in lpfc_work_done()
989 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
990 phba->hba_flag &= ~HBA_POST_RECEIVE_BUFFER; in lpfc_work_done()
991 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
994 if (phba->fcf.fcf_flag & FCF_REDISC_EVT) in lpfc_work_done()
1000 for (i = 0; i <= phba->max_vports; i++) { in lpfc_work_done()
1006 vport = phba->pport; in lpfc_work_done()
1011 spin_lock_irq(&vport->work_port_lock); in lpfc_work_done()
1012 work_port_events = vport->work_port_events; in lpfc_work_done()
1013 vport->work_port_events &= ~work_port_events; in lpfc_work_done()
1014 spin_unlock_irq(&vport->work_port_lock); in lpfc_work_done()
1038 pring->flag & LPFC_DEFERRED_RING_EVENT || in lpfc_work_done()
1039 phba->hba_flag & HBA_SP_QUEUE_EVT)) { in lpfc_work_done()
1040 if (pring->flag & LPFC_STOP_IOCB_EVENT) { in lpfc_work_done()
1041 pring->flag |= LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1043 if (!(phba->hba_flag & HBA_SP_QUEUE_EVT)) in lpfc_work_done()
1044 set_bit(LPFC_DATA_READY, &phba->data_flags); in lpfc_work_done()
1049 if (phba->link_state >= LPFC_LINK_DOWN || in lpfc_work_done()
1050 phba->link_flag & LS_MDS_LOOPBACK) { in lpfc_work_done()
1051 pring->flag &= ~LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1057 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_done()
1062 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_work_done()
1063 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
1064 control = readl(phba->HCregaddr); in lpfc_work_done()
1071 writel(control, phba->HCregaddr); in lpfc_work_done()
1072 readl(phba->HCregaddr); /* flush */ in lpfc_work_done()
1078 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
1091 current->flags |= PF_NOFREEZE; in lpfc_do_work()
1092 phba->data_flags = 0; in lpfc_do_work()
1096 rc = wait_event_interruptible(phba->work_waitq, in lpfc_do_work()
1098 &phba->data_flags) in lpfc_do_work()
1110 phba->worker_thread = NULL; in lpfc_do_work()
1136 evtp->evt_arg1 = arg1; in lpfc_workq_post_event()
1137 evtp->evt_arg2 = arg2; in lpfc_workq_post_event()
1138 evtp->evt = evt; in lpfc_workq_post_event()
1140 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_workq_post_event()
1141 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_workq_post_event()
1142 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_workq_post_event()
1153 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_rpis()
1156 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_cleanup_rpis()
1157 if ((phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) || in lpfc_cleanup_rpis()
1158 ((vport->port_type == LPFC_NPIV_PORT) && in lpfc_cleanup_rpis()
1159 ((ndlp->nlp_DID == NameServer_DID) || in lpfc_cleanup_rpis()
1160 (ndlp->nlp_DID == FDMI_DID) || in lpfc_cleanup_rpis()
1161 (ndlp->nlp_DID == Fabric_Cntl_DID)))) in lpfc_cleanup_rpis()
1165 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_cleanup_rpis()
1166 (!remove && ndlp->nlp_type & NLP_FABRIC)) in lpfc_cleanup_rpis()
1170 if (phba->nvmet_support && in lpfc_cleanup_rpis()
1171 ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) in lpfc_cleanup_rpis()
1179 if (phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) { in lpfc_cleanup_rpis()
1180 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cleanup_rpis()
1183 spin_lock_irq(shost->host_lock); in lpfc_cleanup_rpis()
1184 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_cleanup_rpis()
1185 spin_unlock_irq(shost->host_lock); in lpfc_cleanup_rpis()
1212 struct lpfc_hba *phba = vport->phba; in lpfc_linkdown_port()
1215 if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_linkdown_port()
1221 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_linkdown_port()
1226 spin_lock_irq(shost->host_lock); in lpfc_linkdown_port()
1227 vport->fc_flag &= ~FC_DISC_DELAYED; in lpfc_linkdown_port()
1228 spin_unlock_irq(shost->host_lock); in lpfc_linkdown_port()
1229 del_timer_sync(&vport->delayed_disc_tmo); in lpfc_linkdown_port()
1231 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_linkdown_port()
1232 vport->port_type == LPFC_PHYSICAL_PORT && in lpfc_linkdown_port()
1233 phba->sli4_hba.fawwpn_flag & LPFC_FAWWPN_CONFIG) { in lpfc_linkdown_port()
1235 phba->sli4_hba.fawwpn_flag |= LPFC_FAWWPN_FABRIC; in lpfc_linkdown_port()
1242 struct lpfc_vport *vport = phba->pport; in lpfc_linkdown()
1249 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_linkdown()
1254 offline = pci_channel_offline(phba->pcidev); in lpfc_linkdown()
1256 phba->defer_flogi_acc_flag = false; in lpfc_linkdown()
1259 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_linkdown()
1261 spin_lock_irq(&phba->hbalock); in lpfc_linkdown()
1262 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_linkdown()
1263 spin_unlock_irq(&phba->hbalock); in lpfc_linkdown()
1264 if (phba->link_state > LPFC_LINK_DOWN) { in lpfc_linkdown()
1265 phba->link_state = LPFC_LINK_DOWN; in lpfc_linkdown()
1266 if (phba->sli4_hba.conf_trunk) { in lpfc_linkdown()
1267 phba->trunk_link.link0.state = 0; in lpfc_linkdown()
1268 phba->trunk_link.link1.state = 0; in lpfc_linkdown()
1269 phba->trunk_link.link2.state = 0; in lpfc_linkdown()
1270 phba->trunk_link.link3.state = 0; in lpfc_linkdown()
1271 phba->trunk_link.phy_lnk_speed = in lpfc_linkdown()
1273 phba->sli4_hba.link_state.logical_speed = in lpfc_linkdown()
1276 spin_lock_irq(shost->host_lock); in lpfc_linkdown()
1277 phba->pport->fc_flag &= ~FC_LBIT; in lpfc_linkdown()
1278 spin_unlock_irq(shost->host_lock); in lpfc_linkdown()
1282 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_linkdown()
1286 vports[i]->fc_myDID = 0; in lpfc_linkdown()
1288 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_linkdown()
1289 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_linkdown()
1290 if (phba->nvmet_support) in lpfc_linkdown()
1300 if (phba->sli_rev > LPFC_SLI_REV3 || offline) in lpfc_linkdown()
1303 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1306 mb->vport = vport; in lpfc_linkdown()
1307 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1310 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1316 if (phba->pport->fc_flag & FC_PT2PT) { in lpfc_linkdown()
1317 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1320 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1321 mb->vport = vport; in lpfc_linkdown()
1324 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1327 spin_lock_irq(shost->host_lock); in lpfc_linkdown()
1328 phba->pport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI); in lpfc_linkdown()
1329 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkdown()
1330 spin_unlock_irq(shost->host_lock); in lpfc_linkdown()
1340 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_linkup_cleanup_nodes()
1341 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); in lpfc_linkup_cleanup_nodes()
1343 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_linkup_cleanup_nodes()
1345 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_linkup_cleanup_nodes()
1349 if (ndlp->nlp_DID != Fabric_DID) in lpfc_linkup_cleanup_nodes()
1352 } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { in lpfc_linkup_cleanup_nodes()
1365 struct lpfc_hba *phba = vport->phba; in lpfc_linkup_port()
1367 if ((vport->load_flag & FC_UNLOADING) != 0) in lpfc_linkup_port()
1372 phba->fc_topology, phba->fc_linkspeed, phba->link_flag); in lpfc_linkup_port()
1375 if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_linkup_port()
1376 (vport != phba->pport)) in lpfc_linkup_port()
1379 if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_linkup_port()
1383 spin_lock_irq(shost->host_lock); in lpfc_linkup_port()
1384 if (phba->defer_flogi_acc_flag) in lpfc_linkup_port()
1385 vport->fc_flag &= ~(FC_ABORT_DISCOVERY | FC_RSCN_MODE | in lpfc_linkup_port()
1388 vport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | in lpfc_linkup_port()
1391 vport->fc_flag |= FC_NDISC_ACTIVE; in lpfc_linkup_port()
1392 vport->fc_ns_retry = 0; in lpfc_linkup_port()
1393 spin_unlock_irq(shost->host_lock); in lpfc_linkup_port()
1404 struct Scsi_Host *shost = lpfc_shost_from_vport(phba->pport); in lpfc_linkup()
1406 phba->link_state = LPFC_LINK_UP; in lpfc_linkup()
1409 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_linkup()
1410 del_timer_sync(&phba->fabric_block_timer); in lpfc_linkup()
1414 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) in lpfc_linkup()
1419 * absorbed without an ACQE. No lock here - in worker thread in lpfc_linkup()
1422 spin_lock_irq(shost->host_lock); in lpfc_linkup()
1423 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkup()
1424 spin_unlock_irq(shost->host_lock); in lpfc_linkup()
1427 phba->hba_flag &= ~(HBA_FLOGI_ISSUED | HBA_RHBA_CMPL); in lpfc_linkup()
1441 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_clear_la()
1443 struct lpfc_sli *psli = &phba->sli; in lpfc_mbx_cmpl_clear_la()
1444 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_clear_la()
1448 psli->sli3_ring[LPFC_EXTRA_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1449 psli->sli3_ring[LPFC_FCP_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1452 if ((mb->mbxStatus) && (mb->mbxStatus != 0x1601)) { in lpfc_mbx_cmpl_clear_la()
1457 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_clear_la()
1458 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_clear_la()
1462 if (vport->port_type == LPFC_PHYSICAL_PORT) in lpfc_mbx_cmpl_clear_la()
1463 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_clear_la()
1465 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1466 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1467 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1469 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1470 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1471 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1472 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1479 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1481 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_clear_la()
1482 vport->fc_flag &= ~FC_ABORT_DISCOVERY; in lpfc_mbx_cmpl_clear_la()
1483 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_clear_la()
1489 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1490 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1491 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1493 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1494 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1495 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1503 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_local_config_link()
1505 u16 status = pmb->u.mb.mbxStatus; in lpfc_mbx_cmpl_local_config_link()
1508 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1514 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_local_config_link()
1515 !(phba->hba_flag & HBA_FCOE_MODE) && in lpfc_mbx_cmpl_local_config_link()
1516 (phba->link_flag & LS_LOOPBACK_MODE)) in lpfc_mbx_cmpl_local_config_link()
1519 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_mbx_cmpl_local_config_link()
1520 vport->fc_flag & FC_PUBLIC_LOOP && in lpfc_mbx_cmpl_local_config_link()
1521 !(vport->fc_flag & FC_LBIT)) { in lpfc_mbx_cmpl_local_config_link()
1522 /* Need to wait for FAN - use discovery timer in lpfc_mbx_cmpl_local_config_link()
1523 * for timeout. port_state is identically in lpfc_mbx_cmpl_local_config_link()
1533 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_local_config_link()
1535 * bb-credit recovery is in place. in lpfc_mbx_cmpl_local_config_link()
1537 if (phba->bbcredit_support && phba->cfg_enable_bbcr && in lpfc_mbx_cmpl_local_config_link()
1538 !(phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_local_config_link()
1539 sparam_mb = mempool_alloc(phba->mbox_mem_pool, in lpfc_mbx_cmpl_local_config_link()
1546 mempool_free(sparam_mb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1549 sparam_mb->vport = vport; in lpfc_mbx_cmpl_local_config_link()
1550 sparam_mb->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_cmpl_local_config_link()
1558 phba->hba_flag |= HBA_DEFER_FLOGI; in lpfc_mbx_cmpl_local_config_link()
1563 if (vport->fc_flag & FC_PT2PT) in lpfc_mbx_cmpl_local_config_link()
1571 status, vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1578 vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1597 memset(phba->fcf.fcf_rr_bmask, 0, sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_clear_fcf_rr_bmask()
1598 spin_lock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1600 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_clear_fcf_rr_bmask()
1601 list_del_init(&fcf_pri->list); in lpfc_sli4_clear_fcf_rr_bmask()
1602 fcf_pri->fcf_rec.flag = 0; in lpfc_sli4_clear_fcf_rr_bmask()
1604 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1609 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_fcfi()
1611 if (mboxq->u.mb.mbxStatus) { in lpfc_mbx_cmpl_reg_fcfi()
1614 "HBA state x%x\n", mboxq->u.mb.mbxStatus, in lpfc_mbx_cmpl_reg_fcfi()
1615 vport->port_state); in lpfc_mbx_cmpl_reg_fcfi()
1620 phba->fcf.fcfi = bf_get(lpfc_reg_fcfi_fcfi, &mboxq->u.mqe.un.reg_fcfi); in lpfc_mbx_cmpl_reg_fcfi()
1622 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1623 phba->fcf.fcf_flag |= FCF_REGISTERED; in lpfc_mbx_cmpl_reg_fcfi()
1624 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1627 if ((!(phba->hba_flag & FCF_RR_INPROG)) && in lpfc_mbx_cmpl_reg_fcfi()
1632 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1633 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_mbx_cmpl_reg_fcfi()
1634 phba->hba_flag &= ~FCF_TS_INPROG; in lpfc_mbx_cmpl_reg_fcfi()
1635 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_reg_fcfi()
1636 phba->hba_flag |= FCF_RR_INPROG; in lpfc_mbx_cmpl_reg_fcfi()
1637 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1641 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1645 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1646 phba->hba_flag &= ~FCF_RR_INPROG; in lpfc_mbx_cmpl_reg_fcfi()
1647 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1649 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_fcfi()
1653 * lpfc_fab_name_match - Check if the fcf fabric name match.
1684 * lpfc_sw_name_match - Check if the fcf switch name match.
1715 * lpfc_mac_addr_match - Check if the fcf mac address match.
1748 * __lpfc_update_fcf_record_pri - update the lpfc_fcf_pri record.
1764 fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in __lpfc_update_fcf_record_pri()
1765 fcf_pri->fcf_rec.fcf_index = fcf_index; in __lpfc_update_fcf_record_pri()
1767 fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in __lpfc_update_fcf_record_pri()
1772 * lpfc_copy_fcf_record - Copy fcf information to lpfc_hba.
1784 fcf_rec->fabric_name[0] = in lpfc_copy_fcf_record()
1786 fcf_rec->fabric_name[1] = in lpfc_copy_fcf_record()
1788 fcf_rec->fabric_name[2] = in lpfc_copy_fcf_record()
1790 fcf_rec->fabric_name[3] = in lpfc_copy_fcf_record()
1792 fcf_rec->fabric_name[4] = in lpfc_copy_fcf_record()
1794 fcf_rec->fabric_name[5] = in lpfc_copy_fcf_record()
1796 fcf_rec->fabric_name[6] = in lpfc_copy_fcf_record()
1798 fcf_rec->fabric_name[7] = in lpfc_copy_fcf_record()
1801 fcf_rec->mac_addr[0] = bf_get(lpfc_fcf_record_mac_0, new_fcf_record); in lpfc_copy_fcf_record()
1802 fcf_rec->mac_addr[1] = bf_get(lpfc_fcf_record_mac_1, new_fcf_record); in lpfc_copy_fcf_record()
1803 fcf_rec->mac_addr[2] = bf_get(lpfc_fcf_record_mac_2, new_fcf_record); in lpfc_copy_fcf_record()
1804 fcf_rec->mac_addr[3] = bf_get(lpfc_fcf_record_mac_3, new_fcf_record); in lpfc_copy_fcf_record()
1805 fcf_rec->mac_addr[4] = bf_get(lpfc_fcf_record_mac_4, new_fcf_record); in lpfc_copy_fcf_record()
1806 fcf_rec->mac_addr[5] = bf_get(lpfc_fcf_record_mac_5, new_fcf_record); in lpfc_copy_fcf_record()
1808 fcf_rec->fcf_indx = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); in lpfc_copy_fcf_record()
1810 fcf_rec->priority = new_fcf_record->fip_priority; in lpfc_copy_fcf_record()
1812 fcf_rec->switch_name[0] = in lpfc_copy_fcf_record()
1814 fcf_rec->switch_name[1] = in lpfc_copy_fcf_record()
1816 fcf_rec->switch_name[2] = in lpfc_copy_fcf_record()
1818 fcf_rec->switch_name[3] = in lpfc_copy_fcf_record()
1820 fcf_rec->switch_name[4] = in lpfc_copy_fcf_record()
1822 fcf_rec->switch_name[5] = in lpfc_copy_fcf_record()
1824 fcf_rec->switch_name[6] = in lpfc_copy_fcf_record()
1826 fcf_rec->switch_name[7] = in lpfc_copy_fcf_record()
1831 * __lpfc_update_fcf_record - Update driver fcf record
1848 lockdep_assert_held(&phba->hbalock); in __lpfc_update_fcf_record()
1853 fcf_rec->addr_mode = addr_mode; in __lpfc_update_fcf_record()
1854 fcf_rec->vlan_id = vlan_id; in __lpfc_update_fcf_record()
1855 fcf_rec->flag |= (flag | RECORD_VALID); in __lpfc_update_fcf_record()
1862 * lpfc_register_fcf - Register the FCF with hba.
1874 spin_lock_irq(&phba->hbalock); in lpfc_register_fcf()
1876 if (!(phba->fcf.fcf_flag & FCF_AVAILABLE)) { in lpfc_register_fcf()
1877 phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); in lpfc_register_fcf()
1878 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1883 if (phba->fcf.fcf_flag & FCF_REGISTERED) { in lpfc_register_fcf()
1884 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_register_fcf()
1885 phba->hba_flag &= ~FCF_TS_INPROG; in lpfc_register_fcf()
1886 if (phba->pport->port_state != LPFC_FLOGI && in lpfc_register_fcf()
1887 phba->pport->fc_flag & FC_FABRIC) { in lpfc_register_fcf()
1888 phba->hba_flag |= FCF_RR_INPROG; in lpfc_register_fcf()
1889 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1890 lpfc_initial_flogi(phba->pport); in lpfc_register_fcf()
1893 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1896 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1898 fcf_mbxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_fcf()
1900 spin_lock_irq(&phba->hbalock); in lpfc_register_fcf()
1901 phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); in lpfc_register_fcf()
1902 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1907 fcf_mbxq->vport = phba->pport; in lpfc_register_fcf()
1908 fcf_mbxq->mbox_cmpl = lpfc_mbx_cmpl_reg_fcfi; in lpfc_register_fcf()
1911 spin_lock_irq(&phba->hbalock); in lpfc_register_fcf()
1912 phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); in lpfc_register_fcf()
1913 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1914 mempool_free(fcf_mbxq, phba->mbox_mem_pool); in lpfc_register_fcf()
1921 * lpfc_match_fcf_conn_list - Check if the FCF record can be used for discovery.
1949 if (new_fcf_record->vlan_bitmap[i]) { in lpfc_match_fcf_conn_list()
1952 while (!((new_fcf_record->vlan_bitmap[i] >> j) & 1)) { in lpfc_match_fcf_conn_list()
1966 if (!(phba->hba_flag & HBA_FIP_SUPPORT)) { in lpfc_match_fcf_conn_list()
1970 if (phba->valid_vlan) in lpfc_match_fcf_conn_list()
1971 *vlan_id = phba->vlan_id; in lpfc_match_fcf_conn_list()
1981 if (list_empty(&phba->fcf_conn_rec_list)) { in lpfc_match_fcf_conn_list()
1988 * addressing mode - FPMA. in lpfc_match_fcf_conn_list()
2002 &phba->fcf_conn_rec_list, list) { in lpfc_match_fcf_conn_list()
2003 if (!(conn_entry->conn_rec.flags & FCFCNCT_VALID)) in lpfc_match_fcf_conn_list()
2006 if ((conn_entry->conn_rec.flags & FCFCNCT_FBNM_VALID) && in lpfc_match_fcf_conn_list()
2007 !lpfc_fab_name_match(conn_entry->conn_rec.fabric_name, in lpfc_match_fcf_conn_list()
2010 if ((conn_entry->conn_rec.flags & FCFCNCT_SWNM_VALID) && in lpfc_match_fcf_conn_list()
2011 !lpfc_sw_name_match(conn_entry->conn_rec.switch_name, in lpfc_match_fcf_conn_list()
2014 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) { in lpfc_match_fcf_conn_list()
2019 if (!(new_fcf_record->vlan_bitmap in lpfc_match_fcf_conn_list()
2020 [conn_entry->conn_rec.vlan_tag / 8] & in lpfc_match_fcf_conn_list()
2021 (1 << (conn_entry->conn_rec.vlan_tag % 8)))) in lpfc_match_fcf_conn_list()
2037 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2038 !(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED)) { in lpfc_match_fcf_conn_list()
2043 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2051 if (!(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2060 if (conn_entry->conn_rec.flags & FCFCNCT_BOOT) in lpfc_match_fcf_conn_list()
2076 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2077 (!(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED))) in lpfc_match_fcf_conn_list()
2078 *addr_mode = (conn_entry->conn_rec.flags & in lpfc_match_fcf_conn_list()
2085 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2086 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2087 (conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2090 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2091 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2092 !(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2097 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) in lpfc_match_fcf_conn_list()
2098 *vlan_id = conn_entry->conn_rec.vlan_tag; in lpfc_match_fcf_conn_list()
2115 * lpfc_check_pending_fcoe_event - Check if there is pending fcoe event.
2117 * @unreg_fcf: Unregister FCF if FCF table need to be re-scaned.
2130 if ((phba->link_state >= LPFC_LINK_UP) && in lpfc_check_pending_fcoe_event()
2131 (phba->fcoe_eventtag == phba->fcoe_eventtag_at_fcf_scan)) in lpfc_check_pending_fcoe_event()
2138 phba->link_state, phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2139 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2141 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2142 phba->fcf.fcf_flag &= ~FCF_AVAILABLE; in lpfc_check_pending_fcoe_event()
2143 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2145 if (phba->link_state >= LPFC_LINK_UP) { in lpfc_check_pending_fcoe_event()
2150 phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2151 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2160 "state change (x%x)\n", phba->link_state); in lpfc_check_pending_fcoe_event()
2161 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2162 phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); in lpfc_check_pending_fcoe_event()
2163 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY); in lpfc_check_pending_fcoe_event()
2164 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2169 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2170 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_check_pending_fcoe_event()
2171 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2178 * lpfc_sli4_new_fcf_random_select - Randomly select an eligible new fcf record
2185 * size unit32_t, a 16-bit random number returned from get_random_u16() is
2197 /* Get 16-bit uniform random number */ in lpfc_sli4_new_fcf_random_select()
2208 * lpfc_sli4_fcf_rec_mbox_parse - Parse read_fcf mbox command.
2213 * This routine parses the non-embedded fcf mailbox command by performing the
2214 * necessarily error checking, non-embedded read FCF record mailbox command
2217 * Returns the pointer to the new FCF record in the non-embedded mailbox
2231 /* Get the first SGE entry from the non-embedded DMA memory. This in lpfc_sli4_fcf_rec_mbox_parse()
2235 if (unlikely(!mboxq->sge_array)) { in lpfc_sli4_fcf_rec_mbox_parse()
2237 "2524 Failed to get the non-embedded SGE " in lpfc_sli4_fcf_rec_mbox_parse()
2241 virt_addr = mboxq->sge_array->addr[0]; in lpfc_sli4_fcf_rec_mbox_parse()
2246 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2247 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_fcf_rec_mbox_parse()
2248 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2273 new_fcf_record->word137 = le32_to_cpu(new_fcf_record->word137); in lpfc_sli4_fcf_rec_mbox_parse()
2274 new_fcf_record->word138 = le32_to_cpu(new_fcf_record->word138); in lpfc_sli4_fcf_rec_mbox_parse()
2280 * lpfc_sli4_log_fcf_record_info - Log the information of a fcf record
2312 fcf_record->fip_priority, in lpfc_sli4_log_fcf_record_info()
2341 * lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
2360 if (!lpfc_vlan_id_match(fcf_rec->vlan_id, new_vlan_id)) in lpfc_sli4_fcf_record_match()
2362 if (!lpfc_mac_addr_match(fcf_rec->mac_addr, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2364 if (!lpfc_sw_name_match(fcf_rec->switch_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2366 if (!lpfc_fab_name_match(fcf_rec->fabric_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2368 if (fcf_rec->priority != new_fcf_record->fip_priority) in lpfc_sli4_fcf_record_match()
2374 * lpfc_sli4_fcf_rr_next_proc - processing next roundrobin fcf
2386 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_fcf_rr_next_proc()
2390 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2391 if (phba->hba_flag & HBA_DEVLOSS_TMO) { in lpfc_sli4_fcf_rr_next_proc()
2392 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2395 "FCF, unregister in-use FCF (x%x) " in lpfc_sli4_fcf_rr_next_proc()
2397 phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2402 phba->hba_flag &= ~FCF_RR_INPROG; in lpfc_sli4_fcf_rr_next_proc()
2404 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_sli4_fcf_rr_next_proc()
2405 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2409 phba->pport->port_state, LPFC_VPORT_UNKNOWN); in lpfc_sli4_fcf_rr_next_proc()
2410 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_sli4_fcf_rr_next_proc()
2412 if (!phba->fcf.fcf_redisc_attempted) { in lpfc_sli4_fcf_rr_next_proc()
2419 phba->fcf.fcf_redisc_attempted = 1; in lpfc_sli4_fcf_rr_next_proc()
2441 rc, phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2466 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_del()
2469 fcf_index, new_fcf_pri->fcf_rec.priority, in lpfc_sli4_fcf_pri_list_del()
2470 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_del()
2471 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2472 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) { in lpfc_sli4_fcf_pri_list_del()
2473 if (phba->fcf.current_rec.priority == in lpfc_sli4_fcf_pri_list_del()
2474 new_fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_del()
2475 phba->fcf.eligible_fcf_cnt--; in lpfc_sli4_fcf_pri_list_del()
2476 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_del()
2477 new_fcf_pri->fcf_rec.flag &= ~LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_del()
2479 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2489 * If the fcf record is re-read for any reason this flag is cleared brfore
2496 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_set_fcf_flogi_fail()
2497 spin_lock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2498 new_fcf_pri->fcf_rec.flag |= LPFC_FCF_FLOGI_FAILED; in lpfc_sli4_set_fcf_flogi_fail()
2499 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2529 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_add()
2532 fcf_index, new_fcf_record->fip_priority, in lpfc_sli4_fcf_pri_list_add()
2533 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_add()
2534 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2535 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) in lpfc_sli4_fcf_pri_list_add()
2536 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2537 new_fcf_pri->fcf_rec.fcf_index = fcf_index; in lpfc_sli4_fcf_pri_list_add()
2538 new_fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in lpfc_sli4_fcf_pri_list_add()
2539 if (list_empty(&phba->fcf.fcf_pri_list)) { in lpfc_sli4_fcf_pri_list_add()
2540 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2542 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2546 last_index = find_first_bit(phba->fcf.fcf_rr_bmask, in lpfc_sli4_fcf_pri_list_add()
2552 current_fcf_pri = phba->fcf.fcf_pri[last_index].fcf_rec.priority; in lpfc_sli4_fcf_pri_list_add()
2553 if (new_fcf_pri->fcf_rec.priority <= current_fcf_pri) { in lpfc_sli4_fcf_pri_list_add()
2554 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2555 if (new_fcf_pri->fcf_rec.priority < current_fcf_pri) { in lpfc_sli4_fcf_pri_list_add()
2556 memset(phba->fcf.fcf_rr_bmask, 0, in lpfc_sli4_fcf_pri_list_add()
2557 sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_fcf_pri_list_add()
2559 phba->fcf.eligible_fcf_cnt = 1; in lpfc_sli4_fcf_pri_list_add()
2562 phba->fcf.eligible_fcf_cnt++; in lpfc_sli4_fcf_pri_list_add()
2564 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2569 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_fcf_pri_list_add()
2570 if (new_fcf_pri->fcf_rec.priority <= in lpfc_sli4_fcf_pri_list_add()
2571 fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2572 if (fcf_pri->list.prev == &phba->fcf.fcf_pri_list) in lpfc_sli4_fcf_pri_list_add()
2573 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2574 &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2576 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2578 fcf_pri->list.prev)->list); in lpfc_sli4_fcf_pri_list_add()
2581 } else if (fcf_pri->list.next == &phba->fcf.fcf_pri_list in lpfc_sli4_fcf_pri_list_add()
2582 || new_fcf_pri->fcf_rec.priority < in lpfc_sli4_fcf_pri_list_add()
2583 next_fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2584 list_add(&new_fcf_pri->list, &fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2588 if (new_fcf_pri->fcf_rec.priority > fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_add()
2595 new_fcf_pri->fcf_rec.flag = LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_add()
2596 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2601 * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler.
2632 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2640 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2641 phba->hba_flag &= ~FCF_TS_INPROG; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2642 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2675 if ((phba->fcf.fcf_flag & FCF_IN_USE) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2676 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2679 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2683 "of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2686 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2690 * In case the current in-use FCF record becomes in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2695 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2696 !(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2698 "2835 Invalid in-use FCF " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2701 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2702 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2703 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2704 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2723 * matches the in-use FCF record: fabric name, switch name, mac in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2726 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2727 if (phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2728 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2729 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2732 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2733 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2734 if (phba->fcf.fcf_flag & FCF_REDISC_PEND) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2738 else if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2740 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2741 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2743 "2836 New FCF matches in-use " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2746 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2747 phba->pport->port_state, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2748 phba->pport->fc_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2753 "property of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2756 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2760 * with in-use record only if not during the fast failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2765 if (!(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2766 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2771 * Update on failover FCF record only if it's in FCF fast-failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2774 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2775 fcf_rec = &phba->fcf.failover_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2777 fcf_rec = &phba->fcf.current_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2779 if (phba->fcf.fcf_flag & FCF_AVAILABLE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2785 if (boot_flag && !(fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2790 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2795 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2803 if (!boot_flag && (fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2804 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2811 if (new_fcf_record->fip_priority < fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2816 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2822 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2823 } else if (new_fcf_record->fip_priority == fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2825 phba->fcf.eligible_fcf_cnt++; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2827 phba->fcf.eligible_fcf_cnt); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2832 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2841 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2846 * initial best-fit FCF. in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2857 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2859 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2861 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2867 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2876 if (!(phba->fcf.failover_rec.flag & RECORD_VALID)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2880 phba->fcoe_eventtag_at_fcf_scan, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2883 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2884 if (phba->hba_flag & HBA_DEVLOSS_TMO) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2885 phba->hba_flag &= ~FCF_TS_INPROG; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2886 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2887 /* Unregister in-use FCF and rescan */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2891 "unreg in-use FCF and " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2899 phba->hba_flag &= ~FCF_TS_INPROG; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2900 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2905 * the same as in-use FCF record, unregister the in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2906 * in-use FCF record, replace the in-use FCF record in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2912 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2915 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2917 "2842 Replace in-use FCF (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2919 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2920 phba->fcf.failover_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2921 memcpy(&phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2922 &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2929 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2930 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2931 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2939 if ((phba->fcf.fcf_flag & FCF_REDISC_EVT) || in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2940 (phba->fcf.fcf_flag & FCF_REDISC_PEND)) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2943 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2944 phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2946 * In case the current in-use FCF record no in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2952 "2841 In-use FCF record (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2955 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2956 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2957 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2958 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2978 * lpfc_mbx_cmpl_fcf_rr_read_fcf_rec - fcf roundrobin read_fcf mbox cmpl hdler
3003 if (phba->link_state < LPFC_LINK_UP) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3004 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3005 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3006 phba->hba_flag &= ~FCF_RR_INPROG; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3007 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3011 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3018 "hba_flg x%x fcf_flg x%x\n", phba->hba_flag, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3019 phba->fcf.fcf_flag); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3041 rc = lpfc_sli4_fcf_rr_next_proc(phba->pport, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3047 if (fcf_index == phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3051 phba->fcf.current_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3054 lpfc_issue_init_vfi(phba->pport); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3061 phba->fcf.failover_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3062 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3063 __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3066 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3068 current_fcf_index = phba->fcf.current_rec.fcf_indx; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3070 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3073 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3074 memcpy(&phba->fcf.current_rec, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3088 * lpfc_mbx_cmpl_read_fcf_rec - read fcf completion handler.
3108 if (phba->link_state < LPFC_LINK_UP) in lpfc_mbx_cmpl_read_fcf_rec()
3112 if (!(phba->fcf.fcf_flag & FCF_DISCOVERY)) in lpfc_mbx_cmpl_read_fcf_rec()
3115 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_read_fcf_rec()
3146 * lpfc_init_vfi_cmpl - Completion handler for init_vfi mbox command.
3155 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vfi_cmpl()
3159 * Also continue if the VFI is in use - just use the same one. in lpfc_init_vfi_cmpl()
3161 if (mboxq->u.mb.mbxStatus && in lpfc_init_vfi_cmpl()
3162 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_init_vfi_cmpl()
3164 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_init_vfi_cmpl()
3167 mboxq->u.mb.mbxStatus); in lpfc_init_vfi_cmpl()
3168 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3174 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3179 * lpfc_issue_init_vfi - Issue init_vfi mailbox command.
3190 struct lpfc_hba *phba = vport->phba; in lpfc_issue_init_vfi()
3192 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vfi()
3200 mboxq->mbox_cmpl = lpfc_init_vfi_cmpl; in lpfc_issue_init_vfi()
3205 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vfi()
3210 * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command.
3219 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vpi_cmpl()
3223 if (mboxq->u.mb.mbxStatus) { in lpfc_init_vpi_cmpl()
3226 mboxq->u.mb.mbxStatus); in lpfc_init_vpi_cmpl()
3227 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3231 spin_lock_irq(shost->host_lock); in lpfc_init_vpi_cmpl()
3232 vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI; in lpfc_init_vpi_cmpl()
3233 spin_unlock_irq(shost->host_lock); in lpfc_init_vpi_cmpl()
3236 if ((phba->pport == vport) || (vport->port_state == LPFC_FDISC)) { in lpfc_init_vpi_cmpl()
3245 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3249 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_init_vpi_cmpl()
3256 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3261 * lpfc_issue_init_vpi - Issue init_vpi mailbox command.
3273 if ((vport->port_type != LPFC_PHYSICAL_PORT) && (!vport->vpi)) { in lpfc_issue_init_vpi()
3274 vpi = lpfc_alloc_vpi(vport->phba); in lpfc_issue_init_vpi()
3281 vport->vpi = vpi; in lpfc_issue_init_vpi()
3284 mboxq = mempool_alloc(vport->phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vpi()
3291 lpfc_init_vpi(vport->phba, mboxq, vport->vpi); in lpfc_issue_init_vpi()
3292 mboxq->vport = vport; in lpfc_issue_init_vpi()
3293 mboxq->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_issue_init_vpi()
3294 rc = lpfc_sli_issue_mbox(vport->phba, mboxq, MBX_NOWAIT); in lpfc_issue_init_vpi()
3298 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vpi()
3303 * lpfc_start_fdiscs - send fdiscs for each vports on this port.
3317 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_start_fdiscs()
3318 if (vports[i]->port_type == LPFC_PHYSICAL_PORT) in lpfc_start_fdiscs()
3321 if (vports[i]->vpi > phba->max_vpi) { in lpfc_start_fdiscs()
3326 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_start_fdiscs()
3331 if (vports[i]->fc_flag & FC_VPORT_NEEDS_INIT_VPI) { in lpfc_start_fdiscs()
3335 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_start_fdiscs()
3353 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_vfi()
3360 if (mboxq->u.mb.mbxStatus && in lpfc_mbx_cmpl_reg_vfi()
3361 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_mbx_cmpl_reg_vfi()
3363 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_mbx_cmpl_reg_vfi()
3367 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_mbx_cmpl_reg_vfi()
3368 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_reg_vfi()
3383 if (vport->fc_flag & FC_VFI_REGISTERED) in lpfc_mbx_cmpl_reg_vfi()
3384 if (!(phba->sli_rev == LPFC_SLI_REV4 && in lpfc_mbx_cmpl_reg_vfi()
3385 vport->fc_flag & FC_PT2PT)) in lpfc_mbx_cmpl_reg_vfi()
3389 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3390 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vfi()
3391 vport->fc_flag |= FC_VFI_REGISTERED; in lpfc_mbx_cmpl_reg_vfi()
3392 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_mbx_cmpl_reg_vfi()
3393 vport->fc_flag &= ~FC_VPORT_NEEDS_INIT_VPI; in lpfc_mbx_cmpl_reg_vfi()
3394 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3397 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_reg_vfi()
3398 (phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_reg_vfi()
3399 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_reg_vfi()
3406 vport->port_state, vport->fc_flag, vport->fc_myDID, in lpfc_mbx_cmpl_reg_vfi()
3407 vport->phba->alpa_map[0], in lpfc_mbx_cmpl_reg_vfi()
3408 phba->link_state, phba->fc_topology); in lpfc_mbx_cmpl_reg_vfi()
3410 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_reg_vfi()
3415 if ((vport->fc_flag & FC_PT2PT) || in lpfc_mbx_cmpl_reg_vfi()
3416 ((phba->fc_topology == LPFC_TOPOLOGY_LOOP) && in lpfc_mbx_cmpl_reg_vfi()
3417 !(vport->fc_flag & FC_PUBLIC_LOOP))) { in lpfc_mbx_cmpl_reg_vfi()
3422 if (vport->fc_flag & FC_PT2PT) in lpfc_mbx_cmpl_reg_vfi()
3423 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vfi()
3439 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_sparam()
3440 struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *)pmb->ctx_buf; in lpfc_mbx_cmpl_read_sparam()
3441 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_sparam()
3443 struct serv_parm *sp = &vport->fc_sparam; in lpfc_mbx_cmpl_read_sparam()
3447 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_sparam()
3452 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_sparam()
3457 memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, in lpfc_mbx_cmpl_read_sparam()
3460 ed_tov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_mbx_cmpl_read_sparam()
3461 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_mbx_cmpl_read_sparam()
3464 phba->fc_edtov = ed_tov; in lpfc_mbx_cmpl_read_sparam()
3465 phba->fc_ratov = (2 * ed_tov) / 1000; in lpfc_mbx_cmpl_read_sparam()
3466 if (phba->fc_ratov < FF_DEF_RATOV) { in lpfc_mbx_cmpl_read_sparam()
3468 phba->fc_ratov = FF_DEF_RATOV; in lpfc_mbx_cmpl_read_sparam()
3472 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn); in lpfc_mbx_cmpl_read_sparam()
3473 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_read_sparam()
3474 memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3475 memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3483 if (phba->hba_flag & HBA_DEFER_FLOGI) { in lpfc_mbx_cmpl_read_sparam()
3485 phba->hba_flag &= ~HBA_DEFER_FLOGI; in lpfc_mbx_cmpl_read_sparam()
3497 struct lpfc_vport *vport = phba->pport; in lpfc_mbx_process_link_up()
3506 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3507 phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la); in lpfc_mbx_process_link_up()
3509 if (!(phba->hba_flag & HBA_FCOE_MODE)) { in lpfc_mbx_process_link_up()
3523 phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN; in lpfc_mbx_process_link_up()
3528 if (phba->fc_topology && in lpfc_mbx_process_link_up()
3529 phba->fc_topology != bf_get(lpfc_mbx_read_top_topology, la)) { in lpfc_mbx_process_link_up()
3532 phba->fc_topology, in lpfc_mbx_process_link_up()
3534 phba->fc_topology_changed = 1; in lpfc_mbx_process_link_up()
3537 phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la); in lpfc_mbx_process_link_up()
3538 phba->link_flag &= ~(LS_NPIV_FAB_SUPPORTED | LS_CT_VEN_RPA); in lpfc_mbx_process_link_up()
3541 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_process_link_up()
3542 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; in lpfc_mbx_process_link_up()
3547 if (phba->cfg_enable_npiv && phba->max_vpi) in lpfc_mbx_process_link_up()
3555 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la); in lpfc_mbx_process_link_up()
3556 i = la->lilpBde64.tus.f.bdeSize; in lpfc_mbx_process_link_up()
3559 phba->alpa_map[0] = 0; in lpfc_mbx_process_link_up()
3561 if (vport->cfg_log_verbose & LOG_LINK_EVENT) { in lpfc_mbx_process_link_up()
3572 numalpa = phba->alpa_map[0]; in lpfc_mbx_process_link_up()
3577 un.pamap[k - 1] = in lpfc_mbx_process_link_up()
3578 phba->alpa_map[j + 1]; in lpfc_mbx_process_link_up()
3596 if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) { in lpfc_mbx_process_link_up()
3597 if (phba->max_vpi && phba->cfg_enable_npiv && in lpfc_mbx_process_link_up()
3598 (phba->sli_rev >= LPFC_SLI_REV3)) in lpfc_mbx_process_link_up()
3599 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; in lpfc_mbx_process_link_up()
3601 vport->fc_myDID = phba->fc_pref_DID; in lpfc_mbx_process_link_up()
3604 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3607 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_mbx_process_link_up()
3608 vport->fc_flag |= fc_flags; in lpfc_mbx_process_link_up()
3609 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_mbx_process_link_up()
3615 sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3621 mempool_free(sparam_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3624 sparam_mbox->vport = vport; in lpfc_mbx_process_link_up()
3625 sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_process_link_up()
3632 if (!(phba->hba_flag & HBA_FCOE_MODE)) { in lpfc_mbx_process_link_up()
3633 cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3636 vport->port_state = LPFC_LOCAL_CFG_LINK; in lpfc_mbx_process_link_up()
3638 cfglink_mbox->vport = vport; in lpfc_mbx_process_link_up()
3639 cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_mbx_process_link_up()
3642 mempool_free(cfglink_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3646 vport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_mbx_process_link_up()
3652 if (!(phba->hba_flag & HBA_FIP_SUPPORT)) { in lpfc_mbx_process_link_up()
3660 rc = -ENODEV; in lpfc_mbx_process_link_up()
3672 rc = -ENODEV; in lpfc_mbx_process_link_up()
3682 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3683 if (phba->hba_flag & FCF_TS_INPROG) { in lpfc_mbx_process_link_up()
3684 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3688 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_mbx_process_link_up()
3689 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3695 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3696 phba->fcf.fcf_flag &= ~FCF_INIT_DISC; in lpfc_mbx_process_link_up()
3697 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3705 memset(phba->os_host_name, 0, sizeof(phba->os_host_name)); in lpfc_mbx_process_link_up()
3706 scnprintf(phba->os_host_name, sizeof(phba->os_host_name), "%s", in lpfc_mbx_process_link_up()
3707 init_utsname()->nodename); in lpfc_mbx_process_link_up()
3713 vport->port_state, sparam_mbox, cfglink_mbox); in lpfc_mbx_process_link_up()
3722 struct lpfc_sli *psli = &phba->sli; in lpfc_enable_la()
3723 spin_lock_irq(&phba->hbalock); in lpfc_enable_la()
3724 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_enable_la()
3725 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_enable_la()
3726 control = readl(phba->HCregaddr); in lpfc_enable_la()
3728 writel(control, phba->HCregaddr); in lpfc_enable_la()
3729 readl(phba->HCregaddr); /* flush */ in lpfc_enable_la()
3731 spin_unlock_irq(&phba->hbalock); in lpfc_enable_la()
3740 /* turn on Link Attention interrupts - no CLEAR_LA needed */ in lpfc_mbx_issue_link_down()
3753 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_topology()
3757 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_topology()
3758 struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *)(pmb->ctx_buf); in lpfc_mbx_cmpl_read_topology()
3765 pring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_read_topology()
3768 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_topology()
3771 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_topology()
3773 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_read_topology()
3777 la = (struct lpfc_mbx_read_top *) &pmb->u.mb.un.varReadTop; in lpfc_mbx_cmpl_read_topology()
3780 memcpy(&phba->alpa_map[0], mp->virt, 128); in lpfc_mbx_cmpl_read_topology()
3782 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_mbx_cmpl_read_topology()
3784 vport->fc_flag |= FC_BYPASSED_MODE; in lpfc_mbx_cmpl_read_topology()
3786 vport->fc_flag &= ~FC_BYPASSED_MODE; in lpfc_mbx_cmpl_read_topology()
3787 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_mbx_cmpl_read_topology()
3789 if (phba->fc_eventTag <= la->eventTag) { in lpfc_mbx_cmpl_read_topology()
3790 phba->fc_stat.LinkMultiEvent++; in lpfc_mbx_cmpl_read_topology()
3792 if (phba->fc_eventTag != 0) in lpfc_mbx_cmpl_read_topology()
3796 phba->fc_eventTag = la->eventTag; in lpfc_mbx_cmpl_read_topology()
3797 phba->link_events++; in lpfc_mbx_cmpl_read_topology()
3799 phba->fc_stat.LinkUp++; in lpfc_mbx_cmpl_read_topology()
3800 if (phba->link_flag & LS_LOOPBACK_MODE) { in lpfc_mbx_cmpl_read_topology()
3804 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3808 phba->alpa_map[0]); in lpfc_mbx_cmpl_read_topology()
3813 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3817 phba->alpa_map[0], in lpfc_mbx_cmpl_read_topology()
3822 if (phba->cmf_active_mode != LPFC_CFG_OFF) in lpfc_mbx_cmpl_read_topology()
3825 if (phba->lmt & LMT_64Gb) in lpfc_mbx_cmpl_read_topology()
3830 phba->fc_stat.LinkDown++; in lpfc_mbx_cmpl_read_topology()
3831 if (phba->link_flag & LS_LOOPBACK_MODE) in lpfc_mbx_cmpl_read_topology()
3836 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3837 phba->pport->port_state, vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3842 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3843 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3849 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3850 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3855 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_mbx_cmpl_read_topology()
3874 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_login()
3875 struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *)pmb->ctx_buf; in lpfc_mbx_cmpl_reg_login()
3876 struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp; in lpfc_mbx_cmpl_reg_login()
3882 pmb->ctx_buf = NULL; in lpfc_mbx_cmpl_reg_login()
3883 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_reg_login()
3887 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_reg_login()
3888 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_reg_login()
3890 if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) in lpfc_mbx_cmpl_reg_login()
3891 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_mbx_cmpl_reg_login()
3893 if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL || in lpfc_mbx_cmpl_reg_login()
3894 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { in lpfc_mbx_cmpl_reg_login()
3903 spin_lock_irq(&ndlp->lock); in lpfc_mbx_cmpl_reg_login()
3904 ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; in lpfc_mbx_cmpl_reg_login()
3905 spin_unlock_irq(&ndlp->lock); in lpfc_mbx_cmpl_reg_login()
3912 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_mbx_cmpl_reg_login()
3918 pmb->ctx_buf = mp; in lpfc_mbx_cmpl_reg_login()
3932 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_unreg_vpi()
3933 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_unreg_vpi()
3936 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_unreg_vpi()
3941 mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3947 vport->vpi, mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3948 if (!(phba->pport->load_flag & FC_UNLOADING)) in lpfc_mbx_cmpl_unreg_vpi()
3952 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3953 vport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_unreg_vpi()
3954 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; in lpfc_mbx_cmpl_unreg_vpi()
3955 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3956 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_unreg_vpi()
3962 if ((vport->load_flag & FC_UNLOADING) && (vport != phba->pport)) in lpfc_mbx_cmpl_unreg_vpi()
3969 struct lpfc_hba *phba = vport->phba; in lpfc_mbx_unreg_vpi()
3973 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_unreg_vpi()
3977 lpfc_unreg_vpi(phba, vport->vpi, mbox); in lpfc_mbx_unreg_vpi()
3978 mbox->vport = vport; in lpfc_mbx_unreg_vpi()
3979 mbox->mbox_cmpl = lpfc_mbx_cmpl_unreg_vpi; in lpfc_mbx_unreg_vpi()
3984 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_mbx_unreg_vpi()
3993 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_vpi()
3995 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_reg_vpi()
3997 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_reg_vpi()
4003 mb->mbxStatus); in lpfc_mbx_cmpl_reg_vpi()
4005 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4006 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); in lpfc_mbx_cmpl_reg_vpi()
4007 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4008 vport->fc_myDID = 0; in lpfc_mbx_cmpl_reg_vpi()
4010 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_reg_vpi()
4011 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_mbx_cmpl_reg_vpi()
4012 if (phba->nvmet_support) in lpfc_mbx_cmpl_reg_vpi()
4020 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4021 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vpi()
4022 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI; in lpfc_mbx_cmpl_reg_vpi()
4023 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4024 vport->num_disc_nodes = 0; in lpfc_mbx_cmpl_reg_vpi()
4026 if (vport->fc_npr_cnt) in lpfc_mbx_cmpl_reg_vpi()
4029 if (!vport->num_disc_nodes) { in lpfc_mbx_cmpl_reg_vpi()
4030 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4031 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_mbx_cmpl_reg_vpi()
4032 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4035 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vpi()
4038 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_vpi()
4043 * lpfc_create_static_vport - Read HBA config region to create static vports.
4066 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_create_static_vport()
4074 mb = &pmb->u.mb; in lpfc_create_static_vport()
4081 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_create_static_vport()
4089 * the dump routine is a single-use construct. in lpfc_create_static_vport()
4091 if (pmb->ctx_buf) { in lpfc_create_static_vport()
4092 mp = (struct lpfc_dmabuf *)pmb->ctx_buf; in lpfc_create_static_vport()
4093 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_create_static_vport()
4095 pmb->ctx_buf = NULL; in lpfc_create_static_vport()
4100 pmb->vport = phba->pport; in lpfc_create_static_vport()
4104 if ((mbx_wait_rc != MBX_SUCCESS) || mb->mbxStatus) { in lpfc_create_static_vport()
4109 mbx_wait_rc, mb->mbxStatus); in lpfc_create_static_vport()
4113 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_create_static_vport()
4114 byte_count = pmb->u.mqe.un.mb_words[5]; in lpfc_create_static_vport()
4115 mp = (struct lpfc_dmabuf *)pmb->ctx_buf; in lpfc_create_static_vport()
4116 if (byte_count > sizeof(struct static_vport_info) - in lpfc_create_static_vport()
4119 - offset; in lpfc_create_static_vport()
4120 memcpy(vport_buff + offset, mp->virt, byte_count); in lpfc_create_static_vport()
4123 if (mb->un.varDmp.word_cnt > in lpfc_create_static_vport()
4124 sizeof(struct static_vport_info) - offset) in lpfc_create_static_vport()
4125 mb->un.varDmp.word_cnt = in lpfc_create_static_vport()
4127 - offset; in lpfc_create_static_vport()
4128 byte_count = mb->un.varDmp.word_cnt; in lpfc_create_static_vport()
4140 if ((le32_to_cpu(vport_info->signature) != VPORT_INFO_SIG) || in lpfc_create_static_vport()
4141 ((le32_to_cpu(vport_info->rev) & VPORT_INFO_REV_MASK) in lpfc_create_static_vport()
4146 le32_to_cpu(vport_info->signature), in lpfc_create_static_vport()
4147 le32_to_cpu(vport_info->rev) & in lpfc_create_static_vport()
4153 shost = lpfc_shost_from_vport(phba->pport); in lpfc_create_static_vport()
4157 vport_id.port_name = wwn_to_u64(vport_info->vport_list[i].wwpn); in lpfc_create_static_vport()
4158 vport_id.node_name = wwn_to_u64(vport_info->vport_list[i].wwnn); in lpfc_create_static_vport()
4174 vport = *(struct lpfc_vport **)new_fc_vport->dd_data; in lpfc_create_static_vport()
4175 vport->vport_flag |= STATIC_VPORT; in lpfc_create_static_vport()
4193 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fabric_reg_login()
4194 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fabric_reg_login()
4195 struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp; in lpfc_mbx_cmpl_fabric_reg_login()
4198 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fabric_reg_login()
4200 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fabric_reg_login()
4203 mb->mbxStatus); in lpfc_mbx_cmpl_fabric_reg_login()
4205 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_fabric_reg_login()
4226 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fabric_reg_login()
4227 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fabric_reg_login()
4228 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_mbx_cmpl_fabric_reg_login()
4229 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fabric_reg_login()
4232 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_fabric_reg_login()
4235 if (!(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG)) in lpfc_mbx_cmpl_fabric_reg_login()
4239 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_fabric_reg_login()
4240 vport->fc_flag &= ~FC_LOGO_RCVD_DID_CHNG ; in lpfc_mbx_cmpl_fabric_reg_login()
4241 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_fabric_reg_login()
4263 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4264 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) { in lpfc_issue_gidft()
4277 vport->gidft_inp++; in lpfc_issue_gidft()
4280 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4281 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_issue_gidft()
4292 vport->gidft_inp); in lpfc_issue_gidft()
4293 if (vport->gidft_inp == 0) in lpfc_issue_gidft()
4296 vport->gidft_inp++; in lpfc_issue_gidft()
4298 return vport->gidft_inp; in lpfc_issue_gidft()
4302 * lpfc_issue_gidpt - issue a GID_PT for all N_Ports
4308 * 0 - Failure to issue a GID_PT
4309 * 1 - GID_PT issued
4326 vport->gidft_inp++; in lpfc_issue_gidpt()
4339 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_ns_reg_login()
4340 struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp; in lpfc_mbx_cmpl_ns_reg_login()
4341 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_ns_reg_login()
4344 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_ns_reg_login()
4345 vport->gidft_inp = 0; in lpfc_mbx_cmpl_ns_reg_login()
4347 if (mb->mbxStatus) { in lpfc_mbx_cmpl_ns_reg_login()
4350 mb->mbxStatus); in lpfc_mbx_cmpl_ns_reg_login()
4364 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_mbx_cmpl_ns_reg_login()
4365 spin_lock_irq(&ndlp->lock); in lpfc_mbx_cmpl_ns_reg_login()
4366 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; in lpfc_mbx_cmpl_ns_reg_login()
4367 spin_unlock_irq(&ndlp->lock); in lpfc_mbx_cmpl_ns_reg_login()
4371 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_ns_reg_login()
4386 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_ns_reg_login()
4387 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_ns_reg_login()
4388 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_mbx_cmpl_ns_reg_login()
4389 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_ns_reg_login()
4393 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_ns_reg_login()
4394 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_ns_reg_login()
4397 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_mbx_cmpl_ns_reg_login()
4404 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_ns_reg_login()
4405 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) in lpfc_mbx_cmpl_ns_reg_login()
4408 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_ns_reg_login()
4409 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) in lpfc_mbx_cmpl_ns_reg_login()
4422 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_mbx_cmpl_ns_reg_login()
4423 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_mbx_cmpl_ns_reg_login()
4424 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_mbx_cmpl_ns_reg_login()
4429 rc, phba->cgn_init_reg_signal); in lpfc_mbx_cmpl_ns_reg_login()
4430 } else if (phba->lmt & LMT_64Gb) { in lpfc_mbx_cmpl_ns_reg_login()
4438 vport->fc_ns_retry = 0; in lpfc_mbx_cmpl_ns_reg_login()
4462 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fc_reg_login()
4463 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fc_reg_login()
4464 struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp; in lpfc_mbx_cmpl_fc_reg_login()
4466 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fc_reg_login()
4467 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fc_reg_login()
4470 __func__, mb->mbxStatus); in lpfc_mbx_cmpl_fc_reg_login()
4476 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fc_reg_login()
4477 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fc_reg_login()
4481 __func__, ndlp->nlp_DID, ndlp->nlp_rpi, in lpfc_mbx_cmpl_fc_reg_login()
4482 ndlp->nlp_state); in lpfc_mbx_cmpl_fc_reg_login()
4484 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_mbx_cmpl_fc_reg_login()
4485 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; in lpfc_mbx_cmpl_fc_reg_login()
4486 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fc_reg_login()
4505 struct lpfc_hba *phba = vport->phba; in lpfc_register_remote_port()
4508 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_register_remote_port()
4511 /* Remote port has reappeared. Re-register w/ FC transport */ in lpfc_register_remote_port()
4512 rport_ids.node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn); in lpfc_register_remote_port()
4513 rport_ids.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn); in lpfc_register_remote_port()
4514 rport_ids.port_id = ndlp->nlp_DID; in lpfc_register_remote_port()
4520 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_register_remote_port()
4523 if (vport->load_flag & FC_UNLOADING) in lpfc_register_remote_port()
4526 ndlp->rport = rport = fc_remote_port_add(shost, 0, &rport_ids); in lpfc_register_remote_port()
4528 dev_printk(KERN_WARNING, &phba->pcidev->dev, in lpfc_register_remote_port()
4534 rport->maxframe_size = ndlp->nlp_maxframe; in lpfc_register_remote_port()
4535 rport->supported_classes = ndlp->nlp_class_sup; in lpfc_register_remote_port()
4536 rdata = rport->dd_data; in lpfc_register_remote_port()
4537 rdata->pnode = lpfc_nlp_get(ndlp); in lpfc_register_remote_port()
4538 if (!rdata->pnode) { in lpfc_register_remote_port()
4539 dev_warn(&phba->pcidev->dev, in lpfc_register_remote_port()
4540 "Warning - node ref failed. Unreg rport\n"); in lpfc_register_remote_port()
4542 ndlp->rport = NULL; in lpfc_register_remote_port()
4546 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_register_remote_port()
4547 ndlp->fc4_xpt_flags |= SCSI_XPT_REGD; in lpfc_register_remote_port()
4548 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_register_remote_port()
4550 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_register_remote_port()
4552 if (ndlp->nlp_type & NLP_FCP_INITIATOR) in lpfc_register_remote_port()
4554 if (ndlp->nlp_type & NLP_NVME_INITIATOR) in lpfc_register_remote_port()
4556 if (ndlp->nlp_type & NLP_NVME_TARGET) in lpfc_register_remote_port()
4558 if (ndlp->nlp_type & NLP_NVME_DISCOVERY) in lpfc_register_remote_port()
4564 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_register_remote_port()
4566 __func__, rport, rport->port_id, rport->roles, in lpfc_register_remote_port()
4567 kref_read(&ndlp->kref)); in lpfc_register_remote_port()
4569 if ((rport->scsi_target_id != -1) && in lpfc_register_remote_port()
4570 (rport->scsi_target_id < LPFC_MAX_TARGET)) { in lpfc_register_remote_port()
4571 ndlp->nlp_sid = rport->scsi_target_id; in lpfc_register_remote_port()
4580 struct fc_rport *rport = ndlp->rport; in lpfc_unregister_remote_port()
4581 struct lpfc_vport *vport = ndlp->vport; in lpfc_unregister_remote_port()
4583 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_unregister_remote_port()
4588 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_unregister_remote_port()
4593 ndlp->nlp_DID, rport, ndlp->fc4_xpt_flags, in lpfc_unregister_remote_port()
4594 kref_read(&ndlp->kref)); in lpfc_unregister_remote_port()
4606 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_nlp_counters()
4609 vport->fc_unused_cnt += count; in lpfc_nlp_counters()
4612 vport->fc_plogi_cnt += count; in lpfc_nlp_counters()
4615 vport->fc_adisc_cnt += count; in lpfc_nlp_counters()
4618 vport->fc_reglogin_cnt += count; in lpfc_nlp_counters()
4621 vport->fc_prli_cnt += count; in lpfc_nlp_counters()
4624 vport->fc_unmap_cnt += count; in lpfc_nlp_counters()
4627 vport->fc_map_cnt += count; in lpfc_nlp_counters()
4630 if (vport->fc_npr_cnt == 0 && count == -1) in lpfc_nlp_counters()
4631 vport->fc_npr_cnt = 0; in lpfc_nlp_counters()
4633 vport->fc_npr_cnt += count; in lpfc_nlp_counters()
4636 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_nlp_counters()
4647 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4648 if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) { in lpfc_nlp_reg_node()
4650 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4652 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD && in lpfc_nlp_reg_node()
4653 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) { in lpfc_nlp_reg_node()
4659 ndlp->fc4_xpt_flags |= NLP_XPT_REGD; in lpfc_nlp_reg_node()
4660 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4663 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4672 if (!(ndlp->nlp_fc4_type & NLP_FC4_NVME)) in lpfc_nlp_reg_node()
4676 if (vport->phba->sli_rev >= LPFC_SLI_REV4 && in lpfc_nlp_reg_node()
4677 ndlp->nlp_fc4_type & NLP_FC4_NVME) { in lpfc_nlp_reg_node()
4678 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_reg_node()
4683 if (ndlp->nlp_type & NLP_NVME_TARGET) { in lpfc_nlp_reg_node()
4684 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4702 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4703 if (!(ndlp->fc4_xpt_flags & NLP_XPT_REGD)) { in lpfc_nlp_unreg_node()
4704 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4709 __func__, ndlp, ndlp->rport, ndlp->nlp_DID, in lpfc_nlp_unreg_node()
4710 ndlp->nlp_flag, ndlp->fc4_xpt_flags); in lpfc_nlp_unreg_node()
4714 ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; in lpfc_nlp_unreg_node()
4715 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4717 if (ndlp->rport && in lpfc_nlp_unreg_node()
4718 ndlp->fc4_xpt_flags & SCSI_XPT_REGD) { in lpfc_nlp_unreg_node()
4719 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4721 } else if (!ndlp->rport) { in lpfc_nlp_unreg_node()
4726 __func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_unreg_node()
4727 ndlp->fc4_xpt_flags, in lpfc_nlp_unreg_node()
4728 kref_read(&ndlp->kref)); in lpfc_nlp_unreg_node()
4731 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD) { in lpfc_nlp_unreg_node()
4732 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4733 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_unreg_node()
4735 if (ndlp->nlp_type & NLP_NVME_TARGET) in lpfc_nlp_unreg_node()
4766 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_handle_adisc_state()
4769 ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; in lpfc_handle_adisc_state()
4774 * ADISC_ISSUE to non-mapped states in lpfc_handle_adisc_state()
4775 * We are moving from ADISC_ISSUE to a non-mapped state because in lpfc_handle_adisc_state()
4780 ndlp->nlp_flag &= ~NLP_RCV_PLOGI; in lpfc_handle_adisc_state()
4801 ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; in lpfc_nlp_state_cleanup()
4802 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_nlp_state_cleanup()
4805 ndlp->nlp_flag &= ~NLP_NODEV_REMOVE; in lpfc_nlp_state_cleanup()
4807 ndlp->nlp_flag &= ~NLP_RCV_PLOGI; in lpfc_nlp_state_cleanup()
4815 if (!(ndlp->nlp_flag & NLP_NPR_ADISC) || in lpfc_nlp_state_cleanup()
4816 !lpfc_is_link_up(vport->phba)) in lpfc_nlp_state_cleanup()
4827 * id outside the presentable range - move the node to the in lpfc_nlp_state_cleanup()
4831 (ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_nlp_state_cleanup()
4832 (!ndlp->rport || in lpfc_nlp_state_cleanup()
4833 ndlp->rport->scsi_target_id == -1 || in lpfc_nlp_state_cleanup()
4834 ndlp->rport->scsi_target_id >= LPFC_MAX_TARGET)) { in lpfc_nlp_state_cleanup()
4835 spin_lock_irq(&ndlp->lock); in lpfc_nlp_state_cleanup()
4836 ndlp->nlp_flag |= NLP_TGT_NO_SCSIID; in lpfc_nlp_state_cleanup()
4837 spin_unlock_irq(&ndlp->lock); in lpfc_nlp_state_cleanup()
4869 int old_state = ndlp->nlp_state; in lpfc_nlp_set_state()
4870 int node_dropped = ndlp->nlp_flag & NLP_DROPPED; in lpfc_nlp_set_state()
4874 "0904 NPort state transition x%06x, %s -> %s\n", in lpfc_nlp_set_state()
4875 ndlp->nlp_DID, in lpfc_nlp_set_state()
4881 ndlp->nlp_DID, old_state, state); in lpfc_nlp_set_state()
4885 ndlp->nlp_flag &= ~NLP_DROPPED; in lpfc_nlp_set_state()
4893 ndlp->nlp_flag &= ~NLP_TGT_NO_SCSIID; in lpfc_nlp_set_state()
4894 ndlp->nlp_type &= ~NLP_FC_NODE; in lpfc_nlp_set_state()
4897 if (list_empty(&ndlp->nlp_listp)) { in lpfc_nlp_set_state()
4898 spin_lock_irq(shost->host_lock); in lpfc_nlp_set_state()
4899 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_nlp_set_state()
4900 spin_unlock_irq(shost->host_lock); in lpfc_nlp_set_state()
4902 lpfc_nlp_counters(vport, old_state, -1); in lpfc_nlp_set_state()
4904 ndlp->nlp_state = state; in lpfc_nlp_set_state()
4914 if (list_empty(&ndlp->nlp_listp)) { in lpfc_enqueue_node()
4915 spin_lock_irq(shost->host_lock); in lpfc_enqueue_node()
4916 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_enqueue_node()
4917 spin_unlock_irq(shost->host_lock); in lpfc_enqueue_node()
4927 if (ndlp->nlp_state && !list_empty(&ndlp->nlp_listp)) in lpfc_dequeue_node()
4928 lpfc_nlp_counters(vport, ndlp->nlp_state, -1); in lpfc_dequeue_node()
4929 spin_lock_irq(shost->host_lock); in lpfc_dequeue_node()
4930 list_del_init(&ndlp->nlp_listp); in lpfc_dequeue_node()
4931 spin_unlock_irq(shost->host_lock); in lpfc_dequeue_node()
4932 lpfc_nlp_state_cleanup(vport, ndlp, ndlp->nlp_state, in lpfc_dequeue_node()
4937 * lpfc_initialize_node - Initialize all fields of node object
4946 * to the life-span of the @ndlp might go beyond the existence of @vport as
4954 INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); in lpfc_initialize_node()
4955 INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); in lpfc_initialize_node()
4956 timer_setup(&ndlp->nlp_delayfunc, lpfc_els_retry_delay, 0); in lpfc_initialize_node()
4957 INIT_LIST_HEAD(&ndlp->recovery_evt.evt_listp); in lpfc_initialize_node()
4959 ndlp->nlp_DID = did; in lpfc_initialize_node()
4960 ndlp->vport = vport; in lpfc_initialize_node()
4961 ndlp->phba = vport->phba; in lpfc_initialize_node()
4962 ndlp->nlp_sid = NLP_NO_SID; in lpfc_initialize_node()
4963 ndlp->nlp_fc4_type = NLP_FC4_NONE; in lpfc_initialize_node()
4964 kref_init(&ndlp->kref); in lpfc_initialize_node()
4965 atomic_set(&ndlp->cmd_pending, 0); in lpfc_initialize_node()
4966 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth; in lpfc_initialize_node()
4967 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_initialize_node()
4978 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_drop_node()
4981 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_drop_node()
4990 spin_lock_irq(&ndlp->lock); in lpfc_drop_node()
4991 if (!(ndlp->nlp_flag & NLP_DROPPED)) { in lpfc_drop_node()
4992 ndlp->nlp_flag |= NLP_DROPPED; in lpfc_drop_node()
4993 spin_unlock_irq(&ndlp->lock); in lpfc_drop_node()
4997 spin_unlock_irq(&ndlp->lock); in lpfc_drop_node()
5007 struct lpfc_hba *phba = vport->phba; in lpfc_set_disctmo()
5010 if (vport->port_state == LPFC_LOCAL_CFG_LINK) { in lpfc_set_disctmo()
5011 /* For FAN, timeout should be greater than edtov */ in lpfc_set_disctmo()
5012 tmo = (((phba->fc_edtov + 999) / 1000) + 1); in lpfc_set_disctmo()
5014 /* Normal discovery timeout should be > than ELS/CT timeout in lpfc_set_disctmo()
5017 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_set_disctmo()
5021 if (!timer_pending(&vport->fc_disctmo)) { in lpfc_set_disctmo()
5024 tmo, vport->port_state, vport->fc_flag); in lpfc_set_disctmo()
5027 mod_timer(&vport->fc_disctmo, jiffies + msecs_to_jiffies(1000 * tmo)); in lpfc_set_disctmo()
5028 spin_lock_irq(shost->host_lock); in lpfc_set_disctmo()
5029 vport->fc_flag |= FC_DISC_TMO; in lpfc_set_disctmo()
5030 spin_unlock_irq(shost->host_lock); in lpfc_set_disctmo()
5036 vport->port_state, tmo, in lpfc_set_disctmo()
5037 (unsigned long)&vport->fc_disctmo, vport->fc_plogi_cnt, in lpfc_set_disctmo()
5038 vport->fc_adisc_cnt); in lpfc_set_disctmo()
5054 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_can_disctmo()
5057 if (vport->fc_flag & FC_DISC_TMO || in lpfc_can_disctmo()
5058 timer_pending(&vport->fc_disctmo)) { in lpfc_can_disctmo()
5059 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_can_disctmo()
5060 vport->fc_flag &= ~FC_DISC_TMO; in lpfc_can_disctmo()
5061 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_can_disctmo()
5062 del_timer_sync(&vport->fc_disctmo); in lpfc_can_disctmo()
5063 spin_lock_irqsave(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5064 vport->work_port_events &= ~WORKER_DISC_TMO; in lpfc_can_disctmo()
5065 spin_unlock_irqrestore(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5072 vport->port_state, vport->fc_flag, in lpfc_can_disctmo()
5073 vport->fc_plogi_cnt, vport->fc_adisc_cnt); in lpfc_can_disctmo()
5087 struct lpfc_vport *vport = ndlp->vport; in lpfc_check_sli_ndlp()
5092 if (iocb->vport != vport) in lpfc_check_sli_ndlp()
5099 if (pring->ringno == LPFC_ELS_RING) { in lpfc_check_sli_ndlp()
5102 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5106 if (remote_id == ndlp->nlp_DID) in lpfc_check_sli_ndlp()
5110 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5113 } else if (pring->ringno == LPFC_FCP_RING) { in lpfc_check_sli_ndlp()
5115 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_check_sli_ndlp()
5116 (ndlp->nlp_flag & NLP_DELAY_TMO)) { in lpfc_check_sli_ndlp()
5119 if (ulp_context == ndlp->nlp_rpi) in lpfc_check_sli_ndlp()
5132 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in __lpfc_dequeue_nport_iocbs()
5136 list_move_tail(&iocb->list, dequeue_list); in __lpfc_dequeue_nport_iocbs()
5144 struct lpfc_sli *psli = &phba->sli; in lpfc_sli3_dequeue_nport_iocbs()
5147 spin_lock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5148 for (i = 0; i < psli->num_rings; i++) in lpfc_sli3_dequeue_nport_iocbs()
5149 __lpfc_dequeue_nport_iocbs(phba, ndlp, &psli->sli3_ring[i], in lpfc_sli3_dequeue_nport_iocbs()
5151 spin_unlock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5161 spin_lock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5162 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) { in lpfc_sli4_dequeue_nport_iocbs()
5163 pring = qp->pring; in lpfc_sli4_dequeue_nport_iocbs()
5166 spin_lock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5168 spin_unlock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5170 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5188 if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { in lpfc_no_rpi()
5189 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_no_rpi()
5203 * lpfc_nlp_logo_unreg - Unreg mailbox completion handler before LOGO
5213 struct lpfc_vport *vport = pmb->vport; in lpfc_nlp_logo_unreg()
5216 ndlp = (struct lpfc_nodelist *)(pmb->ctx_ndlp); in lpfc_nlp_logo_unreg()
5222 if ((ndlp->nlp_flag & NLP_UNREG_INP) && in lpfc_nlp_logo_unreg()
5223 (ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING)) { in lpfc_nlp_logo_unreg()
5227 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_logo_unreg()
5228 ndlp->nlp_defer_did, ndlp); in lpfc_nlp_logo_unreg()
5230 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_nlp_logo_unreg()
5231 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_nlp_logo_unreg()
5232 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_nlp_logo_unreg()
5235 if (ndlp->nlp_flag & NLP_RELEASE_RPI) { in lpfc_nlp_logo_unreg()
5236 lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); in lpfc_nlp_logo_unreg()
5237 spin_lock_irq(&ndlp->lock); in lpfc_nlp_logo_unreg()
5238 ndlp->nlp_flag &= ~NLP_RELEASE_RPI; in lpfc_nlp_logo_unreg()
5239 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_nlp_logo_unreg()
5240 spin_unlock_irq(&ndlp->lock); in lpfc_nlp_logo_unreg()
5242 spin_lock_irq(&ndlp->lock); in lpfc_nlp_logo_unreg()
5243 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_nlp_logo_unreg()
5244 spin_unlock_irq(&ndlp->lock); in lpfc_nlp_logo_unreg()
5252 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_nlp_logo_unreg()
5269 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_set_unreg_login_mbx_cmpl()
5270 if (!mbox->ctx_ndlp) in lpfc_set_unreg_login_mbx_cmpl()
5273 if (ndlp->nlp_flag & NLP_ISSUE_LOGO) { in lpfc_set_unreg_login_mbx_cmpl()
5274 mbox->mbox_cmpl = lpfc_nlp_logo_unreg; in lpfc_set_unreg_login_mbx_cmpl()
5276 } else if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_set_unreg_login_mbx_cmpl()
5277 (!(vport->load_flag & FC_UNLOADING)) && in lpfc_set_unreg_login_mbx_cmpl()
5278 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_set_unreg_login_mbx_cmpl()
5280 (kref_read(&ndlp->kref) > 0)) { in lpfc_set_unreg_login_mbx_cmpl()
5281 mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr; in lpfc_set_unreg_login_mbx_cmpl()
5283 if (vport->load_flag & FC_UNLOADING) { in lpfc_set_unreg_login_mbx_cmpl()
5284 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_set_unreg_login_mbx_cmpl()
5285 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_set_unreg_login_mbx_cmpl()
5286 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_set_unreg_login_mbx_cmpl()
5287 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_set_unreg_login_mbx_cmpl()
5290 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_set_unreg_login_mbx_cmpl()
5306 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_rpi()
5311 if (ndlp->nlp_flag & NLP_RPI_REGISTERED || in lpfc_unreg_rpi()
5312 ndlp->nlp_flag & NLP_REG_LOGIN_SEND) { in lpfc_unreg_rpi()
5313 if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) in lpfc_unreg_rpi()
5319 ndlp->nlp_rpi, ndlp->nlp_flag, in lpfc_unreg_rpi()
5320 ndlp->nlp_DID); in lpfc_unreg_rpi()
5325 if (ndlp->nlp_flag & NLP_UNREG_INP) { in lpfc_unreg_rpi()
5331 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5332 ndlp->nlp_defer_did, in lpfc_unreg_rpi()
5333 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5337 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_rpi()
5340 rpi = ndlp->nlp_rpi; in lpfc_unreg_rpi()
5341 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unreg_rpi()
5342 rpi = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]; in lpfc_unreg_rpi()
5344 lpfc_unreg_login(phba, vport->vpi, rpi, mbox); in lpfc_unreg_rpi()
5345 mbox->vport = vport; in lpfc_unreg_rpi()
5347 if (!mbox->ctx_ndlp) { in lpfc_unreg_rpi()
5348 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5352 if (mbox->mbox_cmpl == lpfc_sli4_unreg_rpi_cmpl_clr) in lpfc_unreg_rpi()
5357 if (((ndlp->nlp_DID & Fabric_DID_MASK) != in lpfc_unreg_rpi()
5359 (!(vport->fc_flag & FC_OFFLINE_MODE))) in lpfc_unreg_rpi()
5360 ndlp->nlp_flag |= NLP_UNREG_INP; in lpfc_unreg_rpi()
5367 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5368 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5372 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_unreg_rpi()
5373 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5384 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5385 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5391 if (!(vport->load_flag & FC_UNLOADING)) { in lpfc_unreg_rpi()
5392 ndlp->nlp_flag &= ~NLP_UNREG_INP; in lpfc_unreg_rpi()
5394 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_unreg_rpi()
5403 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_unreg_rpi()
5404 ndlp->nlp_rpi = 0; in lpfc_unreg_rpi()
5405 ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; in lpfc_unreg_rpi()
5406 ndlp->nlp_flag &= ~NLP_NPR_ADISC; in lpfc_unreg_rpi()
5408 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_unreg_rpi()
5411 ndlp->nlp_flag &= ~NLP_LOGO_ACC; in lpfc_unreg_rpi()
5416 * lpfc_unreg_hba_rpis - Unregister rpis registered to the hba.
5436 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unreg_hba_rpis()
5438 spin_lock_irq(shost->host_lock); in lpfc_unreg_hba_rpis()
5439 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_unreg_hba_rpis()
5440 if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { in lpfc_unreg_hba_rpis()
5442 spin_unlock_irq(shost->host_lock); in lpfc_unreg_hba_rpis()
5444 spin_lock_irq(shost->host_lock); in lpfc_unreg_hba_rpis()
5447 spin_unlock_irq(shost->host_lock); in lpfc_unreg_hba_rpis()
5455 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_all_rpis()
5459 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_unreg_all_rpis()
5464 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_all_rpis()
5466 lpfc_unreg_login(phba, vport->vpi, LPFC_UNREG_ALL_RPIS_VPORT, in lpfc_unreg_all_rpis()
5468 mbox->vport = vport; in lpfc_unreg_all_rpis()
5469 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_all_rpis()
5470 mbox->ctx_ndlp = NULL; in lpfc_unreg_all_rpis()
5473 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_all_rpis()
5486 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_default_rpis()
5491 if (phba->sli_rev > LPFC_SLI_REV3) in lpfc_unreg_default_rpis()
5494 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_default_rpis()
5496 lpfc_unreg_did(phba, vport->vpi, LPFC_UNREG_ALL_DFLT_RPIS, in lpfc_unreg_default_rpis()
5498 mbox->vport = vport; in lpfc_unreg_default_rpis()
5499 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_default_rpis()
5500 mbox->ctx_ndlp = NULL; in lpfc_unreg_default_rpis()
5503 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_default_rpis()
5520 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_node()
5527 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_cleanup_node()
5528 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_cleanup_node()
5534 if ((mb = phba->sli.mbox_active)) { in lpfc_cleanup_node()
5535 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5536 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5537 (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) { in lpfc_cleanup_node()
5538 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5539 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5543 spin_lock_irq(&phba->hbalock); in lpfc_cleanup_node()
5545 list_for_each_entry(mb, &phba->sli.mboxq_cmpl, list) { in lpfc_cleanup_node()
5546 if ((mb->u.mb.mbxCommand != MBX_REG_LOGIN64) || in lpfc_cleanup_node()
5547 (mb->mbox_flag & LPFC_MBX_IMED_UNREG) || in lpfc_cleanup_node()
5548 (ndlp != (struct lpfc_nodelist *)mb->ctx_ndlp)) in lpfc_cleanup_node()
5551 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5552 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5555 list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { in lpfc_cleanup_node()
5556 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5557 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5558 (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) { in lpfc_cleanup_node()
5559 list_del(&mb->list); in lpfc_cleanup_node()
5567 spin_unlock_irq(&phba->hbalock); in lpfc_cleanup_node()
5571 spin_lock_irq(&ndlp->lock); in lpfc_cleanup_node()
5572 ndlp->nlp_flag &= ~NLP_DELAY_TMO; in lpfc_cleanup_node()
5573 spin_unlock_irq(&ndlp->lock); in lpfc_cleanup_node()
5575 ndlp->nlp_last_elscmd = 0; in lpfc_cleanup_node()
5576 del_timer_sync(&ndlp->nlp_delayfunc); in lpfc_cleanup_node()
5578 list_del_init(&ndlp->els_retry_evt.evt_listp); in lpfc_cleanup_node()
5579 list_del_init(&ndlp->dev_loss_evt.evt_listp); in lpfc_cleanup_node()
5580 list_del_init(&ndlp->recovery_evt.evt_listp); in lpfc_cleanup_node()
5583 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cleanup_node()
5584 ndlp->nlp_flag |= NLP_RELEASE_RPI; in lpfc_cleanup_node()
5599 if (ndlp->nlp_DID == did) in lpfc_matchdid()
5603 mydid.un.word = vport->fc_myDID; in lpfc_matchdid()
5609 ndlpdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5618 * up matching ndlp->nlp_DID 000001 to in lpfc_matchdid()
5624 vport->phba->fc_topology == in lpfc_matchdid()
5631 matchdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5651 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_findnode_did()
5653 data1 = (((uint32_t)ndlp->nlp_state << 24) | in __lpfc_findnode_did()
5654 ((uint32_t)ndlp->nlp_xri << 16) | in __lpfc_findnode_did()
5655 ((uint32_t)ndlp->nlp_type << 8) in __lpfc_findnode_did()
5660 ndlp, ndlp->nlp_DID, in __lpfc_findnode_did()
5661 ndlp->nlp_flag, data1, ndlp->nlp_rpi, in __lpfc_findnode_did()
5662 ndlp->active_rrqs_xri_bitmap); in __lpfc_findnode_did()
5680 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_findnode_did()
5682 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_findnode_did()
5694 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_findnode_mapped()
5696 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_findnode_mapped()
5697 if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE || in lpfc_findnode_mapped()
5698 ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_findnode_mapped()
5699 data1 = (((uint32_t)ndlp->nlp_state << 24) | in lpfc_findnode_mapped()
5700 ((uint32_t)ndlp->nlp_xri << 16) | in lpfc_findnode_mapped()
5701 ((uint32_t)ndlp->nlp_type << 8) | in lpfc_findnode_mapped()
5702 ((uint32_t)ndlp->nlp_rpi & 0xff)); in lpfc_findnode_mapped()
5703 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_findnode_mapped()
5707 ndlp, ndlp->nlp_DID, in lpfc_findnode_mapped()
5708 ndlp->nlp_flag, data1, in lpfc_findnode_mapped()
5709 ndlp->active_rrqs_xri_bitmap); in lpfc_findnode_mapped()
5713 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_findnode_mapped()
5728 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5730 if ((vport->fc_flag & FC_RSCN_MODE) != 0 && in lpfc_setup_disc_node()
5741 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5742 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5744 spin_lock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5745 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_setup_disc_node()
5746 spin_unlock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5754 if ((vport->fc_flag & FC_RSCN_MODE) && in lpfc_setup_disc_node()
5755 !(vport->fc_flag & FC_NDISC_ACTIVE)) { in lpfc_setup_disc_node()
5759 * delay timeout is not needed. in lpfc_setup_disc_node()
5766 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5767 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5771 * active management - just go to NPR provided the in lpfc_setup_disc_node()
5774 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5780 if (ndlp->nlp_flag & NLP_RCV_PLOGI && in lpfc_setup_disc_node()
5781 !(ndlp->nlp_type & in lpfc_setup_disc_node()
5785 if (ndlp->nlp_state > NLP_STE_UNUSED_NODE && in lpfc_setup_disc_node()
5786 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_setup_disc_node()
5791 spin_lock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5792 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_setup_disc_node()
5793 spin_unlock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5798 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5799 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5806 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5807 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5813 if (ndlp->nlp_state == NLP_STE_ADISC_ISSUE || in lpfc_setup_disc_node()
5814 ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_setup_disc_node()
5815 (!vport->phba->nvmet_support && in lpfc_setup_disc_node()
5816 ndlp->nlp_flag & NLP_RCV_PLOGI)) in lpfc_setup_disc_node()
5819 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5827 spin_lock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5828 ndlp->nlp_flag |= NLP_NPR_2B_DISC; in lpfc_setup_disc_node()
5829 spin_unlock_irq(&ndlp->lock); in lpfc_setup_disc_node()
5838 struct lpfc_hba *phba = vport->phba; in lpfc_disc_list_loopmap()
5845 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) in lpfc_disc_list_loopmap()
5849 if (phba->alpa_map[0]) { in lpfc_disc_list_loopmap()
5850 for (j = 1; j <= phba->alpa_map[0]; j++) { in lpfc_disc_list_loopmap()
5851 alpa = phba->alpa_map[j]; in lpfc_disc_list_loopmap()
5852 if (((vport->fc_myDID & 0xff) == alpa) || (alpa == 0)) in lpfc_disc_list_loopmap()
5862 if (vport->cfg_scan_down) in lpfc_disc_list_loopmap()
5865 index = FC_MAXLOOP - j - 1; in lpfc_disc_list_loopmap()
5867 if ((vport->fc_myDID & 0xff) == alpa) in lpfc_disc_list_loopmap()
5880 struct lpfc_sli *psli = &phba->sli; in lpfc_issue_clear_la()
5881 struct lpfc_sli_ring *extra_ring = &psli->sli3_ring[LPFC_EXTRA_RING]; in lpfc_issue_clear_la()
5882 struct lpfc_sli_ring *fcp_ring = &psli->sli3_ring[LPFC_FCP_RING]; in lpfc_issue_clear_la()
5889 if ((phba->link_state >= LPFC_CLEAR_LA) || in lpfc_issue_clear_la()
5890 (vport->port_type != LPFC_PHYSICAL_PORT) || in lpfc_issue_clear_la()
5891 (phba->sli_rev == LPFC_SLI_REV4)) in lpfc_issue_clear_la()
5895 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) != NULL) { in lpfc_issue_clear_la()
5896 phba->link_state = LPFC_CLEAR_LA; in lpfc_issue_clear_la()
5898 mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la; in lpfc_issue_clear_la()
5899 mbox->vport = vport; in lpfc_issue_clear_la()
5902 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_issue_clear_la()
5904 extra_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5905 fcp_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5906 phba->link_state = LPFC_HBA_ERROR; in lpfc_issue_clear_la()
5917 regvpimbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vpi()
5920 regvpimbox->mbox_cmpl = lpfc_mbx_cmpl_reg_vpi; in lpfc_issue_reg_vpi()
5921 regvpimbox->vport = vport; in lpfc_issue_reg_vpi()
5924 mempool_free(regvpimbox, phba->mbox_mem_pool); in lpfc_issue_reg_vpi()
5934 struct lpfc_hba *phba = vport->phba; in lpfc_disc_start()
5941 phba->link_state); in lpfc_disc_start()
5945 if (phba->link_state == LPFC_CLEAR_LA) in lpfc_disc_start()
5950 if (vport->port_state < LPFC_VPORT_READY) in lpfc_disc_start()
5951 vport->port_state = LPFC_DISC_AUTH; in lpfc_disc_start()
5955 vport->fc_prevDID = vport->fc_myDID; in lpfc_disc_start()
5956 vport->num_disc_nodes = 0; in lpfc_disc_start()
5962 vport->port_state, vport->fc_flag, vport->fc_plogi_cnt, in lpfc_disc_start()
5963 vport->fc_adisc_cnt, vport->fc_npr_cnt); in lpfc_disc_start()
5965 /* First do ADISCs - if any */ in lpfc_disc_start()
5972 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_disc_start()
5973 !(vport->fc_flag & FC_PT2PT) && in lpfc_disc_start()
5974 !(vport->fc_flag & FC_RSCN_MODE) && in lpfc_disc_start()
5975 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_disc_start()
5985 if (vport->port_state < LPFC_VPORT_READY && !clear_la_pending) { in lpfc_disc_start()
5989 if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) { in lpfc_disc_start()
5990 vport->num_disc_nodes = 0; in lpfc_disc_start()
5992 if (vport->fc_npr_cnt) in lpfc_disc_start()
5995 if (!vport->num_disc_nodes) { in lpfc_disc_start()
5996 spin_lock_irq(shost->host_lock); in lpfc_disc_start()
5997 vport->fc_flag &= ~FC_NDISC_ACTIVE; in lpfc_disc_start()
5998 spin_unlock_irq(shost->host_lock); in lpfc_disc_start()
6002 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_start()
6004 /* Next do PLOGIs - if any */ in lpfc_disc_start()
6010 if (vport->fc_flag & FC_RSCN_MODE) { in lpfc_disc_start()
6014 if ((vport->fc_rscn_id_cnt == 0) && in lpfc_disc_start()
6015 (!(vport->fc_flag & FC_RSCN_DISCOVERY))) { in lpfc_disc_start()
6016 spin_lock_irq(shost->host_lock); in lpfc_disc_start()
6017 vport->fc_flag &= ~FC_RSCN_MODE; in lpfc_disc_start()
6018 spin_unlock_irq(shost->host_lock); in lpfc_disc_start()
6046 spin_lock_irq(&phba->hbalock); in lpfc_free_tx()
6047 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in lpfc_free_tx()
6048 if (iocb->ndlp != ndlp) in lpfc_free_tx()
6056 list_move_tail(&iocb->list, &completions); in lpfc_free_tx()
6061 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_free_tx()
6062 if (iocb->ndlp != ndlp) in lpfc_free_tx()
6072 spin_unlock_irq(&phba->hbalock); in lpfc_free_tx()
6086 struct lpfc_hba *phba = vport->phba; in lpfc_disc_flush_list()
6088 if (vport->fc_plogi_cnt || vport->fc_adisc_cnt) { in lpfc_disc_flush_list()
6089 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_flush_list()
6091 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_disc_flush_list()
6092 ndlp->nlp_state == NLP_STE_ADISC_ISSUE) { in lpfc_disc_flush_list()
6100 * lpfc_notify_xport_npr - notifies xport of node disappearance
6104 * calls lpfc_nlp_state_cleanup, the ndlp->rport is unregistered
6114 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_notify_xport_npr()
6125 if (pci_channel_offline(vport->phba->pcidev)) in lpfc_cleanup_discovery_resources()
6133 * FUNCTION: Fibre Channel driver discovery timeout routine.
6148 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout()
6155 spin_lock_irqsave(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6156 tmo_posted = vport->work_port_events & WORKER_DISC_TMO; in lpfc_disc_timeout()
6158 vport->work_port_events |= WORKER_DISC_TMO; in lpfc_disc_timeout()
6159 spin_unlock_irqrestore(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6170 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout_handler()
6171 struct lpfc_sli *psli = &phba->sli; in lpfc_disc_timeout_handler()
6176 if (!(vport->fc_flag & FC_DISC_TMO)) in lpfc_disc_timeout_handler()
6179 spin_lock_irq(shost->host_lock); in lpfc_disc_timeout_handler()
6180 vport->fc_flag &= ~FC_DISC_TMO; in lpfc_disc_timeout_handler()
6181 spin_unlock_irq(shost->host_lock); in lpfc_disc_timeout_handler()
6184 "disc timeout: state:x%x rtry:x%x flg:x%x", in lpfc_disc_timeout_handler()
6185 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_disc_timeout_handler()
6187 switch (vport->port_state) { in lpfc_disc_timeout_handler()
6192 * waiting for FAN timeout in lpfc_disc_timeout_handler()
6195 "0221 FAN timeout\n"); in lpfc_disc_timeout_handler()
6198 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_timeout_handler()
6200 if (ndlp->nlp_state != NLP_STE_NPR_NODE) in lpfc_disc_timeout_handler()
6202 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_disc_timeout_handler()
6206 } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) { in lpfc_disc_timeout_handler()
6213 if (vport->port_state != LPFC_FLOGI) { in lpfc_disc_timeout_handler()
6214 if (phba->sli_rev <= LPFC_SLI_REV3) in lpfc_disc_timeout_handler()
6225 /* Initial FLOGI timeout */ in lpfc_disc_timeout_handler()
6228 "0222 Initial %s timeout\n", in lpfc_disc_timeout_handler()
6229 vport->vpi ? "FDISC" : "FLOGI"); in lpfc_disc_timeout_handler()
6247 "0223 Timeout while waiting for " in lpfc_disc_timeout_handler()
6258 /* Check for wait for NameServer Rsp timeout */ in lpfc_disc_timeout_handler()
6261 "0224 NameServer Query timeout " in lpfc_disc_timeout_handler()
6263 vport->fc_ns_retry, LPFC_MAX_NS_RETRY); in lpfc_disc_timeout_handler()
6265 if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) { in lpfc_disc_timeout_handler()
6267 vport->fc_ns_retry++; in lpfc_disc_timeout_handler()
6268 vport->gidft_inp = 0; in lpfc_disc_timeout_handler()
6273 vport->fc_ns_retry = 0; in lpfc_disc_timeout_handler()
6281 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6282 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6286 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6291 initlinkmbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_disc_timeout_handler()
6297 phba->link_state = LPFC_HBA_ERROR; in lpfc_disc_timeout_handler()
6302 lpfc_init_link(phba, initlinkmbox, phba->cfg_topology, in lpfc_disc_timeout_handler()
6303 phba->cfg_link_speed); in lpfc_disc_timeout_handler()
6304 initlinkmbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_disc_timeout_handler()
6305 initlinkmbox->vport = vport; in lpfc_disc_timeout_handler()
6306 initlinkmbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_disc_timeout_handler()
6310 mempool_free(initlinkmbox, phba->mbox_mem_pool); in lpfc_disc_timeout_handler()
6315 /* Node Authentication timeout */ in lpfc_disc_timeout_handler()
6318 "0227 Node Authentication timeout\n"); in lpfc_disc_timeout_handler()
6325 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6326 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6330 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6336 if (vport->fc_flag & FC_RSCN_MODE) { in lpfc_disc_timeout_handler()
6339 "0231 RSCN timeout Data: x%x " in lpfc_disc_timeout_handler()
6341 vport->fc_ns_retry, LPFC_MAX_NS_RETRY, in lpfc_disc_timeout_handler()
6342 vport->port_state, vport->gidft_inp); in lpfc_disc_timeout_handler()
6355 "0273 Unexpected discovery timeout, " in lpfc_disc_timeout_handler()
6356 "vport State x%x\n", vport->port_state); in lpfc_disc_timeout_handler()
6360 switch (phba->link_state) { in lpfc_disc_timeout_handler()
6362 /* CLEAR LA timeout */ in lpfc_disc_timeout_handler()
6365 "0228 CLEAR LA timeout\n"); in lpfc_disc_timeout_handler()
6380 "0230 Unexpected timeout, hba link " in lpfc_disc_timeout_handler()
6381 "state x%x\n", phba->link_state); in lpfc_disc_timeout_handler()
6391 if (phba->sli_rev != LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6392 psli->sli3_ring[(LPFC_EXTRA_RING)].flag &= in lpfc_disc_timeout_handler()
6394 psli->sli3_ring[LPFC_FCP_RING].flag &= in lpfc_disc_timeout_handler()
6397 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6411 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fdmi_reg_login()
6412 struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp; in lpfc_mbx_cmpl_fdmi_reg_login()
6413 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fdmi_reg_login()
6415 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fdmi_reg_login()
6417 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fdmi_reg_login()
6418 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fdmi_reg_login()
6419 ndlp->nlp_flag |= NLP_RPI_REGISTERED; in lpfc_mbx_cmpl_fdmi_reg_login()
6420 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fdmi_reg_login()
6424 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_fdmi_reg_login()
6425 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_fdmi_reg_login()
6428 * Start issuing Fabric-Device Management Interface (FDMI) command to in lpfc_mbx_cmpl_fdmi_reg_login()
6430 * DHBA -> DPRT -> RHBA -> RPA (physical port) in lpfc_mbx_cmpl_fdmi_reg_login()
6431 * DPRT -> RPRT (vports) in lpfc_mbx_cmpl_fdmi_reg_login()
6433 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_fdmi_reg_login()
6434 phba->link_flag &= ~LS_CT_VEN_RPA; /* For extra Vendor RPA */ in lpfc_mbx_cmpl_fdmi_reg_login()
6454 return ndlp->nlp_rpi == *rpi; in lpfc_filter_by_rpi()
6460 return memcmp(&ndlp->nlp_portname, param, in lpfc_filter_by_wwpn()
6461 sizeof(ndlp->nlp_portname)) == 0; in lpfc_filter_by_wwpn()
6469 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_find_node()
6475 filter, ndlp, ndlp->nlp_DID, in __lpfc_find_node()
6476 ndlp->nlp_flag, ndlp->nlp_state, in __lpfc_find_node()
6477 ndlp->nlp_xri, ndlp->nlp_type, in __lpfc_find_node()
6478 ndlp->nlp_rpi); in __lpfc_find_node()
6507 spin_lock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6509 spin_unlock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6525 spin_lock_irqsave(shost->host_lock, flags); in lpfc_findnode_rpi()
6527 spin_unlock_irqrestore(shost->host_lock, flags); in lpfc_findnode_rpi()
6532 * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier
6541 * NULL - No vport with the matching @vpi found
6542 * Otherwise - Address to the vport with the matching @vpi.
6551 /* The physical ports are always vpi 0 - translate is unnecessary. */ in lpfc_find_vport_by_vpid()
6557 for (i = 0; i <= phba->max_vpi; i++) { in lpfc_find_vport_by_vpid()
6558 if (vpi == phba->vpi_ids[i]) in lpfc_find_vport_by_vpid()
6562 if (i > phba->max_vpi) { in lpfc_find_vport_by_vpid()
6570 spin_lock_irqsave(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6571 list_for_each_entry(vport, &phba->port_list, listentry) { in lpfc_find_vport_by_vpid()
6572 if (vport->vpi == i) { in lpfc_find_vport_by_vpid()
6573 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6577 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6587 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6588 rpi = lpfc_sli4_alloc_rpi(vport->phba); in lpfc_nlp_init()
6593 ndlp = mempool_alloc(vport->phba->nlp_mem_pool, GFP_KERNEL); in lpfc_nlp_init()
6595 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_init()
6596 lpfc_sli4_free_rpi(vport->phba, rpi); in lpfc_nlp_init()
6602 spin_lock_init(&ndlp->lock); in lpfc_nlp_init()
6605 INIT_LIST_HEAD(&ndlp->nlp_listp); in lpfc_nlp_init()
6606 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6607 ndlp->nlp_rpi = rpi; in lpfc_nlp_init()
6611 ndlp, ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_init()
6612 ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_nlp_init()
6614 ndlp->active_rrqs_xri_bitmap = in lpfc_nlp_init()
6615 mempool_alloc(vport->phba->active_rrq_pool, in lpfc_nlp_init()
6617 if (ndlp->active_rrqs_xri_bitmap) in lpfc_nlp_init()
6618 memset(ndlp->active_rrqs_xri_bitmap, 0, in lpfc_nlp_init()
6619 ndlp->phba->cfg_rrq_xri_bitmap_sz); in lpfc_nlp_init()
6626 ndlp->nlp_DID, 0, 0); in lpfc_nlp_init()
6639 struct lpfc_vport *vport = ndlp->vport; in lpfc_nlp_release()
6641 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_release()
6643 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_nlp_release()
6647 __func__, ndlp, ndlp->nlp_DID, in lpfc_nlp_release()
6648 kref_read(&ndlp->kref), ndlp->nlp_rpi); in lpfc_nlp_release()
6661 if (ndlp->nlp_flag & NLP_RELEASE_RPI) { in lpfc_nlp_release()
6662 if (ndlp->nlp_rpi != LPFC_RPI_ALLOC_ERROR && in lpfc_nlp_release()
6663 !(ndlp->nlp_flag & (NLP_RPI_REGISTERED | NLP_UNREG_INP))) { in lpfc_nlp_release()
6664 lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); in lpfc_nlp_release()
6665 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_nlp_release()
6672 ndlp->vport = NULL; in lpfc_nlp_release()
6673 ndlp->nlp_state = NLP_STE_FREED_NODE; in lpfc_nlp_release()
6674 ndlp->nlp_flag = 0; in lpfc_nlp_release()
6675 ndlp->fc4_xpt_flags = 0; in lpfc_nlp_release()
6678 if (ndlp->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_release()
6679 mempool_free(ndlp->active_rrqs_xri_bitmap, in lpfc_nlp_release()
6680 ndlp->phba->active_rrq_pool); in lpfc_nlp_release()
6681 mempool_free(ndlp, ndlp->phba->nlp_mem_pool); in lpfc_nlp_release()
6694 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_get()
6696 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_get()
6697 kref_read(&ndlp->kref)); in lpfc_nlp_get()
6703 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_nlp_get()
6704 if (!kref_get_unless_zero(&ndlp->kref)) { in lpfc_nlp_get()
6705 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6706 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_NODE, in lpfc_nlp_get()
6708 __func__, (void *)ndlp, kref_read(&ndlp->kref)); in lpfc_nlp_get()
6711 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6726 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_put()
6728 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_put()
6729 kref_read(&ndlp->kref)); in lpfc_nlp_put()
6734 return ndlp ? kref_put(&ndlp->kref, lpfc_nlp_release) : 0; in lpfc_nlp_put()
6738 * lpfc_fcf_inuse - Check if FCF can be unregistered.
6761 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_fcf_inuse()
6763 spin_lock_irq(shost->host_lock); in lpfc_fcf_inuse()
6770 if (!(vports[i]->fc_flag & FC_VPORT_CVL_RCVD)) { in lpfc_fcf_inuse()
6771 spin_unlock_irq(shost->host_lock); in lpfc_fcf_inuse()
6775 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_fcf_inuse()
6776 if (ndlp->rport && in lpfc_fcf_inuse()
6777 (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { in lpfc_fcf_inuse()
6779 spin_unlock_irq(shost->host_lock); in lpfc_fcf_inuse()
6781 } else if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { in lpfc_fcf_inuse()
6787 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_fcf_inuse()
6788 ndlp->nlp_flag); in lpfc_fcf_inuse()
6791 spin_unlock_irq(shost->host_lock); in lpfc_fcf_inuse()
6799 * lpfc_unregister_vfi_cmpl - Completion handler for unreg vfi.
6808 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_vfi_cmpl()
6811 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_vfi_cmpl()
6815 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_vfi_cmpl()
6817 spin_lock_irq(shost->host_lock); in lpfc_unregister_vfi_cmpl()
6818 phba->pport->fc_flag &= ~FC_VFI_REGISTERED; in lpfc_unregister_vfi_cmpl()
6819 spin_unlock_irq(shost->host_lock); in lpfc_unregister_vfi_cmpl()
6820 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_vfi_cmpl()
6825 * lpfc_unregister_fcfi_cmpl - Completion handler for unreg fcfi.
6834 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_fcfi_cmpl()
6836 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_fcfi_cmpl()
6840 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_fcfi_cmpl()
6842 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_fcfi_cmpl()
6847 * lpfc_unregister_fcf_prep - Unregister fcf record preparation
6867 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_unregister_fcf_prep()
6871 if (vports && (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) in lpfc_unregister_fcf_prep()
6872 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unregister_fcf_prep()
6878 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6882 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6883 vports[i]->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_unregister_fcf_prep()
6884 vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6885 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6888 if (i == 0 && (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED))) { in lpfc_unregister_fcf_prep()
6889 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_unregister_fcf_prep()
6891 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp); in lpfc_unregister_fcf_prep()
6892 lpfc_cleanup_pending_mbox(phba->pport); in lpfc_unregister_fcf_prep()
6893 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6894 lpfc_sli4_unreg_all_rpis(phba->pport); in lpfc_unregister_fcf_prep()
6895 lpfc_mbx_unreg_vpi(phba->pport); in lpfc_unregister_fcf_prep()
6896 shost = lpfc_shost_from_vport(phba->pport); in lpfc_unregister_fcf_prep()
6897 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6898 phba->pport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; in lpfc_unregister_fcf_prep()
6899 phba->pport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6900 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6907 rc = lpfc_issue_unreg_vfi(phba->pport); in lpfc_unregister_fcf_prep()
6912 * lpfc_sli4_unregister_fcf - Unregister currently registered FCF record
6919 * Return 0 if successfully issued, none-zero otherwise.
6927 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_unregister_fcf()
6931 "HBA state x%x\n", phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6932 return -ENOMEM; in lpfc_sli4_unregister_fcf()
6934 lpfc_unreg_fcfi(mbox, phba->fcf.fcfi); in lpfc_sli4_unregister_fcf()
6935 mbox->vport = phba->pport; in lpfc_sli4_unregister_fcf()
6936 mbox->mbox_cmpl = lpfc_unregister_fcfi_cmpl; in lpfc_sli4_unregister_fcf()
6943 rc, phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6944 return -EINVAL; in lpfc_sli4_unregister_fcf()
6950 * lpfc_unregister_fcf_rescan - Unregister currently registered fcf and rescan
6975 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6976 phba->fcf.fcf_flag = 0; in lpfc_unregister_fcf_rescan()
6977 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6978 phba->fcf.current_rec.flag = 0; in lpfc_unregister_fcf_rescan()
6984 if ((phba->pport->load_flag & FC_UNLOADING) || in lpfc_unregister_fcf_rescan()
6985 (phba->link_state < LPFC_LINK_UP)) in lpfc_unregister_fcf_rescan()
6989 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6990 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
6991 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6999 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
7000 phba->fcf.fcf_flag &= ~FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
7001 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
7005 phba->pport->port_state); in lpfc_unregister_fcf_rescan()
7010 * lpfc_unregister_fcf - Unregister the currently registered fcf record
7035 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf()
7036 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_unregister_fcf()
7037 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf()
7041 * lpfc_unregister_unused_fcf - Unregister FCF if all devices are disconnected.
7056 spin_lock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
7057 if (!(phba->hba_flag & HBA_FCOE_MODE) || in lpfc_unregister_unused_fcf()
7058 !(phba->fcf.fcf_flag & FCF_REGISTERED) || in lpfc_unregister_unused_fcf()
7059 !(phba->hba_flag & HBA_FIP_SUPPORT) || in lpfc_unregister_unused_fcf()
7060 (phba->fcf.fcf_flag & FCF_DISCOVERY) || in lpfc_unregister_unused_fcf()
7061 (phba->pport->port_state == LPFC_FLOGI)) { in lpfc_unregister_unused_fcf()
7062 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
7065 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
7074 * lpfc_read_fcf_conn_tbl - Create driver FCF connection table.
7093 &phba->fcf_conn_rec_list, list) { in lpfc_read_fcf_conn_tbl()
7094 list_del_init(&conn_entry->list); in lpfc_read_fcf_conn_tbl()
7099 record_count = conn_hdr->length * sizeof(uint32_t)/ in lpfc_read_fcf_conn_tbl()
7117 memcpy(&conn_entry->conn_rec, &conn_rec[i], in lpfc_read_fcf_conn_tbl()
7119 list_add_tail(&conn_entry->list, in lpfc_read_fcf_conn_tbl()
7120 &phba->fcf_conn_rec_list); in lpfc_read_fcf_conn_tbl()
7123 if (!list_empty(&phba->fcf_conn_rec_list)) { in lpfc_read_fcf_conn_tbl()
7125 list_for_each_entry(conn_entry, &phba->fcf_conn_rec_list, in lpfc_read_fcf_conn_tbl()
7127 conn_rec = &conn_entry->conn_rec; in lpfc_read_fcf_conn_tbl()
7135 conn_rec->flags, conn_rec->vlan_tag, in lpfc_read_fcf_conn_tbl()
7136 conn_rec->fabric_name[0], in lpfc_read_fcf_conn_tbl()
7137 conn_rec->fabric_name[1], in lpfc_read_fcf_conn_tbl()
7138 conn_rec->fabric_name[2], in lpfc_read_fcf_conn_tbl()
7139 conn_rec->fabric_name[3], in lpfc_read_fcf_conn_tbl()
7140 conn_rec->fabric_name[4], in lpfc_read_fcf_conn_tbl()
7141 conn_rec->fabric_name[5], in lpfc_read_fcf_conn_tbl()
7142 conn_rec->fabric_name[6], in lpfc_read_fcf_conn_tbl()
7143 conn_rec->fabric_name[7], in lpfc_read_fcf_conn_tbl()
7144 conn_rec->switch_name[0], in lpfc_read_fcf_conn_tbl()
7145 conn_rec->switch_name[1], in lpfc_read_fcf_conn_tbl()
7146 conn_rec->switch_name[2], in lpfc_read_fcf_conn_tbl()
7147 conn_rec->switch_name[3], in lpfc_read_fcf_conn_tbl()
7148 conn_rec->switch_name[4], in lpfc_read_fcf_conn_tbl()
7149 conn_rec->switch_name[5], in lpfc_read_fcf_conn_tbl()
7150 conn_rec->switch_name[6], in lpfc_read_fcf_conn_tbl()
7151 conn_rec->switch_name[7]); in lpfc_read_fcf_conn_tbl()
7157 * lpfc_read_fcoe_param - Read FCoe parameters from conf region..
7176 if ((fcoe_param_hdr->parm_version != FIPP_VERSION) || in lpfc_read_fcoe_param()
7177 (fcoe_param_hdr->length != FCOE_PARAM_LENGTH)) in lpfc_read_fcoe_param()
7180 if (fcoe_param_hdr->parm_flags & FIPP_VLAN_VALID) { in lpfc_read_fcoe_param()
7181 phba->valid_vlan = 1; in lpfc_read_fcoe_param()
7182 phba->vlan_id = le16_to_cpu(fcoe_param->vlan_tag) & in lpfc_read_fcoe_param()
7186 phba->fc_map[0] = fcoe_param->fc_map[0]; in lpfc_read_fcoe_param()
7187 phba->fc_map[1] = fcoe_param->fc_map[1]; in lpfc_read_fcoe_param()
7188 phba->fc_map[2] = fcoe_param->fc_map[2]; in lpfc_read_fcoe_param()
7193 * lpfc_get_rec_conf23 - Get a record type in config region data.
7232 * lpfc_parse_fcoe_conf - Parse FCoE config data read from config region 23.
7274 size - offset, FCOE_PARAM_TYPE); in lpfc_parse_fcoe_conf()
7280 size - offset, FCOE_CONN_TBL_TYPE); in lpfc_parse_fcoe_conf()
7287 * lpfc_error_lost_link - IO failure from link event or FW reset check.
7299 * false - No link or reset error occurred.
7300 * true - A link or reset error occurred.