| From 25a00e9174b3bbad9808ea92de8afeebf8cf6c02 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 10 Sep 2018 10:30:41 -0700 |
| Subject: scsi: lpfc: Fix GFT_ID and PRLI logic for RSCN |
| |
| From: James Smart <jsmart2021@gmail.com> |
| |
| [ Upstream commit 01a8aed6a009625282b6265880f6b20cbd7a9c70 ] |
| |
| Driver only sends NVME PRLI to a device that also supports FCP. This resuls |
| in remote ports that don't have fc_remote_ports created for them. The driver |
| is clearing the nlp_fc4_type for a ndlp at the wrong time. |
| |
| Fix by moving the nlp_fc4_type clearing to the discovery engine in the |
| DEVICE_RECOVERY state. Also ensure that rport registration is done for all |
| nlp_fc4_types. |
| |
| Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> |
| Signed-off-by: James Smart <james.smart@broadcom.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/lpfc/lpfc_ct.c | 5 ----- |
| drivers/scsi/lpfc/lpfc_hbadisc.c | 2 +- |
| drivers/scsi/lpfc/lpfc_nportdisc.c | 3 +++ |
| 3 files changed, 4 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c |
| index d909d90035bb2..384f5cd7c3c81 100644 |
| --- a/drivers/scsi/lpfc/lpfc_ct.c |
| +++ b/drivers/scsi/lpfc/lpfc_ct.c |
| @@ -471,11 +471,6 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type) |
| "Parse GID_FTrsp: did:x%x flg:x%x x%x", |
| Did, ndlp->nlp_flag, vport->fc_flag); |
| |
| - /* Don't assume the rport is always the previous |
| - * FC4 type. |
| - */ |
| - ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); |
| - |
| /* By default, the driver expects to support FCP FC4 */ |
| if (fc4_type == FC_TYPE_FCP) |
| ndlp->nlp_fc4_type |= NLP_FC4_FCP; |
| diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c |
| index ccdd82b1123f7..db183d1f34ab2 100644 |
| --- a/drivers/scsi/lpfc/lpfc_hbadisc.c |
| +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c |
| @@ -4198,7 +4198,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, |
| |
| if (new_state == NLP_STE_MAPPED_NODE || |
| new_state == NLP_STE_UNMAPPED_NODE) { |
| - if (ndlp->nlp_fc4_type & NLP_FC4_FCP || |
| + if (ndlp->nlp_fc4_type || |
| ndlp->nlp_DID == Fabric_DID || |
| ndlp->nlp_DID == NameServer_DID || |
| ndlp->nlp_DID == FDMI_DID) { |
| diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c |
| index ae6301c796785..c15f3265eefeb 100644 |
| --- a/drivers/scsi/lpfc/lpfc_nportdisc.c |
| +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c |
| @@ -2323,6 +2323,7 @@ lpfc_device_recov_unmap_node(struct lpfc_vport *vport, |
| lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); |
| spin_lock_irq(shost->host_lock); |
| ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); |
| + ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); |
| spin_unlock_irq(shost->host_lock); |
| lpfc_disc_set_adisc(vport, ndlp); |
| |
| @@ -2400,6 +2401,7 @@ lpfc_device_recov_mapped_node(struct lpfc_vport *vport, |
| lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); |
| spin_lock_irq(shost->host_lock); |
| ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); |
| + ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); |
| spin_unlock_irq(shost->host_lock); |
| lpfc_disc_set_adisc(vport, ndlp); |
| return ndlp->nlp_state; |
| @@ -2657,6 +2659,7 @@ lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, |
| lpfc_cancel_retry_delay_tmo(vport, ndlp); |
| spin_lock_irq(shost->host_lock); |
| ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); |
| + ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); |
| spin_unlock_irq(shost->host_lock); |
| return ndlp->nlp_state; |
| } |
| -- |
| 2.20.1 |
| |