diff mbox

[04/17] lpfc: Fix RegLogin failed error seen on Lancer FC during port bounce

Message ID 5671efbb.hZSIh/wq1cqxxyH9%james.smart@avagotech.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

James Smart Dec. 16, 2015, 11:11 p.m. UTC
Fix RegLogin failed error seen on Lancer FC during port bounce

Fix the statemachine and ref counting.

Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
---
 drivers/scsi/lpfc/lpfc_els.c       | 14 +++++++++-----
 drivers/scsi/lpfc/lpfc_hbadisc.c   |  8 ++++----
 drivers/scsi/lpfc/lpfc_nportdisc.c |  3 +++
 3 files changed, 16 insertions(+), 9 deletions(-)

Comments

Hannes Reinecke Dec. 17, 2015, 8:16 a.m. UTC | #1
On 12/17/2015 12:11 AM, James Smart wrote:
>
> Fix RegLogin failed error seen on Lancer FC during port bounce
>
> Fix the statemachine and ref counting.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
>   drivers/scsi/lpfc/lpfc_els.c       | 14 +++++++++-----
>   drivers/scsi/lpfc/lpfc_hbadisc.c   |  8 ++++----
>   drivers/scsi/lpfc/lpfc_nportdisc.c |  3 +++
>   3 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index f6dd15b..d508378 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -3779,14 +3779,17 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
>   				lpfc_nlp_set_state(vport, ndlp,
>   					   NLP_STE_REG_LOGIN_ISSUE);
>   			}
> +
> +			ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
>   			if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
>   			    != MBX_NOT_FINISHED)
>   				goto out;
> -			else
> -				/* Decrement the ndlp reference count we
> -				 * set for this failed mailbox command.
> -				 */
> -				lpfc_nlp_put(ndlp);
> +
> +			/* Decrement the ndlp reference count we
> +			 * set for this failed mailbox command.
> +			 */
> +			lpfc_nlp_put(ndlp);
> +			ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
>
>   			/* ELS rsp: Cannot issue reg_login for <NPortid> */
>   			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
> @@ -3843,6 +3846,7 @@ out:
>   				 * the routine lpfc_els_free_iocb.
>   				 */
>   				cmdiocb->context1 = NULL;
> +
>   	}
>
>   	lpfc_els_free_iocb(phba, cmdiocb);
> diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
> index f0777f2..b19237b 100644
> --- a/drivers/scsi/lpfc/lpfc_hbadisc.c
> +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
> @@ -3452,10 +3452,10 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
>   		spin_lock_irq(shost->host_lock);
>   		ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
>   		spin_unlock_irq(shost->host_lock);
> -	} else
> -		/* Good status, call state machine */
> -		lpfc_disc_state_machine(vport, ndlp, pmb,
> -				NLP_EVT_CMPL_REG_LOGIN);
> +	}
> +
> +	/* Call state machine */
> +	lpfc_disc_state_machine(vport, ndlp, pmb, NLP_EVT_CMPL_REG_LOGIN);
>
>   	lpfc_mbuf_free(phba, mp->virt, mp->phys);
>   	kfree(mp);
> diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
> index daeda6d..9e571dd 100644
> --- a/drivers/scsi/lpfc/lpfc_nportdisc.c
> +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
> @@ -2325,6 +2325,9 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_vport *vport,
>   		if (vport->phba->sli_rev < LPFC_SLI_REV4)
>   			ndlp->nlp_rpi = mb->un.varWords[0];
>   		ndlp->nlp_flag |= NLP_RPI_REGISTERED;
> +		if (ndlp->nlp_flag & NLP_LOGO_ACC) {
> +			lpfc_unreg_rpi(vport, ndlp);
> +		}
>   	} else {
>   		if (ndlp->nlp_flag & NLP_NODEV_REMOVE) {
>   			lpfc_drop_node(vport, ndlp);
>
Not sure if that belong into this patch, but let's not be picky here.

Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index f6dd15b..d508378 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -3779,14 +3779,17 @@  lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 				lpfc_nlp_set_state(vport, ndlp,
 					   NLP_STE_REG_LOGIN_ISSUE);
 			}
+
+			ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
 			if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
 			    != MBX_NOT_FINISHED)
 				goto out;
-			else
-				/* Decrement the ndlp reference count we
-				 * set for this failed mailbox command.
-				 */
-				lpfc_nlp_put(ndlp);
+
+			/* Decrement the ndlp reference count we
+			 * set for this failed mailbox command.
+			 */
+			lpfc_nlp_put(ndlp);
+			ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
 
 			/* ELS rsp: Cannot issue reg_login for <NPortid> */
 			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
@@ -3843,6 +3846,7 @@  out:
 				 * the routine lpfc_els_free_iocb.
 				 */
 				cmdiocb->context1 = NULL;
+
 	}
 
 	lpfc_els_free_iocb(phba, cmdiocb);
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index f0777f2..b19237b 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -3452,10 +3452,10 @@  lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
 		spin_lock_irq(shost->host_lock);
 		ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
 		spin_unlock_irq(shost->host_lock);
-	} else
-		/* Good status, call state machine */
-		lpfc_disc_state_machine(vport, ndlp, pmb,
-				NLP_EVT_CMPL_REG_LOGIN);
+	}
+
+	/* Call state machine */
+	lpfc_disc_state_machine(vport, ndlp, pmb, NLP_EVT_CMPL_REG_LOGIN);
 
 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
 	kfree(mp);
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index daeda6d..9e571dd 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -2325,6 +2325,9 @@  lpfc_cmpl_reglogin_npr_node(struct lpfc_vport *vport,
 		if (vport->phba->sli_rev < LPFC_SLI_REV4)
 			ndlp->nlp_rpi = mb->un.varWords[0];
 		ndlp->nlp_flag |= NLP_RPI_REGISTERED;
+		if (ndlp->nlp_flag & NLP_LOGO_ACC) {
+			lpfc_unreg_rpi(vport, ndlp);
+		}
 	} else {
 		if (ndlp->nlp_flag & NLP_NODEV_REMOVE) {
 			lpfc_drop_node(vport, ndlp);