Lines Matching +full:timeout +full:- +full:lta +full:- +full:ms

4  * Copyright (C) 2017-2025 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 if (rport->flags & FC_RPORT_DEVLOSS_CALLBK_DONE) { in lpfc_rport_invalid()
105 __func__, rport, rport->scsi_target_id); in lpfc_rport_invalid()
106 return -EINVAL; in lpfc_rport_invalid()
109 rdata = rport->dd_data; in lpfc_rport_invalid()
112 __func__, rport, rport->scsi_target_id); in lpfc_rport_invalid()
113 return -EINVAL; in lpfc_rport_invalid()
116 ndlp = rdata->pnode; in lpfc_rport_invalid()
117 if (!rdata->pnode) { in lpfc_rport_invalid()
119 __func__, rport, rport->scsi_target_id); in lpfc_rport_invalid()
120 return -EINVAL; in lpfc_rport_invalid()
123 if (!ndlp->vport) { in lpfc_rport_invalid()
125 "SID x%x\n", __func__, ndlp, ndlp->nlp_DID, rport, in lpfc_rport_invalid()
126 rport->scsi_target_id); in lpfc_rport_invalid()
127 return -EINVAL; in lpfc_rport_invalid()
142 rdata = rport->dd_data; in lpfc_terminate_rport_io()
143 ndlp = rdata->pnode; in lpfc_terminate_rport_io()
144 vport = ndlp->vport; in lpfc_terminate_rport_io()
147 ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); in lpfc_terminate_rport_io()
149 if (ndlp->nlp_sid != NLP_NO_SID) in lpfc_terminate_rport_io()
150 lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); in lpfc_terminate_rport_io()
166 ndlp = ((struct lpfc_rport_data *)rport->dd_data)->pnode; in lpfc_dev_loss_tmo_callbk()
170 vport = ndlp->vport; in lpfc_dev_loss_tmo_callbk()
171 phba = vport->phba; in lpfc_dev_loss_tmo_callbk()
175 ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag); in lpfc_dev_loss_tmo_callbk()
177 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_callbk()
180 ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag, in lpfc_dev_loss_tmo_callbk()
181 vport->load_flag, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_callbk()
182 ndlp->nlp_state, ndlp->fc4_xpt_flags); in lpfc_dev_loss_tmo_callbk()
185 if (test_bit(FC_UNLOADING, &vport->load_flag) || in lpfc_dev_loss_tmo_callbk()
186 (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_dev_loss_tmo_callbk()
187 !test_bit(HBA_SETUP, &phba->hba_flag))) { in lpfc_dev_loss_tmo_callbk()
189 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
190 ndlp->rport = NULL; in lpfc_dev_loss_tmo_callbk()
196 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_callbk()
197 if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) in lpfc_dev_loss_tmo_callbk()
203 if (ndlp->fc4_xpt_flags & SCSI_XPT_REGD) { in lpfc_dev_loss_tmo_callbk()
204 ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
212 if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) { in lpfc_dev_loss_tmo_callbk()
213 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_callbk()
214 ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
215 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
220 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
223 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
231 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) in lpfc_dev_loss_tmo_callbk()
235 if (ndlp->rport != rport) { in lpfc_dev_loss_tmo_callbk()
240 ndlp->nlp_DID, ndlp, rport, ndlp->rport, in lpfc_dev_loss_tmo_callbk()
241 ndlp->nlp_state, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_callbk()
245 if (rport->port_name != wwn_to_u64(ndlp->nlp_portname.u.wwn)) in lpfc_dev_loss_tmo_callbk()
248 rport->port_name, in lpfc_dev_loss_tmo_callbk()
249 wwn_to_u64(ndlp->nlp_portname.u.wwn)); in lpfc_dev_loss_tmo_callbk()
251 evtp = &ndlp->dev_loss_evt; in lpfc_dev_loss_tmo_callbk()
253 if (!list_empty(&evtp->evt_listp)) { in lpfc_dev_loss_tmo_callbk()
256 rport->port_name); in lpfc_dev_loss_tmo_callbk()
260 set_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_callbk()
262 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
266 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE) in lpfc_dev_loss_tmo_callbk()
267 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_callbk()
273 ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD; in lpfc_dev_loss_tmo_callbk()
274 ((struct lpfc_rport_data *)rport->dd_data)->pnode = NULL; in lpfc_dev_loss_tmo_callbk()
275 ndlp->rport = NULL; in lpfc_dev_loss_tmo_callbk()
276 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_callbk()
278 if (phba->worker_thread) { in lpfc_dev_loss_tmo_callbk()
282 evtp->evt_arg1 = lpfc_nlp_get(ndlp); in lpfc_dev_loss_tmo_callbk()
284 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
285 if (evtp->evt_arg1) { in lpfc_dev_loss_tmo_callbk()
286 evtp->evt = LPFC_EVT_DEV_LOSS; in lpfc_dev_loss_tmo_callbk()
287 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_dev_loss_tmo_callbk()
288 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
292 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_dev_loss_tmo_callbk()
294 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_callbk()
297 "%d\n", __func__, ndlp->nlp_DID, in lpfc_dev_loss_tmo_callbk()
298 ndlp->rport, ndlp->nlp_flag, in lpfc_dev_loss_tmo_callbk()
299 vport->load_flag, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_callbk()
300 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) { in lpfc_dev_loss_tmo_callbk()
302 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_callbk()
310 * lpfc_check_inactive_vmid_one - VMID inactivity checker for a vport
320 u64 *lta; in lpfc_check_inactive_vmid_one() local
324 write_lock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
326 if (!vport->cur_vmid_cnt) in lpfc_check_inactive_vmid_one()
330 hash_for_each(vport->hash_table, bucket, vmp, hnode) { in lpfc_check_inactive_vmid_one()
332 if (vmp->flag & LPFC_VMID_REGISTERED) { in lpfc_check_inactive_vmid_one()
336 /* if last access time is less than timeout */ in lpfc_check_inactive_vmid_one()
337 lta = per_cpu_ptr(vmp->last_io_time, cpu); in lpfc_check_inactive_vmid_one()
338 if (!lta) in lpfc_check_inactive_vmid_one()
340 difftime = (jiffies) - (*lta); in lpfc_check_inactive_vmid_one()
341 if ((vport->vmid_inactivity_timeout * in lpfc_check_inactive_vmid_one()
352 vmp->flag = LPFC_VMID_DE_REGISTER; in lpfc_check_inactive_vmid_one()
353 write_unlock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
354 if (vport->vmid_priority_tagging) in lpfc_check_inactive_vmid_one()
363 write_lock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
367 vport->cur_vmid_cnt--; in lpfc_check_inactive_vmid_one()
368 ht->flag = LPFC_VMID_SLOT_FREE; in lpfc_check_inactive_vmid_one()
369 free_percpu(ht->last_io_time); in lpfc_check_inactive_vmid_one()
370 ht->last_io_time = NULL; in lpfc_check_inactive_vmid_one()
371 hash_del(&ht->hnode); in lpfc_check_inactive_vmid_one()
377 write_unlock(&vport->vmid_lock); in lpfc_check_inactive_vmid_one()
381 * lpfc_check_inactive_vmid - VMID inactivity checker
400 for (i = 0; i <= phba->max_vports; i++) { in lpfc_check_inactive_vmid()
402 vport = phba->pport; in lpfc_check_inactive_vmid()
414 * lpfc_check_nlp_post_devloss - Check to restore ndlp refcnt after devloss
426 if (test_and_clear_bit(NLP_IN_RECOV_POST_DEV_LOSS, &ndlp->save_flags)) { in lpfc_check_nlp_post_devloss()
427 clear_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_check_nlp_post_devloss()
430 "8438 Devloss timeout reversed on DID x%x " in lpfc_check_nlp_post_devloss()
433 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, in lpfc_check_nlp_post_devloss()
434 ndlp->nlp_flag, vport->port_state); in lpfc_check_nlp_post_devloss()
439 * lpfc_dev_loss_tmo_handler - Remote node devloss timeout handler
442 * This function is called from the worker thread when devloss timeout timer
446 * when devloss timeout happened to this @ndlp.
460 vport = ndlp->vport; in lpfc_dev_loss_tmo_handler()
461 name = (uint8_t *)&ndlp->nlp_portname; in lpfc_dev_loss_tmo_handler()
462 phba = vport->phba; in lpfc_dev_loss_tmo_handler()
464 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_dev_loss_tmo_handler()
469 ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_sid); in lpfc_dev_loss_tmo_handler()
471 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_handler()
473 __func__, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
474 ndlp->fc4_xpt_flags, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
477 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
479 "0284 Devloss timeout Ignored on " in lpfc_dev_loss_tmo_handler()
484 ndlp->nlp_DID); in lpfc_dev_loss_tmo_handler()
486 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
491 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_dev_loss_tmo_handler()
492 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
498 switch (ndlp->nlp_DID) { in lpfc_dev_loss_tmo_handler()
500 fc_vport = vport->fc_vport; in lpfc_dev_loss_tmo_handler()
503 if (fc_vport->vport_state == in lpfc_dev_loss_tmo_handler()
509 &phba->hba_flag)) in lpfc_dev_loss_tmo_handler()
514 if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_dev_loss_tmo_handler()
520 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
521 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
529 if (ndlp->nlp_DID & Fabric_DID_MASK) { in lpfc_dev_loss_tmo_handler()
530 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
531 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
536 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
542 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
546 "8436 Devloss timeout marked on " in lpfc_dev_loss_tmo_handler()
549 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
550 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
551 vport->port_state); in lpfc_dev_loss_tmo_handler()
552 set_bit(NLP_IN_RECOV_POST_DEV_LOSS, &ndlp->save_flags); in lpfc_dev_loss_tmo_handler()
554 } else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
561 "8437 Devloss timeout ignored on " in lpfc_dev_loss_tmo_handler()
564 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
565 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
566 vport->port_state); in lpfc_dev_loss_tmo_handler()
570 if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) in lpfc_dev_loss_tmo_handler()
575 if (ndlp->nlp_sid != NLP_NO_SID) { in lpfc_dev_loss_tmo_handler()
577 lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); in lpfc_dev_loss_tmo_handler()
582 "0203 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
587 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
588 ndlp->nlp_state, ndlp->nlp_rpi, in lpfc_dev_loss_tmo_handler()
589 kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
592 "0204 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
597 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
598 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_dev_loss_tmo_handler()
600 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
605 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
606 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_dev_loss_tmo_handler()
610 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_handler()
626 for (i = 0; i <= phba->max_vports; i++) { in lpfc_check_vmid_qfpa_issue()
628 vport = phba->pport; in lpfc_check_vmid_qfpa_issue()
634 if (vport->vmid_flag & LPFC_VMID_ISSUE_QFPA) { in lpfc_check_vmid_qfpa_issue()
636 vport->vmid_flag &= ~LPFC_VMID_ISSUE_QFPA; in lpfc_check_vmid_qfpa_issue()
643 * lpfc_sli4_post_dev_loss_tmo_handler - SLI4 post devloss timeout handler
645 * @fcf_inuse: SLI4 FCF in-use state reported from devloss timeout handler.
646 * @nlp_did: remote node identifer with devloss timeout.
649 * timeout handler and releasing the reference count for the ndlp with
650 * which the devloss timeout was handled for SLI4 host. For the devloss
651 * timeout of the last remote node which had been in use of FCF, when this
653 * in-use of FCF. When devloss timeout to the last remote using the FCF,
655 * failover process, the in-use FCF shall be unregistered. If the FIP
656 * engine is in FCF discovery process, the devloss timeout state shall
658 * process to unregister the in-use FCF.
664 /* If devloss timeout happened to a remote node when FCF had no in lpfc_sli4_post_dev_loss_tmo_handler()
665 * longer been in-use, do nothing. in lpfc_sli4_post_dev_loss_tmo_handler()
670 if (test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) && in lpfc_sli4_post_dev_loss_tmo_handler()
672 spin_lock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
673 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_sli4_post_dev_loss_tmo_handler()
675 &phba->hba_flag)) { in lpfc_sli4_post_dev_loss_tmo_handler()
676 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
683 if (phba->fcf.fcf_flag & FCF_REDISC_PROG) { in lpfc_sli4_post_dev_loss_tmo_handler()
684 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
690 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
691 if (!test_bit(FCF_TS_INPROG, &phba->hba_flag) && in lpfc_sli4_post_dev_loss_tmo_handler()
692 !test_bit(FCF_RR_INPROG, &phba->hba_flag)) { in lpfc_sli4_post_dev_loss_tmo_handler()
695 "unreg in-use FCF and rescan.\n"); in lpfc_sli4_post_dev_loss_tmo_handler()
696 /* Unregister in-use FCF and rescan */ in lpfc_sli4_post_dev_loss_tmo_handler()
700 if (test_bit(FCF_TS_INPROG, &phba->hba_flag)) in lpfc_sli4_post_dev_loss_tmo_handler()
703 if (test_bit(FCF_RR_INPROG, &phba->hba_flag)) in lpfc_sli4_post_dev_loss_tmo_handler()
712 * lpfc_alloc_fast_evt - Allocates data structure for posting event
726 if (atomic_read(&phba->fast_event_count) > LPFC_MAX_EVT_COUNT) in lpfc_alloc_fast_evt()
732 atomic_inc(&phba->fast_event_count); in lpfc_alloc_fast_evt()
733 INIT_LIST_HEAD(&ret->work_evt.evt_listp); in lpfc_alloc_fast_evt()
734 ret->work_evt.evt = LPFC_EVT_FASTPATH_MGMT_EVT; in lpfc_alloc_fast_evt()
740 * lpfc_free_fast_evt - Frees event data structure
751 atomic_dec(&phba->fast_event_count); in lpfc_free_fast_evt()
756 * lpfc_send_fastpath_evt - Posts events generated from fast path
777 evt_category = (unsigned long) fast_evt_data->un.fabric_evt.event_type; in lpfc_send_fastpath_evt()
778 evt_sub_category = (unsigned long) fast_evt_data->un. in lpfc_send_fastpath_evt()
780 shost = lpfc_shost_from_vport(fast_evt_data->vport); in lpfc_send_fastpath_evt()
783 evt_data = (char *) &fast_evt_data->un.read_check_error; in lpfc_send_fastpath_evt()
784 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
788 evt_data = (char *) &fast_evt_data->un.fabric_evt; in lpfc_send_fastpath_evt()
789 evt_data_size = sizeof(fast_evt_data->un.fabric_evt); in lpfc_send_fastpath_evt()
798 evt_data = (char *) &fast_evt_data->un.scsi_evt; in lpfc_send_fastpath_evt()
799 evt_data_size = sizeof(fast_evt_data->un.scsi_evt); in lpfc_send_fastpath_evt()
802 evt_data = (char *) &fast_evt_data->un.check_cond_evt; in lpfc_send_fastpath_evt()
803 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
807 evt_data = (char *) &fast_evt_data->un.queue_depth_evt; in lpfc_send_fastpath_evt()
808 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
820 if (phba->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_send_fastpath_evt()
841 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
842 while (!list_empty(&phba->work_list)) { in lpfc_work_list_done()
843 list_remove_head((&phba->work_list), evtp, typeof(*evtp), in lpfc_work_list_done()
845 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
846 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_list_done()
848 switch (evtp->evt) { in lpfc_work_list_done()
850 ndlp = (struct lpfc_nodelist *) (evtp->evt_arg1); in lpfc_work_list_done()
861 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
867 nlp_did = ndlp->nlp_DID; in lpfc_work_list_done()
869 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_list_done()
875 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
877 lpfc_sli_abts_recover_port(ndlp->vport, ndlp); in lpfc_work_list_done()
886 if (phba->link_state < LPFC_LINK_DOWN) in lpfc_work_list_done()
887 *(int *) (evtp->evt_arg1) = lpfc_online(phba); in lpfc_work_list_done()
889 *(int *) (evtp->evt_arg1) = 0; in lpfc_work_list_done()
890 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
893 if (phba->link_state >= LPFC_LINK_DOWN) in lpfc_work_list_done()
895 *(int *)(evtp->evt_arg1) = 0; in lpfc_work_list_done()
896 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
901 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
904 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
911 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
914 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
918 *(int *)(evtp->evt_arg1) in lpfc_work_list_done()
919 = (phba->pport->stopped) in lpfc_work_list_done()
922 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
929 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_work_list_done()
935 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
937 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
951 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_done()
952 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
953 ha_copy = phba->work_ha; in lpfc_work_done()
954 phba->work_ha = 0; in lpfc_work_done()
955 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
960 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC && !hba_pci_err) in lpfc_work_done()
967 if (phba->fw_dump_cmpl) { in lpfc_work_done()
968 complete(phba->fw_dump_cmpl); in lpfc_work_done()
969 phba->fw_dump_cmpl = NULL; in lpfc_work_done()
981 if (phba->pport->work_port_events & in lpfc_work_done()
984 phba->pport->work_port_events &= in lpfc_work_done()
987 if (phba->pport->work_port_events & in lpfc_work_done()
990 phba->pport->work_port_events &= in lpfc_work_done()
996 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) { in lpfc_work_done()
997 if (test_bit(HBA_RRQ_ACTIVE, &phba->hba_flag)) in lpfc_work_done()
999 if (test_bit(ELS_XRI_ABORT_EVENT, &phba->hba_flag)) in lpfc_work_done()
1001 if (test_bit(ASYNC_EVENT, &phba->hba_flag)) in lpfc_work_done()
1004 &phba->hba_flag)) in lpfc_work_done()
1006 if (phba->fcf.fcf_flag & FCF_REDISC_EVT) in lpfc_work_done()
1012 for (i = 0; i <= phba->max_vports; i++) { in lpfc_work_done()
1018 vport = phba->pport; in lpfc_work_done()
1023 spin_lock_irq(&vport->work_port_lock); in lpfc_work_done()
1024 work_port_events = vport->work_port_events; in lpfc_work_done()
1025 vport->work_port_events &= ~work_port_events; in lpfc_work_done()
1026 spin_unlock_irq(&vport->work_port_lock); in lpfc_work_done()
1050 pring->flag & LPFC_DEFERRED_RING_EVENT || in lpfc_work_done()
1051 test_bit(HBA_SP_QUEUE_EVT, &phba->hba_flag))) { in lpfc_work_done()
1052 if (pring->flag & LPFC_STOP_IOCB_EVENT) { in lpfc_work_done()
1053 pring->flag |= LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1055 if (!test_bit(HBA_SP_QUEUE_EVT, &phba->hba_flag)) in lpfc_work_done()
1056 set_bit(LPFC_DATA_READY, &phba->data_flags); in lpfc_work_done()
1061 if (phba->link_state >= LPFC_LINK_DOWN || in lpfc_work_done()
1062 phba->link_flag & LS_MDS_LOOPBACK) { in lpfc_work_done()
1063 pring->flag &= ~LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1069 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_done()
1074 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_work_done()
1075 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
1076 control = readl(phba->HCregaddr); in lpfc_work_done()
1083 writel(control, phba->HCregaddr); in lpfc_work_done()
1084 readl(phba->HCregaddr); /* flush */ in lpfc_work_done()
1090 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
1103 current->flags |= PF_NOFREEZE; in lpfc_do_work()
1104 phba->data_flags = 0; in lpfc_do_work()
1108 rc = wait_event_interruptible(phba->work_waitq, in lpfc_do_work()
1110 &phba->data_flags) in lpfc_do_work()
1122 phba->worker_thread = NULL; in lpfc_do_work()
1148 evtp->evt_arg1 = arg1; in lpfc_workq_post_event()
1149 evtp->evt_arg2 = arg2; in lpfc_workq_post_event()
1150 evtp->evt = evt; in lpfc_workq_post_event()
1152 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_workq_post_event()
1153 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_workq_post_event()
1154 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_workq_post_event()
1164 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_rpis()
1167 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_cleanup_rpis()
1168 if ((phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) || in lpfc_cleanup_rpis()
1169 ((vport->port_type == LPFC_NPIV_PORT) && in lpfc_cleanup_rpis()
1170 ((ndlp->nlp_DID == NameServer_DID) || in lpfc_cleanup_rpis()
1171 (ndlp->nlp_DID == FDMI_DID) || in lpfc_cleanup_rpis()
1172 (ndlp->nlp_DID == Fabric_Cntl_DID)))) in lpfc_cleanup_rpis()
1176 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_cleanup_rpis()
1177 (!remove && ndlp->nlp_type & NLP_FABRIC)) in lpfc_cleanup_rpis()
1181 if (phba->nvmet_support && in lpfc_cleanup_rpis()
1182 ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) in lpfc_cleanup_rpis()
1190 if (phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) { in lpfc_cleanup_rpis()
1191 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cleanup_rpis()
1194 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cleanup_rpis()
1221 struct lpfc_hba *phba = vport->phba; in lpfc_linkdown_port()
1224 if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_linkdown_port()
1230 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_linkdown_port()
1235 clear_bit(FC_DISC_DELAYED, &vport->fc_flag); in lpfc_linkdown_port()
1236 timer_delete_sync(&vport->delayed_disc_tmo); in lpfc_linkdown_port()
1238 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_linkdown_port()
1239 vport->port_type == LPFC_PHYSICAL_PORT && in lpfc_linkdown_port()
1240 phba->sli4_hba.fawwpn_flag & LPFC_FAWWPN_CONFIG) { in lpfc_linkdown_port()
1242 phba->sli4_hba.fawwpn_flag |= LPFC_FAWWPN_FABRIC; in lpfc_linkdown_port()
1249 struct lpfc_vport *vport = phba->pport; in lpfc_linkdown()
1256 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_linkdown()
1261 offline = pci_channel_offline(phba->pcidev); in lpfc_linkdown()
1264 if (phba->defer_flogi_acc.flag) { in lpfc_linkdown()
1265 if (phba->defer_flogi_acc.ndlp) { in lpfc_linkdown()
1266 lpfc_nlp_put(phba->defer_flogi_acc.ndlp); in lpfc_linkdown()
1267 phba->defer_flogi_acc.ndlp = NULL; in lpfc_linkdown()
1270 phba->defer_flogi_acc.flag = false; in lpfc_linkdown()
1273 clear_bit(HBA_FLOGI_ISSUED, &phba->hba_flag); in lpfc_linkdown()
1274 clear_bit(HBA_RHBA_CMPL, &phba->hba_flag); in lpfc_linkdown()
1277 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_linkdown()
1279 spin_lock_irq(&phba->hbalock); in lpfc_linkdown()
1280 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_linkdown()
1281 spin_unlock_irq(&phba->hbalock); in lpfc_linkdown()
1282 if (phba->link_state > LPFC_LINK_DOWN) { in lpfc_linkdown()
1283 phba->link_state = LPFC_LINK_DOWN; in lpfc_linkdown()
1284 if (phba->sli4_hba.conf_trunk) { in lpfc_linkdown()
1285 phba->trunk_link.link0.state = 0; in lpfc_linkdown()
1286 phba->trunk_link.link1.state = 0; in lpfc_linkdown()
1287 phba->trunk_link.link2.state = 0; in lpfc_linkdown()
1288 phba->trunk_link.link3.state = 0; in lpfc_linkdown()
1289 phba->trunk_link.phy_lnk_speed = in lpfc_linkdown()
1291 phba->sli4_hba.link_state.logical_speed = in lpfc_linkdown()
1294 clear_bit(FC_LBIT, &phba->pport->fc_flag); in lpfc_linkdown()
1298 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_linkdown()
1302 vports[i]->fc_myDID = 0; in lpfc_linkdown()
1304 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_linkdown()
1305 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_linkdown()
1306 if (phba->nvmet_support) in lpfc_linkdown()
1316 if (phba->sli_rev > LPFC_SLI_REV3 || offline) in lpfc_linkdown()
1319 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1322 mb->vport = vport; in lpfc_linkdown()
1323 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1326 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1332 if (test_bit(FC_PT2PT, &phba->pport->fc_flag)) { in lpfc_linkdown()
1333 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1336 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1337 mb->vport = vport; in lpfc_linkdown()
1340 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1343 clear_bit(FC_PT2PT, &phba->pport->fc_flag); in lpfc_linkdown()
1344 clear_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag); in lpfc_linkdown()
1345 spin_lock_irq(shost->host_lock); in lpfc_linkdown()
1346 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkdown()
1347 spin_unlock_irq(shost->host_lock); in lpfc_linkdown()
1357 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_linkup_cleanup_nodes()
1358 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); in lpfc_linkup_cleanup_nodes()
1360 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_linkup_cleanup_nodes()
1362 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_linkup_cleanup_nodes()
1366 if (ndlp->nlp_DID != Fabric_DID) in lpfc_linkup_cleanup_nodes()
1369 } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_linkup_cleanup_nodes()
1382 struct lpfc_hba *phba = vport->phba; in lpfc_linkup_port()
1384 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_linkup_port()
1389 phba->fc_topology, phba->fc_linkspeed, phba->link_flag); in lpfc_linkup_port()
1392 if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_linkup_port()
1393 (vport != phba->pport)) in lpfc_linkup_port()
1396 if (phba->defer_flogi_acc.flag) { in lpfc_linkup_port()
1397 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1398 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_linkup_port()
1399 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_linkup_port()
1400 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1402 clear_bit(FC_PT2PT, &vport->fc_flag); in lpfc_linkup_port()
1403 clear_bit(FC_PT2PT_PLOGI, &vport->fc_flag); in lpfc_linkup_port()
1404 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1405 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_linkup_port()
1406 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_linkup_port()
1407 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1409 set_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_linkup_port()
1411 spin_lock_irq(shost->host_lock); in lpfc_linkup_port()
1412 vport->fc_ns_retry = 0; in lpfc_linkup_port()
1413 spin_unlock_irq(shost->host_lock); in lpfc_linkup_port()
1424 struct Scsi_Host *shost = lpfc_shost_from_vport(phba->pport); in lpfc_linkup()
1426 phba->link_state = LPFC_LINK_UP; in lpfc_linkup()
1429 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_linkup()
1430 timer_delete_sync(&phba->fabric_block_timer); in lpfc_linkup()
1434 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) in lpfc_linkup()
1439 * absorbed without an ACQE. No lock here - in worker thread in lpfc_linkup()
1442 spin_lock_irq(shost->host_lock); in lpfc_linkup()
1443 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkup()
1444 spin_unlock_irq(shost->host_lock); in lpfc_linkup()
1458 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_clear_la()
1459 struct lpfc_sli *psli = &phba->sli; in lpfc_mbx_cmpl_clear_la()
1460 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_clear_la()
1464 psli->sli3_ring[LPFC_EXTRA_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1465 psli->sli3_ring[LPFC_FCP_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1468 if ((mb->mbxStatus) && (mb->mbxStatus != 0x1601)) { in lpfc_mbx_cmpl_clear_la()
1473 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_clear_la()
1474 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_clear_la()
1478 if (vport->port_type == LPFC_PHYSICAL_PORT) in lpfc_mbx_cmpl_clear_la()
1479 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_clear_la()
1481 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1482 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1483 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1485 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1486 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1487 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1488 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1495 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1497 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_mbx_cmpl_clear_la()
1503 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1504 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1505 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1507 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1508 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1509 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1517 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_local_config_link()
1519 u16 status = pmb->u.mb.mbxStatus; in lpfc_mbx_cmpl_local_config_link()
1522 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1528 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_local_config_link()
1529 !test_bit(HBA_FCOE_MODE, &phba->hba_flag) && in lpfc_mbx_cmpl_local_config_link()
1530 (phba->link_flag & LS_LOOPBACK_MODE)) in lpfc_mbx_cmpl_local_config_link()
1533 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_mbx_cmpl_local_config_link()
1534 test_bit(FC_PUBLIC_LOOP, &vport->fc_flag) && in lpfc_mbx_cmpl_local_config_link()
1535 !test_bit(FC_LBIT, &vport->fc_flag)) { in lpfc_mbx_cmpl_local_config_link()
1536 /* Need to wait for FAN - use discovery timer in lpfc_mbx_cmpl_local_config_link()
1537 * for timeout. port_state is identically in lpfc_mbx_cmpl_local_config_link()
1547 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_local_config_link()
1549 * bb-credit recovery is in place. in lpfc_mbx_cmpl_local_config_link()
1551 if (phba->bbcredit_support && phba->cfg_enable_bbcr && in lpfc_mbx_cmpl_local_config_link()
1552 !(phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_local_config_link()
1553 sparam_mb = mempool_alloc(phba->mbox_mem_pool, in lpfc_mbx_cmpl_local_config_link()
1560 mempool_free(sparam_mb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1563 sparam_mb->vport = vport; in lpfc_mbx_cmpl_local_config_link()
1564 sparam_mb->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_cmpl_local_config_link()
1572 set_bit(HBA_DEFER_FLOGI, &phba->hba_flag); in lpfc_mbx_cmpl_local_config_link()
1577 if (test_bit(FC_PT2PT, &vport->fc_flag)) in lpfc_mbx_cmpl_local_config_link()
1585 status, vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1592 vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1611 memset(phba->fcf.fcf_rr_bmask, 0, sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_clear_fcf_rr_bmask()
1612 spin_lock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1614 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_clear_fcf_rr_bmask()
1615 list_del_init(&fcf_pri->list); in lpfc_sli4_clear_fcf_rr_bmask()
1616 fcf_pri->fcf_rec.flag = 0; in lpfc_sli4_clear_fcf_rr_bmask()
1618 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1623 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_fcfi()
1625 if (mboxq->u.mb.mbxStatus) { in lpfc_mbx_cmpl_reg_fcfi()
1628 "HBA state x%x\n", mboxq->u.mb.mbxStatus, in lpfc_mbx_cmpl_reg_fcfi()
1629 vport->port_state); in lpfc_mbx_cmpl_reg_fcfi()
1634 phba->fcf.fcfi = bf_get(lpfc_reg_fcfi_fcfi, &mboxq->u.mqe.un.reg_fcfi); in lpfc_mbx_cmpl_reg_fcfi()
1636 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1637 phba->fcf.fcf_flag |= FCF_REGISTERED; in lpfc_mbx_cmpl_reg_fcfi()
1638 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1641 if (!test_bit(FCF_RR_INPROG, &phba->hba_flag) && in lpfc_mbx_cmpl_reg_fcfi()
1646 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1647 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_mbx_cmpl_reg_fcfi()
1648 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1649 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1650 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_reg_fcfi()
1651 set_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1657 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1659 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_fcfi()
1663 * lpfc_fab_name_match - Check if the fcf fabric name match.
1694 * lpfc_sw_name_match - Check if the fcf switch name match.
1725 * lpfc_mac_addr_match - Check if the fcf mac address match.
1758 * __lpfc_update_fcf_record_pri - update the lpfc_fcf_pri record.
1774 fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in __lpfc_update_fcf_record_pri()
1775 fcf_pri->fcf_rec.fcf_index = fcf_index; in __lpfc_update_fcf_record_pri()
1777 fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in __lpfc_update_fcf_record_pri()
1782 * lpfc_copy_fcf_record - Copy fcf information to lpfc_hba.
1794 fcf_rec->fabric_name[0] = in lpfc_copy_fcf_record()
1796 fcf_rec->fabric_name[1] = in lpfc_copy_fcf_record()
1798 fcf_rec->fabric_name[2] = in lpfc_copy_fcf_record()
1800 fcf_rec->fabric_name[3] = in lpfc_copy_fcf_record()
1802 fcf_rec->fabric_name[4] = in lpfc_copy_fcf_record()
1804 fcf_rec->fabric_name[5] = in lpfc_copy_fcf_record()
1806 fcf_rec->fabric_name[6] = in lpfc_copy_fcf_record()
1808 fcf_rec->fabric_name[7] = in lpfc_copy_fcf_record()
1811 fcf_rec->mac_addr[0] = bf_get(lpfc_fcf_record_mac_0, new_fcf_record); in lpfc_copy_fcf_record()
1812 fcf_rec->mac_addr[1] = bf_get(lpfc_fcf_record_mac_1, new_fcf_record); in lpfc_copy_fcf_record()
1813 fcf_rec->mac_addr[2] = bf_get(lpfc_fcf_record_mac_2, new_fcf_record); in lpfc_copy_fcf_record()
1814 fcf_rec->mac_addr[3] = bf_get(lpfc_fcf_record_mac_3, new_fcf_record); in lpfc_copy_fcf_record()
1815 fcf_rec->mac_addr[4] = bf_get(lpfc_fcf_record_mac_4, new_fcf_record); in lpfc_copy_fcf_record()
1816 fcf_rec->mac_addr[5] = bf_get(lpfc_fcf_record_mac_5, new_fcf_record); in lpfc_copy_fcf_record()
1818 fcf_rec->fcf_indx = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); in lpfc_copy_fcf_record()
1820 fcf_rec->priority = new_fcf_record->fip_priority; in lpfc_copy_fcf_record()
1822 fcf_rec->switch_name[0] = in lpfc_copy_fcf_record()
1824 fcf_rec->switch_name[1] = in lpfc_copy_fcf_record()
1826 fcf_rec->switch_name[2] = in lpfc_copy_fcf_record()
1828 fcf_rec->switch_name[3] = in lpfc_copy_fcf_record()
1830 fcf_rec->switch_name[4] = in lpfc_copy_fcf_record()
1832 fcf_rec->switch_name[5] = in lpfc_copy_fcf_record()
1834 fcf_rec->switch_name[6] = in lpfc_copy_fcf_record()
1836 fcf_rec->switch_name[7] = in lpfc_copy_fcf_record()
1841 * __lpfc_update_fcf_record - Update driver fcf record
1858 lockdep_assert_held(&phba->hbalock); in __lpfc_update_fcf_record()
1863 fcf_rec->addr_mode = addr_mode; in __lpfc_update_fcf_record()
1864 fcf_rec->vlan_id = vlan_id; in __lpfc_update_fcf_record()
1865 fcf_rec->flag |= (flag | RECORD_VALID); in __lpfc_update_fcf_record()
1872 * lpfc_register_fcf - Register the FCF with hba.
1884 spin_lock_irq(&phba->hbalock); in lpfc_register_fcf()
1886 if (!(phba->fcf.fcf_flag & FCF_AVAILABLE)) { in lpfc_register_fcf()
1887 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1888 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1889 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1894 if (phba->fcf.fcf_flag & FCF_REGISTERED) { in lpfc_register_fcf()
1895 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_register_fcf()
1896 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1897 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1898 if (phba->pport->port_state != LPFC_FLOGI && in lpfc_register_fcf()
1899 test_bit(FC_FABRIC, &phba->pport->fc_flag)) { in lpfc_register_fcf()
1900 set_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1901 lpfc_initial_flogi(phba->pport); in lpfc_register_fcf()
1906 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1908 fcf_mbxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_fcf()
1910 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1911 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1916 fcf_mbxq->vport = phba->pport; in lpfc_register_fcf()
1917 fcf_mbxq->mbox_cmpl = lpfc_mbx_cmpl_reg_fcfi; in lpfc_register_fcf()
1920 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1921 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1922 mempool_free(fcf_mbxq, phba->mbox_mem_pool); in lpfc_register_fcf()
1929 * lpfc_match_fcf_conn_list - Check if the FCF record can be used for discovery.
1957 if (new_fcf_record->vlan_bitmap[i]) { in lpfc_match_fcf_conn_list()
1960 while (!((new_fcf_record->vlan_bitmap[i] >> j) & 1)) { in lpfc_match_fcf_conn_list()
1974 if (!test_bit(HBA_FIP_SUPPORT, &phba->hba_flag)) { in lpfc_match_fcf_conn_list()
1978 if (phba->valid_vlan) in lpfc_match_fcf_conn_list()
1979 *vlan_id = phba->vlan_id; in lpfc_match_fcf_conn_list()
1989 if (list_empty(&phba->fcf_conn_rec_list)) { in lpfc_match_fcf_conn_list()
1996 * addressing mode - FPMA. in lpfc_match_fcf_conn_list()
2010 &phba->fcf_conn_rec_list, list) { in lpfc_match_fcf_conn_list()
2011 if (!(conn_entry->conn_rec.flags & FCFCNCT_VALID)) in lpfc_match_fcf_conn_list()
2014 if ((conn_entry->conn_rec.flags & FCFCNCT_FBNM_VALID) && in lpfc_match_fcf_conn_list()
2015 !lpfc_fab_name_match(conn_entry->conn_rec.fabric_name, in lpfc_match_fcf_conn_list()
2018 if ((conn_entry->conn_rec.flags & FCFCNCT_SWNM_VALID) && in lpfc_match_fcf_conn_list()
2019 !lpfc_sw_name_match(conn_entry->conn_rec.switch_name, in lpfc_match_fcf_conn_list()
2022 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) { in lpfc_match_fcf_conn_list()
2027 if (!(new_fcf_record->vlan_bitmap in lpfc_match_fcf_conn_list()
2028 [conn_entry->conn_rec.vlan_tag / 8] & in lpfc_match_fcf_conn_list()
2029 (1 << (conn_entry->conn_rec.vlan_tag % 8)))) in lpfc_match_fcf_conn_list()
2045 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2046 !(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED)) { in lpfc_match_fcf_conn_list()
2051 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2059 if (!(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2068 if (conn_entry->conn_rec.flags & FCFCNCT_BOOT) in lpfc_match_fcf_conn_list()
2084 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2085 (!(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED))) in lpfc_match_fcf_conn_list()
2086 *addr_mode = (conn_entry->conn_rec.flags & in lpfc_match_fcf_conn_list()
2093 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2094 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2095 (conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2098 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2099 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2100 !(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2105 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) in lpfc_match_fcf_conn_list()
2106 *vlan_id = conn_entry->conn_rec.vlan_tag; in lpfc_match_fcf_conn_list()
2123 * lpfc_check_pending_fcoe_event - Check if there is pending fcoe event.
2125 * @unreg_fcf: Unregister FCF if FCF table need to be re-scaned.
2138 if ((phba->link_state >= LPFC_LINK_UP) && in lpfc_check_pending_fcoe_event()
2139 (phba->fcoe_eventtag == phba->fcoe_eventtag_at_fcf_scan)) in lpfc_check_pending_fcoe_event()
2146 phba->link_state, phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2147 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2149 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2150 phba->fcf.fcf_flag &= ~FCF_AVAILABLE; in lpfc_check_pending_fcoe_event()
2151 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2153 if (phba->link_state >= LPFC_LINK_UP) { in lpfc_check_pending_fcoe_event()
2158 phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2159 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2168 "state change (x%x)\n", phba->link_state); in lpfc_check_pending_fcoe_event()
2169 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_check_pending_fcoe_event()
2170 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_check_pending_fcoe_event()
2171 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2172 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY); in lpfc_check_pending_fcoe_event()
2173 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2178 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2179 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_check_pending_fcoe_event()
2180 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2187 * lpfc_sli4_new_fcf_random_select - Randomly select an eligible new fcf record
2194 * size unit32_t, a 16-bit random number returned from get_random_u16() is
2206 /* Get 16-bit uniform random number */ in lpfc_sli4_new_fcf_random_select()
2217 * lpfc_sli4_fcf_rec_mbox_parse - Parse read_fcf mbox command.
2222 * This routine parses the non-embedded fcf mailbox command by performing the
2223 * necessarily error checking, non-embedded read FCF record mailbox command
2226 * Returns the pointer to the new FCF record in the non-embedded mailbox
2240 /* Get the first SGE entry from the non-embedded DMA memory. This in lpfc_sli4_fcf_rec_mbox_parse()
2244 if (unlikely(!mboxq->sge_array)) { in lpfc_sli4_fcf_rec_mbox_parse()
2246 "2524 Failed to get the non-embedded SGE " in lpfc_sli4_fcf_rec_mbox_parse()
2250 virt_addr = mboxq->sge_array->addr[0]; in lpfc_sli4_fcf_rec_mbox_parse()
2255 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2256 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_fcf_rec_mbox_parse()
2257 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2282 new_fcf_record->word137 = le32_to_cpu(new_fcf_record->word137); in lpfc_sli4_fcf_rec_mbox_parse()
2283 new_fcf_record->word138 = le32_to_cpu(new_fcf_record->word138); in lpfc_sli4_fcf_rec_mbox_parse()
2289 * lpfc_sli4_log_fcf_record_info - Log the information of a fcf record
2321 fcf_record->fip_priority, in lpfc_sli4_log_fcf_record_info()
2350 * lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
2369 if (!lpfc_vlan_id_match(fcf_rec->vlan_id, new_vlan_id)) in lpfc_sli4_fcf_record_match()
2371 if (!lpfc_mac_addr_match(fcf_rec->mac_addr, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2373 if (!lpfc_sw_name_match(fcf_rec->switch_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2375 if (!lpfc_fab_name_match(fcf_rec->fabric_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2377 if (fcf_rec->priority != new_fcf_record->fip_priority) in lpfc_sli4_fcf_record_match()
2383 * lpfc_sli4_fcf_rr_next_proc - processing next roundrobin fcf
2395 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_fcf_rr_next_proc()
2399 if (test_bit(HBA_DEVLOSS_TMO, &phba->hba_flag)) { in lpfc_sli4_fcf_rr_next_proc()
2402 "FCF, unregister in-use FCF (x%x) " in lpfc_sli4_fcf_rr_next_proc()
2404 phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2409 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_sli4_fcf_rr_next_proc()
2411 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2412 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_sli4_fcf_rr_next_proc()
2413 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2417 phba->pport->port_state, LPFC_VPORT_UNKNOWN); in lpfc_sli4_fcf_rr_next_proc()
2418 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_sli4_fcf_rr_next_proc()
2420 if (!phba->fcf.fcf_redisc_attempted) { in lpfc_sli4_fcf_rr_next_proc()
2427 phba->fcf.fcf_redisc_attempted = 1; in lpfc_sli4_fcf_rr_next_proc()
2449 rc, phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2474 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_del()
2477 fcf_index, new_fcf_pri->fcf_rec.priority, in lpfc_sli4_fcf_pri_list_del()
2478 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_del()
2479 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2480 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) { in lpfc_sli4_fcf_pri_list_del()
2481 if (phba->fcf.current_rec.priority == in lpfc_sli4_fcf_pri_list_del()
2482 new_fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_del()
2483 phba->fcf.eligible_fcf_cnt--; in lpfc_sli4_fcf_pri_list_del()
2484 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_del()
2485 new_fcf_pri->fcf_rec.flag &= ~LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_del()
2487 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2497 * If the fcf record is re-read for any reason this flag is cleared brfore
2504 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_set_fcf_flogi_fail()
2505 spin_lock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2506 new_fcf_pri->fcf_rec.flag |= LPFC_FCF_FLOGI_FAILED; in lpfc_sli4_set_fcf_flogi_fail()
2507 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2537 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_add()
2540 fcf_index, new_fcf_record->fip_priority, in lpfc_sli4_fcf_pri_list_add()
2541 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_add()
2542 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2543 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) in lpfc_sli4_fcf_pri_list_add()
2544 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2545 new_fcf_pri->fcf_rec.fcf_index = fcf_index; in lpfc_sli4_fcf_pri_list_add()
2546 new_fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in lpfc_sli4_fcf_pri_list_add()
2547 if (list_empty(&phba->fcf.fcf_pri_list)) { in lpfc_sli4_fcf_pri_list_add()
2548 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2550 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2554 last_index = find_first_bit(phba->fcf.fcf_rr_bmask, in lpfc_sli4_fcf_pri_list_add()
2560 current_fcf_pri = phba->fcf.fcf_pri[last_index].fcf_rec.priority; in lpfc_sli4_fcf_pri_list_add()
2561 if (new_fcf_pri->fcf_rec.priority <= current_fcf_pri) { in lpfc_sli4_fcf_pri_list_add()
2562 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2563 if (new_fcf_pri->fcf_rec.priority < current_fcf_pri) { in lpfc_sli4_fcf_pri_list_add()
2564 memset(phba->fcf.fcf_rr_bmask, 0, in lpfc_sli4_fcf_pri_list_add()
2565 sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_fcf_pri_list_add()
2567 phba->fcf.eligible_fcf_cnt = 1; in lpfc_sli4_fcf_pri_list_add()
2570 phba->fcf.eligible_fcf_cnt++; in lpfc_sli4_fcf_pri_list_add()
2572 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2577 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_fcf_pri_list_add()
2578 if (new_fcf_pri->fcf_rec.priority <= in lpfc_sli4_fcf_pri_list_add()
2579 fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2580 if (fcf_pri->list.prev == &phba->fcf.fcf_pri_list) in lpfc_sli4_fcf_pri_list_add()
2581 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2582 &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2584 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2586 fcf_pri->list.prev)->list); in lpfc_sli4_fcf_pri_list_add()
2589 } else if (fcf_pri->list.next == &phba->fcf.fcf_pri_list in lpfc_sli4_fcf_pri_list_add()
2590 || new_fcf_pri->fcf_rec.priority < in lpfc_sli4_fcf_pri_list_add()
2591 next_fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2592 list_add(&new_fcf_pri->list, &fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2596 if (new_fcf_pri->fcf_rec.priority > fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_add()
2603 new_fcf_pri->fcf_rec.flag = LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_add()
2604 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2609 * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler.
2640 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2648 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2681 if ((phba->fcf.fcf_flag & FCF_IN_USE) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2682 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2685 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2689 "of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2692 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2696 * In case the current in-use FCF record becomes in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2701 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2702 !(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2704 "2835 Invalid in-use FCF " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2707 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2708 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2709 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2710 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2729 * matches the in-use FCF record: fabric name, switch name, mac in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2732 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2733 if (phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2734 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2735 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2738 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2739 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2740 if (phba->fcf.fcf_flag & FCF_REDISC_PEND) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2744 else if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2746 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2747 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2749 "2836 New FCF matches in-use " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2752 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2753 phba->pport->port_state, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2754 phba->pport->fc_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2759 "property of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2762 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2766 * with in-use record only if not during the fast failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2771 if (!(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2772 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2777 * Update on failover FCF record only if it's in FCF fast-failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2780 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2781 fcf_rec = &phba->fcf.failover_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2783 fcf_rec = &phba->fcf.current_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2785 if (phba->fcf.fcf_flag & FCF_AVAILABLE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2791 if (boot_flag && !(fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2796 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2801 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2809 if (!boot_flag && (fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2810 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2817 if (new_fcf_record->fip_priority < fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2822 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2828 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2829 } else if (new_fcf_record->fip_priority == fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2831 phba->fcf.eligible_fcf_cnt++; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2833 phba->fcf.eligible_fcf_cnt); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2838 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2847 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2852 * initial best-fit FCF. in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2863 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2865 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2867 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2873 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2882 if (!(phba->fcf.failover_rec.flag & RECORD_VALID)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2886 phba->fcoe_eventtag_at_fcf_scan, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2890 &phba->hba_flag)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2892 &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2893 /* Unregister in-use FCF and rescan */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2897 "unreg in-use FCF and " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2905 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2910 * the same as in-use FCF record, unregister the in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2911 * in-use FCF record, replace the in-use FCF record in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2917 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2920 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2922 "2842 Replace in-use FCF (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2924 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2925 phba->fcf.failover_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2926 memcpy(&phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2927 &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2934 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2935 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2936 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2944 if ((phba->fcf.fcf_flag & FCF_REDISC_EVT) || in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2945 (phba->fcf.fcf_flag & FCF_REDISC_PEND)) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2948 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2949 phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2951 * In case the current in-use FCF record no in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2957 "2841 In-use FCF record (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2960 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2961 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2962 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2963 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2983 * lpfc_mbx_cmpl_fcf_rr_read_fcf_rec - fcf roundrobin read_fcf mbox cmpl hdler
3008 if (phba->link_state < LPFC_LINK_UP) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3009 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3010 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3011 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3012 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3016 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3023 "hba_flg x%lx fcf_flg x%x\n", phba->hba_flag, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3024 phba->fcf.fcf_flag); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3046 rc = lpfc_sli4_fcf_rr_next_proc(phba->pport, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3052 if (fcf_index == phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3056 phba->fcf.current_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3057 /* Wait 500 ms before retrying FLOGI to current FCF */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3059 lpfc_issue_init_vfi(phba->pport); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3066 phba->fcf.failover_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3067 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3068 __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3071 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3073 current_fcf_index = phba->fcf.current_rec.fcf_indx; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3075 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3078 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3079 memcpy(&phba->fcf.current_rec, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3093 * lpfc_mbx_cmpl_read_fcf_rec - read fcf completion handler.
3113 if (phba->link_state < LPFC_LINK_UP) in lpfc_mbx_cmpl_read_fcf_rec()
3117 if (!(phba->fcf.fcf_flag & FCF_DISCOVERY)) in lpfc_mbx_cmpl_read_fcf_rec()
3120 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_read_fcf_rec()
3151 * lpfc_init_vfi_cmpl - Completion handler for init_vfi mbox command.
3160 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vfi_cmpl()
3164 * Also continue if the VFI is in use - just use the same one. in lpfc_init_vfi_cmpl()
3166 if (mboxq->u.mb.mbxStatus && in lpfc_init_vfi_cmpl()
3167 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_init_vfi_cmpl()
3169 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_init_vfi_cmpl()
3172 mboxq->u.mb.mbxStatus); in lpfc_init_vfi_cmpl()
3173 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3179 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3184 * lpfc_issue_init_vfi - Issue init_vfi mailbox command.
3195 struct lpfc_hba *phba = vport->phba; in lpfc_issue_init_vfi()
3197 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vfi()
3205 mboxq->mbox_cmpl = lpfc_init_vfi_cmpl; in lpfc_issue_init_vfi()
3210 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vfi()
3215 * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command.
3224 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vpi_cmpl()
3227 if (mboxq->u.mb.mbxStatus) { in lpfc_init_vpi_cmpl()
3230 mboxq->u.mb.mbxStatus); in lpfc_init_vpi_cmpl()
3231 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3235 clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_init_vpi_cmpl()
3238 if ((phba->pport == vport) || (vport->port_state == LPFC_FDISC)) { in lpfc_init_vpi_cmpl()
3247 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3251 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_init_vpi_cmpl()
3258 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3263 * lpfc_issue_init_vpi - Issue init_vpi mailbox command.
3275 if ((vport->port_type != LPFC_PHYSICAL_PORT) && (!vport->vpi)) { in lpfc_issue_init_vpi()
3276 vpi = lpfc_alloc_vpi(vport->phba); in lpfc_issue_init_vpi()
3283 vport->vpi = vpi; in lpfc_issue_init_vpi()
3286 mboxq = mempool_alloc(vport->phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vpi()
3293 lpfc_init_vpi(vport->phba, mboxq, vport->vpi); in lpfc_issue_init_vpi()
3294 mboxq->vport = vport; in lpfc_issue_init_vpi()
3295 mboxq->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_issue_init_vpi()
3296 rc = lpfc_sli_issue_mbox(vport->phba, mboxq, MBX_NOWAIT); in lpfc_issue_init_vpi()
3300 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vpi()
3305 * lpfc_start_fdiscs - send fdiscs for each vports on this port.
3319 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_start_fdiscs()
3320 if (vports[i]->port_type == LPFC_PHYSICAL_PORT) in lpfc_start_fdiscs()
3323 if (vports[i]->vpi > phba->max_vpi) { in lpfc_start_fdiscs()
3328 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_start_fdiscs()
3334 &vports[i]->fc_flag)) { in lpfc_start_fdiscs()
3338 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_start_fdiscs()
3356 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_vfi()
3363 if (mboxq->u.mb.mbxStatus && in lpfc_mbx_cmpl_reg_vfi()
3364 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_mbx_cmpl_reg_vfi()
3366 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_mbx_cmpl_reg_vfi()
3370 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_mbx_cmpl_reg_vfi()
3371 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_reg_vfi()
3386 if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag)) in lpfc_mbx_cmpl_reg_vfi()
3387 if (!(phba->sli_rev == LPFC_SLI_REV4 && in lpfc_mbx_cmpl_reg_vfi()
3388 test_bit(FC_PT2PT, &vport->fc_flag))) in lpfc_mbx_cmpl_reg_vfi()
3392 set_bit(FC_VFI_REGISTERED, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3393 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3394 clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3395 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3396 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vfi()
3397 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3400 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_reg_vfi()
3401 (phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_reg_vfi()
3402 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_reg_vfi()
3409 vport->port_state, vport->fc_flag, vport->fc_myDID, in lpfc_mbx_cmpl_reg_vfi()
3410 vport->phba->alpa_map[0], in lpfc_mbx_cmpl_reg_vfi()
3411 phba->link_state, phba->fc_topology); in lpfc_mbx_cmpl_reg_vfi()
3413 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_reg_vfi()
3418 if (test_bit(FC_PT2PT, &vport->fc_flag) || in lpfc_mbx_cmpl_reg_vfi()
3419 (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_mbx_cmpl_reg_vfi()
3420 !test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))) { in lpfc_mbx_cmpl_reg_vfi()
3425 if (test_bit(FC_PT2PT, &vport->fc_flag)) in lpfc_mbx_cmpl_reg_vfi()
3426 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vfi()
3442 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_sparam()
3443 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_read_sparam()
3444 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_sparam()
3446 struct serv_parm *sp = &vport->fc_sparam; in lpfc_mbx_cmpl_read_sparam()
3450 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_sparam()
3455 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_sparam()
3460 memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, in lpfc_mbx_cmpl_read_sparam()
3463 ed_tov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_mbx_cmpl_read_sparam()
3464 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_mbx_cmpl_read_sparam()
3467 phba->fc_edtov = ed_tov; in lpfc_mbx_cmpl_read_sparam()
3468 phba->fc_ratov = (2 * ed_tov) / 1000; in lpfc_mbx_cmpl_read_sparam()
3469 if (phba->fc_ratov < FF_DEF_RATOV) { in lpfc_mbx_cmpl_read_sparam()
3471 phba->fc_ratov = FF_DEF_RATOV; in lpfc_mbx_cmpl_read_sparam()
3475 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn); in lpfc_mbx_cmpl_read_sparam()
3476 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_read_sparam()
3477 memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3478 memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3486 if (test_bit(HBA_DEFER_FLOGI, &phba->hba_flag)) { in lpfc_mbx_cmpl_read_sparam()
3488 clear_bit(HBA_DEFER_FLOGI, &phba->hba_flag); in lpfc_mbx_cmpl_read_sparam()
3500 struct lpfc_vport *vport = phba->pport; in lpfc_mbx_process_link_up()
3507 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3508 phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la); in lpfc_mbx_process_link_up()
3510 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3524 phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN; in lpfc_mbx_process_link_up()
3529 if (phba->fc_topology && in lpfc_mbx_process_link_up()
3530 phba->fc_topology != bf_get(lpfc_mbx_read_top_topology, la)) { in lpfc_mbx_process_link_up()
3533 phba->fc_topology, in lpfc_mbx_process_link_up()
3535 phba->fc_topology_changed = 1; in lpfc_mbx_process_link_up()
3538 phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la); in lpfc_mbx_process_link_up()
3539 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()
3553 set_bit(FC_LBIT, &vport->fc_flag); 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()
3602 set_bit(FC_LBIT, &vport->fc_flag); in lpfc_mbx_process_link_up()
3604 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3609 sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3615 mempool_free(sparam_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3618 sparam_mbox->vport = vport; in lpfc_mbx_process_link_up()
3619 sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_process_link_up()
3626 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3627 cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3630 vport->port_state = LPFC_LOCAL_CFG_LINK; in lpfc_mbx_process_link_up()
3632 cfglink_mbox->vport = vport; in lpfc_mbx_process_link_up()
3633 cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_mbx_process_link_up()
3636 mempool_free(cfglink_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3640 vport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_mbx_process_link_up()
3646 if (!test_bit(HBA_FIP_SUPPORT, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3654 rc = -ENODEV; in lpfc_mbx_process_link_up()
3666 rc = -ENODEV; in lpfc_mbx_process_link_up()
3676 if (test_bit(FCF_TS_INPROG, &phba->hba_flag)) in lpfc_mbx_process_link_up()
3679 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3680 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_mbx_process_link_up()
3681 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3687 spin_lock_irqsave(&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()
3697 memset(phba->os_host_name, 0, sizeof(phba->os_host_name)); in lpfc_mbx_process_link_up()
3698 scnprintf(phba->os_host_name, sizeof(phba->os_host_name), "%s", in lpfc_mbx_process_link_up()
3699 init_utsname()->nodename); in lpfc_mbx_process_link_up()
3705 vport->port_state, sparam_mbox, cfglink_mbox); in lpfc_mbx_process_link_up()
3714 struct lpfc_sli *psli = &phba->sli; in lpfc_enable_la()
3715 spin_lock_irq(&phba->hbalock); in lpfc_enable_la()
3716 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_enable_la()
3717 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_enable_la()
3718 control = readl(phba->HCregaddr); in lpfc_enable_la()
3720 writel(control, phba->HCregaddr); in lpfc_enable_la()
3721 readl(phba->HCregaddr); /* flush */ in lpfc_enable_la()
3723 spin_unlock_irq(&phba->hbalock); in lpfc_enable_la()
3732 /* turn on Link Attention interrupts - no CLEAR_LA needed */ in lpfc_mbx_issue_link_down()
3745 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_topology()
3748 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_topology()
3749 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_read_topology()
3755 pring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_read_topology()
3758 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_topology()
3761 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_topology()
3763 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_read_topology()
3767 la = (struct lpfc_mbx_read_top *) &pmb->u.mb.un.varReadTop; in lpfc_mbx_cmpl_read_topology()
3770 memcpy(&phba->alpa_map[0], mp->virt, 128); in lpfc_mbx_cmpl_read_topology()
3773 set_bit(FC_BYPASSED_MODE, &vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3775 clear_bit(FC_BYPASSED_MODE, &vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3777 if (phba->fc_eventTag <= la->eventTag) { in lpfc_mbx_cmpl_read_topology()
3778 phba->fc_stat.LinkMultiEvent++; in lpfc_mbx_cmpl_read_topology()
3780 if (phba->fc_eventTag != 0) in lpfc_mbx_cmpl_read_topology()
3784 phba->fc_eventTag = la->eventTag; in lpfc_mbx_cmpl_read_topology()
3785 phba->link_events++; in lpfc_mbx_cmpl_read_topology()
3787 phba->fc_stat.LinkUp++; in lpfc_mbx_cmpl_read_topology()
3788 if (phba->link_flag & LS_LOOPBACK_MODE) { in lpfc_mbx_cmpl_read_topology()
3792 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3796 phba->alpa_map[0]); in lpfc_mbx_cmpl_read_topology()
3801 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3805 phba->alpa_map[0], in lpfc_mbx_cmpl_read_topology()
3810 if (phba->cmf_active_mode != LPFC_CFG_OFF) in lpfc_mbx_cmpl_read_topology()
3813 if (phba->lmt & LMT_64Gb) in lpfc_mbx_cmpl_read_topology()
3818 phba->fc_stat.LinkDown++; in lpfc_mbx_cmpl_read_topology()
3819 if (phba->link_flag & LS_LOOPBACK_MODE) in lpfc_mbx_cmpl_read_topology()
3824 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3825 phba->pport->port_state, vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3830 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3831 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3837 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3838 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3843 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_mbx_cmpl_read_topology()
3862 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_login()
3863 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_reg_login()
3864 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_reg_login()
3870 pmb->ctx_buf = NULL; in lpfc_mbx_cmpl_reg_login()
3871 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_reg_login()
3875 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_reg_login()
3876 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_reg_login()
3878 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3880 if (test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) || in lpfc_mbx_cmpl_reg_login()
3881 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { in lpfc_mbx_cmpl_reg_login()
3890 clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3897 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3903 pmb->ctx_buf = mp; in lpfc_mbx_cmpl_reg_login()
3917 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_unreg_vpi()
3918 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_unreg_vpi()
3921 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_unreg_vpi()
3926 mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3932 vport->vpi, mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3933 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_mbx_cmpl_unreg_vpi()
3938 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_unreg_vpi()
3939 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3940 vport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_unreg_vpi()
3941 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3942 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_unreg_vpi()
3948 if (test_bit(FC_UNLOADING, &vport->load_flag) && vport != phba->pport) in lpfc_mbx_cmpl_unreg_vpi()
3955 struct lpfc_hba *phba = vport->phba; in lpfc_mbx_unreg_vpi()
3959 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_unreg_vpi()
3963 lpfc_unreg_vpi(phba, vport->vpi, mbox); in lpfc_mbx_unreg_vpi()
3964 mbox->vport = vport; in lpfc_mbx_unreg_vpi()
3965 mbox->mbox_cmpl = lpfc_mbx_cmpl_unreg_vpi; in lpfc_mbx_unreg_vpi()
3970 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_mbx_unreg_vpi()
3979 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_vpi()
3981 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_reg_vpi()
3983 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_reg_vpi()
3989 mb->mbxStatus); in lpfc_mbx_cmpl_reg_vpi()
3991 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
3992 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
3993 vport->fc_myDID = 0; in lpfc_mbx_cmpl_reg_vpi()
3995 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_reg_vpi()
3996 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_mbx_cmpl_reg_vpi()
3997 if (phba->nvmet_support) in lpfc_mbx_cmpl_reg_vpi()
4005 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
4006 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4007 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vpi()
4008 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4009 vport->num_disc_nodes = 0; in lpfc_mbx_cmpl_reg_vpi()
4011 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_mbx_cmpl_reg_vpi()
4014 if (!vport->num_disc_nodes) { in lpfc_mbx_cmpl_reg_vpi()
4015 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
4018 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vpi()
4021 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_vpi()
4026 * lpfc_create_static_vport - Read HBA config region to create static vports.
4049 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_create_static_vport()
4057 mb = &pmb->u.mb; in lpfc_create_static_vport()
4064 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_create_static_vport()
4072 * the dump routine is a single-use construct. in lpfc_create_static_vport()
4074 if (pmb->ctx_buf) { in lpfc_create_static_vport()
4075 mp = pmb->ctx_buf; in lpfc_create_static_vport()
4076 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_create_static_vport()
4078 pmb->ctx_buf = NULL; in lpfc_create_static_vport()
4083 pmb->vport = phba->pport; in lpfc_create_static_vport()
4087 if ((mbx_wait_rc != MBX_SUCCESS) || mb->mbxStatus) { in lpfc_create_static_vport()
4092 mbx_wait_rc, mb->mbxStatus); in lpfc_create_static_vport()
4096 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_create_static_vport()
4097 byte_count = pmb->u.mqe.un.mb_words[5]; in lpfc_create_static_vport()
4098 mp = pmb->ctx_buf; in lpfc_create_static_vport()
4099 if (byte_count > sizeof(struct static_vport_info) - in lpfc_create_static_vport()
4102 - offset; in lpfc_create_static_vport()
4103 memcpy(vport_buff + offset, mp->virt, byte_count); in lpfc_create_static_vport()
4106 if (mb->un.varDmp.word_cnt > in lpfc_create_static_vport()
4107 sizeof(struct static_vport_info) - offset) in lpfc_create_static_vport()
4108 mb->un.varDmp.word_cnt = in lpfc_create_static_vport()
4110 - offset; in lpfc_create_static_vport()
4111 byte_count = mb->un.varDmp.word_cnt; in lpfc_create_static_vport()
4123 if ((le32_to_cpu(vport_info->signature) != VPORT_INFO_SIG) || in lpfc_create_static_vport()
4124 ((le32_to_cpu(vport_info->rev) & VPORT_INFO_REV_MASK) in lpfc_create_static_vport()
4129 le32_to_cpu(vport_info->signature), in lpfc_create_static_vport()
4130 le32_to_cpu(vport_info->rev) & in lpfc_create_static_vport()
4136 shost = lpfc_shost_from_vport(phba->pport); in lpfc_create_static_vport()
4140 vport_id.port_name = wwn_to_u64(vport_info->vport_list[i].wwpn); in lpfc_create_static_vport()
4141 vport_id.node_name = wwn_to_u64(vport_info->vport_list[i].wwnn); in lpfc_create_static_vport()
4157 vport = *(struct lpfc_vport **)new_fc_vport->dd_data; in lpfc_create_static_vport()
4158 vport->vport_flag |= STATIC_VPORT; in lpfc_create_static_vport()
4176 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fabric_reg_login()
4177 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fabric_reg_login()
4178 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fabric_reg_login()
4180 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fabric_reg_login()
4182 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fabric_reg_login()
4185 mb->mbxStatus); in lpfc_mbx_cmpl_fabric_reg_login()
4187 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_fabric_reg_login()
4208 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fabric_reg_login()
4209 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fabric_reg_login()
4210 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fabric_reg_login()
4211 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fabric_reg_login()
4214 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_fabric_reg_login()
4217 if (!test_and_clear_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag)) in lpfc_mbx_cmpl_fabric_reg_login()
4239 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4240 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) { in lpfc_issue_gidft()
4253 vport->gidft_inp++; in lpfc_issue_gidft()
4256 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4257 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_issue_gidft()
4268 vport->gidft_inp); in lpfc_issue_gidft()
4269 if (vport->gidft_inp == 0) in lpfc_issue_gidft()
4272 vport->gidft_inp++; in lpfc_issue_gidft()
4274 return vport->gidft_inp; in lpfc_issue_gidft()
4278 * lpfc_issue_gidpt - issue a GID_PT for all N_Ports
4284 * 0 - Failure to issue a GID_PT
4285 * 1 - GID_PT issued
4302 vport->gidft_inp++; in lpfc_issue_gidpt()
4315 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_ns_reg_login()
4316 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_ns_reg_login()
4317 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_ns_reg_login()
4320 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_ns_reg_login()
4321 vport->gidft_inp = 0; in lpfc_mbx_cmpl_ns_reg_login()
4323 if (mb->mbxStatus) { in lpfc_mbx_cmpl_ns_reg_login()
4326 mb->mbxStatus); in lpfc_mbx_cmpl_ns_reg_login()
4340 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_mbx_cmpl_ns_reg_login()
4341 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_mbx_cmpl_ns_reg_login()
4345 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_ns_reg_login()
4360 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_ns_reg_login()
4361 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_ns_reg_login()
4362 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_ns_reg_login()
4363 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_ns_reg_login()
4367 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_ns_reg_login()
4368 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_ns_reg_login()
4371 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_mbx_cmpl_ns_reg_login()
4376 if (phba->pni) in lpfc_mbx_cmpl_ns_reg_login()
4380 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_ns_reg_login()
4381 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) in lpfc_mbx_cmpl_ns_reg_login()
4384 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_ns_reg_login()
4385 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) in lpfc_mbx_cmpl_ns_reg_login()
4398 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_mbx_cmpl_ns_reg_login()
4399 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_mbx_cmpl_ns_reg_login()
4400 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_mbx_cmpl_ns_reg_login()
4405 rc, phba->cgn_init_reg_signal); in lpfc_mbx_cmpl_ns_reg_login()
4406 } else if (phba->lmt & LMT_64Gb) { in lpfc_mbx_cmpl_ns_reg_login()
4414 vport->fc_ns_retry = 0; in lpfc_mbx_cmpl_ns_reg_login()
4438 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fc_reg_login()
4439 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fc_reg_login()
4440 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fc_reg_login()
4442 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fc_reg_login()
4443 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fc_reg_login()
4446 __func__, mb->mbxStatus); in lpfc_mbx_cmpl_fc_reg_login()
4452 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fc_reg_login()
4453 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fc_reg_login()
4457 __func__, ndlp->nlp_DID, ndlp->nlp_rpi, in lpfc_mbx_cmpl_fc_reg_login()
4458 ndlp->nlp_state); in lpfc_mbx_cmpl_fc_reg_login()
4460 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fc_reg_login()
4461 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fc_reg_login()
4462 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fc_reg_login()
4481 struct lpfc_hba *phba = vport->phba; in lpfc_register_remote_port()
4484 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_register_remote_port()
4487 /* Remote port has reappeared. Re-register w/ FC transport */ in lpfc_register_remote_port()
4488 rport_ids.node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn); in lpfc_register_remote_port()
4489 rport_ids.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn); in lpfc_register_remote_port()
4490 rport_ids.port_id = ndlp->nlp_DID; in lpfc_register_remote_port()
4496 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_register_remote_port()
4499 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_register_remote_port()
4502 ndlp->rport = rport = fc_remote_port_add(shost, 0, &rport_ids); in lpfc_register_remote_port()
4504 dev_printk(KERN_WARNING, &phba->pcidev->dev, in lpfc_register_remote_port()
4510 rport->maxframe_size = ndlp->nlp_maxframe; in lpfc_register_remote_port()
4511 rport->supported_classes = ndlp->nlp_class_sup; in lpfc_register_remote_port()
4512 rdata = rport->dd_data; in lpfc_register_remote_port()
4513 rdata->pnode = lpfc_nlp_get(ndlp); in lpfc_register_remote_port()
4514 if (!rdata->pnode) { in lpfc_register_remote_port()
4515 dev_warn(&phba->pcidev->dev, in lpfc_register_remote_port()
4516 "Warning - node ref failed. Unreg rport\n"); in lpfc_register_remote_port()
4518 ndlp->rport = NULL; in lpfc_register_remote_port()
4522 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_register_remote_port()
4523 ndlp->fc4_xpt_flags |= SCSI_XPT_REGD; in lpfc_register_remote_port()
4524 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_register_remote_port()
4526 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_register_remote_port()
4528 if (ndlp->nlp_type & NLP_FCP_INITIATOR) in lpfc_register_remote_port()
4530 if (ndlp->nlp_type & NLP_NVME_INITIATOR) in lpfc_register_remote_port()
4532 if (ndlp->nlp_type & NLP_NVME_TARGET) in lpfc_register_remote_port()
4534 if (ndlp->nlp_type & NLP_NVME_DISCOVERY) in lpfc_register_remote_port()
4540 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_register_remote_port()
4542 __func__, rport, rport->port_id, rport->roles, in lpfc_register_remote_port()
4543 kref_read(&ndlp->kref)); in lpfc_register_remote_port()
4545 if ((rport->scsi_target_id != -1) && in lpfc_register_remote_port()
4546 (rport->scsi_target_id < LPFC_MAX_TARGET)) { in lpfc_register_remote_port()
4547 ndlp->nlp_sid = rport->scsi_target_id; in lpfc_register_remote_port()
4556 struct fc_rport *rport = ndlp->rport; in lpfc_unregister_remote_port()
4557 struct lpfc_vport *vport = ndlp->vport; in lpfc_unregister_remote_port()
4559 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_unregister_remote_port()
4564 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_unregister_remote_port()
4569 ndlp->nlp_DID, rport, ndlp->fc4_xpt_flags, in lpfc_unregister_remote_port()
4570 kref_read(&ndlp->kref)); in lpfc_unregister_remote_port()
4581 atomic_add(count, &vport->fc_unused_cnt); in lpfc_nlp_counters()
4584 atomic_add(count, &vport->fc_plogi_cnt); in lpfc_nlp_counters()
4587 atomic_add(count, &vport->fc_adisc_cnt); in lpfc_nlp_counters()
4590 atomic_add(count, &vport->fc_reglogin_cnt); in lpfc_nlp_counters()
4593 atomic_add(count, &vport->fc_prli_cnt); in lpfc_nlp_counters()
4596 atomic_add(count, &vport->fc_unmap_cnt); in lpfc_nlp_counters()
4599 atomic_add(count, &vport->fc_map_cnt); in lpfc_nlp_counters()
4602 if (!atomic_read(&vport->fc_npr_cnt) && count == -1) in lpfc_nlp_counters()
4603 atomic_set(&vport->fc_npr_cnt, 0); in lpfc_nlp_counters()
4605 atomic_add(count, &vport->fc_npr_cnt); in lpfc_nlp_counters()
4618 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4619 if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) { in lpfc_nlp_reg_node()
4621 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4623 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD && in lpfc_nlp_reg_node()
4624 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) { in lpfc_nlp_reg_node()
4630 ndlp->fc4_xpt_flags |= NLP_XPT_REGD; in lpfc_nlp_reg_node()
4631 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4634 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4643 if (!(ndlp->nlp_fc4_type & NLP_FC4_NVME)) in lpfc_nlp_reg_node()
4647 if (vport->phba->sli_rev >= LPFC_SLI_REV4 && in lpfc_nlp_reg_node()
4648 ndlp->nlp_fc4_type & NLP_FC4_NVME) { in lpfc_nlp_reg_node()
4649 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_reg_node()
4654 if (ndlp->nlp_type & NLP_NVME_TARGET) { in lpfc_nlp_reg_node()
4655 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4673 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4674 if (!(ndlp->fc4_xpt_flags & NLP_XPT_REGD)) { in lpfc_nlp_unreg_node()
4675 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4680 __func__, ndlp, ndlp->rport, ndlp->nlp_DID, in lpfc_nlp_unreg_node()
4681 ndlp->nlp_flag, ndlp->fc4_xpt_flags); in lpfc_nlp_unreg_node()
4685 ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; in lpfc_nlp_unreg_node()
4686 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4688 if (ndlp->rport && in lpfc_nlp_unreg_node()
4689 ndlp->fc4_xpt_flags & SCSI_XPT_REGD) { in lpfc_nlp_unreg_node()
4690 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4692 } else if (!ndlp->rport) { in lpfc_nlp_unreg_node()
4697 __func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_unreg_node()
4698 ndlp->fc4_xpt_flags, in lpfc_nlp_unreg_node()
4699 kref_read(&ndlp->kref)); in lpfc_nlp_unreg_node()
4702 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD) { in lpfc_nlp_unreg_node()
4703 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4704 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_unreg_node()
4735 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_handle_adisc_state()
4738 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_handle_adisc_state()
4743 * ADISC_ISSUE to non-mapped states in lpfc_handle_adisc_state()
4744 * We are moving from ADISC_ISSUE to a non-mapped state because in lpfc_handle_adisc_state()
4749 clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); in lpfc_handle_adisc_state()
4770 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4771 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_nlp_state_cleanup()
4774 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4776 clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4784 if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag) || in lpfc_nlp_state_cleanup()
4785 !lpfc_is_link_up(vport->phba)) in lpfc_nlp_state_cleanup()
4796 * id outside the presentable range - move the node to the in lpfc_nlp_state_cleanup()
4800 (ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_nlp_state_cleanup()
4801 (!ndlp->rport || in lpfc_nlp_state_cleanup()
4802 ndlp->rport->scsi_target_id == -1 || in lpfc_nlp_state_cleanup()
4803 ndlp->rport->scsi_target_id >= LPFC_MAX_TARGET)) { in lpfc_nlp_state_cleanup()
4804 set_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4835 int old_state = ndlp->nlp_state; in lpfc_nlp_set_state()
4836 bool node_dropped = test_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4841 "0904 NPort state transition x%06x, %s -> %s\n", in lpfc_nlp_set_state()
4842 ndlp->nlp_DID, in lpfc_nlp_set_state()
4848 ndlp->nlp_DID, old_state, state); in lpfc_nlp_set_state()
4852 clear_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4860 clear_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4861 ndlp->nlp_type &= ~NLP_FC_NODE; in lpfc_nlp_set_state()
4864 if (list_empty(&ndlp->nlp_listp)) { in lpfc_nlp_set_state()
4865 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_nlp_set_state()
4866 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_nlp_set_state()
4867 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_nlp_set_state()
4869 lpfc_nlp_counters(vport, old_state, -1); in lpfc_nlp_set_state()
4871 ndlp->nlp_state = state; in lpfc_nlp_set_state()
4881 if (list_empty(&ndlp->nlp_listp)) { in lpfc_enqueue_node()
4882 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_enqueue_node()
4883 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_enqueue_node()
4884 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_enqueue_node()
4894 if (ndlp->nlp_state && !list_empty(&ndlp->nlp_listp)) in lpfc_dequeue_node()
4895 lpfc_nlp_counters(vport, ndlp->nlp_state, -1); in lpfc_dequeue_node()
4896 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_dequeue_node()
4897 list_del_init(&ndlp->nlp_listp); in lpfc_dequeue_node()
4898 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_dequeue_node()
4899 lpfc_nlp_state_cleanup(vport, ndlp, ndlp->nlp_state, in lpfc_dequeue_node()
4904 * lpfc_initialize_node - Initialize all fields of node object
4913 * to the life-span of the @ndlp might go beyond the existence of @vport as
4921 INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); in lpfc_initialize_node()
4922 INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); in lpfc_initialize_node()
4923 timer_setup(&ndlp->nlp_delayfunc, lpfc_els_retry_delay, 0); in lpfc_initialize_node()
4924 INIT_LIST_HEAD(&ndlp->recovery_evt.evt_listp); in lpfc_initialize_node()
4926 ndlp->nlp_DID = did; in lpfc_initialize_node()
4927 ndlp->vport = vport; in lpfc_initialize_node()
4928 ndlp->phba = vport->phba; in lpfc_initialize_node()
4929 ndlp->nlp_sid = NLP_NO_SID; in lpfc_initialize_node()
4930 ndlp->nlp_fc4_type = NLP_FC4_NONE; in lpfc_initialize_node()
4931 kref_init(&ndlp->kref); in lpfc_initialize_node()
4932 atomic_set(&ndlp->cmd_pending, 0); in lpfc_initialize_node()
4933 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth; in lpfc_initialize_node()
4934 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_initialize_node()
4945 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_drop_node()
4948 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_drop_node()
4957 if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) in lpfc_drop_node()
4967 struct lpfc_hba *phba = vport->phba; in lpfc_set_disctmo()
4970 if (vport->port_state == LPFC_LOCAL_CFG_LINK) { in lpfc_set_disctmo()
4971 /* For FAN, timeout should be greater than edtov */ in lpfc_set_disctmo()
4972 tmo = (((phba->fc_edtov + 999) / 1000) + 1); in lpfc_set_disctmo()
4974 /* Normal discovery timeout should be > than ELS/CT timeout in lpfc_set_disctmo()
4977 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_set_disctmo()
4981 if (!timer_pending(&vport->fc_disctmo)) { in lpfc_set_disctmo()
4984 tmo, vport->port_state, vport->fc_flag); in lpfc_set_disctmo()
4987 mod_timer(&vport->fc_disctmo, jiffies + secs_to_jiffies(tmo)); in lpfc_set_disctmo()
4988 set_bit(FC_DISC_TMO, &vport->fc_flag); in lpfc_set_disctmo()
4994 vport->port_state, tmo, in lpfc_set_disctmo()
4995 (unsigned long)&vport->fc_disctmo, in lpfc_set_disctmo()
4996 atomic_read(&vport->fc_plogi_cnt), in lpfc_set_disctmo()
4997 atomic_read(&vport->fc_adisc_cnt)); in lpfc_set_disctmo()
5012 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_can_disctmo()
5015 if (test_bit(FC_DISC_TMO, &vport->fc_flag) || in lpfc_can_disctmo()
5016 timer_pending(&vport->fc_disctmo)) { in lpfc_can_disctmo()
5017 clear_bit(FC_DISC_TMO, &vport->fc_flag); in lpfc_can_disctmo()
5018 timer_delete_sync(&vport->fc_disctmo); in lpfc_can_disctmo()
5019 spin_lock_irqsave(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5020 vport->work_port_events &= ~WORKER_DISC_TMO; in lpfc_can_disctmo()
5021 spin_unlock_irqrestore(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5028 vport->port_state, vport->fc_flag, in lpfc_can_disctmo()
5029 atomic_read(&vport->fc_plogi_cnt), in lpfc_can_disctmo()
5030 atomic_read(&vport->fc_adisc_cnt)); in lpfc_can_disctmo()
5044 struct lpfc_vport *vport = ndlp->vport; in lpfc_check_sli_ndlp()
5049 if (iocb->vport != vport) in lpfc_check_sli_ndlp()
5056 if (pring->ringno == LPFC_ELS_RING) { in lpfc_check_sli_ndlp()
5059 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5063 if (remote_id == ndlp->nlp_DID) in lpfc_check_sli_ndlp()
5067 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5070 } else if (pring->ringno == LPFC_FCP_RING) { in lpfc_check_sli_ndlp()
5072 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_check_sli_ndlp()
5073 test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) in lpfc_check_sli_ndlp()
5076 if (ulp_context == ndlp->nlp_rpi) in lpfc_check_sli_ndlp()
5089 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in __lpfc_dequeue_nport_iocbs()
5093 list_move_tail(&iocb->list, dequeue_list); in __lpfc_dequeue_nport_iocbs()
5101 struct lpfc_sli *psli = &phba->sli; in lpfc_sli3_dequeue_nport_iocbs()
5104 spin_lock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5105 for (i = 0; i < psli->num_rings; i++) in lpfc_sli3_dequeue_nport_iocbs()
5106 __lpfc_dequeue_nport_iocbs(phba, ndlp, &psli->sli3_ring[i], in lpfc_sli3_dequeue_nport_iocbs()
5108 spin_unlock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5118 spin_lock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5119 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) { in lpfc_sli4_dequeue_nport_iocbs()
5120 pring = qp->pring; in lpfc_sli4_dequeue_nport_iocbs()
5123 spin_lock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5125 spin_unlock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5127 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5145 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { in lpfc_no_rpi()
5146 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_no_rpi()
5160 * lpfc_nlp_logo_unreg - Unreg mailbox completion handler before LOGO
5170 struct lpfc_vport *vport = pmb->vport; in lpfc_nlp_logo_unreg()
5173 ndlp = pmb->ctx_ndlp; in lpfc_nlp_logo_unreg()
5179 if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) && in lpfc_nlp_logo_unreg()
5180 ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) { in lpfc_nlp_logo_unreg()
5184 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_logo_unreg()
5185 ndlp->nlp_defer_did, ndlp); in lpfc_nlp_logo_unreg()
5187 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_nlp_logo_unreg()
5188 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_nlp_logo_unreg()
5189 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_nlp_logo_unreg()
5191 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_nlp_logo_unreg()
5199 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_nlp_logo_unreg()
5214 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_set_unreg_login_mbx_cmpl()
5215 if (!mbox->ctx_ndlp) in lpfc_set_unreg_login_mbx_cmpl()
5218 if (test_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag)) { in lpfc_set_unreg_login_mbx_cmpl()
5219 mbox->mbox_cmpl = lpfc_nlp_logo_unreg; in lpfc_set_unreg_login_mbx_cmpl()
5220 } else if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_set_unreg_login_mbx_cmpl()
5221 !test_bit(FC_UNLOADING, &vport->load_flag) && in lpfc_set_unreg_login_mbx_cmpl()
5222 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_set_unreg_login_mbx_cmpl()
5224 (kref_read(&ndlp->kref) > 0)) { in lpfc_set_unreg_login_mbx_cmpl()
5225 mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr; in lpfc_set_unreg_login_mbx_cmpl()
5227 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_set_unreg_login_mbx_cmpl()
5243 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_rpi()
5248 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) || in lpfc_unreg_rpi()
5249 test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) { in lpfc_unreg_rpi()
5250 if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_unreg_rpi()
5256 ndlp->nlp_rpi, ndlp->nlp_flag, in lpfc_unreg_rpi()
5257 ndlp->nlp_DID); in lpfc_unreg_rpi()
5262 if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) { in lpfc_unreg_rpi()
5268 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5269 ndlp->nlp_defer_did, in lpfc_unreg_rpi()
5270 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5274 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_rpi()
5277 rpi = ndlp->nlp_rpi; in lpfc_unreg_rpi()
5278 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unreg_rpi()
5279 rpi = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]; in lpfc_unreg_rpi()
5281 lpfc_unreg_login(phba, vport->vpi, rpi, mbox); in lpfc_unreg_rpi()
5282 mbox->vport = vport; in lpfc_unreg_rpi()
5284 if (!mbox->ctx_ndlp) { in lpfc_unreg_rpi()
5285 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5290 if (mbox->mbox_cmpl == lpfc_sli4_unreg_rpi_cmpl_clr) in lpfc_unreg_rpi()
5293 if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) in lpfc_unreg_rpi()
5294 set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5301 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5302 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5306 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5307 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5318 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5319 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5325 if (!test_bit(FC_UNLOADING, &vport->load_flag)) { in lpfc_unreg_rpi()
5326 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5328 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_unreg_rpi()
5337 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_unreg_rpi()
5338 ndlp->nlp_rpi = 0; in lpfc_unreg_rpi()
5339 clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5340 clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5342 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5345 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5350 * lpfc_unreg_hba_rpis - Unregister rpis registered to the hba.
5370 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unreg_hba_rpis()
5371 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_unreg_hba_rpis()
5372 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_unreg_hba_rpis()
5373 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { in lpfc_unreg_hba_rpis()
5375 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, in lpfc_unreg_hba_rpis()
5378 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, in lpfc_unreg_hba_rpis()
5382 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_unreg_hba_rpis()
5390 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_all_rpis()
5394 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_unreg_all_rpis()
5399 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_all_rpis()
5401 lpfc_unreg_login(phba, vport->vpi, LPFC_UNREG_ALL_RPIS_VPORT, in lpfc_unreg_all_rpis()
5403 mbox->vport = vport; in lpfc_unreg_all_rpis()
5404 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_all_rpis()
5405 mbox->ctx_ndlp = NULL; in lpfc_unreg_all_rpis()
5408 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_all_rpis()
5421 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_default_rpis()
5426 if (phba->sli_rev > LPFC_SLI_REV3) in lpfc_unreg_default_rpis()
5429 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_default_rpis()
5431 lpfc_unreg_did(phba, vport->vpi, LPFC_UNREG_ALL_DFLT_RPIS, in lpfc_unreg_default_rpis()
5433 mbox->vport = vport; in lpfc_unreg_default_rpis()
5434 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_default_rpis()
5435 mbox->ctx_ndlp = NULL; in lpfc_unreg_default_rpis()
5438 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_default_rpis()
5455 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_node()
5462 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_cleanup_node()
5463 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_cleanup_node()
5469 if ((mb = phba->sli.mbox_active)) { in lpfc_cleanup_node()
5470 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5471 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5472 (ndlp == mb->ctx_ndlp)) { in lpfc_cleanup_node()
5473 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5474 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5478 spin_lock_irq(&phba->hbalock); in lpfc_cleanup_node()
5480 list_for_each_entry(mb, &phba->sli.mboxq_cmpl, list) { in lpfc_cleanup_node()
5481 if ((mb->u.mb.mbxCommand != MBX_REG_LOGIN64) || in lpfc_cleanup_node()
5482 (mb->mbox_flag & LPFC_MBX_IMED_UNREG) || in lpfc_cleanup_node()
5483 (ndlp != mb->ctx_ndlp)) in lpfc_cleanup_node()
5486 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5487 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5490 list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { in lpfc_cleanup_node()
5491 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5492 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5493 (ndlp == mb->ctx_ndlp)) { in lpfc_cleanup_node()
5494 list_del(&mb->list); in lpfc_cleanup_node()
5502 spin_unlock_irq(&phba->hbalock); in lpfc_cleanup_node()
5506 clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_cleanup_node()
5508 ndlp->nlp_last_elscmd = 0; in lpfc_cleanup_node()
5509 timer_delete_sync(&ndlp->nlp_delayfunc); in lpfc_cleanup_node()
5511 list_del_init(&ndlp->els_retry_evt.evt_listp); in lpfc_cleanup_node()
5512 list_del_init(&ndlp->dev_loss_evt.evt_listp); in lpfc_cleanup_node()
5513 list_del_init(&ndlp->recovery_evt.evt_listp); in lpfc_cleanup_node()
5528 if (ndlp->nlp_DID == did) in lpfc_matchdid()
5532 mydid.un.word = vport->fc_myDID; in lpfc_matchdid()
5538 ndlpdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5547 * up matching ndlp->nlp_DID 000001 to in lpfc_matchdid()
5553 vport->phba->fc_topology == in lpfc_matchdid()
5560 matchdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5581 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_findnode_did()
5583 data1 = (((uint32_t)ndlp->nlp_state << 24) | in __lpfc_findnode_did()
5584 ((uint32_t)ndlp->nlp_xri << 16) | in __lpfc_findnode_did()
5585 ((uint32_t)ndlp->nlp_type << 8) in __lpfc_findnode_did()
5590 ndlp, ndlp->nlp_DID, in __lpfc_findnode_did()
5591 ndlp->nlp_flag, data1, ndlp->nlp_rpi, in __lpfc_findnode_did()
5592 ndlp->active_rrqs_xri_bitmap); in __lpfc_findnode_did()
5595 if (ndlp->nlp_state != NLP_STE_UNUSED_NODE) in __lpfc_findnode_did()
5616 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_findnode_did()
5618 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_findnode_did()
5629 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_findnode_mapped()
5631 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_findnode_mapped()
5632 if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE || in lpfc_findnode_mapped()
5633 ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_findnode_mapped()
5634 data1 = (((uint32_t)ndlp->nlp_state << 24) | in lpfc_findnode_mapped()
5635 ((uint32_t)ndlp->nlp_xri << 16) | in lpfc_findnode_mapped()
5636 ((uint32_t)ndlp->nlp_type << 8) | in lpfc_findnode_mapped()
5637 ((uint32_t)ndlp->nlp_rpi & 0xff)); in lpfc_findnode_mapped()
5638 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, in lpfc_findnode_mapped()
5643 ndlp, ndlp->nlp_DID, in lpfc_findnode_mapped()
5644 ndlp->nlp_flag, data1, in lpfc_findnode_mapped()
5645 ndlp->active_rrqs_xri_bitmap); in lpfc_findnode_mapped()
5649 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_findnode_mapped()
5664 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5666 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_setup_disc_node()
5677 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5678 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5680 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5688 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_setup_disc_node()
5689 !test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) { in lpfc_setup_disc_node()
5693 * delay timeout is not needed. in lpfc_setup_disc_node()
5700 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5701 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5705 * active management - just go to NPR provided the in lpfc_setup_disc_node()
5708 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5711 if (ndlp->nlp_state > NLP_STE_UNUSED_NODE && in lpfc_setup_disc_node()
5712 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_setup_disc_node()
5717 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5722 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5723 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5730 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5731 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5737 if (ndlp->nlp_state == NLP_STE_ADISC_ISSUE || in lpfc_setup_disc_node()
5738 ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_setup_disc_node()
5739 (!vport->phba->nvmet_support && in lpfc_setup_disc_node()
5740 test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag))) in lpfc_setup_disc_node()
5743 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5750 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5759 struct lpfc_hba *phba = vport->phba; in lpfc_disc_list_loopmap()
5766 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) in lpfc_disc_list_loopmap()
5770 if (phba->alpa_map[0]) { in lpfc_disc_list_loopmap()
5771 for (j = 1; j <= phba->alpa_map[0]; j++) { in lpfc_disc_list_loopmap()
5772 alpa = phba->alpa_map[j]; in lpfc_disc_list_loopmap()
5773 if (((vport->fc_myDID & 0xff) == alpa) || (alpa == 0)) in lpfc_disc_list_loopmap()
5783 if (vport->cfg_scan_down) in lpfc_disc_list_loopmap()
5786 index = FC_MAXLOOP - j - 1; in lpfc_disc_list_loopmap()
5788 if ((vport->fc_myDID & 0xff) == alpa) in lpfc_disc_list_loopmap()
5801 struct lpfc_sli *psli = &phba->sli; in lpfc_issue_clear_la()
5802 struct lpfc_sli_ring *extra_ring = &psli->sli3_ring[LPFC_EXTRA_RING]; in lpfc_issue_clear_la()
5803 struct lpfc_sli_ring *fcp_ring = &psli->sli3_ring[LPFC_FCP_RING]; in lpfc_issue_clear_la()
5810 if ((phba->link_state >= LPFC_CLEAR_LA) || in lpfc_issue_clear_la()
5811 (vport->port_type != LPFC_PHYSICAL_PORT) || in lpfc_issue_clear_la()
5812 (phba->sli_rev == LPFC_SLI_REV4)) in lpfc_issue_clear_la()
5816 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) != NULL) { in lpfc_issue_clear_la()
5817 phba->link_state = LPFC_CLEAR_LA; in lpfc_issue_clear_la()
5819 mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la; in lpfc_issue_clear_la()
5820 mbox->vport = vport; in lpfc_issue_clear_la()
5823 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_issue_clear_la()
5825 extra_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5826 fcp_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5827 phba->link_state = LPFC_HBA_ERROR; in lpfc_issue_clear_la()
5838 regvpimbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vpi()
5841 regvpimbox->mbox_cmpl = lpfc_mbx_cmpl_reg_vpi; in lpfc_issue_reg_vpi()
5842 regvpimbox->vport = vport; in lpfc_issue_reg_vpi()
5845 mempool_free(regvpimbox, phba->mbox_mem_pool); in lpfc_issue_reg_vpi()
5854 struct lpfc_hba *phba = vport->phba; in lpfc_disc_start()
5861 phba->link_state); in lpfc_disc_start()
5865 if (phba->link_state == LPFC_CLEAR_LA) in lpfc_disc_start()
5870 if (vport->port_state < LPFC_VPORT_READY) in lpfc_disc_start()
5871 vport->port_state = LPFC_DISC_AUTH; in lpfc_disc_start()
5875 vport->fc_prevDID = vport->fc_myDID; in lpfc_disc_start()
5876 vport->num_disc_nodes = 0; in lpfc_disc_start()
5882 vport->port_state, vport->fc_flag, in lpfc_disc_start()
5883 atomic_read(&vport->fc_plogi_cnt), in lpfc_disc_start()
5884 atomic_read(&vport->fc_adisc_cnt), in lpfc_disc_start()
5885 atomic_read(&vport->fc_npr_cnt)); in lpfc_disc_start()
5887 /* First do ADISCs - if any */ in lpfc_disc_start()
5894 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_disc_start()
5895 !test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_disc_start()
5896 !test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_disc_start()
5897 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_disc_start()
5907 if (vport->port_state < LPFC_VPORT_READY && !clear_la_pending) { in lpfc_disc_start()
5911 if (!test_bit(FC_ABORT_DISCOVERY, &vport->fc_flag)) { in lpfc_disc_start()
5912 vport->num_disc_nodes = 0; in lpfc_disc_start()
5914 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_disc_start()
5917 if (!vport->num_disc_nodes) { in lpfc_disc_start()
5918 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_disc_start()
5922 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_start()
5924 /* Next do PLOGIs - if any */ in lpfc_disc_start()
5930 if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) { in lpfc_disc_start()
5934 if (vport->fc_rscn_id_cnt == 0 && in lpfc_disc_start()
5935 !test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) { in lpfc_disc_start()
5936 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_disc_start()
5965 spin_lock_irq(&phba->hbalock); in lpfc_free_tx()
5966 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in lpfc_free_tx()
5967 if (iocb->ndlp != ndlp) in lpfc_free_tx()
5975 list_move_tail(&iocb->list, &completions); in lpfc_free_tx()
5980 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_free_tx()
5981 if (iocb->ndlp != ndlp) in lpfc_free_tx()
5991 spin_unlock_irq(&phba->hbalock); in lpfc_free_tx()
6005 struct lpfc_hba *phba = vport->phba; in lpfc_disc_flush_list()
6007 if (atomic_read(&vport->fc_plogi_cnt) || in lpfc_disc_flush_list()
6008 atomic_read(&vport->fc_adisc_cnt)) { in lpfc_disc_flush_list()
6009 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_flush_list()
6011 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_disc_flush_list()
6012 ndlp->nlp_state == NLP_STE_ADISC_ISSUE) { in lpfc_disc_flush_list()
6020 * lpfc_notify_xport_npr - notifies xport of node disappearance
6024 * calls lpfc_nlp_state_cleanup, the ndlp->rport is unregistered
6034 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_notify_xport_npr()
6045 if (pci_channel_offline(vport->phba->pcidev)) in lpfc_cleanup_discovery_resources()
6053 * FUNCTION: Fibre Channel driver discovery timeout routine.
6068 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout()
6075 spin_lock_irqsave(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6076 tmo_posted = vport->work_port_events & WORKER_DISC_TMO; in lpfc_disc_timeout()
6078 vport->work_port_events |= WORKER_DISC_TMO; in lpfc_disc_timeout()
6079 spin_unlock_irqrestore(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6089 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout_handler()
6090 struct lpfc_sli *psli = &phba->sli; in lpfc_disc_timeout_handler()
6095 if (!test_and_clear_bit(FC_DISC_TMO, &vport->fc_flag)) in lpfc_disc_timeout_handler()
6099 "disc timeout: state:x%x rtry:x%x flg:x%x", in lpfc_disc_timeout_handler()
6100 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_disc_timeout_handler()
6102 switch (vport->port_state) { in lpfc_disc_timeout_handler()
6107 * waiting for FAN timeout in lpfc_disc_timeout_handler()
6110 "0221 FAN timeout\n"); in lpfc_disc_timeout_handler()
6113 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_timeout_handler()
6115 if (ndlp->nlp_state != NLP_STE_NPR_NODE) in lpfc_disc_timeout_handler()
6117 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_disc_timeout_handler()
6121 } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_disc_timeout_handler()
6128 if (vport->port_state != LPFC_FLOGI) { in lpfc_disc_timeout_handler()
6129 if (phba->sli_rev <= LPFC_SLI_REV3) in lpfc_disc_timeout_handler()
6140 /* Initial FLOGI timeout */ in lpfc_disc_timeout_handler()
6143 "0222 Initial %s timeout\n", in lpfc_disc_timeout_handler()
6144 vport->vpi ? "FDISC" : "FLOGI"); in lpfc_disc_timeout_handler()
6162 "0223 Timeout while waiting for " in lpfc_disc_timeout_handler()
6173 /* Check for wait for NameServer Rsp timeout */ in lpfc_disc_timeout_handler()
6176 "0224 NameServer Query timeout " in lpfc_disc_timeout_handler()
6178 vport->fc_ns_retry, LPFC_MAX_NS_RETRY); in lpfc_disc_timeout_handler()
6180 if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) { in lpfc_disc_timeout_handler()
6182 vport->fc_ns_retry++; in lpfc_disc_timeout_handler()
6183 vport->gidft_inp = 0; in lpfc_disc_timeout_handler()
6188 vport->fc_ns_retry = 0; in lpfc_disc_timeout_handler()
6196 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6197 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6201 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6206 initlinkmbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_disc_timeout_handler()
6212 phba->link_state = LPFC_HBA_ERROR; in lpfc_disc_timeout_handler()
6217 lpfc_init_link(phba, initlinkmbox, phba->cfg_topology, in lpfc_disc_timeout_handler()
6218 phba->cfg_link_speed); in lpfc_disc_timeout_handler()
6219 initlinkmbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_disc_timeout_handler()
6220 initlinkmbox->vport = vport; in lpfc_disc_timeout_handler()
6221 initlinkmbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_disc_timeout_handler()
6225 mempool_free(initlinkmbox, phba->mbox_mem_pool); in lpfc_disc_timeout_handler()
6230 /* Node Authentication timeout */ in lpfc_disc_timeout_handler()
6233 "0227 Node Authentication timeout\n"); in lpfc_disc_timeout_handler()
6240 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6241 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6245 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6251 if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) { in lpfc_disc_timeout_handler()
6254 "0231 RSCN timeout Data: x%x " in lpfc_disc_timeout_handler()
6256 vport->fc_ns_retry, LPFC_MAX_NS_RETRY, in lpfc_disc_timeout_handler()
6257 vport->port_state, vport->gidft_inp); in lpfc_disc_timeout_handler()
6270 "0273 Unexpected discovery timeout, " in lpfc_disc_timeout_handler()
6271 "vport State x%x\n", vport->port_state); in lpfc_disc_timeout_handler()
6275 switch (phba->link_state) { in lpfc_disc_timeout_handler()
6277 /* CLEAR LA timeout */ in lpfc_disc_timeout_handler()
6280 "0228 CLEAR LA timeout\n"); in lpfc_disc_timeout_handler()
6295 "0230 Unexpected timeout, hba link " in lpfc_disc_timeout_handler()
6296 "state x%x\n", phba->link_state); in lpfc_disc_timeout_handler()
6306 if (phba->sli_rev != LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6307 psli->sli3_ring[(LPFC_EXTRA_RING)].flag &= in lpfc_disc_timeout_handler()
6309 psli->sli3_ring[LPFC_FCP_RING].flag &= in lpfc_disc_timeout_handler()
6312 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6326 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fdmi_reg_login()
6327 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fdmi_reg_login()
6328 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fdmi_reg_login()
6330 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fdmi_reg_login()
6332 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fdmi_reg_login()
6333 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fdmi_reg_login()
6334 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fdmi_reg_login()
6335 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fdmi_reg_login()
6339 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_fdmi_reg_login()
6340 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_fdmi_reg_login()
6343 * Start issuing Fabric-Device Management Interface (FDMI) command to in lpfc_mbx_cmpl_fdmi_reg_login()
6345 * DHBA -> DPRT -> RHBA -> RPA (physical port) in lpfc_mbx_cmpl_fdmi_reg_login()
6346 * DPRT -> RPRT (vports) in lpfc_mbx_cmpl_fdmi_reg_login()
6348 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_fdmi_reg_login()
6349 phba->link_flag &= ~LS_CT_VEN_RPA; /* For extra Vendor RPA */ in lpfc_mbx_cmpl_fdmi_reg_login()
6369 return ndlp->nlp_rpi == *rpi; in lpfc_filter_by_rpi()
6375 return memcmp(&ndlp->nlp_portname, param, in lpfc_filter_by_wwpn()
6376 sizeof(ndlp->nlp_portname)) == 0; in lpfc_filter_by_wwpn()
6384 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_find_node()
6390 filter, ndlp, ndlp->nlp_DID, in __lpfc_find_node()
6391 ndlp->nlp_flag, ndlp->nlp_state, in __lpfc_find_node()
6392 ndlp->nlp_xri, ndlp->nlp_type, in __lpfc_find_node()
6393 ndlp->nlp_rpi); in __lpfc_find_node()
6422 spin_lock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6424 spin_unlock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6440 spin_lock_irqsave(shost->host_lock, flags); in lpfc_findnode_rpi()
6442 spin_unlock_irqrestore(shost->host_lock, flags); in lpfc_findnode_rpi()
6447 * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier
6456 * NULL - No vport with the matching @vpi found
6457 * Otherwise - Address to the vport with the matching @vpi.
6466 /* The physical ports are always vpi 0 - translate is unnecessary. */ in lpfc_find_vport_by_vpid()
6472 for (i = 0; i <= phba->max_vpi; i++) { in lpfc_find_vport_by_vpid()
6473 if (vpi == phba->vpi_ids[i]) in lpfc_find_vport_by_vpid()
6477 if (i > phba->max_vpi) { in lpfc_find_vport_by_vpid()
6485 spin_lock_irqsave(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6486 list_for_each_entry(vport, &phba->port_list, listentry) { in lpfc_find_vport_by_vpid()
6487 if (vport->vpi == i) { in lpfc_find_vport_by_vpid()
6488 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6492 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6502 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6503 rpi = lpfc_sli4_alloc_rpi(vport->phba); in lpfc_nlp_init()
6508 ndlp = mempool_alloc(vport->phba->nlp_mem_pool, GFP_KERNEL); in lpfc_nlp_init()
6510 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_init()
6511 lpfc_sli4_free_rpi(vport->phba, rpi); in lpfc_nlp_init()
6517 spin_lock_init(&ndlp->lock); in lpfc_nlp_init()
6520 INIT_LIST_HEAD(&ndlp->nlp_listp); in lpfc_nlp_init()
6521 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6522 ndlp->nlp_rpi = rpi; in lpfc_nlp_init()
6527 ndlp, ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_init()
6528 ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_nlp_init()
6530 ndlp->active_rrqs_xri_bitmap = in lpfc_nlp_init()
6531 mempool_alloc(vport->phba->active_rrq_pool, in lpfc_nlp_init()
6533 if (ndlp->active_rrqs_xri_bitmap) in lpfc_nlp_init()
6534 memset(ndlp->active_rrqs_xri_bitmap, 0, in lpfc_nlp_init()
6535 ndlp->phba->cfg_rrq_xri_bitmap_sz); in lpfc_nlp_init()
6542 ndlp->nlp_DID, 0, 0); in lpfc_nlp_init()
6555 struct lpfc_vport *vport = ndlp->vport; in lpfc_nlp_release()
6557 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_release()
6559 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_nlp_release()
6563 __func__, ndlp, ndlp->nlp_DID, in lpfc_nlp_release()
6564 kref_read(&ndlp->kref), ndlp->nlp_rpi); in lpfc_nlp_release()
6573 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_release()
6574 lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); in lpfc_nlp_release()
6575 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_nlp_release()
6581 ndlp->vport = NULL; in lpfc_nlp_release()
6582 ndlp->nlp_state = NLP_STE_FREED_NODE; in lpfc_nlp_release()
6583 ndlp->nlp_flag = 0; in lpfc_nlp_release()
6584 ndlp->fc4_xpt_flags = 0; in lpfc_nlp_release()
6587 if (ndlp->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_release()
6588 mempool_free(ndlp->active_rrqs_xri_bitmap, in lpfc_nlp_release()
6589 ndlp->phba->active_rrq_pool); in lpfc_nlp_release()
6590 mempool_free(ndlp, ndlp->phba->nlp_mem_pool); in lpfc_nlp_release()
6603 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_get()
6605 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_get()
6606 kref_read(&ndlp->kref)); in lpfc_nlp_get()
6612 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_nlp_get()
6613 if (!kref_get_unless_zero(&ndlp->kref)) { in lpfc_nlp_get()
6614 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6615 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_NODE, in lpfc_nlp_get()
6617 __func__, (void *)ndlp, kref_read(&ndlp->kref)); in lpfc_nlp_get()
6620 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6635 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_put()
6637 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_put()
6638 kref_read(&ndlp->kref)); in lpfc_nlp_put()
6643 return ndlp ? kref_put(&ndlp->kref, lpfc_nlp_release) : 0; in lpfc_nlp_put()
6647 * lpfc_fcf_inuse - Check if FCF can be unregistered.
6670 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_fcf_inuse()
6677 if (!test_bit(FC_VPORT_CVL_RCVD, &vports[i]->fc_flag)) { in lpfc_fcf_inuse()
6681 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_fcf_inuse()
6682 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_fcf_inuse()
6683 if (ndlp->rport && in lpfc_fcf_inuse()
6684 (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { in lpfc_fcf_inuse()
6686 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, in lpfc_fcf_inuse()
6690 &ndlp->nlp_flag)) { in lpfc_fcf_inuse()
6696 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_fcf_inuse()
6697 ndlp->nlp_flag); in lpfc_fcf_inuse()
6700 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_fcf_inuse()
6708 * lpfc_unregister_vfi_cmpl - Completion handler for unreg vfi.
6717 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_vfi_cmpl()
6719 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_vfi_cmpl()
6723 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_vfi_cmpl()
6725 clear_bit(FC_VFI_REGISTERED, &phba->pport->fc_flag); in lpfc_unregister_vfi_cmpl()
6726 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_vfi_cmpl()
6731 * lpfc_unregister_fcfi_cmpl - Completion handler for unreg fcfi.
6740 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_fcfi_cmpl()
6742 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_fcfi_cmpl()
6746 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_fcfi_cmpl()
6748 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_fcfi_cmpl()
6753 * lpfc_unregister_fcf_prep - Unregister fcf record preparation
6773 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_unregister_fcf_prep()
6777 if (vports && (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) in lpfc_unregister_fcf_prep()
6778 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unregister_fcf_prep()
6784 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6788 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6789 vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6790 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6791 set_bit(FC_VPORT_NEEDS_INIT_VPI, &vports[i]->fc_flag); in lpfc_unregister_fcf_prep()
6794 if (i == 0 && (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED))) { in lpfc_unregister_fcf_prep()
6795 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_unregister_fcf_prep()
6797 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp); in lpfc_unregister_fcf_prep()
6798 lpfc_cleanup_pending_mbox(phba->pport); in lpfc_unregister_fcf_prep()
6799 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6800 lpfc_sli4_unreg_all_rpis(phba->pport); in lpfc_unregister_fcf_prep()
6801 lpfc_mbx_unreg_vpi(phba->pport); in lpfc_unregister_fcf_prep()
6802 shost = lpfc_shost_from_vport(phba->pport); in lpfc_unregister_fcf_prep()
6803 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6804 phba->pport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6805 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6806 set_bit(FC_VPORT_NEEDS_INIT_VPI, &phba->pport->fc_flag); in lpfc_unregister_fcf_prep()
6813 rc = lpfc_issue_unreg_vfi(phba->pport); in lpfc_unregister_fcf_prep()
6818 * lpfc_sli4_unregister_fcf - Unregister currently registered FCF record
6825 * Return 0 if successfully issued, none-zero otherwise.
6833 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_unregister_fcf()
6837 "HBA state x%x\n", phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6838 return -ENOMEM; in lpfc_sli4_unregister_fcf()
6840 lpfc_unreg_fcfi(mbox, phba->fcf.fcfi); in lpfc_sli4_unregister_fcf()
6841 mbox->vport = phba->pport; in lpfc_sli4_unregister_fcf()
6842 mbox->mbox_cmpl = lpfc_unregister_fcfi_cmpl; in lpfc_sli4_unregister_fcf()
6849 rc, phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6850 return -EINVAL; in lpfc_sli4_unregister_fcf()
6856 * lpfc_unregister_fcf_rescan - Unregister currently registered fcf and rescan
6881 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6882 phba->fcf.fcf_flag = 0; in lpfc_unregister_fcf_rescan()
6883 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6884 phba->fcf.current_rec.flag = 0; in lpfc_unregister_fcf_rescan()
6890 if (test_bit(FC_UNLOADING, &phba->pport->load_flag) || in lpfc_unregister_fcf_rescan()
6891 phba->link_state < LPFC_LINK_UP) in lpfc_unregister_fcf_rescan()
6895 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6896 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
6897 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6905 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6906 phba->fcf.fcf_flag &= ~FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
6907 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6911 phba->pport->port_state); in lpfc_unregister_fcf_rescan()
6916 * lpfc_unregister_fcf - Unregister the currently registered fcf record
6941 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf()
6942 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_unregister_fcf()
6943 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf()
6947 * lpfc_unregister_unused_fcf - Unregister FCF if all devices are disconnected.
6962 spin_lock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6963 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) || in lpfc_unregister_unused_fcf()
6964 !(phba->fcf.fcf_flag & FCF_REGISTERED) || in lpfc_unregister_unused_fcf()
6965 !test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) || in lpfc_unregister_unused_fcf()
6966 (phba->fcf.fcf_flag & FCF_DISCOVERY) || in lpfc_unregister_unused_fcf()
6967 phba->pport->port_state == LPFC_FLOGI) { in lpfc_unregister_unused_fcf()
6968 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6971 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6980 * lpfc_read_fcf_conn_tbl - Create driver FCF connection table.
6999 &phba->fcf_conn_rec_list, list) { in lpfc_read_fcf_conn_tbl()
7000 list_del_init(&conn_entry->list); in lpfc_read_fcf_conn_tbl()
7005 record_count = conn_hdr->length * sizeof(uint32_t)/ in lpfc_read_fcf_conn_tbl()
7023 memcpy(&conn_entry->conn_rec, &conn_rec[i], in lpfc_read_fcf_conn_tbl()
7025 list_add_tail(&conn_entry->list, in lpfc_read_fcf_conn_tbl()
7026 &phba->fcf_conn_rec_list); in lpfc_read_fcf_conn_tbl()
7029 if (!list_empty(&phba->fcf_conn_rec_list)) { in lpfc_read_fcf_conn_tbl()
7031 list_for_each_entry(conn_entry, &phba->fcf_conn_rec_list, in lpfc_read_fcf_conn_tbl()
7033 conn_rec = &conn_entry->conn_rec; in lpfc_read_fcf_conn_tbl()
7041 conn_rec->flags, conn_rec->vlan_tag, in lpfc_read_fcf_conn_tbl()
7042 conn_rec->fabric_name[0], in lpfc_read_fcf_conn_tbl()
7043 conn_rec->fabric_name[1], in lpfc_read_fcf_conn_tbl()
7044 conn_rec->fabric_name[2], in lpfc_read_fcf_conn_tbl()
7045 conn_rec->fabric_name[3], in lpfc_read_fcf_conn_tbl()
7046 conn_rec->fabric_name[4], in lpfc_read_fcf_conn_tbl()
7047 conn_rec->fabric_name[5], in lpfc_read_fcf_conn_tbl()
7048 conn_rec->fabric_name[6], in lpfc_read_fcf_conn_tbl()
7049 conn_rec->fabric_name[7], in lpfc_read_fcf_conn_tbl()
7050 conn_rec->switch_name[0], in lpfc_read_fcf_conn_tbl()
7051 conn_rec->switch_name[1], in lpfc_read_fcf_conn_tbl()
7052 conn_rec->switch_name[2], in lpfc_read_fcf_conn_tbl()
7053 conn_rec->switch_name[3], in lpfc_read_fcf_conn_tbl()
7054 conn_rec->switch_name[4], in lpfc_read_fcf_conn_tbl()
7055 conn_rec->switch_name[5], in lpfc_read_fcf_conn_tbl()
7056 conn_rec->switch_name[6], in lpfc_read_fcf_conn_tbl()
7057 conn_rec->switch_name[7]); in lpfc_read_fcf_conn_tbl()
7063 * lpfc_read_fcoe_param - Read FCoe parameters from conf region..
7082 if ((fcoe_param_hdr->parm_version != FIPP_VERSION) || in lpfc_read_fcoe_param()
7083 (fcoe_param_hdr->length != FCOE_PARAM_LENGTH)) in lpfc_read_fcoe_param()
7086 if (fcoe_param_hdr->parm_flags & FIPP_VLAN_VALID) { in lpfc_read_fcoe_param()
7087 phba->valid_vlan = 1; in lpfc_read_fcoe_param()
7088 phba->vlan_id = le16_to_cpu(fcoe_param->vlan_tag) & in lpfc_read_fcoe_param()
7092 phba->fc_map[0] = fcoe_param->fc_map[0]; in lpfc_read_fcoe_param()
7093 phba->fc_map[1] = fcoe_param->fc_map[1]; in lpfc_read_fcoe_param()
7094 phba->fc_map[2] = fcoe_param->fc_map[2]; in lpfc_read_fcoe_param()
7099 * lpfc_get_rec_conf23 - Get a record type in config region data.
7138 * lpfc_parse_fcoe_conf - Parse FCoE config data read from config region 23.
7180 size - offset, FCOE_PARAM_TYPE); in lpfc_parse_fcoe_conf()
7186 size - offset, FCOE_CONN_TBL_TYPE); in lpfc_parse_fcoe_conf()
7193 * lpfc_error_lost_link - IO failure from link event or FW reset check.
7205 * false - No link or reset error occurred.
7206 * true - A link or reset error occurred.