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

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()
429 "8438 Devloss timeout reversed on DID x%x " in lpfc_check_nlp_post_devloss()
432 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp, in lpfc_check_nlp_post_devloss()
433 ndlp->nlp_flag, vport->port_state); in lpfc_check_nlp_post_devloss()
438 * lpfc_dev_loss_tmo_handler - Remote node devloss timeout handler
441 * This function is called from the worker thread when devloss timeout timer
445 * when devloss timeout happened to this @ndlp.
459 vport = ndlp->vport; in lpfc_dev_loss_tmo_handler()
460 name = (uint8_t *)&ndlp->nlp_portname; in lpfc_dev_loss_tmo_handler()
461 phba = vport->phba; in lpfc_dev_loss_tmo_handler()
463 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_dev_loss_tmo_handler()
468 ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_sid); in lpfc_dev_loss_tmo_handler()
470 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_dev_loss_tmo_handler()
472 __func__, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
473 ndlp->fc4_xpt_flags, kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
476 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
478 "0284 Devloss timeout Ignored on " in lpfc_dev_loss_tmo_handler()
483 ndlp->nlp_DID); in lpfc_dev_loss_tmo_handler()
485 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
490 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_dev_loss_tmo_handler()
491 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
497 switch (ndlp->nlp_DID) { in lpfc_dev_loss_tmo_handler()
499 fc_vport = vport->fc_vport; in lpfc_dev_loss_tmo_handler()
502 if (fc_vport->vport_state == in lpfc_dev_loss_tmo_handler()
508 &phba->hba_flag)) in lpfc_dev_loss_tmo_handler()
513 if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_dev_loss_tmo_handler()
519 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
520 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
528 if (ndlp->nlp_DID & Fabric_DID_MASK) { in lpfc_dev_loss_tmo_handler()
529 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
530 ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) in lpfc_dev_loss_tmo_handler()
535 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_dev_loss_tmo_handler()
541 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
545 "8436 Devloss timeout marked on " in lpfc_dev_loss_tmo_handler()
548 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
549 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
550 vport->port_state); in lpfc_dev_loss_tmo_handler()
551 set_bit(NLP_IN_RECOV_POST_DEV_LOSS, &ndlp->save_flags); in lpfc_dev_loss_tmo_handler()
553 } else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { in lpfc_dev_loss_tmo_handler()
560 "8437 Devloss timeout ignored on " in lpfc_dev_loss_tmo_handler()
563 ndlp->nlp_DID, kref_read(&ndlp->kref), in lpfc_dev_loss_tmo_handler()
564 ndlp, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
565 vport->port_state); in lpfc_dev_loss_tmo_handler()
573 if (ndlp->nlp_sid != NLP_NO_SID) { in lpfc_dev_loss_tmo_handler()
575 lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT); in lpfc_dev_loss_tmo_handler()
580 "0203 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
585 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
586 ndlp->nlp_state, ndlp->nlp_rpi, in lpfc_dev_loss_tmo_handler()
587 kref_read(&ndlp->kref)); in lpfc_dev_loss_tmo_handler()
590 "0204 Devloss timeout on " in lpfc_dev_loss_tmo_handler()
595 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_dev_loss_tmo_handler()
596 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_dev_loss_tmo_handler()
598 clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag); in lpfc_dev_loss_tmo_handler()
603 if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE && in lpfc_dev_loss_tmo_handler()
604 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_dev_loss_tmo_handler()
608 if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) in lpfc_dev_loss_tmo_handler()
624 for (i = 0; i <= phba->max_vports; i++) { in lpfc_check_vmid_qfpa_issue()
626 vport = phba->pport; in lpfc_check_vmid_qfpa_issue()
632 if (vport->vmid_flag & LPFC_VMID_ISSUE_QFPA) { in lpfc_check_vmid_qfpa_issue()
634 vport->vmid_flag &= ~LPFC_VMID_ISSUE_QFPA; in lpfc_check_vmid_qfpa_issue()
641 * lpfc_sli4_post_dev_loss_tmo_handler - SLI4 post devloss timeout handler
643 * @fcf_inuse: SLI4 FCF in-use state reported from devloss timeout handler.
644 * @nlp_did: remote node identifer with devloss timeout.
647 * timeout handler and releasing the reference count for the ndlp with
648 * which the devloss timeout was handled for SLI4 host. For the devloss
649 * timeout of the last remote node which had been in use of FCF, when this
651 * in-use of FCF. When devloss timeout to the last remote using the FCF,
653 * failover process, the in-use FCF shall be unregistered. If the FIP
654 * engine is in FCF discovery process, the devloss timeout state shall
656 * process to unregister the in-use FCF.
662 /* If devloss timeout happened to a remote node when FCF had no in lpfc_sli4_post_dev_loss_tmo_handler()
663 * longer been in-use, do nothing. in lpfc_sli4_post_dev_loss_tmo_handler()
668 if (test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) && in lpfc_sli4_post_dev_loss_tmo_handler()
670 spin_lock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
671 if (phba->fcf.fcf_flag & FCF_DISCOVERY) { in lpfc_sli4_post_dev_loss_tmo_handler()
673 &phba->hba_flag)) { in lpfc_sli4_post_dev_loss_tmo_handler()
674 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
681 if (phba->fcf.fcf_flag & FCF_REDISC_PROG) { in lpfc_sli4_post_dev_loss_tmo_handler()
682 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
688 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_post_dev_loss_tmo_handler()
689 if (!test_bit(FCF_TS_INPROG, &phba->hba_flag) && in lpfc_sli4_post_dev_loss_tmo_handler()
690 !test_bit(FCF_RR_INPROG, &phba->hba_flag)) { in lpfc_sli4_post_dev_loss_tmo_handler()
693 "unreg in-use FCF and rescan.\n"); in lpfc_sli4_post_dev_loss_tmo_handler()
694 /* Unregister in-use FCF and rescan */ in lpfc_sli4_post_dev_loss_tmo_handler()
698 if (test_bit(FCF_TS_INPROG, &phba->hba_flag)) in lpfc_sli4_post_dev_loss_tmo_handler()
701 if (test_bit(FCF_RR_INPROG, &phba->hba_flag)) in lpfc_sli4_post_dev_loss_tmo_handler()
710 * lpfc_alloc_fast_evt - Allocates data structure for posting event
724 if (atomic_read(&phba->fast_event_count) > LPFC_MAX_EVT_COUNT) in lpfc_alloc_fast_evt()
730 atomic_inc(&phba->fast_event_count); in lpfc_alloc_fast_evt()
731 INIT_LIST_HEAD(&ret->work_evt.evt_listp); in lpfc_alloc_fast_evt()
732 ret->work_evt.evt = LPFC_EVT_FASTPATH_MGMT_EVT; in lpfc_alloc_fast_evt()
738 * lpfc_free_fast_evt - Frees event data structure
749 atomic_dec(&phba->fast_event_count); in lpfc_free_fast_evt()
754 * lpfc_send_fastpath_evt - Posts events generated from fast path
775 evt_category = (unsigned long) fast_evt_data->un.fabric_evt.event_type; in lpfc_send_fastpath_evt()
776 evt_sub_category = (unsigned long) fast_evt_data->un. in lpfc_send_fastpath_evt()
778 shost = lpfc_shost_from_vport(fast_evt_data->vport); in lpfc_send_fastpath_evt()
781 evt_data = (char *) &fast_evt_data->un.read_check_error; in lpfc_send_fastpath_evt()
782 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
786 evt_data = (char *) &fast_evt_data->un.fabric_evt; in lpfc_send_fastpath_evt()
787 evt_data_size = sizeof(fast_evt_data->un.fabric_evt); in lpfc_send_fastpath_evt()
796 evt_data = (char *) &fast_evt_data->un.scsi_evt; in lpfc_send_fastpath_evt()
797 evt_data_size = sizeof(fast_evt_data->un.scsi_evt); in lpfc_send_fastpath_evt()
800 evt_data = (char *) &fast_evt_data->un.check_cond_evt; in lpfc_send_fastpath_evt()
801 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
805 evt_data = (char *) &fast_evt_data->un.queue_depth_evt; in lpfc_send_fastpath_evt()
806 evt_data_size = sizeof(fast_evt_data->un. in lpfc_send_fastpath_evt()
818 if (phba->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_send_fastpath_evt()
839 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
840 while (!list_empty(&phba->work_list)) { in lpfc_work_list_done()
841 list_remove_head((&phba->work_list), evtp, typeof(*evtp), in lpfc_work_list_done()
843 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
844 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_list_done()
846 switch (evtp->evt) { in lpfc_work_list_done()
848 ndlp = (struct lpfc_nodelist *) (evtp->evt_arg1); in lpfc_work_list_done()
859 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
865 nlp_did = ndlp->nlp_DID; in lpfc_work_list_done()
867 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_list_done()
873 ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); in lpfc_work_list_done()
875 lpfc_sli_abts_recover_port(ndlp->vport, ndlp); in lpfc_work_list_done()
884 if (phba->link_state < LPFC_LINK_DOWN) in lpfc_work_list_done()
885 *(int *) (evtp->evt_arg1) = lpfc_online(phba); in lpfc_work_list_done()
887 *(int *) (evtp->evt_arg1) = 0; in lpfc_work_list_done()
888 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
891 if (phba->link_state >= LPFC_LINK_DOWN) in lpfc_work_list_done()
893 *(int *)(evtp->evt_arg1) = 0; in lpfc_work_list_done()
894 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
899 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
902 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
909 *(int *)(evtp->evt_arg1) = in lpfc_work_list_done()
912 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
916 *(int *)(evtp->evt_arg1) in lpfc_work_list_done()
917 = (phba->pport->stopped) in lpfc_work_list_done()
920 complete((struct completion *)(evtp->evt_arg2)); in lpfc_work_list_done()
927 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_work_list_done()
933 spin_lock_irq(&phba->hbalock); in lpfc_work_list_done()
935 spin_unlock_irq(&phba->hbalock); in lpfc_work_list_done()
949 hba_pci_err = test_bit(HBA_PCI_ERR, &phba->bit_flags); in lpfc_work_done()
950 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
951 ha_copy = phba->work_ha; in lpfc_work_done()
952 phba->work_ha = 0; in lpfc_work_done()
953 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
958 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC && !hba_pci_err) in lpfc_work_done()
965 if (phba->fw_dump_cmpl) { in lpfc_work_done()
966 complete(phba->fw_dump_cmpl); in lpfc_work_done()
967 phba->fw_dump_cmpl = NULL; in lpfc_work_done()
979 if (phba->pport->work_port_events & in lpfc_work_done()
982 phba->pport->work_port_events &= in lpfc_work_done()
985 if (phba->pport->work_port_events & in lpfc_work_done()
988 phba->pport->work_port_events &= in lpfc_work_done()
994 if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) { in lpfc_work_done()
995 if (test_bit(HBA_RRQ_ACTIVE, &phba->hba_flag)) in lpfc_work_done()
997 if (test_bit(ELS_XRI_ABORT_EVENT, &phba->hba_flag)) in lpfc_work_done()
999 if (test_bit(ASYNC_EVENT, &phba->hba_flag)) in lpfc_work_done()
1002 &phba->hba_flag)) in lpfc_work_done()
1004 if (phba->fcf.fcf_flag & FCF_REDISC_EVT) in lpfc_work_done()
1010 for (i = 0; i <= phba->max_vports; i++) { in lpfc_work_done()
1016 vport = phba->pport; in lpfc_work_done()
1021 spin_lock_irq(&vport->work_port_lock); in lpfc_work_done()
1022 work_port_events = vport->work_port_events; in lpfc_work_done()
1023 vport->work_port_events &= ~work_port_events; in lpfc_work_done()
1024 spin_unlock_irq(&vport->work_port_lock); in lpfc_work_done()
1048 pring->flag & LPFC_DEFERRED_RING_EVENT || in lpfc_work_done()
1049 test_bit(HBA_SP_QUEUE_EVT, &phba->hba_flag))) { in lpfc_work_done()
1050 if (pring->flag & LPFC_STOP_IOCB_EVENT) { in lpfc_work_done()
1051 pring->flag |= LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1053 if (!test_bit(HBA_SP_QUEUE_EVT, &phba->hba_flag)) in lpfc_work_done()
1054 set_bit(LPFC_DATA_READY, &phba->data_flags); in lpfc_work_done()
1059 if (phba->link_state >= LPFC_LINK_DOWN || in lpfc_work_done()
1060 phba->link_flag & LS_MDS_LOOPBACK) { in lpfc_work_done()
1061 pring->flag &= ~LPFC_DEFERRED_RING_EVENT; in lpfc_work_done()
1067 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_work_done()
1072 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_work_done()
1073 spin_lock_irq(&phba->hbalock); in lpfc_work_done()
1074 control = readl(phba->HCregaddr); in lpfc_work_done()
1081 writel(control, phba->HCregaddr); in lpfc_work_done()
1082 readl(phba->HCregaddr); /* flush */ in lpfc_work_done()
1088 spin_unlock_irq(&phba->hbalock); in lpfc_work_done()
1101 current->flags |= PF_NOFREEZE; in lpfc_do_work()
1102 phba->data_flags = 0; in lpfc_do_work()
1106 rc = wait_event_interruptible(phba->work_waitq, in lpfc_do_work()
1108 &phba->data_flags) in lpfc_do_work()
1120 phba->worker_thread = NULL; in lpfc_do_work()
1146 evtp->evt_arg1 = arg1; in lpfc_workq_post_event()
1147 evtp->evt_arg2 = arg2; in lpfc_workq_post_event()
1148 evtp->evt = evt; in lpfc_workq_post_event()
1150 spin_lock_irqsave(&phba->hbalock, flags); in lpfc_workq_post_event()
1151 list_add_tail(&evtp->evt_listp, &phba->work_list); in lpfc_workq_post_event()
1152 spin_unlock_irqrestore(&phba->hbalock, flags); in lpfc_workq_post_event()
1162 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_rpis()
1165 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_cleanup_rpis()
1166 if ((phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) || in lpfc_cleanup_rpis()
1167 ((vport->port_type == LPFC_NPIV_PORT) && in lpfc_cleanup_rpis()
1168 ((ndlp->nlp_DID == NameServer_DID) || in lpfc_cleanup_rpis()
1169 (ndlp->nlp_DID == FDMI_DID) || in lpfc_cleanup_rpis()
1170 (ndlp->nlp_DID == Fabric_Cntl_DID)))) in lpfc_cleanup_rpis()
1174 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_cleanup_rpis()
1175 (!remove && ndlp->nlp_type & NLP_FABRIC)) in lpfc_cleanup_rpis()
1179 if (phba->nvmet_support && in lpfc_cleanup_rpis()
1180 ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) in lpfc_cleanup_rpis()
1188 if (phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) { in lpfc_cleanup_rpis()
1189 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_cleanup_rpis()
1192 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_cleanup_rpis()
1219 struct lpfc_hba *phba = vport->phba; in lpfc_linkdown_port()
1222 if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME) in lpfc_linkdown_port()
1228 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_linkdown_port()
1233 clear_bit(FC_DISC_DELAYED, &vport->fc_flag); in lpfc_linkdown_port()
1234 timer_delete_sync(&vport->delayed_disc_tmo); in lpfc_linkdown_port()
1236 if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_linkdown_port()
1237 vport->port_type == LPFC_PHYSICAL_PORT && in lpfc_linkdown_port()
1238 phba->sli4_hba.fawwpn_flag & LPFC_FAWWPN_CONFIG) { in lpfc_linkdown_port()
1240 phba->sli4_hba.fawwpn_flag |= LPFC_FAWWPN_FABRIC; in lpfc_linkdown_port()
1247 struct lpfc_vport *vport = phba->pport; in lpfc_linkdown()
1254 if (phba->link_state == LPFC_LINK_DOWN) in lpfc_linkdown()
1259 offline = pci_channel_offline(phba->pcidev); in lpfc_linkdown()
1262 if (phba->defer_flogi_acc.flag) { in lpfc_linkdown()
1263 if (phba->defer_flogi_acc.ndlp) { in lpfc_linkdown()
1264 lpfc_nlp_put(phba->defer_flogi_acc.ndlp); in lpfc_linkdown()
1265 phba->defer_flogi_acc.ndlp = NULL; in lpfc_linkdown()
1268 phba->defer_flogi_acc.flag = false; in lpfc_linkdown()
1271 clear_bit(HBA_FLOGI_ISSUED, &phba->hba_flag); in lpfc_linkdown()
1272 clear_bit(HBA_RHBA_CMPL, &phba->hba_flag); in lpfc_linkdown()
1275 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK; in lpfc_linkdown()
1277 spin_lock_irq(&phba->hbalock); in lpfc_linkdown()
1278 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_linkdown()
1279 spin_unlock_irq(&phba->hbalock); in lpfc_linkdown()
1280 if (phba->link_state > LPFC_LINK_DOWN) { in lpfc_linkdown()
1281 phba->link_state = LPFC_LINK_DOWN; in lpfc_linkdown()
1282 if (phba->sli4_hba.conf_trunk) { in lpfc_linkdown()
1283 phba->trunk_link.link0.state = 0; in lpfc_linkdown()
1284 phba->trunk_link.link1.state = 0; in lpfc_linkdown()
1285 phba->trunk_link.link2.state = 0; in lpfc_linkdown()
1286 phba->trunk_link.link3.state = 0; in lpfc_linkdown()
1287 phba->trunk_link.phy_lnk_speed = in lpfc_linkdown()
1289 phba->sli4_hba.link_state.logical_speed = in lpfc_linkdown()
1292 clear_bit(FC_LBIT, &phba->pport->fc_flag); in lpfc_linkdown()
1296 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_linkdown()
1300 vports[i]->fc_myDID = 0; in lpfc_linkdown()
1302 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_linkdown()
1303 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_linkdown()
1304 if (phba->nvmet_support) in lpfc_linkdown()
1314 if (phba->sli_rev > LPFC_SLI_REV3 || offline) in lpfc_linkdown()
1317 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1320 mb->vport = vport; in lpfc_linkdown()
1321 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1324 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1330 if (test_bit(FC_PT2PT, &phba->pport->fc_flag)) { in lpfc_linkdown()
1331 mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_linkdown()
1334 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_linkdown()
1335 mb->vport = vport; in lpfc_linkdown()
1338 mempool_free(mb, phba->mbox_mem_pool); in lpfc_linkdown()
1341 clear_bit(FC_PT2PT, &phba->pport->fc_flag); in lpfc_linkdown()
1342 clear_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag); in lpfc_linkdown()
1343 spin_lock_irq(shost->host_lock); in lpfc_linkdown()
1344 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkdown()
1345 spin_unlock_irq(shost->host_lock); in lpfc_linkdown()
1355 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_linkup_cleanup_nodes()
1356 ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); in lpfc_linkup_cleanup_nodes()
1358 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_linkup_cleanup_nodes()
1360 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_linkup_cleanup_nodes()
1364 if (ndlp->nlp_DID != Fabric_DID) in lpfc_linkup_cleanup_nodes()
1367 } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_linkup_cleanup_nodes()
1380 struct lpfc_hba *phba = vport->phba; in lpfc_linkup_port()
1382 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_linkup_port()
1387 phba->fc_topology, phba->fc_linkspeed, phba->link_flag); in lpfc_linkup_port()
1390 if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_linkup_port()
1391 (vport != phba->pport)) in lpfc_linkup_port()
1394 if (phba->defer_flogi_acc.flag) { in lpfc_linkup_port()
1395 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1396 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_linkup_port()
1397 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_linkup_port()
1398 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1400 clear_bit(FC_PT2PT, &vport->fc_flag); in lpfc_linkup_port()
1401 clear_bit(FC_PT2PT_PLOGI, &vport->fc_flag); in lpfc_linkup_port()
1402 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1403 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_linkup_port()
1404 clear_bit(FC_NLP_MORE, &vport->fc_flag); in lpfc_linkup_port()
1405 clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag); in lpfc_linkup_port()
1407 set_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_linkup_port()
1409 spin_lock_irq(shost->host_lock); in lpfc_linkup_port()
1410 vport->fc_ns_retry = 0; in lpfc_linkup_port()
1411 spin_unlock_irq(shost->host_lock); in lpfc_linkup_port()
1422 struct Scsi_Host *shost = lpfc_shost_from_vport(phba->pport); in lpfc_linkup()
1424 phba->link_state = LPFC_LINK_UP; in lpfc_linkup()
1427 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags); in lpfc_linkup()
1428 timer_delete_sync(&phba->fabric_block_timer); in lpfc_linkup()
1432 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) in lpfc_linkup()
1437 * absorbed without an ACQE. No lock here - in worker thread in lpfc_linkup()
1440 spin_lock_irq(shost->host_lock); in lpfc_linkup()
1441 phba->pport->rcv_flogi_cnt = 0; in lpfc_linkup()
1442 spin_unlock_irq(shost->host_lock); in lpfc_linkup()
1456 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_clear_la()
1457 struct lpfc_sli *psli = &phba->sli; in lpfc_mbx_cmpl_clear_la()
1458 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_clear_la()
1462 psli->sli3_ring[LPFC_EXTRA_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1463 psli->sli3_ring[LPFC_FCP_RING].flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_clear_la()
1466 if ((mb->mbxStatus) && (mb->mbxStatus != 0x1601)) { in lpfc_mbx_cmpl_clear_la()
1471 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_clear_la()
1472 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_clear_la()
1476 if (vport->port_type == LPFC_PHYSICAL_PORT) in lpfc_mbx_cmpl_clear_la()
1477 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_clear_la()
1479 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1480 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1481 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1483 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1484 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1485 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1486 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1493 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_clear_la()
1495 clear_bit(FC_ABORT_DISCOVERY, &vport->fc_flag); in lpfc_mbx_cmpl_clear_la()
1501 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1502 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_mbx_cmpl_clear_la()
1503 control = readl(phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1505 writel(control, phba->HCregaddr); in lpfc_mbx_cmpl_clear_la()
1506 readl(phba->HCregaddr); /* flush */ in lpfc_mbx_cmpl_clear_la()
1507 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_clear_la()
1515 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_local_config_link()
1517 u16 status = pmb->u.mb.mbxStatus; in lpfc_mbx_cmpl_local_config_link()
1520 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1526 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_local_config_link()
1527 !test_bit(HBA_FCOE_MODE, &phba->hba_flag) && in lpfc_mbx_cmpl_local_config_link()
1528 (phba->link_flag & LS_LOOPBACK_MODE)) in lpfc_mbx_cmpl_local_config_link()
1531 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_mbx_cmpl_local_config_link()
1532 test_bit(FC_PUBLIC_LOOP, &vport->fc_flag) && in lpfc_mbx_cmpl_local_config_link()
1533 !test_bit(FC_LBIT, &vport->fc_flag)) { in lpfc_mbx_cmpl_local_config_link()
1534 /* Need to wait for FAN - use discovery timer in lpfc_mbx_cmpl_local_config_link()
1535 * for timeout. port_state is identically in lpfc_mbx_cmpl_local_config_link()
1545 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_local_config_link()
1547 * bb-credit recovery is in place. in lpfc_mbx_cmpl_local_config_link()
1549 if (phba->bbcredit_support && phba->cfg_enable_bbcr && in lpfc_mbx_cmpl_local_config_link()
1550 !(phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_local_config_link()
1551 sparam_mb = mempool_alloc(phba->mbox_mem_pool, in lpfc_mbx_cmpl_local_config_link()
1558 mempool_free(sparam_mb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_local_config_link()
1561 sparam_mb->vport = vport; in lpfc_mbx_cmpl_local_config_link()
1562 sparam_mb->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_cmpl_local_config_link()
1570 set_bit(HBA_DEFER_FLOGI, &phba->hba_flag); in lpfc_mbx_cmpl_local_config_link()
1575 if (test_bit(FC_PT2PT, &vport->fc_flag)) in lpfc_mbx_cmpl_local_config_link()
1583 status, vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1590 vport->port_state); in lpfc_mbx_cmpl_local_config_link()
1609 memset(phba->fcf.fcf_rr_bmask, 0, sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_clear_fcf_rr_bmask()
1610 spin_lock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1612 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_clear_fcf_rr_bmask()
1613 list_del_init(&fcf_pri->list); in lpfc_sli4_clear_fcf_rr_bmask()
1614 fcf_pri->fcf_rec.flag = 0; in lpfc_sli4_clear_fcf_rr_bmask()
1616 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_clear_fcf_rr_bmask()
1621 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_fcfi()
1623 if (mboxq->u.mb.mbxStatus) { in lpfc_mbx_cmpl_reg_fcfi()
1626 "HBA state x%x\n", mboxq->u.mb.mbxStatus, in lpfc_mbx_cmpl_reg_fcfi()
1627 vport->port_state); in lpfc_mbx_cmpl_reg_fcfi()
1632 phba->fcf.fcfi = bf_get(lpfc_reg_fcfi_fcfi, &mboxq->u.mqe.un.reg_fcfi); in lpfc_mbx_cmpl_reg_fcfi()
1634 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1635 phba->fcf.fcf_flag |= FCF_REGISTERED; in lpfc_mbx_cmpl_reg_fcfi()
1636 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1639 if (!test_bit(FCF_RR_INPROG, &phba->hba_flag) && in lpfc_mbx_cmpl_reg_fcfi()
1644 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1645 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_mbx_cmpl_reg_fcfi()
1646 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_reg_fcfi()
1647 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1648 if (vport->port_state != LPFC_FLOGI) { in lpfc_mbx_cmpl_reg_fcfi()
1649 set_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1655 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_reg_fcfi()
1657 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_fcfi()
1661 * lpfc_fab_name_match - Check if the fcf fabric name match.
1692 * lpfc_sw_name_match - Check if the fcf switch name match.
1723 * lpfc_mac_addr_match - Check if the fcf mac address match.
1756 * __lpfc_update_fcf_record_pri - update the lpfc_fcf_pri record.
1772 fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in __lpfc_update_fcf_record_pri()
1773 fcf_pri->fcf_rec.fcf_index = fcf_index; in __lpfc_update_fcf_record_pri()
1775 fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in __lpfc_update_fcf_record_pri()
1780 * lpfc_copy_fcf_record - Copy fcf information to lpfc_hba.
1792 fcf_rec->fabric_name[0] = in lpfc_copy_fcf_record()
1794 fcf_rec->fabric_name[1] = in lpfc_copy_fcf_record()
1796 fcf_rec->fabric_name[2] = in lpfc_copy_fcf_record()
1798 fcf_rec->fabric_name[3] = in lpfc_copy_fcf_record()
1800 fcf_rec->fabric_name[4] = in lpfc_copy_fcf_record()
1802 fcf_rec->fabric_name[5] = in lpfc_copy_fcf_record()
1804 fcf_rec->fabric_name[6] = in lpfc_copy_fcf_record()
1806 fcf_rec->fabric_name[7] = in lpfc_copy_fcf_record()
1809 fcf_rec->mac_addr[0] = bf_get(lpfc_fcf_record_mac_0, new_fcf_record); in lpfc_copy_fcf_record()
1810 fcf_rec->mac_addr[1] = bf_get(lpfc_fcf_record_mac_1, new_fcf_record); in lpfc_copy_fcf_record()
1811 fcf_rec->mac_addr[2] = bf_get(lpfc_fcf_record_mac_2, new_fcf_record); in lpfc_copy_fcf_record()
1812 fcf_rec->mac_addr[3] = bf_get(lpfc_fcf_record_mac_3, new_fcf_record); in lpfc_copy_fcf_record()
1813 fcf_rec->mac_addr[4] = bf_get(lpfc_fcf_record_mac_4, new_fcf_record); in lpfc_copy_fcf_record()
1814 fcf_rec->mac_addr[5] = bf_get(lpfc_fcf_record_mac_5, new_fcf_record); in lpfc_copy_fcf_record()
1816 fcf_rec->fcf_indx = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); in lpfc_copy_fcf_record()
1818 fcf_rec->priority = new_fcf_record->fip_priority; in lpfc_copy_fcf_record()
1820 fcf_rec->switch_name[0] = in lpfc_copy_fcf_record()
1822 fcf_rec->switch_name[1] = in lpfc_copy_fcf_record()
1824 fcf_rec->switch_name[2] = in lpfc_copy_fcf_record()
1826 fcf_rec->switch_name[3] = in lpfc_copy_fcf_record()
1828 fcf_rec->switch_name[4] = in lpfc_copy_fcf_record()
1830 fcf_rec->switch_name[5] = in lpfc_copy_fcf_record()
1832 fcf_rec->switch_name[6] = in lpfc_copy_fcf_record()
1834 fcf_rec->switch_name[7] = in lpfc_copy_fcf_record()
1839 * __lpfc_update_fcf_record - Update driver fcf record
1856 lockdep_assert_held(&phba->hbalock); in __lpfc_update_fcf_record()
1861 fcf_rec->addr_mode = addr_mode; in __lpfc_update_fcf_record()
1862 fcf_rec->vlan_id = vlan_id; in __lpfc_update_fcf_record()
1863 fcf_rec->flag |= (flag | RECORD_VALID); in __lpfc_update_fcf_record()
1870 * lpfc_register_fcf - Register the FCF with hba.
1882 spin_lock_irq(&phba->hbalock); in lpfc_register_fcf()
1884 if (!(phba->fcf.fcf_flag & FCF_AVAILABLE)) { in lpfc_register_fcf()
1885 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1886 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1887 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1892 if (phba->fcf.fcf_flag & FCF_REGISTERED) { in lpfc_register_fcf()
1893 phba->fcf.fcf_flag |= (FCF_SCAN_DONE | FCF_IN_USE); in lpfc_register_fcf()
1894 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1895 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1896 if (phba->pport->port_state != LPFC_FLOGI && in lpfc_register_fcf()
1897 test_bit(FC_FABRIC, &phba->pport->fc_flag)) { in lpfc_register_fcf()
1898 set_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1899 lpfc_initial_flogi(phba->pport); in lpfc_register_fcf()
1904 spin_unlock_irq(&phba->hbalock); in lpfc_register_fcf()
1906 fcf_mbxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_register_fcf()
1908 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1909 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1914 fcf_mbxq->vport = phba->pport; in lpfc_register_fcf()
1915 fcf_mbxq->mbox_cmpl = lpfc_mbx_cmpl_reg_fcfi; in lpfc_register_fcf()
1918 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1919 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_register_fcf()
1920 mempool_free(fcf_mbxq, phba->mbox_mem_pool); in lpfc_register_fcf()
1927 * lpfc_match_fcf_conn_list - Check if the FCF record can be used for discovery.
1955 if (new_fcf_record->vlan_bitmap[i]) { in lpfc_match_fcf_conn_list()
1958 while (!((new_fcf_record->vlan_bitmap[i] >> j) & 1)) { in lpfc_match_fcf_conn_list()
1972 if (!test_bit(HBA_FIP_SUPPORT, &phba->hba_flag)) { in lpfc_match_fcf_conn_list()
1976 if (phba->valid_vlan) in lpfc_match_fcf_conn_list()
1977 *vlan_id = phba->vlan_id; in lpfc_match_fcf_conn_list()
1987 if (list_empty(&phba->fcf_conn_rec_list)) { in lpfc_match_fcf_conn_list()
1994 * addressing mode - FPMA. in lpfc_match_fcf_conn_list()
2008 &phba->fcf_conn_rec_list, list) { in lpfc_match_fcf_conn_list()
2009 if (!(conn_entry->conn_rec.flags & FCFCNCT_VALID)) in lpfc_match_fcf_conn_list()
2012 if ((conn_entry->conn_rec.flags & FCFCNCT_FBNM_VALID) && in lpfc_match_fcf_conn_list()
2013 !lpfc_fab_name_match(conn_entry->conn_rec.fabric_name, in lpfc_match_fcf_conn_list()
2016 if ((conn_entry->conn_rec.flags & FCFCNCT_SWNM_VALID) && in lpfc_match_fcf_conn_list()
2017 !lpfc_sw_name_match(conn_entry->conn_rec.switch_name, in lpfc_match_fcf_conn_list()
2020 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) { in lpfc_match_fcf_conn_list()
2025 if (!(new_fcf_record->vlan_bitmap in lpfc_match_fcf_conn_list()
2026 [conn_entry->conn_rec.vlan_tag / 8] & in lpfc_match_fcf_conn_list()
2027 (1 << (conn_entry->conn_rec.vlan_tag % 8)))) in lpfc_match_fcf_conn_list()
2043 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2044 !(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED)) { in lpfc_match_fcf_conn_list()
2049 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2057 if (!(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2066 if (conn_entry->conn_rec.flags & FCFCNCT_BOOT) in lpfc_match_fcf_conn_list()
2082 if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2083 (!(conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED))) in lpfc_match_fcf_conn_list()
2084 *addr_mode = (conn_entry->conn_rec.flags & in lpfc_match_fcf_conn_list()
2091 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2092 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2093 (conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2096 else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && in lpfc_match_fcf_conn_list()
2097 (conn_entry->conn_rec.flags & FCFCNCT_AM_PREFERRED) && in lpfc_match_fcf_conn_list()
2098 !(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && in lpfc_match_fcf_conn_list()
2103 if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) in lpfc_match_fcf_conn_list()
2104 *vlan_id = conn_entry->conn_rec.vlan_tag; in lpfc_match_fcf_conn_list()
2121 * lpfc_check_pending_fcoe_event - Check if there is pending fcoe event.
2123 * @unreg_fcf: Unregister FCF if FCF table need to be re-scaned.
2136 if ((phba->link_state >= LPFC_LINK_UP) && in lpfc_check_pending_fcoe_event()
2137 (phba->fcoe_eventtag == phba->fcoe_eventtag_at_fcf_scan)) in lpfc_check_pending_fcoe_event()
2144 phba->link_state, phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2145 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2147 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2148 phba->fcf.fcf_flag &= ~FCF_AVAILABLE; in lpfc_check_pending_fcoe_event()
2149 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2151 if (phba->link_state >= LPFC_LINK_UP) { in lpfc_check_pending_fcoe_event()
2156 phba->fcoe_eventtag_at_fcf_scan, in lpfc_check_pending_fcoe_event()
2157 phba->fcoe_eventtag); in lpfc_check_pending_fcoe_event()
2166 "state change (x%x)\n", phba->link_state); in lpfc_check_pending_fcoe_event()
2167 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_check_pending_fcoe_event()
2168 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_check_pending_fcoe_event()
2169 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2170 phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY); in lpfc_check_pending_fcoe_event()
2171 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2176 spin_lock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2177 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_check_pending_fcoe_event()
2178 spin_unlock_irq(&phba->hbalock); in lpfc_check_pending_fcoe_event()
2185 * lpfc_sli4_new_fcf_random_select - Randomly select an eligible new fcf record
2192 * size unit32_t, a 16-bit random number returned from get_random_u16() is
2204 /* Get 16-bit uniform random number */ in lpfc_sli4_new_fcf_random_select()
2215 * lpfc_sli4_fcf_rec_mbox_parse - Parse read_fcf mbox command.
2220 * This routine parses the non-embedded fcf mailbox command by performing the
2221 * necessarily error checking, non-embedded read FCF record mailbox command
2224 * Returns the pointer to the new FCF record in the non-embedded mailbox
2238 /* Get the first SGE entry from the non-embedded DMA memory. This in lpfc_sli4_fcf_rec_mbox_parse()
2242 if (unlikely(!mboxq->sge_array)) { in lpfc_sli4_fcf_rec_mbox_parse()
2244 "2524 Failed to get the non-embedded SGE " in lpfc_sli4_fcf_rec_mbox_parse()
2248 virt_addr = mboxq->sge_array->addr[0]; in lpfc_sli4_fcf_rec_mbox_parse()
2253 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2254 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); in lpfc_sli4_fcf_rec_mbox_parse()
2255 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); in lpfc_sli4_fcf_rec_mbox_parse()
2280 new_fcf_record->word137 = le32_to_cpu(new_fcf_record->word137); in lpfc_sli4_fcf_rec_mbox_parse()
2281 new_fcf_record->word138 = le32_to_cpu(new_fcf_record->word138); in lpfc_sli4_fcf_rec_mbox_parse()
2287 * lpfc_sli4_log_fcf_record_info - Log the information of a fcf record
2319 fcf_record->fip_priority, in lpfc_sli4_log_fcf_record_info()
2348 * lpfc_sli4_fcf_record_match - testing new FCF record for matching existing FCF
2367 if (!lpfc_vlan_id_match(fcf_rec->vlan_id, new_vlan_id)) in lpfc_sli4_fcf_record_match()
2369 if (!lpfc_mac_addr_match(fcf_rec->mac_addr, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2371 if (!lpfc_sw_name_match(fcf_rec->switch_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2373 if (!lpfc_fab_name_match(fcf_rec->fabric_name, new_fcf_record)) in lpfc_sli4_fcf_record_match()
2375 if (fcf_rec->priority != new_fcf_record->fip_priority) in lpfc_sli4_fcf_record_match()
2381 * lpfc_sli4_fcf_rr_next_proc - processing next roundrobin fcf
2393 struct lpfc_hba *phba = vport->phba; in lpfc_sli4_fcf_rr_next_proc()
2397 if (test_bit(HBA_DEVLOSS_TMO, &phba->hba_flag)) { in lpfc_sli4_fcf_rr_next_proc()
2400 "FCF, unregister in-use FCF (x%x) " in lpfc_sli4_fcf_rr_next_proc()
2402 phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2407 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_sli4_fcf_rr_next_proc()
2409 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2410 phba->fcf.fcf_flag &= ~(FCF_AVAILABLE | FCF_SCAN_DONE); in lpfc_sli4_fcf_rr_next_proc()
2411 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_rr_next_proc()
2415 phba->pport->port_state, LPFC_VPORT_UNKNOWN); in lpfc_sli4_fcf_rr_next_proc()
2416 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_sli4_fcf_rr_next_proc()
2418 if (!phba->fcf.fcf_redisc_attempted) { in lpfc_sli4_fcf_rr_next_proc()
2425 phba->fcf.fcf_redisc_attempted = 1; in lpfc_sli4_fcf_rr_next_proc()
2447 rc, phba->fcf.current_rec.fcf_indx); in lpfc_sli4_fcf_rr_next_proc()
2472 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_del()
2475 fcf_index, new_fcf_pri->fcf_rec.priority, in lpfc_sli4_fcf_pri_list_del()
2476 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_del()
2477 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2478 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) { in lpfc_sli4_fcf_pri_list_del()
2479 if (phba->fcf.current_rec.priority == in lpfc_sli4_fcf_pri_list_del()
2480 new_fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_del()
2481 phba->fcf.eligible_fcf_cnt--; in lpfc_sli4_fcf_pri_list_del()
2482 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_del()
2483 new_fcf_pri->fcf_rec.flag &= ~LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_del()
2485 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_del()
2495 * If the fcf record is re-read for any reason this flag is cleared brfore
2502 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_set_fcf_flogi_fail()
2503 spin_lock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2504 new_fcf_pri->fcf_rec.flag |= LPFC_FCF_FLOGI_FAILED; in lpfc_sli4_set_fcf_flogi_fail()
2505 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_set_fcf_flogi_fail()
2535 new_fcf_pri = &phba->fcf.fcf_pri[fcf_index]; in lpfc_sli4_fcf_pri_list_add()
2538 fcf_index, new_fcf_record->fip_priority, in lpfc_sli4_fcf_pri_list_add()
2539 new_fcf_pri->fcf_rec.flag); in lpfc_sli4_fcf_pri_list_add()
2540 spin_lock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2541 if (new_fcf_pri->fcf_rec.flag & LPFC_FCF_ON_PRI_LIST) in lpfc_sli4_fcf_pri_list_add()
2542 list_del_init(&new_fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2543 new_fcf_pri->fcf_rec.fcf_index = fcf_index; in lpfc_sli4_fcf_pri_list_add()
2544 new_fcf_pri->fcf_rec.priority = new_fcf_record->fip_priority; in lpfc_sli4_fcf_pri_list_add()
2545 if (list_empty(&phba->fcf.fcf_pri_list)) { in lpfc_sli4_fcf_pri_list_add()
2546 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2548 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2552 last_index = find_first_bit(phba->fcf.fcf_rr_bmask, in lpfc_sli4_fcf_pri_list_add()
2558 current_fcf_pri = phba->fcf.fcf_pri[last_index].fcf_rec.priority; in lpfc_sli4_fcf_pri_list_add()
2559 if (new_fcf_pri->fcf_rec.priority <= current_fcf_pri) { in lpfc_sli4_fcf_pri_list_add()
2560 list_add(&new_fcf_pri->list, &phba->fcf.fcf_pri_list); 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 memset(phba->fcf.fcf_rr_bmask, 0, in lpfc_sli4_fcf_pri_list_add()
2563 sizeof(*phba->fcf.fcf_rr_bmask)); in lpfc_sli4_fcf_pri_list_add()
2565 phba->fcf.eligible_fcf_cnt = 1; in lpfc_sli4_fcf_pri_list_add()
2568 phba->fcf.eligible_fcf_cnt++; in lpfc_sli4_fcf_pri_list_add()
2570 new_fcf_pri->fcf_rec.fcf_index); in lpfc_sli4_fcf_pri_list_add()
2575 &phba->fcf.fcf_pri_list, list) { in lpfc_sli4_fcf_pri_list_add()
2576 if (new_fcf_pri->fcf_rec.priority <= in lpfc_sli4_fcf_pri_list_add()
2577 fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2578 if (fcf_pri->list.prev == &phba->fcf.fcf_pri_list) in lpfc_sli4_fcf_pri_list_add()
2579 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2580 &phba->fcf.fcf_pri_list); in lpfc_sli4_fcf_pri_list_add()
2582 list_add(&new_fcf_pri->list, in lpfc_sli4_fcf_pri_list_add()
2584 fcf_pri->list.prev)->list); in lpfc_sli4_fcf_pri_list_add()
2587 } else if (fcf_pri->list.next == &phba->fcf.fcf_pri_list in lpfc_sli4_fcf_pri_list_add()
2588 || new_fcf_pri->fcf_rec.priority < in lpfc_sli4_fcf_pri_list_add()
2589 next_fcf_pri->fcf_rec.priority) { in lpfc_sli4_fcf_pri_list_add()
2590 list_add(&new_fcf_pri->list, &fcf_pri->list); in lpfc_sli4_fcf_pri_list_add()
2594 if (new_fcf_pri->fcf_rec.priority > fcf_pri->fcf_rec.priority) in lpfc_sli4_fcf_pri_list_add()
2601 new_fcf_pri->fcf_rec.flag = LPFC_FCF_ON_PRI_LIST; in lpfc_sli4_fcf_pri_list_add()
2602 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_fcf_pri_list_add()
2607 * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler.
2638 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2646 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2679 if ((phba->fcf.fcf_flag & FCF_IN_USE) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2680 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2683 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2687 "of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2690 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2694 * In case the current in-use FCF record becomes in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2699 if (!(phba->fcf.fcf_flag & FCF_REDISC_PEND) && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2700 !(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2702 "2835 Invalid in-use FCF " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2705 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2706 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2707 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2708 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2727 * matches the in-use FCF record: fabric name, switch name, mac in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2730 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2731 if (phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2732 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2733 lpfc_sli4_fcf_record_match(phba, &phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2736 phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2737 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2738 if (phba->fcf.fcf_flag & FCF_REDISC_PEND) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2742 else if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2744 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2745 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2747 "2836 New FCF matches in-use " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2750 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2751 phba->pport->port_state, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2752 phba->pport->fc_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2757 "property of in-use FCF (x%x)\n", in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2760 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2764 * with in-use record only if not during the fast failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2769 if (!(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2770 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2775 * Update on failover FCF record only if it's in FCF fast-failover in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2778 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2779 fcf_rec = &phba->fcf.failover_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2781 fcf_rec = &phba->fcf.current_rec; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2783 if (phba->fcf.fcf_flag & FCF_AVAILABLE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2789 if (boot_flag && !(fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2794 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2799 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2807 if (!boot_flag && (fcf_rec->flag & BOOT_ENABLE)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2808 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2815 if (new_fcf_record->fip_priority < fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2820 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2826 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2827 } else if (new_fcf_record->fip_priority == fcf_rec->priority) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2829 phba->fcf.eligible_fcf_cnt++; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2831 phba->fcf.eligible_fcf_cnt); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2836 fcf_rec->fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2845 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2850 * initial best-fit FCF. in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2861 phba->fcf.fcf_flag |= FCF_AVAILABLE; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2863 phba->fcf.eligible_fcf_cnt = 1; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2865 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2871 if (phba->fcf.fcf_flag & FCF_REDISC_FOV) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2880 if (!(phba->fcf.failover_rec.flag & RECORD_VALID)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2884 phba->fcoe_eventtag_at_fcf_scan, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2888 &phba->hba_flag)) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2890 &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2891 /* Unregister in-use FCF and rescan */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2895 "unreg in-use FCF and " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2903 clear_bit(FCF_TS_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2908 * the same as in-use FCF record, unregister the in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2909 * in-use FCF record, replace the in-use FCF record in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2915 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2918 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2920 "2842 Replace in-use FCF (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2922 phba->fcf.current_rec.fcf_indx, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2923 phba->fcf.failover_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2924 memcpy(&phba->fcf.current_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2925 &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2932 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2933 phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2934 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2942 if ((phba->fcf.fcf_flag & FCF_REDISC_EVT) || in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2943 (phba->fcf.fcf_flag & FCF_REDISC_PEND)) in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2946 if (phba->cfg_fcf_failover_policy == LPFC_FCF_FOV && in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2947 phba->fcf.fcf_flag & FCF_IN_USE) { in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2949 * In case the current in-use FCF record no in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2955 "2841 In-use FCF record (x%x) " in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2958 phba->fcf.current_rec.fcf_indx); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2959 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2960 phba->fcf.fcf_flag |= FCF_REDISC_FOV; in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2961 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_scan_read_fcf_rec()
2981 * lpfc_mbx_cmpl_fcf_rr_read_fcf_rec - fcf roundrobin read_fcf mbox cmpl hdler
3006 if (phba->link_state < LPFC_LINK_UP) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3007 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3008 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3009 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3010 clear_bit(FCF_RR_INPROG, &phba->hba_flag); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3014 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3021 "hba_flg x%lx fcf_flg x%x\n", phba->hba_flag, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3022 phba->fcf.fcf_flag); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3044 rc = lpfc_sli4_fcf_rr_next_proc(phba->pport, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3050 if (fcf_index == phba->fcf.current_rec.fcf_indx) { in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3054 phba->fcf.current_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3057 lpfc_issue_init_vfi(phba->pport); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3064 phba->fcf.failover_rec.fcf_indx, fcf_index); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3065 spin_lock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3066 __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3069 spin_unlock_irq(&phba->hbalock); in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3071 current_fcf_index = phba->fcf.current_rec.fcf_indx; in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3073 /* Unregister the current in-use FCF record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3076 /* Replace in-use record with the new record */ in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3077 memcpy(&phba->fcf.current_rec, &phba->fcf.failover_rec, in lpfc_mbx_cmpl_fcf_rr_read_fcf_rec()
3091 * lpfc_mbx_cmpl_read_fcf_rec - read fcf completion handler.
3111 if (phba->link_state < LPFC_LINK_UP) in lpfc_mbx_cmpl_read_fcf_rec()
3115 if (!(phba->fcf.fcf_flag & FCF_DISCOVERY)) in lpfc_mbx_cmpl_read_fcf_rec()
3118 /* Parse the FCF record from the non-embedded mailbox command */ in lpfc_mbx_cmpl_read_fcf_rec()
3149 * lpfc_init_vfi_cmpl - Completion handler for init_vfi mbox command.
3158 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vfi_cmpl()
3162 * Also continue if the VFI is in use - just use the same one. in lpfc_init_vfi_cmpl()
3164 if (mboxq->u.mb.mbxStatus && in lpfc_init_vfi_cmpl()
3165 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_init_vfi_cmpl()
3167 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_init_vfi_cmpl()
3170 mboxq->u.mb.mbxStatus); in lpfc_init_vfi_cmpl()
3171 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3177 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vfi_cmpl()
3182 * lpfc_issue_init_vfi - Issue init_vfi mailbox command.
3193 struct lpfc_hba *phba = vport->phba; in lpfc_issue_init_vfi()
3195 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vfi()
3203 mboxq->mbox_cmpl = lpfc_init_vfi_cmpl; in lpfc_issue_init_vfi()
3208 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vfi()
3213 * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command.
3222 struct lpfc_vport *vport = mboxq->vport; in lpfc_init_vpi_cmpl()
3225 if (mboxq->u.mb.mbxStatus) { in lpfc_init_vpi_cmpl()
3228 mboxq->u.mb.mbxStatus); in lpfc_init_vpi_cmpl()
3229 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3233 clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_init_vpi_cmpl()
3236 if ((phba->pport == vport) || (vport->port_state == LPFC_FDISC)) { in lpfc_init_vpi_cmpl()
3245 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3249 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_init_vpi_cmpl()
3256 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_init_vpi_cmpl()
3261 * lpfc_issue_init_vpi - Issue init_vpi mailbox command.
3273 if ((vport->port_type != LPFC_PHYSICAL_PORT) && (!vport->vpi)) { in lpfc_issue_init_vpi()
3274 vpi = lpfc_alloc_vpi(vport->phba); in lpfc_issue_init_vpi()
3281 vport->vpi = vpi; in lpfc_issue_init_vpi()
3284 mboxq = mempool_alloc(vport->phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_init_vpi()
3291 lpfc_init_vpi(vport->phba, mboxq, vport->vpi); in lpfc_issue_init_vpi()
3292 mboxq->vport = vport; in lpfc_issue_init_vpi()
3293 mboxq->mbox_cmpl = lpfc_init_vpi_cmpl; in lpfc_issue_init_vpi()
3294 rc = lpfc_sli_issue_mbox(vport->phba, mboxq, MBX_NOWAIT); in lpfc_issue_init_vpi()
3298 mempool_free(mboxq, vport->phba->mbox_mem_pool); in lpfc_issue_init_vpi()
3303 * lpfc_start_fdiscs - send fdiscs for each vports on this port.
3317 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_start_fdiscs()
3318 if (vports[i]->port_type == LPFC_PHYSICAL_PORT) in lpfc_start_fdiscs()
3321 if (vports[i]->vpi > phba->max_vpi) { in lpfc_start_fdiscs()
3326 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_start_fdiscs()
3332 &vports[i]->fc_flag)) { in lpfc_start_fdiscs()
3336 if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) in lpfc_start_fdiscs()
3354 struct lpfc_vport *vport = mboxq->vport; in lpfc_mbx_cmpl_reg_vfi()
3361 if (mboxq->u.mb.mbxStatus && in lpfc_mbx_cmpl_reg_vfi()
3362 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != in lpfc_mbx_cmpl_reg_vfi()
3364 mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) { in lpfc_mbx_cmpl_reg_vfi()
3368 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_mbx_cmpl_reg_vfi()
3369 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_reg_vfi()
3384 if (test_bit(FC_VFI_REGISTERED, &vport->fc_flag)) in lpfc_mbx_cmpl_reg_vfi()
3385 if (!(phba->sli_rev == LPFC_SLI_REV4 && in lpfc_mbx_cmpl_reg_vfi()
3386 test_bit(FC_PT2PT, &vport->fc_flag))) in lpfc_mbx_cmpl_reg_vfi()
3390 set_bit(FC_VFI_REGISTERED, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3391 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3392 clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vfi()
3393 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3394 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vfi()
3395 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vfi()
3398 if ((phba->sli_rev == LPFC_SLI_REV4) && in lpfc_mbx_cmpl_reg_vfi()
3399 (phba->link_flag & LS_LOOPBACK_MODE)) { in lpfc_mbx_cmpl_reg_vfi()
3400 phba->link_state = LPFC_HBA_READY; in lpfc_mbx_cmpl_reg_vfi()
3407 vport->port_state, vport->fc_flag, vport->fc_myDID, in lpfc_mbx_cmpl_reg_vfi()
3408 vport->phba->alpa_map[0], in lpfc_mbx_cmpl_reg_vfi()
3409 phba->link_state, phba->fc_topology); in lpfc_mbx_cmpl_reg_vfi()
3411 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_reg_vfi()
3416 if (test_bit(FC_PT2PT, &vport->fc_flag) || in lpfc_mbx_cmpl_reg_vfi()
3417 (phba->fc_topology == LPFC_TOPOLOGY_LOOP && in lpfc_mbx_cmpl_reg_vfi()
3418 !test_bit(FC_PUBLIC_LOOP, &vport->fc_flag))) { in lpfc_mbx_cmpl_reg_vfi()
3423 if (test_bit(FC_PT2PT, &vport->fc_flag)) in lpfc_mbx_cmpl_reg_vfi()
3424 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vfi()
3440 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_sparam()
3441 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_read_sparam()
3442 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_sparam()
3444 struct serv_parm *sp = &vport->fc_sparam; in lpfc_mbx_cmpl_read_sparam()
3448 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_sparam()
3453 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_sparam()
3458 memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, in lpfc_mbx_cmpl_read_sparam()
3461 ed_tov = be32_to_cpu(sp->cmn.e_d_tov); in lpfc_mbx_cmpl_read_sparam()
3462 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */ in lpfc_mbx_cmpl_read_sparam()
3465 phba->fc_edtov = ed_tov; in lpfc_mbx_cmpl_read_sparam()
3466 phba->fc_ratov = (2 * ed_tov) / 1000; in lpfc_mbx_cmpl_read_sparam()
3467 if (phba->fc_ratov < FF_DEF_RATOV) { in lpfc_mbx_cmpl_read_sparam()
3469 phba->fc_ratov = FF_DEF_RATOV; in lpfc_mbx_cmpl_read_sparam()
3473 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn); in lpfc_mbx_cmpl_read_sparam()
3474 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_read_sparam()
3475 memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3476 memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); in lpfc_mbx_cmpl_read_sparam()
3484 if (test_bit(HBA_DEFER_FLOGI, &phba->hba_flag)) { in lpfc_mbx_cmpl_read_sparam()
3486 clear_bit(HBA_DEFER_FLOGI, &phba->hba_flag); in lpfc_mbx_cmpl_read_sparam()
3498 struct lpfc_vport *vport = phba->pport; in lpfc_mbx_process_link_up()
3505 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3506 phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la); in lpfc_mbx_process_link_up()
3508 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3522 phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN; in lpfc_mbx_process_link_up()
3527 if (phba->fc_topology && in lpfc_mbx_process_link_up()
3528 phba->fc_topology != bf_get(lpfc_mbx_read_top_topology, la)) { in lpfc_mbx_process_link_up()
3531 phba->fc_topology, in lpfc_mbx_process_link_up()
3533 phba->fc_topology_changed = 1; in lpfc_mbx_process_link_up()
3536 phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la); in lpfc_mbx_process_link_up()
3537 phba->link_flag &= ~(LS_NPIV_FAB_SUPPORTED | LS_CT_VEN_RPA); in lpfc_mbx_process_link_up()
3539 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_process_link_up()
3540 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; in lpfc_mbx_process_link_up()
3545 if (phba->cfg_enable_npiv && phba->max_vpi) in lpfc_mbx_process_link_up()
3551 set_bit(FC_LBIT, &vport->fc_flag); in lpfc_mbx_process_link_up()
3553 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la); in lpfc_mbx_process_link_up()
3554 i = la->lilpBde64.tus.f.bdeSize; in lpfc_mbx_process_link_up()
3557 phba->alpa_map[0] = 0; in lpfc_mbx_process_link_up()
3559 if (vport->cfg_log_verbose & LOG_LINK_EVENT) { in lpfc_mbx_process_link_up()
3570 numalpa = phba->alpa_map[0]; in lpfc_mbx_process_link_up()
3575 un.pamap[k - 1] = in lpfc_mbx_process_link_up()
3576 phba->alpa_map[j + 1]; in lpfc_mbx_process_link_up()
3594 if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) { in lpfc_mbx_process_link_up()
3595 if (phba->max_vpi && phba->cfg_enable_npiv && in lpfc_mbx_process_link_up()
3596 (phba->sli_rev >= LPFC_SLI_REV3)) in lpfc_mbx_process_link_up()
3597 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; in lpfc_mbx_process_link_up()
3599 vport->fc_myDID = phba->fc_pref_DID; in lpfc_mbx_process_link_up()
3600 set_bit(FC_LBIT, &vport->fc_flag); in lpfc_mbx_process_link_up()
3602 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3607 sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3613 mempool_free(sparam_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3616 sparam_mbox->vport = vport; in lpfc_mbx_process_link_up()
3617 sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; in lpfc_mbx_process_link_up()
3624 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3625 cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_process_link_up()
3628 vport->port_state = LPFC_LOCAL_CFG_LINK; in lpfc_mbx_process_link_up()
3630 cfglink_mbox->vport = vport; in lpfc_mbx_process_link_up()
3631 cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; in lpfc_mbx_process_link_up()
3634 mempool_free(cfglink_mbox, phba->mbox_mem_pool); in lpfc_mbx_process_link_up()
3638 vport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_mbx_process_link_up()
3644 if (!test_bit(HBA_FIP_SUPPORT, &phba->hba_flag)) { in lpfc_mbx_process_link_up()
3652 rc = -ENODEV; in lpfc_mbx_process_link_up()
3664 rc = -ENODEV; in lpfc_mbx_process_link_up()
3674 if (test_bit(FCF_TS_INPROG, &phba->hba_flag)) in lpfc_mbx_process_link_up()
3677 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3678 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_mbx_process_link_up()
3679 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3685 spin_lock_irqsave(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3686 phba->fcf.fcf_flag &= ~FCF_INIT_DISC; in lpfc_mbx_process_link_up()
3687 spin_unlock_irqrestore(&phba->hbalock, iflags); in lpfc_mbx_process_link_up()
3695 memset(phba->os_host_name, 0, sizeof(phba->os_host_name)); in lpfc_mbx_process_link_up()
3696 scnprintf(phba->os_host_name, sizeof(phba->os_host_name), "%s", in lpfc_mbx_process_link_up()
3697 init_utsname()->nodename); in lpfc_mbx_process_link_up()
3703 vport->port_state, sparam_mbox, cfglink_mbox); in lpfc_mbx_process_link_up()
3712 struct lpfc_sli *psli = &phba->sli; in lpfc_enable_la()
3713 spin_lock_irq(&phba->hbalock); in lpfc_enable_la()
3714 psli->sli_flag |= LPFC_PROCESS_LA; in lpfc_enable_la()
3715 if (phba->sli_rev <= LPFC_SLI_REV3) { in lpfc_enable_la()
3716 control = readl(phba->HCregaddr); in lpfc_enable_la()
3718 writel(control, phba->HCregaddr); in lpfc_enable_la()
3719 readl(phba->HCregaddr); /* flush */ in lpfc_enable_la()
3721 spin_unlock_irq(&phba->hbalock); in lpfc_enable_la()
3730 /* turn on Link Attention interrupts - no CLEAR_LA needed */ in lpfc_mbx_issue_link_down()
3743 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_read_topology()
3746 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_read_topology()
3747 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_read_topology()
3753 pring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_mbx_cmpl_read_topology()
3756 if (mb->mbxStatus) { in lpfc_mbx_cmpl_read_topology()
3759 mb->mbxStatus, vport->port_state); in lpfc_mbx_cmpl_read_topology()
3761 phba->link_state = LPFC_HBA_ERROR; in lpfc_mbx_cmpl_read_topology()
3765 la = (struct lpfc_mbx_read_top *) &pmb->u.mb.un.varReadTop; in lpfc_mbx_cmpl_read_topology()
3768 memcpy(&phba->alpa_map[0], mp->virt, 128); in lpfc_mbx_cmpl_read_topology()
3771 set_bit(FC_BYPASSED_MODE, &vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3773 clear_bit(FC_BYPASSED_MODE, &vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3775 if (phba->fc_eventTag <= la->eventTag) { in lpfc_mbx_cmpl_read_topology()
3776 phba->fc_stat.LinkMultiEvent++; in lpfc_mbx_cmpl_read_topology()
3778 if (phba->fc_eventTag != 0) in lpfc_mbx_cmpl_read_topology()
3782 phba->fc_eventTag = la->eventTag; in lpfc_mbx_cmpl_read_topology()
3783 phba->link_events++; in lpfc_mbx_cmpl_read_topology()
3785 phba->fc_stat.LinkUp++; in lpfc_mbx_cmpl_read_topology()
3786 if (phba->link_flag & LS_LOOPBACK_MODE) { in lpfc_mbx_cmpl_read_topology()
3790 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3794 phba->alpa_map[0]); in lpfc_mbx_cmpl_read_topology()
3799 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3803 phba->alpa_map[0], in lpfc_mbx_cmpl_read_topology()
3808 if (phba->cmf_active_mode != LPFC_CFG_OFF) in lpfc_mbx_cmpl_read_topology()
3811 if (phba->lmt & LMT_64Gb) in lpfc_mbx_cmpl_read_topology()
3816 phba->fc_stat.LinkDown++; in lpfc_mbx_cmpl_read_topology()
3817 if (phba->link_flag & LS_LOOPBACK_MODE) in lpfc_mbx_cmpl_read_topology()
3822 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3823 phba->pport->port_state, vport->fc_flag); in lpfc_mbx_cmpl_read_topology()
3828 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3829 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3835 la->eventTag, phba->fc_eventTag, in lpfc_mbx_cmpl_read_topology()
3836 phba->pport->port_state, vport->fc_flag, in lpfc_mbx_cmpl_read_topology()
3841 if ((phba->sli_rev < LPFC_SLI_REV4) && in lpfc_mbx_cmpl_read_topology()
3860 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_login()
3861 struct lpfc_dmabuf *mp = pmb->ctx_buf; in lpfc_mbx_cmpl_reg_login()
3862 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_reg_login()
3868 pmb->ctx_buf = NULL; in lpfc_mbx_cmpl_reg_login()
3869 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_reg_login()
3873 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_reg_login()
3874 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_reg_login()
3876 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3878 if (test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) || in lpfc_mbx_cmpl_reg_login()
3879 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { in lpfc_mbx_cmpl_reg_login()
3888 clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3895 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_reg_login()
3901 pmb->ctx_buf = mp; in lpfc_mbx_cmpl_reg_login()
3915 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_unreg_vpi()
3916 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_unreg_vpi()
3919 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_unreg_vpi()
3924 mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3930 vport->vpi, mb->mbxStatus); in lpfc_mbx_cmpl_unreg_vpi()
3931 if (!test_bit(FC_UNLOADING, &phba->pport->load_flag)) in lpfc_mbx_cmpl_unreg_vpi()
3936 set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_unreg_vpi()
3937 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3938 vport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_unreg_vpi()
3939 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_unreg_vpi()
3940 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_unreg_vpi()
3946 if (test_bit(FC_UNLOADING, &vport->load_flag) && vport != phba->pport) in lpfc_mbx_cmpl_unreg_vpi()
3953 struct lpfc_hba *phba = vport->phba; in lpfc_mbx_unreg_vpi()
3957 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_mbx_unreg_vpi()
3961 lpfc_unreg_vpi(phba, vport->vpi, mbox); in lpfc_mbx_unreg_vpi()
3962 mbox->vport = vport; in lpfc_mbx_unreg_vpi()
3963 mbox->mbox_cmpl = lpfc_mbx_cmpl_unreg_vpi; in lpfc_mbx_unreg_vpi()
3968 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_mbx_unreg_vpi()
3977 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_reg_vpi()
3979 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_reg_vpi()
3981 switch (mb->mbxStatus) { in lpfc_mbx_cmpl_reg_vpi()
3987 mb->mbxStatus); in lpfc_mbx_cmpl_reg_vpi()
3989 clear_bit(FC_FABRIC, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
3990 clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
3991 vport->fc_myDID = 0; in lpfc_mbx_cmpl_reg_vpi()
3993 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_reg_vpi()
3994 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_mbx_cmpl_reg_vpi()
3995 if (phba->nvmet_support) in lpfc_mbx_cmpl_reg_vpi()
4003 clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
4004 spin_lock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4005 vport->vpi_state |= LPFC_VPI_REGISTERED; in lpfc_mbx_cmpl_reg_vpi()
4006 spin_unlock_irq(shost->host_lock); in lpfc_mbx_cmpl_reg_vpi()
4007 vport->num_disc_nodes = 0; in lpfc_mbx_cmpl_reg_vpi()
4009 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_mbx_cmpl_reg_vpi()
4012 if (!vport->num_disc_nodes) { in lpfc_mbx_cmpl_reg_vpi()
4013 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_mbx_cmpl_reg_vpi()
4016 vport->port_state = LPFC_VPORT_READY; in lpfc_mbx_cmpl_reg_vpi()
4019 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_mbx_cmpl_reg_vpi()
4024 * lpfc_create_static_vport - Read HBA config region to create static vports.
4047 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_create_static_vport()
4055 mb = &pmb->u.mb; in lpfc_create_static_vport()
4062 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_create_static_vport()
4070 * the dump routine is a single-use construct. in lpfc_create_static_vport()
4072 if (pmb->ctx_buf) { in lpfc_create_static_vport()
4073 mp = pmb->ctx_buf; in lpfc_create_static_vport()
4074 lpfc_mbuf_free(phba, mp->virt, mp->phys); in lpfc_create_static_vport()
4076 pmb->ctx_buf = NULL; in lpfc_create_static_vport()
4081 pmb->vport = phba->pport; in lpfc_create_static_vport()
4085 if ((mbx_wait_rc != MBX_SUCCESS) || mb->mbxStatus) { in lpfc_create_static_vport()
4090 mbx_wait_rc, mb->mbxStatus); in lpfc_create_static_vport()
4094 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_create_static_vport()
4095 byte_count = pmb->u.mqe.un.mb_words[5]; in lpfc_create_static_vport()
4096 mp = pmb->ctx_buf; in lpfc_create_static_vport()
4097 if (byte_count > sizeof(struct static_vport_info) - in lpfc_create_static_vport()
4100 - offset; in lpfc_create_static_vport()
4101 memcpy(vport_buff + offset, mp->virt, byte_count); in lpfc_create_static_vport()
4104 if (mb->un.varDmp.word_cnt > in lpfc_create_static_vport()
4105 sizeof(struct static_vport_info) - offset) in lpfc_create_static_vport()
4106 mb->un.varDmp.word_cnt = in lpfc_create_static_vport()
4108 - offset; in lpfc_create_static_vport()
4109 byte_count = mb->un.varDmp.word_cnt; in lpfc_create_static_vport()
4121 if ((le32_to_cpu(vport_info->signature) != VPORT_INFO_SIG) || in lpfc_create_static_vport()
4122 ((le32_to_cpu(vport_info->rev) & VPORT_INFO_REV_MASK) in lpfc_create_static_vport()
4127 le32_to_cpu(vport_info->signature), in lpfc_create_static_vport()
4128 le32_to_cpu(vport_info->rev) & in lpfc_create_static_vport()
4134 shost = lpfc_shost_from_vport(phba->pport); in lpfc_create_static_vport()
4138 vport_id.port_name = wwn_to_u64(vport_info->vport_list[i].wwpn); in lpfc_create_static_vport()
4139 vport_id.node_name = wwn_to_u64(vport_info->vport_list[i].wwnn); in lpfc_create_static_vport()
4155 vport = *(struct lpfc_vport **)new_fc_vport->dd_data; in lpfc_create_static_vport()
4156 vport->vport_flag |= STATIC_VPORT; in lpfc_create_static_vport()
4174 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fabric_reg_login()
4175 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fabric_reg_login()
4176 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fabric_reg_login()
4178 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fabric_reg_login()
4180 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fabric_reg_login()
4183 mb->mbxStatus); in lpfc_mbx_cmpl_fabric_reg_login()
4185 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_fabric_reg_login()
4206 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fabric_reg_login()
4207 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fabric_reg_login()
4208 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fabric_reg_login()
4209 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fabric_reg_login()
4212 if (vport->port_state == LPFC_FABRIC_CFG_LINK) { in lpfc_mbx_cmpl_fabric_reg_login()
4215 if (!test_and_clear_bit(FC_LOGO_RCVD_DID_CHNG, &vport->fc_flag)) in lpfc_mbx_cmpl_fabric_reg_login()
4237 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4238 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) { in lpfc_issue_gidft()
4251 vport->gidft_inp++; in lpfc_issue_gidft()
4254 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_issue_gidft()
4255 (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) { in lpfc_issue_gidft()
4266 vport->gidft_inp); in lpfc_issue_gidft()
4267 if (vport->gidft_inp == 0) in lpfc_issue_gidft()
4270 vport->gidft_inp++; in lpfc_issue_gidft()
4272 return vport->gidft_inp; in lpfc_issue_gidft()
4276 * lpfc_issue_gidpt - issue a GID_PT for all N_Ports
4282 * 0 - Failure to issue a GID_PT
4283 * 1 - GID_PT issued
4300 vport->gidft_inp++; in lpfc_issue_gidpt()
4313 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_ns_reg_login()
4314 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_ns_reg_login()
4315 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_ns_reg_login()
4318 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_ns_reg_login()
4319 vport->gidft_inp = 0; in lpfc_mbx_cmpl_ns_reg_login()
4321 if (mb->mbxStatus) { in lpfc_mbx_cmpl_ns_reg_login()
4324 mb->mbxStatus); in lpfc_mbx_cmpl_ns_reg_login()
4338 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) { in lpfc_mbx_cmpl_ns_reg_login()
4339 clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_mbx_cmpl_ns_reg_login()
4343 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { in lpfc_mbx_cmpl_ns_reg_login()
4358 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_ns_reg_login()
4359 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_ns_reg_login()
4360 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_ns_reg_login()
4361 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_ns_reg_login()
4365 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_ns_reg_login()
4366 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_ns_reg_login()
4369 if (vport->port_state < LPFC_VPORT_READY) { in lpfc_mbx_cmpl_ns_reg_login()
4376 if ((vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) || in lpfc_mbx_cmpl_ns_reg_login()
4377 (vport->cfg_enable_fc4_type == LPFC_ENABLE_FCP)) 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_NVME)) in lpfc_mbx_cmpl_ns_reg_login()
4394 if (phba->cmf_active_mode != LPFC_CFG_OFF) { in lpfc_mbx_cmpl_ns_reg_login()
4395 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin; in lpfc_mbx_cmpl_ns_reg_login()
4396 phba->cgn_reg_signal = phba->cgn_init_reg_signal; in lpfc_mbx_cmpl_ns_reg_login()
4401 rc, phba->cgn_init_reg_signal); in lpfc_mbx_cmpl_ns_reg_login()
4402 } else if (phba->lmt & LMT_64Gb) { in lpfc_mbx_cmpl_ns_reg_login()
4410 vport->fc_ns_retry = 0; in lpfc_mbx_cmpl_ns_reg_login()
4434 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fc_reg_login()
4435 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fc_reg_login()
4436 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fc_reg_login()
4438 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fc_reg_login()
4439 if (mb->mbxStatus) { in lpfc_mbx_cmpl_fc_reg_login()
4442 __func__, mb->mbxStatus); in lpfc_mbx_cmpl_fc_reg_login()
4448 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fc_reg_login()
4449 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fc_reg_login()
4453 __func__, ndlp->nlp_DID, ndlp->nlp_rpi, in lpfc_mbx_cmpl_fc_reg_login()
4454 ndlp->nlp_state); in lpfc_mbx_cmpl_fc_reg_login()
4456 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fc_reg_login()
4457 clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fc_reg_login()
4458 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fc_reg_login()
4477 struct lpfc_hba *phba = vport->phba; in lpfc_register_remote_port()
4480 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_register_remote_port()
4483 /* Remote port has reappeared. Re-register w/ FC transport */ in lpfc_register_remote_port()
4484 rport_ids.node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn); in lpfc_register_remote_port()
4485 rport_ids.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn); in lpfc_register_remote_port()
4486 rport_ids.port_id = ndlp->nlp_DID; in lpfc_register_remote_port()
4492 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_register_remote_port()
4495 if (test_bit(FC_UNLOADING, &vport->load_flag)) in lpfc_register_remote_port()
4498 ndlp->rport = rport = fc_remote_port_add(shost, 0, &rport_ids); in lpfc_register_remote_port()
4500 dev_printk(KERN_WARNING, &phba->pcidev->dev, in lpfc_register_remote_port()
4506 rport->maxframe_size = ndlp->nlp_maxframe; in lpfc_register_remote_port()
4507 rport->supported_classes = ndlp->nlp_class_sup; in lpfc_register_remote_port()
4508 rdata = rport->dd_data; in lpfc_register_remote_port()
4509 rdata->pnode = lpfc_nlp_get(ndlp); in lpfc_register_remote_port()
4510 if (!rdata->pnode) { in lpfc_register_remote_port()
4511 dev_warn(&phba->pcidev->dev, in lpfc_register_remote_port()
4512 "Warning - node ref failed. Unreg rport\n"); in lpfc_register_remote_port()
4514 ndlp->rport = NULL; in lpfc_register_remote_port()
4518 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_register_remote_port()
4519 ndlp->fc4_xpt_flags |= SCSI_XPT_REGD; in lpfc_register_remote_port()
4520 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_register_remote_port()
4522 if (ndlp->nlp_type & NLP_FCP_TARGET) in lpfc_register_remote_port()
4524 if (ndlp->nlp_type & NLP_FCP_INITIATOR) in lpfc_register_remote_port()
4526 if (ndlp->nlp_type & NLP_NVME_INITIATOR) in lpfc_register_remote_port()
4528 if (ndlp->nlp_type & NLP_NVME_TARGET) in lpfc_register_remote_port()
4530 if (ndlp->nlp_type & NLP_NVME_DISCOVERY) in lpfc_register_remote_port()
4536 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE, in lpfc_register_remote_port()
4538 __func__, rport, rport->port_id, rport->roles, in lpfc_register_remote_port()
4539 kref_read(&ndlp->kref)); in lpfc_register_remote_port()
4541 if ((rport->scsi_target_id != -1) && in lpfc_register_remote_port()
4542 (rport->scsi_target_id < LPFC_MAX_TARGET)) { in lpfc_register_remote_port()
4543 ndlp->nlp_sid = rport->scsi_target_id; in lpfc_register_remote_port()
4552 struct fc_rport *rport = ndlp->rport; in lpfc_unregister_remote_port()
4553 struct lpfc_vport *vport = ndlp->vport; in lpfc_unregister_remote_port()
4555 if (vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME) in lpfc_unregister_remote_port()
4560 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_unregister_remote_port()
4565 ndlp->nlp_DID, rport, ndlp->fc4_xpt_flags, in lpfc_unregister_remote_port()
4566 kref_read(&ndlp->kref)); in lpfc_unregister_remote_port()
4577 atomic_add(count, &vport->fc_unused_cnt); in lpfc_nlp_counters()
4580 atomic_add(count, &vport->fc_plogi_cnt); in lpfc_nlp_counters()
4583 atomic_add(count, &vport->fc_adisc_cnt); in lpfc_nlp_counters()
4586 atomic_add(count, &vport->fc_reglogin_cnt); in lpfc_nlp_counters()
4589 atomic_add(count, &vport->fc_prli_cnt); in lpfc_nlp_counters()
4592 atomic_add(count, &vport->fc_unmap_cnt); in lpfc_nlp_counters()
4595 atomic_add(count, &vport->fc_map_cnt); in lpfc_nlp_counters()
4598 if (!atomic_read(&vport->fc_npr_cnt) && count == -1) in lpfc_nlp_counters()
4599 atomic_set(&vport->fc_npr_cnt, 0); in lpfc_nlp_counters()
4601 atomic_add(count, &vport->fc_npr_cnt); in lpfc_nlp_counters()
4614 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4615 if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) { in lpfc_nlp_reg_node()
4617 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4619 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD && in lpfc_nlp_reg_node()
4620 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY)) { in lpfc_nlp_reg_node()
4626 ndlp->fc4_xpt_flags |= NLP_XPT_REGD; in lpfc_nlp_reg_node()
4627 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_reg_node()
4630 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4639 if (!(ndlp->nlp_fc4_type & NLP_FC4_NVME)) in lpfc_nlp_reg_node()
4643 if (vport->phba->sli_rev >= LPFC_SLI_REV4 && in lpfc_nlp_reg_node()
4644 ndlp->nlp_fc4_type & NLP_FC4_NVME) { in lpfc_nlp_reg_node()
4645 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_reg_node()
4650 if (ndlp->nlp_type & NLP_NVME_TARGET) { in lpfc_nlp_reg_node()
4651 vport->phba->nport_event_cnt++; in lpfc_nlp_reg_node()
4669 spin_lock_irqsave(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4670 if (!(ndlp->fc4_xpt_flags & NLP_XPT_REGD)) { in lpfc_nlp_unreg_node()
4671 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4676 __func__, ndlp, ndlp->rport, ndlp->nlp_DID, in lpfc_nlp_unreg_node()
4677 ndlp->nlp_flag, ndlp->fc4_xpt_flags); in lpfc_nlp_unreg_node()
4681 ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD; in lpfc_nlp_unreg_node()
4682 spin_unlock_irqrestore(&ndlp->lock, iflags); in lpfc_nlp_unreg_node()
4684 if (ndlp->rport && in lpfc_nlp_unreg_node()
4685 ndlp->fc4_xpt_flags & SCSI_XPT_REGD) { in lpfc_nlp_unreg_node()
4686 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4688 } else if (!ndlp->rport) { in lpfc_nlp_unreg_node()
4693 __func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_unreg_node()
4694 ndlp->fc4_xpt_flags, in lpfc_nlp_unreg_node()
4695 kref_read(&ndlp->kref)); in lpfc_nlp_unreg_node()
4698 if (ndlp->fc4_xpt_flags & NVME_XPT_REGD) { in lpfc_nlp_unreg_node()
4699 vport->phba->nport_event_cnt++; in lpfc_nlp_unreg_node()
4700 if (vport->phba->nvmet_support == 0) { in lpfc_nlp_unreg_node()
4731 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_handle_adisc_state()
4734 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_handle_adisc_state()
4739 * ADISC_ISSUE to non-mapped states in lpfc_handle_adisc_state()
4740 * We are moving from ADISC_ISSUE to a non-mapped state because in lpfc_handle_adisc_state()
4745 clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); in lpfc_handle_adisc_state()
4766 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4767 ndlp->nlp_type |= NLP_FC_NODE; in lpfc_nlp_state_cleanup()
4770 clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4772 clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4780 if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag) || in lpfc_nlp_state_cleanup()
4781 !lpfc_is_link_up(vport->phba)) in lpfc_nlp_state_cleanup()
4792 * id outside the presentable range - move the node to the in lpfc_nlp_state_cleanup()
4796 (ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_nlp_state_cleanup()
4797 (!ndlp->rport || in lpfc_nlp_state_cleanup()
4798 ndlp->rport->scsi_target_id == -1 || in lpfc_nlp_state_cleanup()
4799 ndlp->rport->scsi_target_id >= LPFC_MAX_TARGET)) { in lpfc_nlp_state_cleanup()
4800 set_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); in lpfc_nlp_state_cleanup()
4831 int old_state = ndlp->nlp_state; in lpfc_nlp_set_state()
4832 bool node_dropped = test_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4837 "0904 NPort state transition x%06x, %s -> %s\n", in lpfc_nlp_set_state()
4838 ndlp->nlp_DID, in lpfc_nlp_set_state()
4844 ndlp->nlp_DID, old_state, state); in lpfc_nlp_set_state()
4848 clear_bit(NLP_DROPPED, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4856 clear_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag); in lpfc_nlp_set_state()
4857 ndlp->nlp_type &= ~NLP_FC_NODE; in lpfc_nlp_set_state()
4860 if (list_empty(&ndlp->nlp_listp)) { in lpfc_nlp_set_state()
4861 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_nlp_set_state()
4862 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_nlp_set_state()
4863 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_nlp_set_state()
4865 lpfc_nlp_counters(vport, old_state, -1); in lpfc_nlp_set_state()
4867 ndlp->nlp_state = state; in lpfc_nlp_set_state()
4877 if (list_empty(&ndlp->nlp_listp)) { in lpfc_enqueue_node()
4878 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_enqueue_node()
4879 list_add_tail(&ndlp->nlp_listp, &vport->fc_nodes); in lpfc_enqueue_node()
4880 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_enqueue_node()
4890 if (ndlp->nlp_state && !list_empty(&ndlp->nlp_listp)) in lpfc_dequeue_node()
4891 lpfc_nlp_counters(vport, ndlp->nlp_state, -1); in lpfc_dequeue_node()
4892 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_dequeue_node()
4893 list_del_init(&ndlp->nlp_listp); in lpfc_dequeue_node()
4894 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_dequeue_node()
4895 lpfc_nlp_state_cleanup(vport, ndlp, ndlp->nlp_state, in lpfc_dequeue_node()
4900 * lpfc_initialize_node - Initialize all fields of node object
4909 * to the life-span of the @ndlp might go beyond the existence of @vport as
4917 INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); in lpfc_initialize_node()
4918 INIT_LIST_HEAD(&ndlp->dev_loss_evt.evt_listp); in lpfc_initialize_node()
4919 timer_setup(&ndlp->nlp_delayfunc, lpfc_els_retry_delay, 0); in lpfc_initialize_node()
4920 INIT_LIST_HEAD(&ndlp->recovery_evt.evt_listp); in lpfc_initialize_node()
4922 ndlp->nlp_DID = did; in lpfc_initialize_node()
4923 ndlp->vport = vport; in lpfc_initialize_node()
4924 ndlp->phba = vport->phba; in lpfc_initialize_node()
4925 ndlp->nlp_sid = NLP_NO_SID; in lpfc_initialize_node()
4926 ndlp->nlp_fc4_type = NLP_FC4_NONE; in lpfc_initialize_node()
4927 kref_init(&ndlp->kref); in lpfc_initialize_node()
4928 atomic_set(&ndlp->cmd_pending, 0); in lpfc_initialize_node()
4929 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth; in lpfc_initialize_node()
4930 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_initialize_node()
4941 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) in lpfc_drop_node()
4944 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_drop_node()
4953 if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag)) in lpfc_drop_node()
4963 struct lpfc_hba *phba = vport->phba; in lpfc_set_disctmo()
4966 if (vport->port_state == LPFC_LOCAL_CFG_LINK) { in lpfc_set_disctmo()
4967 /* For FAN, timeout should be greater than edtov */ in lpfc_set_disctmo()
4968 tmo = (((phba->fc_edtov + 999) / 1000) + 1); in lpfc_set_disctmo()
4970 /* Normal discovery timeout should be > than ELS/CT timeout in lpfc_set_disctmo()
4973 tmo = ((phba->fc_ratov * 3) + 3); in lpfc_set_disctmo()
4977 if (!timer_pending(&vport->fc_disctmo)) { in lpfc_set_disctmo()
4980 tmo, vport->port_state, vport->fc_flag); in lpfc_set_disctmo()
4983 mod_timer(&vport->fc_disctmo, jiffies + secs_to_jiffies(tmo)); in lpfc_set_disctmo()
4984 set_bit(FC_DISC_TMO, &vport->fc_flag); in lpfc_set_disctmo()
4990 vport->port_state, tmo, in lpfc_set_disctmo()
4991 (unsigned long)&vport->fc_disctmo, in lpfc_set_disctmo()
4992 atomic_read(&vport->fc_plogi_cnt), in lpfc_set_disctmo()
4993 atomic_read(&vport->fc_adisc_cnt)); in lpfc_set_disctmo()
5008 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_can_disctmo()
5011 if (test_bit(FC_DISC_TMO, &vport->fc_flag) || in lpfc_can_disctmo()
5012 timer_pending(&vport->fc_disctmo)) { in lpfc_can_disctmo()
5013 clear_bit(FC_DISC_TMO, &vport->fc_flag); in lpfc_can_disctmo()
5014 timer_delete_sync(&vport->fc_disctmo); in lpfc_can_disctmo()
5015 spin_lock_irqsave(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5016 vport->work_port_events &= ~WORKER_DISC_TMO; in lpfc_can_disctmo()
5017 spin_unlock_irqrestore(&vport->work_port_lock, iflags); in lpfc_can_disctmo()
5024 vport->port_state, vport->fc_flag, in lpfc_can_disctmo()
5025 atomic_read(&vport->fc_plogi_cnt), in lpfc_can_disctmo()
5026 atomic_read(&vport->fc_adisc_cnt)); in lpfc_can_disctmo()
5040 struct lpfc_vport *vport = ndlp->vport; in lpfc_check_sli_ndlp()
5045 if (iocb->vport != vport) in lpfc_check_sli_ndlp()
5052 if (pring->ringno == LPFC_ELS_RING) { in lpfc_check_sli_ndlp()
5055 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5059 if (remote_id == ndlp->nlp_DID) in lpfc_check_sli_ndlp()
5063 if (iocb->ndlp == ndlp) in lpfc_check_sli_ndlp()
5066 } else if (pring->ringno == LPFC_FCP_RING) { in lpfc_check_sli_ndlp()
5068 if ((ndlp->nlp_type & NLP_FCP_TARGET) && in lpfc_check_sli_ndlp()
5069 test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) in lpfc_check_sli_ndlp()
5072 if (ulp_context == ndlp->nlp_rpi) in lpfc_check_sli_ndlp()
5085 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in __lpfc_dequeue_nport_iocbs()
5089 list_move_tail(&iocb->list, dequeue_list); in __lpfc_dequeue_nport_iocbs()
5097 struct lpfc_sli *psli = &phba->sli; in lpfc_sli3_dequeue_nport_iocbs()
5100 spin_lock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5101 for (i = 0; i < psli->num_rings; i++) in lpfc_sli3_dequeue_nport_iocbs()
5102 __lpfc_dequeue_nport_iocbs(phba, ndlp, &psli->sli3_ring[i], in lpfc_sli3_dequeue_nport_iocbs()
5104 spin_unlock_irq(&phba->hbalock); in lpfc_sli3_dequeue_nport_iocbs()
5114 spin_lock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5115 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) { in lpfc_sli4_dequeue_nport_iocbs()
5116 pring = qp->pring; in lpfc_sli4_dequeue_nport_iocbs()
5119 spin_lock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5121 spin_unlock(&pring->ring_lock); in lpfc_sli4_dequeue_nport_iocbs()
5123 spin_unlock_irq(&phba->hbalock); in lpfc_sli4_dequeue_nport_iocbs()
5141 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { in lpfc_no_rpi()
5142 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_no_rpi()
5156 * lpfc_nlp_logo_unreg - Unreg mailbox completion handler before LOGO
5166 struct lpfc_vport *vport = pmb->vport; in lpfc_nlp_logo_unreg()
5169 ndlp = pmb->ctx_ndlp; in lpfc_nlp_logo_unreg()
5175 if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) && in lpfc_nlp_logo_unreg()
5176 ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) { in lpfc_nlp_logo_unreg()
5180 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_logo_unreg()
5181 ndlp->nlp_defer_did, ndlp); in lpfc_nlp_logo_unreg()
5183 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_nlp_logo_unreg()
5184 ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING; in lpfc_nlp_logo_unreg()
5185 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0); in lpfc_nlp_logo_unreg()
5187 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_nlp_logo_unreg()
5195 mempool_free(pmb, phba->mbox_mem_pool); in lpfc_nlp_logo_unreg()
5210 mbox->ctx_ndlp = lpfc_nlp_get(ndlp); in lpfc_set_unreg_login_mbx_cmpl()
5211 if (!mbox->ctx_ndlp) in lpfc_set_unreg_login_mbx_cmpl()
5214 if (test_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag)) { in lpfc_set_unreg_login_mbx_cmpl()
5215 mbox->mbox_cmpl = lpfc_nlp_logo_unreg; in lpfc_set_unreg_login_mbx_cmpl()
5216 } else if (phba->sli_rev == LPFC_SLI_REV4 && in lpfc_set_unreg_login_mbx_cmpl()
5217 !test_bit(FC_UNLOADING, &vport->load_flag) && in lpfc_set_unreg_login_mbx_cmpl()
5218 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= in lpfc_set_unreg_login_mbx_cmpl()
5220 (kref_read(&ndlp->kref) > 0)) { in lpfc_set_unreg_login_mbx_cmpl()
5221 mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr; in lpfc_set_unreg_login_mbx_cmpl()
5223 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_set_unreg_login_mbx_cmpl()
5239 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_rpi()
5244 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) || in lpfc_unreg_rpi()
5245 test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) { in lpfc_unreg_rpi()
5246 if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) in lpfc_unreg_rpi()
5252 ndlp->nlp_rpi, ndlp->nlp_flag, in lpfc_unreg_rpi()
5253 ndlp->nlp_DID); in lpfc_unreg_rpi()
5258 if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) { in lpfc_unreg_rpi()
5264 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5265 ndlp->nlp_defer_did, in lpfc_unreg_rpi()
5266 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5270 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_rpi()
5273 rpi = ndlp->nlp_rpi; in lpfc_unreg_rpi()
5274 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unreg_rpi()
5275 rpi = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]; in lpfc_unreg_rpi()
5277 lpfc_unreg_login(phba, vport->vpi, rpi, mbox); in lpfc_unreg_rpi()
5278 mbox->vport = vport; in lpfc_unreg_rpi()
5280 if (!mbox->ctx_ndlp) { in lpfc_unreg_rpi()
5281 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5286 if (mbox->mbox_cmpl == lpfc_sli4_unreg_rpi_cmpl_clr) in lpfc_unreg_rpi()
5289 if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)) in lpfc_unreg_rpi()
5290 set_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5297 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5298 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5302 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5303 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_rpi()
5314 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_unreg_rpi()
5315 ndlp->nlp_flag, ndlp); in lpfc_unreg_rpi()
5321 if (!test_bit(FC_UNLOADING, &vport->load_flag)) { in lpfc_unreg_rpi()
5322 clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5324 ndlp->nlp_prev_state = ndlp->nlp_state; in lpfc_unreg_rpi()
5333 if (phba->sli_rev != LPFC_SLI_REV4) in lpfc_unreg_rpi()
5334 ndlp->nlp_rpi = 0; in lpfc_unreg_rpi()
5335 clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5336 clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5338 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5341 clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag); in lpfc_unreg_rpi()
5346 * lpfc_unreg_hba_rpis - Unregister rpis registered to the hba.
5366 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unreg_hba_rpis()
5367 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_unreg_hba_rpis()
5368 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_unreg_hba_rpis()
5369 if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) { in lpfc_unreg_hba_rpis()
5371 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, in lpfc_unreg_hba_rpis()
5374 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, in lpfc_unreg_hba_rpis()
5378 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_unreg_hba_rpis()
5386 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_all_rpis()
5390 if (phba->sli_rev == LPFC_SLI_REV4) { in lpfc_unreg_all_rpis()
5395 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_all_rpis()
5397 lpfc_unreg_login(phba, vport->vpi, LPFC_UNREG_ALL_RPIS_VPORT, in lpfc_unreg_all_rpis()
5399 mbox->vport = vport; in lpfc_unreg_all_rpis()
5400 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_all_rpis()
5401 mbox->ctx_ndlp = NULL; in lpfc_unreg_all_rpis()
5404 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_all_rpis()
5417 struct lpfc_hba *phba = vport->phba; in lpfc_unreg_default_rpis()
5422 if (phba->sli_rev > LPFC_SLI_REV3) in lpfc_unreg_default_rpis()
5425 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_unreg_default_rpis()
5427 lpfc_unreg_did(phba, vport->vpi, LPFC_UNREG_ALL_DFLT_RPIS, in lpfc_unreg_default_rpis()
5429 mbox->vport = vport; in lpfc_unreg_default_rpis()
5430 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_unreg_default_rpis()
5431 mbox->ctx_ndlp = NULL; in lpfc_unreg_default_rpis()
5434 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_unreg_default_rpis()
5451 struct lpfc_hba *phba = vport->phba; in lpfc_cleanup_node()
5458 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_cleanup_node()
5459 ndlp->nlp_state, ndlp->nlp_rpi); in lpfc_cleanup_node()
5465 if ((mb = phba->sli.mbox_active)) { in lpfc_cleanup_node()
5466 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5467 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5468 (ndlp == mb->ctx_ndlp)) { in lpfc_cleanup_node()
5469 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5470 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5474 spin_lock_irq(&phba->hbalock); in lpfc_cleanup_node()
5476 list_for_each_entry(mb, &phba->sli.mboxq_cmpl, list) { in lpfc_cleanup_node()
5477 if ((mb->u.mb.mbxCommand != MBX_REG_LOGIN64) || in lpfc_cleanup_node()
5478 (mb->mbox_flag & LPFC_MBX_IMED_UNREG) || in lpfc_cleanup_node()
5479 (ndlp != mb->ctx_ndlp)) in lpfc_cleanup_node()
5482 mb->ctx_ndlp = NULL; in lpfc_cleanup_node()
5483 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_cleanup_node()
5486 list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { in lpfc_cleanup_node()
5487 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) && in lpfc_cleanup_node()
5488 !(mb->mbox_flag & LPFC_MBX_IMED_UNREG) && in lpfc_cleanup_node()
5489 (ndlp == mb->ctx_ndlp)) { in lpfc_cleanup_node()
5490 list_del(&mb->list); in lpfc_cleanup_node()
5498 spin_unlock_irq(&phba->hbalock); in lpfc_cleanup_node()
5502 clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag); in lpfc_cleanup_node()
5504 ndlp->nlp_last_elscmd = 0; in lpfc_cleanup_node()
5505 timer_delete_sync(&ndlp->nlp_delayfunc); in lpfc_cleanup_node()
5507 list_del_init(&ndlp->els_retry_evt.evt_listp); in lpfc_cleanup_node()
5508 list_del_init(&ndlp->dev_loss_evt.evt_listp); in lpfc_cleanup_node()
5509 list_del_init(&ndlp->recovery_evt.evt_listp); in lpfc_cleanup_node()
5524 if (ndlp->nlp_DID == did) in lpfc_matchdid()
5528 mydid.un.word = vport->fc_myDID; in lpfc_matchdid()
5534 ndlpdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5543 * up matching ndlp->nlp_DID 000001 to in lpfc_matchdid()
5549 vport->phba->fc_topology == in lpfc_matchdid()
5556 matchdid.un.word = ndlp->nlp_DID; in lpfc_matchdid()
5577 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_findnode_did()
5579 data1 = (((uint32_t)ndlp->nlp_state << 24) | in __lpfc_findnode_did()
5580 ((uint32_t)ndlp->nlp_xri << 16) | in __lpfc_findnode_did()
5581 ((uint32_t)ndlp->nlp_type << 8) in __lpfc_findnode_did()
5586 ndlp, ndlp->nlp_DID, in __lpfc_findnode_did()
5587 ndlp->nlp_flag, data1, ndlp->nlp_rpi, in __lpfc_findnode_did()
5588 ndlp->active_rrqs_xri_bitmap); in __lpfc_findnode_did()
5591 if (ndlp->nlp_state != NLP_STE_UNUSED_NODE) in __lpfc_findnode_did()
5612 spin_lock_irqsave(shost->host_lock, iflags); in lpfc_findnode_did()
5614 spin_unlock_irqrestore(shost->host_lock, iflags); in lpfc_findnode_did()
5625 spin_lock_irqsave(&vport->fc_nodes_list_lock, iflags); in lpfc_findnode_mapped()
5627 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in lpfc_findnode_mapped()
5628 if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE || in lpfc_findnode_mapped()
5629 ndlp->nlp_state == NLP_STE_MAPPED_NODE) { in lpfc_findnode_mapped()
5630 data1 = (((uint32_t)ndlp->nlp_state << 24) | in lpfc_findnode_mapped()
5631 ((uint32_t)ndlp->nlp_xri << 16) | in lpfc_findnode_mapped()
5632 ((uint32_t)ndlp->nlp_type << 8) | in lpfc_findnode_mapped()
5633 ((uint32_t)ndlp->nlp_rpi & 0xff)); in lpfc_findnode_mapped()
5634 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, in lpfc_findnode_mapped()
5639 ndlp, ndlp->nlp_DID, in lpfc_findnode_mapped()
5640 ndlp->nlp_flag, data1, in lpfc_findnode_mapped()
5641 ndlp->active_rrqs_xri_bitmap); in lpfc_findnode_mapped()
5645 spin_unlock_irqrestore(&vport->fc_nodes_list_lock, iflags); in lpfc_findnode_mapped()
5660 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5662 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_setup_disc_node()
5673 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5674 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5676 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5684 if (test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_setup_disc_node()
5685 !test_bit(FC_NDISC_ACTIVE, &vport->fc_flag)) { in lpfc_setup_disc_node()
5689 * delay timeout is not needed. in lpfc_setup_disc_node()
5696 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5697 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5701 * active management - just go to NPR provided the in lpfc_setup_disc_node()
5704 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5707 if (ndlp->nlp_state > NLP_STE_UNUSED_NODE && in lpfc_setup_disc_node()
5708 ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) { in lpfc_setup_disc_node()
5713 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5718 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5719 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5726 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_setup_disc_node()
5727 ndlp->nlp_state, vport->fc_flag); in lpfc_setup_disc_node()
5733 if (ndlp->nlp_state == NLP_STE_ADISC_ISSUE || in lpfc_setup_disc_node()
5734 ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_setup_disc_node()
5735 (!vport->phba->nvmet_support && in lpfc_setup_disc_node()
5736 test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag))) in lpfc_setup_disc_node()
5739 if (vport->phba->nvmet_support) in lpfc_setup_disc_node()
5746 set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag); in lpfc_setup_disc_node()
5755 struct lpfc_hba *phba = vport->phba; in lpfc_disc_list_loopmap()
5762 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) in lpfc_disc_list_loopmap()
5766 if (phba->alpa_map[0]) { in lpfc_disc_list_loopmap()
5767 for (j = 1; j <= phba->alpa_map[0]; j++) { in lpfc_disc_list_loopmap()
5768 alpa = phba->alpa_map[j]; in lpfc_disc_list_loopmap()
5769 if (((vport->fc_myDID & 0xff) == alpa) || (alpa == 0)) in lpfc_disc_list_loopmap()
5779 if (vport->cfg_scan_down) in lpfc_disc_list_loopmap()
5782 index = FC_MAXLOOP - j - 1; in lpfc_disc_list_loopmap()
5784 if ((vport->fc_myDID & 0xff) == alpa) in lpfc_disc_list_loopmap()
5797 struct lpfc_sli *psli = &phba->sli; in lpfc_issue_clear_la()
5798 struct lpfc_sli_ring *extra_ring = &psli->sli3_ring[LPFC_EXTRA_RING]; in lpfc_issue_clear_la()
5799 struct lpfc_sli_ring *fcp_ring = &psli->sli3_ring[LPFC_FCP_RING]; in lpfc_issue_clear_la()
5806 if ((phba->link_state >= LPFC_CLEAR_LA) || in lpfc_issue_clear_la()
5807 (vport->port_type != LPFC_PHYSICAL_PORT) || in lpfc_issue_clear_la()
5808 (phba->sli_rev == LPFC_SLI_REV4)) in lpfc_issue_clear_la()
5812 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) != NULL) { in lpfc_issue_clear_la()
5813 phba->link_state = LPFC_CLEAR_LA; in lpfc_issue_clear_la()
5815 mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la; in lpfc_issue_clear_la()
5816 mbox->vport = vport; in lpfc_issue_clear_la()
5819 mempool_free(mbox, phba->mbox_mem_pool); in lpfc_issue_clear_la()
5821 extra_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5822 fcp_ring->flag &= ~LPFC_STOP_IOCB_EVENT; in lpfc_issue_clear_la()
5823 phba->link_state = LPFC_HBA_ERROR; in lpfc_issue_clear_la()
5834 regvpimbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_issue_reg_vpi()
5837 regvpimbox->mbox_cmpl = lpfc_mbx_cmpl_reg_vpi; in lpfc_issue_reg_vpi()
5838 regvpimbox->vport = vport; in lpfc_issue_reg_vpi()
5841 mempool_free(regvpimbox, phba->mbox_mem_pool); in lpfc_issue_reg_vpi()
5850 struct lpfc_hba *phba = vport->phba; in lpfc_disc_start()
5857 phba->link_state); in lpfc_disc_start()
5861 if (phba->link_state == LPFC_CLEAR_LA) in lpfc_disc_start()
5866 if (vport->port_state < LPFC_VPORT_READY) in lpfc_disc_start()
5867 vport->port_state = LPFC_DISC_AUTH; in lpfc_disc_start()
5871 vport->fc_prevDID = vport->fc_myDID; in lpfc_disc_start()
5872 vport->num_disc_nodes = 0; in lpfc_disc_start()
5878 vport->port_state, vport->fc_flag, in lpfc_disc_start()
5879 atomic_read(&vport->fc_plogi_cnt), in lpfc_disc_start()
5880 atomic_read(&vport->fc_adisc_cnt), in lpfc_disc_start()
5881 atomic_read(&vport->fc_npr_cnt)); in lpfc_disc_start()
5883 /* First do ADISCs - if any */ in lpfc_disc_start()
5890 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) && in lpfc_disc_start()
5891 !test_bit(FC_PT2PT, &vport->fc_flag) && in lpfc_disc_start()
5892 !test_bit(FC_RSCN_MODE, &vport->fc_flag) && in lpfc_disc_start()
5893 (phba->sli_rev < LPFC_SLI_REV4)) { in lpfc_disc_start()
5903 if (vport->port_state < LPFC_VPORT_READY && !clear_la_pending) { in lpfc_disc_start()
5907 if (!test_bit(FC_ABORT_DISCOVERY, &vport->fc_flag)) { in lpfc_disc_start()
5908 vport->num_disc_nodes = 0; in lpfc_disc_start()
5910 if (atomic_read(&vport->fc_npr_cnt)) in lpfc_disc_start()
5913 if (!vport->num_disc_nodes) { in lpfc_disc_start()
5914 clear_bit(FC_NDISC_ACTIVE, &vport->fc_flag); in lpfc_disc_start()
5918 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_start()
5920 /* Next do PLOGIs - if any */ in lpfc_disc_start()
5926 if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) { in lpfc_disc_start()
5930 if (vport->fc_rscn_id_cnt == 0 && in lpfc_disc_start()
5931 !test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag)) { in lpfc_disc_start()
5932 clear_bit(FC_RSCN_MODE, &vport->fc_flag); in lpfc_disc_start()
5961 spin_lock_irq(&phba->hbalock); in lpfc_free_tx()
5962 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { in lpfc_free_tx()
5963 if (iocb->ndlp != ndlp) in lpfc_free_tx()
5971 list_move_tail(&iocb->list, &completions); in lpfc_free_tx()
5976 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { in lpfc_free_tx()
5977 if (iocb->ndlp != ndlp) in lpfc_free_tx()
5987 spin_unlock_irq(&phba->hbalock); in lpfc_free_tx()
6001 struct lpfc_hba *phba = vport->phba; in lpfc_disc_flush_list()
6003 if (atomic_read(&vport->fc_plogi_cnt) || in lpfc_disc_flush_list()
6004 atomic_read(&vport->fc_adisc_cnt)) { in lpfc_disc_flush_list()
6005 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_flush_list()
6007 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE || in lpfc_disc_flush_list()
6008 ndlp->nlp_state == NLP_STE_ADISC_ISSUE) { in lpfc_disc_flush_list()
6016 * lpfc_notify_xport_npr - notifies xport of node disappearance
6020 * calls lpfc_nlp_state_cleanup, the ndlp->rport is unregistered
6030 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_notify_xport_npr()
6041 if (pci_channel_offline(vport->phba->pcidev)) in lpfc_cleanup_discovery_resources()
6049 * FUNCTION: Fibre Channel driver discovery timeout routine.
6064 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout()
6071 spin_lock_irqsave(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6072 tmo_posted = vport->work_port_events & WORKER_DISC_TMO; in lpfc_disc_timeout()
6074 vport->work_port_events |= WORKER_DISC_TMO; in lpfc_disc_timeout()
6075 spin_unlock_irqrestore(&vport->work_port_lock, flags); in lpfc_disc_timeout()
6085 struct lpfc_hba *phba = vport->phba; in lpfc_disc_timeout_handler()
6086 struct lpfc_sli *psli = &phba->sli; in lpfc_disc_timeout_handler()
6091 if (!test_and_clear_bit(FC_DISC_TMO, &vport->fc_flag)) in lpfc_disc_timeout_handler()
6095 "disc timeout: state:x%x rtry:x%x flg:x%x", in lpfc_disc_timeout_handler()
6096 vport->port_state, vport->fc_ns_retry, vport->fc_flag); in lpfc_disc_timeout_handler()
6098 switch (vport->port_state) { in lpfc_disc_timeout_handler()
6103 * waiting for FAN timeout in lpfc_disc_timeout_handler()
6106 "0221 FAN timeout\n"); in lpfc_disc_timeout_handler()
6109 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, in lpfc_disc_timeout_handler()
6111 if (ndlp->nlp_state != NLP_STE_NPR_NODE) in lpfc_disc_timeout_handler()
6113 if (ndlp->nlp_type & NLP_FABRIC) { in lpfc_disc_timeout_handler()
6117 } else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) { in lpfc_disc_timeout_handler()
6124 if (vport->port_state != LPFC_FLOGI) { in lpfc_disc_timeout_handler()
6125 if (phba->sli_rev <= LPFC_SLI_REV3) in lpfc_disc_timeout_handler()
6136 /* Initial FLOGI timeout */ in lpfc_disc_timeout_handler()
6139 "0222 Initial %s timeout\n", in lpfc_disc_timeout_handler()
6140 vport->vpi ? "FDISC" : "FLOGI"); in lpfc_disc_timeout_handler()
6158 "0223 Timeout while waiting for " in lpfc_disc_timeout_handler()
6169 /* Check for wait for NameServer Rsp timeout */ in lpfc_disc_timeout_handler()
6172 "0224 NameServer Query timeout " in lpfc_disc_timeout_handler()
6174 vport->fc_ns_retry, LPFC_MAX_NS_RETRY); in lpfc_disc_timeout_handler()
6176 if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) { in lpfc_disc_timeout_handler()
6178 vport->fc_ns_retry++; in lpfc_disc_timeout_handler()
6179 vport->gidft_inp = 0; in lpfc_disc_timeout_handler()
6184 vport->fc_ns_retry = 0; in lpfc_disc_timeout_handler()
6192 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6193 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6197 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6202 initlinkmbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_disc_timeout_handler()
6208 phba->link_state = LPFC_HBA_ERROR; in lpfc_disc_timeout_handler()
6213 lpfc_init_link(phba, initlinkmbox, phba->cfg_topology, in lpfc_disc_timeout_handler()
6214 phba->cfg_link_speed); in lpfc_disc_timeout_handler()
6215 initlinkmbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; in lpfc_disc_timeout_handler()
6216 initlinkmbox->vport = vport; in lpfc_disc_timeout_handler()
6217 initlinkmbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; in lpfc_disc_timeout_handler()
6221 mempool_free(initlinkmbox, phba->mbox_mem_pool); in lpfc_disc_timeout_handler()
6226 /* Node Authentication timeout */ in lpfc_disc_timeout_handler()
6229 "0227 Node Authentication timeout\n"); in lpfc_disc_timeout_handler()
6236 if (phba->sli_rev < LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6237 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) in lpfc_disc_timeout_handler()
6241 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6247 if (test_bit(FC_RSCN_MODE, &vport->fc_flag)) { in lpfc_disc_timeout_handler()
6250 "0231 RSCN timeout Data: x%x " in lpfc_disc_timeout_handler()
6252 vport->fc_ns_retry, LPFC_MAX_NS_RETRY, in lpfc_disc_timeout_handler()
6253 vport->port_state, vport->gidft_inp); in lpfc_disc_timeout_handler()
6266 "0273 Unexpected discovery timeout, " in lpfc_disc_timeout_handler()
6267 "vport State x%x\n", vport->port_state); in lpfc_disc_timeout_handler()
6271 switch (phba->link_state) { in lpfc_disc_timeout_handler()
6273 /* CLEAR LA timeout */ in lpfc_disc_timeout_handler()
6276 "0228 CLEAR LA timeout\n"); in lpfc_disc_timeout_handler()
6291 "0230 Unexpected timeout, hba link " in lpfc_disc_timeout_handler()
6292 "state x%x\n", phba->link_state); in lpfc_disc_timeout_handler()
6302 if (phba->sli_rev != LPFC_SLI_REV4) { in lpfc_disc_timeout_handler()
6303 psli->sli3_ring[(LPFC_EXTRA_RING)].flag &= in lpfc_disc_timeout_handler()
6305 psli->sli3_ring[LPFC_FCP_RING].flag &= in lpfc_disc_timeout_handler()
6308 vport->port_state = LPFC_VPORT_READY; in lpfc_disc_timeout_handler()
6322 MAILBOX_t *mb = &pmb->u.mb; in lpfc_mbx_cmpl_fdmi_reg_login()
6323 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp; in lpfc_mbx_cmpl_fdmi_reg_login()
6324 struct lpfc_vport *vport = pmb->vport; in lpfc_mbx_cmpl_fdmi_reg_login()
6326 pmb->ctx_ndlp = NULL; in lpfc_mbx_cmpl_fdmi_reg_login()
6328 if (phba->sli_rev < LPFC_SLI_REV4) in lpfc_mbx_cmpl_fdmi_reg_login()
6329 ndlp->nlp_rpi = mb->un.varWords[0]; in lpfc_mbx_cmpl_fdmi_reg_login()
6330 set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag); in lpfc_mbx_cmpl_fdmi_reg_login()
6331 ndlp->nlp_type |= NLP_FABRIC; in lpfc_mbx_cmpl_fdmi_reg_login()
6335 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_mbx_cmpl_fdmi_reg_login()
6336 kref_read(&ndlp->kref), in lpfc_mbx_cmpl_fdmi_reg_login()
6339 * Start issuing Fabric-Device Management Interface (FDMI) command to in lpfc_mbx_cmpl_fdmi_reg_login()
6341 * DHBA -> DPRT -> RHBA -> RPA (physical port) in lpfc_mbx_cmpl_fdmi_reg_login()
6342 * DPRT -> RPRT (vports) in lpfc_mbx_cmpl_fdmi_reg_login()
6344 if (vport->port_type == LPFC_PHYSICAL_PORT) { in lpfc_mbx_cmpl_fdmi_reg_login()
6345 phba->link_flag &= ~LS_CT_VEN_RPA; /* For extra Vendor RPA */ in lpfc_mbx_cmpl_fdmi_reg_login()
6365 return ndlp->nlp_rpi == *rpi; in lpfc_filter_by_rpi()
6371 return memcmp(&ndlp->nlp_portname, param, in lpfc_filter_by_wwpn()
6372 sizeof(ndlp->nlp_portname)) == 0; in lpfc_filter_by_wwpn()
6380 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { in __lpfc_find_node()
6386 filter, ndlp, ndlp->nlp_DID, in __lpfc_find_node()
6387 ndlp->nlp_flag, ndlp->nlp_state, in __lpfc_find_node()
6388 ndlp->nlp_xri, ndlp->nlp_type, in __lpfc_find_node()
6389 ndlp->nlp_rpi); in __lpfc_find_node()
6418 spin_lock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6420 spin_unlock_irq(shost->host_lock); in lpfc_findnode_wwpn()
6436 spin_lock_irqsave(shost->host_lock, flags); in lpfc_findnode_rpi()
6438 spin_unlock_irqrestore(shost->host_lock, flags); in lpfc_findnode_rpi()
6443 * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier
6452 * NULL - No vport with the matching @vpi found
6453 * Otherwise - Address to the vport with the matching @vpi.
6462 /* The physical ports are always vpi 0 - translate is unnecessary. */ in lpfc_find_vport_by_vpid()
6468 for (i = 0; i <= phba->max_vpi; i++) { in lpfc_find_vport_by_vpid()
6469 if (vpi == phba->vpi_ids[i]) in lpfc_find_vport_by_vpid()
6473 if (i > phba->max_vpi) { in lpfc_find_vport_by_vpid()
6481 spin_lock_irqsave(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6482 list_for_each_entry(vport, &phba->port_list, listentry) { in lpfc_find_vport_by_vpid()
6483 if (vport->vpi == i) { in lpfc_find_vport_by_vpid()
6484 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6488 spin_unlock_irqrestore(&phba->port_list_lock, flags); in lpfc_find_vport_by_vpid()
6498 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6499 rpi = lpfc_sli4_alloc_rpi(vport->phba); in lpfc_nlp_init()
6504 ndlp = mempool_alloc(vport->phba->nlp_mem_pool, GFP_KERNEL); in lpfc_nlp_init()
6506 if (vport->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_init()
6507 lpfc_sli4_free_rpi(vport->phba, rpi); in lpfc_nlp_init()
6513 spin_lock_init(&ndlp->lock); in lpfc_nlp_init()
6516 INIT_LIST_HEAD(&ndlp->nlp_listp); in lpfc_nlp_init()
6517 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_init()
6518 ndlp->nlp_rpi = rpi; in lpfc_nlp_init()
6523 ndlp, ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_nlp_init()
6524 ndlp->nlp_flag, kref_read(&ndlp->kref)); in lpfc_nlp_init()
6526 ndlp->active_rrqs_xri_bitmap = in lpfc_nlp_init()
6527 mempool_alloc(vport->phba->active_rrq_pool, in lpfc_nlp_init()
6529 if (ndlp->active_rrqs_xri_bitmap) in lpfc_nlp_init()
6530 memset(ndlp->active_rrqs_xri_bitmap, 0, in lpfc_nlp_init()
6531 ndlp->phba->cfg_rrq_xri_bitmap_sz); in lpfc_nlp_init()
6538 ndlp->nlp_DID, 0, 0); in lpfc_nlp_init()
6551 struct lpfc_vport *vport = ndlp->vport; in lpfc_nlp_release()
6553 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_release()
6555 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type); in lpfc_nlp_release()
6559 __func__, ndlp, ndlp->nlp_DID, in lpfc_nlp_release()
6560 kref_read(&ndlp->kref), ndlp->nlp_rpi); in lpfc_nlp_release()
6569 if (vport->phba->sli_rev == LPFC_SLI_REV4) { in lpfc_nlp_release()
6570 lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi); in lpfc_nlp_release()
6571 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR; in lpfc_nlp_release()
6577 ndlp->vport = NULL; in lpfc_nlp_release()
6578 ndlp->nlp_state = NLP_STE_FREED_NODE; in lpfc_nlp_release()
6579 ndlp->nlp_flag = 0; in lpfc_nlp_release()
6580 ndlp->fc4_xpt_flags = 0; in lpfc_nlp_release()
6583 if (ndlp->phba->sli_rev == LPFC_SLI_REV4) in lpfc_nlp_release()
6584 mempool_free(ndlp->active_rrqs_xri_bitmap, in lpfc_nlp_release()
6585 ndlp->phba->active_rrq_pool); in lpfc_nlp_release()
6586 mempool_free(ndlp, ndlp->phba->nlp_mem_pool); in lpfc_nlp_release()
6599 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_get()
6601 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_get()
6602 kref_read(&ndlp->kref)); in lpfc_nlp_get()
6608 spin_lock_irqsave(&ndlp->lock, flags); in lpfc_nlp_get()
6609 if (!kref_get_unless_zero(&ndlp->kref)) { in lpfc_nlp_get()
6610 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6611 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_NODE, in lpfc_nlp_get()
6613 __func__, (void *)ndlp, kref_read(&ndlp->kref)); in lpfc_nlp_get()
6616 spin_unlock_irqrestore(&ndlp->lock, flags); in lpfc_nlp_get()
6631 lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE, in lpfc_nlp_put()
6633 ndlp->nlp_DID, ndlp->nlp_flag, in lpfc_nlp_put()
6634 kref_read(&ndlp->kref)); in lpfc_nlp_put()
6639 return ndlp ? kref_put(&ndlp->kref, lpfc_nlp_release) : 0; in lpfc_nlp_put()
6643 * lpfc_fcf_inuse - Check if FCF can be unregistered.
6666 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_fcf_inuse()
6673 if (!test_bit(FC_VPORT_CVL_RCVD, &vports[i]->fc_flag)) { in lpfc_fcf_inuse()
6677 spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_fcf_inuse()
6678 list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { in lpfc_fcf_inuse()
6679 if (ndlp->rport && in lpfc_fcf_inuse()
6680 (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { in lpfc_fcf_inuse()
6682 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, in lpfc_fcf_inuse()
6686 &ndlp->nlp_flag)) { in lpfc_fcf_inuse()
6692 ndlp->nlp_rpi, ndlp->nlp_DID, in lpfc_fcf_inuse()
6693 ndlp->nlp_flag); in lpfc_fcf_inuse()
6696 spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock, iflags); in lpfc_fcf_inuse()
6704 * lpfc_unregister_vfi_cmpl - Completion handler for unreg vfi.
6713 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_vfi_cmpl()
6715 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_vfi_cmpl()
6719 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_vfi_cmpl()
6721 clear_bit(FC_VFI_REGISTERED, &phba->pport->fc_flag); in lpfc_unregister_vfi_cmpl()
6722 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_vfi_cmpl()
6727 * lpfc_unregister_fcfi_cmpl - Completion handler for unreg fcfi.
6736 struct lpfc_vport *vport = mboxq->vport; in lpfc_unregister_fcfi_cmpl()
6738 if (mboxq->u.mb.mbxStatus) { in lpfc_unregister_fcfi_cmpl()
6742 mboxq->u.mb.mbxStatus, vport->port_state); in lpfc_unregister_fcfi_cmpl()
6744 mempool_free(mboxq, phba->mbox_mem_pool); in lpfc_unregister_fcfi_cmpl()
6749 * lpfc_unregister_fcf_prep - Unregister fcf record preparation
6769 phba->pport->port_state = LPFC_VPORT_UNKNOWN; in lpfc_unregister_fcf_prep()
6773 if (vports && (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) in lpfc_unregister_fcf_prep()
6774 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { in lpfc_unregister_fcf_prep()
6780 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6784 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6785 vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6786 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6787 set_bit(FC_VPORT_NEEDS_INIT_VPI, &vports[i]->fc_flag); in lpfc_unregister_fcf_prep()
6790 if (i == 0 && (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED))) { in lpfc_unregister_fcf_prep()
6791 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); in lpfc_unregister_fcf_prep()
6793 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp); in lpfc_unregister_fcf_prep()
6794 lpfc_cleanup_pending_mbox(phba->pport); in lpfc_unregister_fcf_prep()
6795 if (phba->sli_rev == LPFC_SLI_REV4) in lpfc_unregister_fcf_prep()
6796 lpfc_sli4_unreg_all_rpis(phba->pport); in lpfc_unregister_fcf_prep()
6797 lpfc_mbx_unreg_vpi(phba->pport); in lpfc_unregister_fcf_prep()
6798 shost = lpfc_shost_from_vport(phba->pport); in lpfc_unregister_fcf_prep()
6799 spin_lock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6800 phba->pport->vpi_state &= ~LPFC_VPI_REGISTERED; in lpfc_unregister_fcf_prep()
6801 spin_unlock_irq(shost->host_lock); in lpfc_unregister_fcf_prep()
6802 set_bit(FC_VPORT_NEEDS_INIT_VPI, &phba->pport->fc_flag); in lpfc_unregister_fcf_prep()
6809 rc = lpfc_issue_unreg_vfi(phba->pport); in lpfc_unregister_fcf_prep()
6814 * lpfc_sli4_unregister_fcf - Unregister currently registered FCF record
6821 * Return 0 if successfully issued, none-zero otherwise.
6829 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); in lpfc_sli4_unregister_fcf()
6833 "HBA state x%x\n", phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6834 return -ENOMEM; in lpfc_sli4_unregister_fcf()
6836 lpfc_unreg_fcfi(mbox, phba->fcf.fcfi); in lpfc_sli4_unregister_fcf()
6837 mbox->vport = phba->pport; in lpfc_sli4_unregister_fcf()
6838 mbox->mbox_cmpl = lpfc_unregister_fcfi_cmpl; in lpfc_sli4_unregister_fcf()
6845 rc, phba->pport->port_state); in lpfc_sli4_unregister_fcf()
6846 return -EINVAL; in lpfc_sli4_unregister_fcf()
6852 * lpfc_unregister_fcf_rescan - Unregister currently registered fcf and rescan
6877 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6878 phba->fcf.fcf_flag = 0; in lpfc_unregister_fcf_rescan()
6879 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6880 phba->fcf.current_rec.flag = 0; in lpfc_unregister_fcf_rescan()
6886 if (test_bit(FC_UNLOADING, &phba->pport->load_flag) || in lpfc_unregister_fcf_rescan()
6887 phba->link_state < LPFC_LINK_UP) in lpfc_unregister_fcf_rescan()
6891 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6892 phba->fcf.fcf_flag |= FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
6893 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6901 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6902 phba->fcf.fcf_flag &= ~FCF_INIT_DISC; in lpfc_unregister_fcf_rescan()
6903 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf_rescan()
6907 phba->pport->port_state); in lpfc_unregister_fcf_rescan()
6912 * lpfc_unregister_fcf - Unregister the currently registered fcf record
6937 spin_lock_irq(&phba->hbalock); in lpfc_unregister_fcf()
6938 phba->fcf.fcf_flag &= ~FCF_REGISTERED; in lpfc_unregister_fcf()
6939 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_fcf()
6943 * lpfc_unregister_unused_fcf - Unregister FCF if all devices are disconnected.
6958 spin_lock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6959 if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) || in lpfc_unregister_unused_fcf()
6960 !(phba->fcf.fcf_flag & FCF_REGISTERED) || in lpfc_unregister_unused_fcf()
6961 !test_bit(HBA_FIP_SUPPORT, &phba->hba_flag) || in lpfc_unregister_unused_fcf()
6962 (phba->fcf.fcf_flag & FCF_DISCOVERY) || in lpfc_unregister_unused_fcf()
6963 phba->pport->port_state == LPFC_FLOGI) { in lpfc_unregister_unused_fcf()
6964 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6967 spin_unlock_irq(&phba->hbalock); in lpfc_unregister_unused_fcf()
6976 * lpfc_read_fcf_conn_tbl - Create driver FCF connection table.
6995 &phba->fcf_conn_rec_list, list) { in lpfc_read_fcf_conn_tbl()
6996 list_del_init(&conn_entry->list); in lpfc_read_fcf_conn_tbl()
7001 record_count = conn_hdr->length * sizeof(uint32_t)/ in lpfc_read_fcf_conn_tbl()
7019 memcpy(&conn_entry->conn_rec, &conn_rec[i], in lpfc_read_fcf_conn_tbl()
7021 list_add_tail(&conn_entry->list, in lpfc_read_fcf_conn_tbl()
7022 &phba->fcf_conn_rec_list); in lpfc_read_fcf_conn_tbl()
7025 if (!list_empty(&phba->fcf_conn_rec_list)) { in lpfc_read_fcf_conn_tbl()
7027 list_for_each_entry(conn_entry, &phba->fcf_conn_rec_list, in lpfc_read_fcf_conn_tbl()
7029 conn_rec = &conn_entry->conn_rec; in lpfc_read_fcf_conn_tbl()
7037 conn_rec->flags, conn_rec->vlan_tag, in lpfc_read_fcf_conn_tbl()
7038 conn_rec->fabric_name[0], in lpfc_read_fcf_conn_tbl()
7039 conn_rec->fabric_name[1], in lpfc_read_fcf_conn_tbl()
7040 conn_rec->fabric_name[2], in lpfc_read_fcf_conn_tbl()
7041 conn_rec->fabric_name[3], in lpfc_read_fcf_conn_tbl()
7042 conn_rec->fabric_name[4], in lpfc_read_fcf_conn_tbl()
7043 conn_rec->fabric_name[5], in lpfc_read_fcf_conn_tbl()
7044 conn_rec->fabric_name[6], in lpfc_read_fcf_conn_tbl()
7045 conn_rec->fabric_name[7], in lpfc_read_fcf_conn_tbl()
7046 conn_rec->switch_name[0], in lpfc_read_fcf_conn_tbl()
7047 conn_rec->switch_name[1], in lpfc_read_fcf_conn_tbl()
7048 conn_rec->switch_name[2], in lpfc_read_fcf_conn_tbl()
7049 conn_rec->switch_name[3], in lpfc_read_fcf_conn_tbl()
7050 conn_rec->switch_name[4], in lpfc_read_fcf_conn_tbl()
7051 conn_rec->switch_name[5], in lpfc_read_fcf_conn_tbl()
7052 conn_rec->switch_name[6], in lpfc_read_fcf_conn_tbl()
7053 conn_rec->switch_name[7]); in lpfc_read_fcf_conn_tbl()
7059 * lpfc_read_fcoe_param - Read FCoe parameters from conf region..
7078 if ((fcoe_param_hdr->parm_version != FIPP_VERSION) || in lpfc_read_fcoe_param()
7079 (fcoe_param_hdr->length != FCOE_PARAM_LENGTH)) in lpfc_read_fcoe_param()
7082 if (fcoe_param_hdr->parm_flags & FIPP_VLAN_VALID) { in lpfc_read_fcoe_param()
7083 phba->valid_vlan = 1; in lpfc_read_fcoe_param()
7084 phba->vlan_id = le16_to_cpu(fcoe_param->vlan_tag) & in lpfc_read_fcoe_param()
7088 phba->fc_map[0] = fcoe_param->fc_map[0]; in lpfc_read_fcoe_param()
7089 phba->fc_map[1] = fcoe_param->fc_map[1]; in lpfc_read_fcoe_param()
7090 phba->fc_map[2] = fcoe_param->fc_map[2]; in lpfc_read_fcoe_param()
7095 * lpfc_get_rec_conf23 - Get a record type in config region data.
7134 * lpfc_parse_fcoe_conf - Parse FCoE config data read from config region 23.
7176 size - offset, FCOE_PARAM_TYPE); in lpfc_parse_fcoe_conf()
7182 size - offset, FCOE_CONN_TBL_TYPE); in lpfc_parse_fcoe_conf()
7189 * lpfc_error_lost_link - IO failure from link event or FW reset check.
7201 * false - No link or reset error occurred.
7202 * true - A link or reset error occurred.