⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpfc_nportdisc.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 4 页
字号:
{	struct lpfc_iocbq *cmdiocb, *rspiocb;	IOCB_t *irsp;	ADISC *ap;	cmdiocb = (struct lpfc_iocbq *) arg;	rspiocb = cmdiocb->context_un.rsp_iocb;	ap = (ADISC *)lpfc_check_elscmpl_iocb(phba, cmdiocb, rspiocb);	irsp = &rspiocb->iocb;	if ((irsp->ulpStatus) ||		(!lpfc_check_adisc(phba, ndlp, &ap->nodeName, &ap->portName))) {		ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI;		/* 1 sec timeout */		mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ);		spin_lock_irq(phba->host->host_lock);		ndlp->nlp_flag |= NLP_DELAY_TMO;		spin_unlock_irq(phba->host->host_lock);		memset(&ndlp->nlp_nodename, 0, sizeof (struct lpfc_name));		memset(&ndlp->nlp_portname, 0, sizeof (struct lpfc_name));		ndlp->nlp_state = NLP_STE_NPR_NODE;		lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);		lpfc_unreg_rpi(phba, ndlp);		return (ndlp->nlp_state);	}	if (ndlp->nlp_type & NLP_FCP_TARGET) {		ndlp->nlp_state = NLP_STE_MAPPED_NODE;		lpfc_nlp_list(phba, ndlp, NLP_MAPPED_LIST);	} else {		ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;		lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);	}	return (ndlp->nlp_state);}static uint32_tlpfc_device_rm_adisc_issue(struct lpfc_hba * phba,			    struct lpfc_nodelist * ndlp, void *arg,			    uint32_t evt){	/* software abort outstanding ADISC */	lpfc_els_abort(phba, ndlp, 1);	lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);	return (NLP_STE_FREED_NODE);}static uint32_tlpfc_device_recov_adisc_issue(struct lpfc_hba * phba,			    struct lpfc_nodelist * ndlp, void *arg,			    uint32_t evt){	/* software abort outstanding ADISC */	lpfc_els_abort(phba, ndlp, 1);	ndlp->nlp_state = NLP_STE_NPR_NODE;	lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);	spin_lock_irq(phba->host->host_lock);	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;	spin_unlock_irq(phba->host->host_lock);	lpfc_disc_set_adisc(phba, ndlp);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_plogi_reglogin_issue(struct lpfc_hba * phba,			      struct lpfc_nodelist * ndlp, void *arg,			      uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_plogi(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prli_reglogin_issue(struct lpfc_hba * phba,			     struct lpfc_nodelist * ndlp, void *arg,			     uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_logo_reglogin_issue(struct lpfc_hba * phba,			     struct lpfc_nodelist * ndlp, void *arg,			     uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_logo(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_padisc_reglogin_issue(struct lpfc_hba * phba,			       struct lpfc_nodelist * ndlp, void *arg,			       uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_padisc(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prlo_reglogin_issue(struct lpfc_hba * phba,			     struct lpfc_nodelist * ndlp, void *arg,			     uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);	return (ndlp->nlp_state);}static uint32_tlpfc_cmpl_reglogin_reglogin_issue(struct lpfc_hba * phba,				  struct lpfc_nodelist * ndlp,				  void *arg, uint32_t evt){	LPFC_MBOXQ_t *pmb;	MAILBOX_t *mb;	uint32_t did;	pmb = (LPFC_MBOXQ_t *) arg;	mb = &pmb->mb;	did = mb->un.varWords[1];	if (mb->mbxStatus) {		/* RegLogin failed */		lpfc_printf_log(phba,				KERN_ERR,				LOG_DISCOVERY,				"%d:0246 RegLogin failed Data: x%x x%x x%x\n",				phba->brd_no,				did, mb->mbxStatus, phba->hba_state);		mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ * 1);		spin_lock_irq(phba->host->host_lock);		ndlp->nlp_flag |= NLP_DELAY_TMO;		spin_unlock_irq(phba->host->host_lock);		lpfc_issue_els_logo(phba, ndlp, 0);		/* Put ndlp in npr list set plogi timer for 1 sec */		ndlp->nlp_last_elscmd = (unsigned long)ELS_CMD_PLOGI;		ndlp->nlp_state = NLP_STE_NPR_NODE;		lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);		return (ndlp->nlp_state);	}	ndlp->nlp_rpi = mb->un.varWords[0];	/* Only if we are not a fabric nport do we issue PRLI */	if (!(ndlp->nlp_type & NLP_FABRIC)) {		ndlp->nlp_state = NLP_STE_PRLI_ISSUE;		lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST);		lpfc_issue_els_prli(phba, ndlp, 0);	} else {		ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;		lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);	}	return (ndlp->nlp_state);}static uint32_tlpfc_device_rm_reglogin_issue(struct lpfc_hba * phba,			      struct lpfc_nodelist * ndlp, void *arg,			      uint32_t evt){	lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);	return (NLP_STE_FREED_NODE);}static uint32_tlpfc_device_recov_reglogin_issue(struct lpfc_hba * phba,			       struct lpfc_nodelist * ndlp, void *arg,			       uint32_t evt){	ndlp->nlp_state = NLP_STE_NPR_NODE;	lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);	spin_lock_irq(phba->host->host_lock);	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;	spin_unlock_irq(phba->host->host_lock);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_plogi_prli_issue(struct lpfc_hba * phba,			  struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_plogi(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prli_prli_issue(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_logo_prli_issue(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	/* Software abort outstanding PRLI before sending acc */	lpfc_els_abort(phba, ndlp, 1);	lpfc_rcv_logo(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_padisc_prli_issue(struct lpfc_hba * phba,			   struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_padisc(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}/* This routine is envoked when we rcv a PRLO request from a nport * we are logged into.  We should send back a PRLO rsp setting the * appropriate bits. * NEXT STATE = PRLI_ISSUE */static uint32_tlpfc_rcv_prlo_prli_issue(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);	return (ndlp->nlp_state);}static uint32_tlpfc_cmpl_prli_prli_issue(struct lpfc_hba * phba,			  struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb, *rspiocb;	IOCB_t *irsp;	PRLI *npr;	cmdiocb = (struct lpfc_iocbq *) arg;	rspiocb = cmdiocb->context_un.rsp_iocb;	npr = (PRLI *)lpfc_check_elscmpl_iocb(phba, cmdiocb, rspiocb);	irsp = &rspiocb->iocb;	if (irsp->ulpStatus) {		ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;		lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);		return (ndlp->nlp_state);	}	/* Check out PRLI rsp */	ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);	ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;	if ((npr->acceptRspCode == PRLI_REQ_EXECUTED) &&	    (npr->prliType == PRLI_FCP_TYPE)) {		if (npr->initiatorFunc)			ndlp->nlp_type |= NLP_FCP_INITIATOR;		if (npr->targetFunc)			ndlp->nlp_type |= NLP_FCP_TARGET;		if (npr->Retry)			ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;	}	ndlp->nlp_state = NLP_STE_MAPPED_NODE;	lpfc_nlp_list(phba, ndlp, NLP_MAPPED_LIST);	return (ndlp->nlp_state);}/*! lpfc_device_rm_prli_issue  *  * \pre  * \post  * \param   phba  * \param   ndlp  * \param   arg  * \param   evt  * \return  uint32_t  *  * \b Description:  *    This routine is envoked when we a request to remove a nport we are in the  *    process of PRLIing. We should software abort outstanding prli, unreg  *    login, send a logout. We will change node state to UNUSED_NODE, put it  *    on plogi list so it can be freed when LOGO completes.  *  */static uint32_tlpfc_device_rm_prli_issue(struct lpfc_hba * phba,			  struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	/* software abort outstanding PRLI */	lpfc_els_abort(phba, ndlp, 1);	lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);	return (NLP_STE_FREED_NODE);}/*! lpfc_device_recov_prli_issue  *  * \pre  * \post  * \param   phba  * \param   ndlp  * \param   arg  * \param   evt  * \return  uint32_t  *  * \b Description:  *    The routine is envoked when the state of a device is unknown, like  *    during a link down. We should remove the nodelist entry from the  *    unmapped list, issue a UNREG_LOGIN, do a software abort of the  *    outstanding PRLI command, then free the node entry.  */static uint32_tlpfc_device_recov_prli_issue(struct lpfc_hba * phba,			   struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	/* software abort outstanding PRLI */	lpfc_els_abort(phba, ndlp, 1);	ndlp->nlp_state = NLP_STE_NPR_NODE;	lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);	spin_lock_irq(phba->host->host_lock);	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;	spin_unlock_irq(phba->host->host_lock);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_plogi_unmap_node(struct lpfc_hba * phba,			  struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_plogi(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prli_unmap_node(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_prli(phba, ndlp, cmdiocb);	lpfc_els_rsp_prli_acc(phba, cmdiocb, ndlp);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_logo_unmap_node(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_logo(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_padisc_unmap_node(struct lpfc_hba * phba,			   struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_padisc(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prlo_unmap_node(struct lpfc_hba * phba,			 struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	/* Treat like rcv logo */	lpfc_rcv_logo(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_device_recov_unmap_node(struct lpfc_hba * phba,			   struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	ndlp->nlp_state = NLP_STE_NPR_NODE;	lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;	lpfc_disc_set_adisc(phba, ndlp);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_plogi_mapped_node(struct lpfc_hba * phba,			   struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;	lpfc_rcv_plogi(phba, ndlp, cmdiocb);	return (ndlp->nlp_state);}static uint32_tlpfc_rcv_prli_mapped_node(struct lpfc_hba * phba,			  struct lpfc_nodelist * ndlp, void *arg, uint32_t evt){	struct lpfc_iocbq *cmdiocb;	cmdiocb = (struct lpfc_iocbq *) arg;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -