mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 20:37:27 +00:00
lpfc: Fix to handle PLOGI when already logged in
Signed-off-by: Dick Kennedy <dick.kennedy@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
c637797020
commit
ed4afe7405
@ -276,6 +276,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|||||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||||
struct lpfc_hba *phba = vport->phba;
|
struct lpfc_hba *phba = vport->phba;
|
||||||
struct lpfc_dmabuf *pcmd;
|
struct lpfc_dmabuf *pcmd;
|
||||||
|
uint64_t nlp_portwwn = 0;
|
||||||
uint32_t *lp;
|
uint32_t *lp;
|
||||||
IOCB_t *icmd;
|
IOCB_t *icmd;
|
||||||
struct serv_parm *sp;
|
struct serv_parm *sp;
|
||||||
@ -332,6 +333,8 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|||||||
NULL);
|
NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nlp_portwwn = wwn_to_u64(ndlp->nlp_portname.u.wwn);
|
||||||
if ((lpfc_check_sparm(vport, ndlp, sp, CLASS3, 0) == 0)) {
|
if ((lpfc_check_sparm(vport, ndlp, sp, CLASS3, 0) == 0)) {
|
||||||
/* Reject this request because invalid parameters */
|
/* Reject this request because invalid parameters */
|
||||||
stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
|
stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
|
||||||
@ -367,7 +370,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|||||||
ndlp->nlp_maxframe =
|
ndlp->nlp_maxframe =
|
||||||
((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb;
|
((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb;
|
||||||
|
|
||||||
/* no need to reg_login if we are already in one of these states */
|
/* if already logged in, do implicit logout */
|
||||||
switch (ndlp->nlp_state) {
|
switch (ndlp->nlp_state) {
|
||||||
case NLP_STE_NPR_NODE:
|
case NLP_STE_NPR_NODE:
|
||||||
if (!(ndlp->nlp_flag & NLP_NPR_ADISC))
|
if (!(ndlp->nlp_flag & NLP_NPR_ADISC))
|
||||||
@ -376,8 +379,26 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|||||||
case NLP_STE_PRLI_ISSUE:
|
case NLP_STE_PRLI_ISSUE:
|
||||||
case NLP_STE_UNMAPPED_NODE:
|
case NLP_STE_UNMAPPED_NODE:
|
||||||
case NLP_STE_MAPPED_NODE:
|
case NLP_STE_MAPPED_NODE:
|
||||||
lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL);
|
/* lpfc_plogi_confirm_nport skips fabric did, handle it here */
|
||||||
return 1;
|
if (!(ndlp->nlp_type & NLP_FABRIC)) {
|
||||||
|
lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb,
|
||||||
|
ndlp, NULL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (nlp_portwwn != 0 &&
|
||||||
|
nlp_portwwn != wwn_to_u64(sp->portName.u.wwn))
|
||||||
|
lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
|
||||||
|
"0143 PLOGI recv'd from DID: x%x "
|
||||||
|
"WWPN changed: old %llx new %llx\n",
|
||||||
|
ndlp->nlp_DID,
|
||||||
|
(unsigned long long)nlp_portwwn,
|
||||||
|
(unsigned long long)
|
||||||
|
wwn_to_u64(sp->portName.u.wwn));
|
||||||
|
|
||||||
|
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||||
|
/* rport needs to be unregistered first */
|
||||||
|
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for Nport to NPort pt2pt protocol */
|
/* Check for Nport to NPort pt2pt protocol */
|
||||||
|
Loading…
Reference in New Issue
Block a user