mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 05:02:31 +00:00
Merge patch series "Update lpfc to revision 14.4.0.6"
Justin Tee <justintee8345@gmail.com> says: Update lpfc to revision 14.4.0.6 This patch set contains bug fixes related to congestion handling, accounting for internal remoteport objects, resource release during HBA unload and reset, and clean up regarding the abuse of a global spinlock. The patches were cut against Martin's 6.13/scsi-queue tree. Link: https://lore.kernel.org/r/20241031223219.152342-1-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
826d94a715
@ -398,7 +398,11 @@ lpfc_bsg_send_mgmt_cmd(struct bsg_job *job)
|
||||
/* in case no data is transferred */
|
||||
bsg_reply->reply_payload_rcv_len = 0;
|
||||
|
||||
if (ndlp->nlp_flag & NLP_ELS_SND_MASK)
|
||||
if (test_bit(NLP_PLOGI_SND, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_PRLI_SND, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_ADISC_SND, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_LOGO_SND, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_RNID_SND, &ndlp->nlp_flag))
|
||||
return -ENODEV;
|
||||
|
||||
/* allocate our bsg tracking structure */
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************
|
||||
* This file is part of the Emulex Linux Device Driver for *
|
||||
* Fibre Channel Host Bus Adapters. *
|
||||
* Copyright (C) 2017-2023 Broadcom. All Rights Reserved. The term *
|
||||
* Copyright (C) 2017-2024 Broadcom. All Rights Reserved. The term *
|
||||
* “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
|
||||
* Copyright (C) 2004-2016 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
@ -571,7 +571,7 @@ int lpfc_issue_reg_vfi(struct lpfc_vport *);
|
||||
int lpfc_issue_unreg_vfi(struct lpfc_vport *);
|
||||
int lpfc_selective_reset(struct lpfc_hba *);
|
||||
int lpfc_sli4_read_config(struct lpfc_hba *);
|
||||
void lpfc_sli4_node_prep(struct lpfc_hba *);
|
||||
void lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba);
|
||||
int lpfc_sli4_els_sgl_update(struct lpfc_hba *phba);
|
||||
int lpfc_sli4_nvmet_sgl_update(struct lpfc_hba *phba);
|
||||
int lpfc_io_buf_flush(struct lpfc_hba *phba, struct list_head *sglist);
|
||||
@ -660,6 +660,7 @@ void lpfc_wqe_cmd_template(void);
|
||||
void lpfc_nvmet_cmd_template(void);
|
||||
void lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
||||
uint32_t stat, uint32_t param);
|
||||
void lpfc_nvmels_flush_cmd(struct lpfc_hba *phba);
|
||||
extern int lpfc_enable_nvmet_cnt;
|
||||
extern unsigned long long lpfc_enable_nvmet[];
|
||||
extern int lpfc_no_hba_reset_cnt;
|
||||
|
@ -735,7 +735,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0238 Process x%06x NameServer Rsp "
|
||||
"Data: x%x x%x x%x x%lx x%x\n", Did,
|
||||
"Data: x%lx x%x x%x x%lx x%x\n", Did,
|
||||
ndlp->nlp_flag, ndlp->nlp_fc4_type,
|
||||
ndlp->nlp_state, vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt);
|
||||
@ -744,7 +744,7 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
* state of ndlp hit devloss, change state to
|
||||
* allow rediscovery.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC &&
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) &&
|
||||
ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
NLP_STE_NPR_NODE);
|
||||
@ -832,12 +832,10 @@ lpfc_ns_rsp_audit_did(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
|
||||
if (ndlp->nlp_type != NLP_NVME_INITIATOR ||
|
||||
ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
|
||||
continue;
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
if (ndlp->nlp_DID == Did)
|
||||
ndlp->nlp_flag &= ~NLP_NVMET_RECOV;
|
||||
clear_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag);
|
||||
else
|
||||
ndlp->nlp_flag |= NLP_NVMET_RECOV;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -894,13 +892,11 @@ lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint8_t fc4_type,
|
||||
*/
|
||||
if (vport->phba->nvmet_support) {
|
||||
list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
|
||||
if (!(ndlp->nlp_flag & NLP_NVMET_RECOV))
|
||||
if (!test_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag))
|
||||
continue;
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NVMET_RECOV;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NVMET_RECOV, &ndlp->nlp_flag);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1440,7 +1436,7 @@ lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (ndlp) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0242 Process x%x GFF "
|
||||
"NameServer Rsp Data: x%x x%lx x%x\n",
|
||||
"NameServer Rsp Data: x%lx x%lx x%x\n",
|
||||
did, ndlp->nlp_flag, vport->fc_flag,
|
||||
vport->fc_rscn_id_cnt);
|
||||
} else {
|
||||
@ -2226,6 +2222,11 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
ulp_status, ulp_word4, latt);
|
||||
|
||||
if (latt || ulp_status) {
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY,
|
||||
"0229 FDMI cmd %04x failed, latt = %d "
|
||||
"ulp_status: (x%x/x%x), sli_flag x%x\n",
|
||||
be16_to_cpu(fdmi_cmd), latt, ulp_status,
|
||||
ulp_word4, phba->sli.sli_flag);
|
||||
|
||||
/* Look for a retryable error */
|
||||
if (ulp_status == IOSTAT_LOCAL_REJECT) {
|
||||
@ -2234,8 +2235,16 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
case IOERR_SLI_DOWN:
|
||||
/* Driver aborted this IO. No retry as error
|
||||
* is likely Offline->Online or some adapter
|
||||
* error. Recovery will try again.
|
||||
* error. Recovery will try again, but if port
|
||||
* is not active there's no point to continue
|
||||
* issuing follow up FDMI commands.
|
||||
*/
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE)) {
|
||||
free_ndlp = cmdiocb->ndlp;
|
||||
lpfc_ct_free_iocb(phba, cmdiocb);
|
||||
lpfc_nlp_put(free_ndlp);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case IOERR_ABORT_IN_PROGRESS:
|
||||
case IOERR_SEQUENCE_TIMEOUT:
|
||||
@ -2256,12 +2265,6 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0229 FDMI cmd %04x latt = %d "
|
||||
"ulp_status: x%x, rid x%x\n",
|
||||
be16_to_cpu(fdmi_cmd), latt, ulp_status,
|
||||
ulp_word4);
|
||||
}
|
||||
|
||||
free_ndlp = cmdiocb->ndlp;
|
||||
|
@ -870,8 +870,8 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size)
|
||||
wwn_to_u64(ndlp->nlp_nodename.u.wwn));
|
||||
len += scnprintf(buf+len, size-len, "RPI:x%04x ",
|
||||
ndlp->nlp_rpi);
|
||||
len += scnprintf(buf+len, size-len, "flag:x%08x ",
|
||||
ndlp->nlp_flag);
|
||||
len += scnprintf(buf+len, size-len, "flag:x%08lx ",
|
||||
ndlp->nlp_flag);
|
||||
if (!ndlp->nlp_type)
|
||||
len += scnprintf(buf+len, size-len, "UNKNOWN_TYPE ");
|
||||
if (ndlp->nlp_type & NLP_FC_NODE)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************
|
||||
* This file is part of the Emulex Linux Device Driver for *
|
||||
* Fibre Channel Host Bus Adapters. *
|
||||
* Copyright (C) 2017-2022 Broadcom. All Rights Reserved. The term *
|
||||
* Copyright (C) 2017-2024 Broadcom. All Rights Reserved. The term *
|
||||
* “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
|
||||
* Copyright (C) 2004-2013 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
@ -102,7 +102,7 @@ struct lpfc_nodelist {
|
||||
|
||||
spinlock_t lock; /* Node management lock */
|
||||
|
||||
uint32_t nlp_flag; /* entry flags */
|
||||
unsigned long nlp_flag; /* entry flags */
|
||||
uint32_t nlp_DID; /* FC D_ID of entry */
|
||||
uint32_t nlp_last_elscmd; /* Last ELS cmd sent */
|
||||
uint16_t nlp_type;
|
||||
@ -182,37 +182,37 @@ struct lpfc_node_rrq {
|
||||
#define lpfc_ndlp_check_qdepth(phba, ndlp) \
|
||||
(ndlp->cmd_qdepth < phba->sli4_hba.max_cfg_param.max_xri)
|
||||
|
||||
/* Defines for nlp_flag (uint32) */
|
||||
#define NLP_IGNR_REG_CMPL 0x00000001 /* Rcvd rscn before we cmpl reg login */
|
||||
#define NLP_REG_LOGIN_SEND 0x00000002 /* sent reglogin to adapter */
|
||||
#define NLP_RELEASE_RPI 0x00000004 /* Release RPI to free pool */
|
||||
#define NLP_SUPPRESS_RSP 0x00000010 /* Remote NPort supports suppress rsp */
|
||||
#define NLP_PLOGI_SND 0x00000020 /* sent PLOGI request for this entry */
|
||||
#define NLP_PRLI_SND 0x00000040 /* sent PRLI request for this entry */
|
||||
#define NLP_ADISC_SND 0x00000080 /* sent ADISC request for this entry */
|
||||
#define NLP_LOGO_SND 0x00000100 /* sent LOGO request for this entry */
|
||||
#define NLP_RNID_SND 0x00000400 /* sent RNID request for this entry */
|
||||
#define NLP_ELS_SND_MASK 0x000007e0 /* sent ELS request for this entry */
|
||||
#define NLP_NVMET_RECOV 0x00001000 /* NVMET auditing node for recovery. */
|
||||
#define NLP_UNREG_INP 0x00008000 /* UNREG_RPI cmd is in progress */
|
||||
#define NLP_DROPPED 0x00010000 /* Init ref count has been dropped */
|
||||
#define NLP_DELAY_TMO 0x00020000 /* delay timeout is running for node */
|
||||
#define NLP_NPR_2B_DISC 0x00040000 /* node is included in num_disc_nodes */
|
||||
#define NLP_RCV_PLOGI 0x00080000 /* Rcv'ed PLOGI from remote system */
|
||||
#define NLP_LOGO_ACC 0x00100000 /* Process LOGO after ACC completes */
|
||||
#define NLP_TGT_NO_SCSIID 0x00200000 /* good PRLI but no binding for scsid */
|
||||
#define NLP_ISSUE_LOGO 0x00400000 /* waiting to issue a LOGO */
|
||||
#define NLP_IN_DEV_LOSS 0x00800000 /* devloss in progress */
|
||||
#define NLP_ACC_REGLOGIN 0x01000000 /* Issue Reg Login after successful
|
||||
/* nlp_flag mask bits */
|
||||
enum lpfc_nlp_flag {
|
||||
NLP_IGNR_REG_CMPL = 0, /* Rcvd rscn before we cmpl reg login */
|
||||
NLP_REG_LOGIN_SEND = 1, /* sent reglogin to adapter */
|
||||
NLP_SUPPRESS_RSP = 4, /* Remote NPort supports suppress rsp */
|
||||
NLP_PLOGI_SND = 5, /* sent PLOGI request for this entry */
|
||||
NLP_PRLI_SND = 6, /* sent PRLI request for this entry */
|
||||
NLP_ADISC_SND = 7, /* sent ADISC request for this entry */
|
||||
NLP_LOGO_SND = 8, /* sent LOGO request for this entry */
|
||||
NLP_RNID_SND = 10, /* sent RNID request for this entry */
|
||||
NLP_NVMET_RECOV = 12, /* NVMET auditing node for recovery. */
|
||||
NLP_UNREG_INP = 15, /* UNREG_RPI cmd is in progress */
|
||||
NLP_DROPPED = 16, /* Init ref count has been dropped */
|
||||
NLP_DELAY_TMO = 17, /* delay timeout is running for node */
|
||||
NLP_NPR_2B_DISC = 18, /* node is included in num_disc_nodes */
|
||||
NLP_RCV_PLOGI = 19, /* Rcv'ed PLOGI from remote system */
|
||||
NLP_LOGO_ACC = 20, /* Process LOGO after ACC completes */
|
||||
NLP_TGT_NO_SCSIID = 21, /* good PRLI but no binding for scsid */
|
||||
NLP_ISSUE_LOGO = 22, /* waiting to issue a LOGO */
|
||||
NLP_IN_DEV_LOSS = 23, /* devloss in progress */
|
||||
NLP_ACC_REGLOGIN = 24, /* Issue Reg Login after successful
|
||||
ACC */
|
||||
#define NLP_NPR_ADISC 0x02000000 /* Issue ADISC when dq'ed from
|
||||
NLP_NPR_ADISC = 25, /* Issue ADISC when dq'ed from
|
||||
NPR list */
|
||||
#define NLP_RM_DFLT_RPI 0x04000000 /* need to remove leftover dflt RPI */
|
||||
#define NLP_NODEV_REMOVE 0x08000000 /* Defer removal till discovery ends */
|
||||
#define NLP_TARGET_REMOVE 0x10000000 /* Target remove in process */
|
||||
#define NLP_SC_REQ 0x20000000 /* Target requires authentication */
|
||||
#define NLP_FIRSTBURST 0x40000000 /* Target supports FirstBurst */
|
||||
#define NLP_RPI_REGISTERED 0x80000000 /* nlp_rpi is valid */
|
||||
NLP_RM_DFLT_RPI = 26, /* need to remove leftover dflt RPI */
|
||||
NLP_NODEV_REMOVE = 27, /* Defer removal till discovery ends */
|
||||
NLP_TARGET_REMOVE = 28, /* Target remove in process */
|
||||
NLP_SC_REQ = 29, /* Target requires authentication */
|
||||
NLP_FIRSTBURST = 30, /* Target supports FirstBurst */
|
||||
NLP_RPI_REGISTERED = 31 /* nlp_rpi is valid */
|
||||
};
|
||||
|
||||
/* There are 4 different double linked lists nodelist entries can reside on.
|
||||
* The Port Login (PLOGI) list and Address Discovery (ADISC) list are used
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -100,6 +100,12 @@ lpfc_rport_invalid(struct fc_rport *rport)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (rport->flags & FC_RPORT_DEVLOSS_CALLBK_DONE) {
|
||||
pr_info("**** %s: devloss_callbk_done rport x%px SID x%x\n",
|
||||
__func__, rport, rport->scsi_target_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rdata = rport->dd_data;
|
||||
if (!rdata) {
|
||||
pr_err("**** %s: NULL dd_data on rport x%px SID x%x\n",
|
||||
@ -137,7 +143,7 @@ lpfc_terminate_rport_io(struct fc_rport *rport)
|
||||
ndlp = rdata->pnode;
|
||||
vport = ndlp->vport;
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT,
|
||||
"rport terminate: sid:x%x did:x%x flg:x%x",
|
||||
"rport terminate: sid:x%x did:x%x flg:x%lx",
|
||||
ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag);
|
||||
|
||||
if (ndlp->nlp_sid != NLP_NO_SID)
|
||||
@ -155,6 +161,7 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
struct lpfc_hba *phba;
|
||||
struct lpfc_work_evt *evtp;
|
||||
unsigned long iflags;
|
||||
bool nvme_reg = false;
|
||||
|
||||
ndlp = ((struct lpfc_rport_data *)rport->dd_data)->pnode;
|
||||
if (!ndlp)
|
||||
@ -164,11 +171,11 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
phba = vport->phba;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT,
|
||||
"rport devlosscb: sid:x%x did:x%x flg:x%x",
|
||||
"rport devlosscb: sid:x%x did:x%x flg:x%lx",
|
||||
ndlp->nlp_sid, ndlp->nlp_DID, ndlp->nlp_flag);
|
||||
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
|
||||
"3181 dev_loss_callbk x%06x, rport x%px flg x%x "
|
||||
"3181 dev_loss_callbk x%06x, rport x%px flg x%lx "
|
||||
"load_flag x%lx refcnt %u state %d xpt x%x\n",
|
||||
ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag,
|
||||
vport->load_flag, kref_read(&ndlp->kref),
|
||||
@ -177,38 +184,44 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
/* Don't schedule a worker thread event if the vport is going down. */
|
||||
if (test_bit(FC_UNLOADING, &vport->load_flag) ||
|
||||
!test_bit(HBA_SETUP, &phba->hba_flag)) {
|
||||
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->rport = NULL;
|
||||
|
||||
if (ndlp->fc4_xpt_flags & NVME_XPT_REGD)
|
||||
nvme_reg = true;
|
||||
|
||||
/* The scsi_transport is done with the rport so lpfc cannot
|
||||
* call to unregister. Remove the scsi transport reference
|
||||
* and clean up the SCSI transport node details.
|
||||
* call to unregister.
|
||||
*/
|
||||
if (ndlp->fc4_xpt_flags & (NLP_XPT_REGD | SCSI_XPT_REGD)) {
|
||||
if (ndlp->fc4_xpt_flags & SCSI_XPT_REGD) {
|
||||
ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD;
|
||||
|
||||
/* NVME transport-registered rports need the
|
||||
* NLP_XPT_REGD flag to complete an unregister.
|
||||
/* If NLP_XPT_REGD was cleared in lpfc_nlp_unreg_node,
|
||||
* unregister calls were made to the scsi and nvme
|
||||
* transports and refcnt was already decremented. Clear
|
||||
* the NLP_XPT_REGD flag only if the NVME Rport is
|
||||
* confirmed unregistered.
|
||||
*/
|
||||
if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD))
|
||||
if (!nvme_reg && ndlp->fc4_xpt_flags & NLP_XPT_REGD) {
|
||||
ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
lpfc_nlp_put(ndlp); /* may free ndlp */
|
||||
} else {
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
}
|
||||
} else {
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
lpfc_nlp_put(ndlp);
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
}
|
||||
|
||||
/* Only 1 thread can drop the initial node reference. If
|
||||
* another thread has set NLP_DROPPED, this thread is done.
|
||||
*/
|
||||
if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD) &&
|
||||
!(ndlp->nlp_flag & NLP_DROPPED)) {
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
lpfc_nlp_put(ndlp);
|
||||
if (nvme_reg || test_bit(NLP_DROPPED, &ndlp->nlp_flag))
|
||||
return;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
set_bit(NLP_DROPPED, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -235,14 +248,14 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag |= NLP_IN_DEV_LOSS;
|
||||
set_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag);
|
||||
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
/* If there is a PLOGI in progress, and we are in a
|
||||
* NLP_NPR_2B_DISC state, don't turn off the flag.
|
||||
*/
|
||||
if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE)
|
||||
ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
|
||||
/*
|
||||
* The backend does not expect any more calls associated with this
|
||||
@ -271,15 +284,13 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
} else {
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
|
||||
"3188 worker thread is stopped %s x%06x, "
|
||||
" rport x%px flg x%x load_flag x%lx refcnt "
|
||||
" rport x%px flg x%lx load_flag x%lx refcnt "
|
||||
"%d\n", __func__, ndlp->nlp_DID,
|
||||
ndlp->rport, ndlp->nlp_flag,
|
||||
vport->load_flag, kref_read(&ndlp->kref));
|
||||
if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD)) {
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
/* Node is in dev loss. No further transaction. */
|
||||
ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag);
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RM);
|
||||
}
|
||||
@ -412,7 +423,7 @@ lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
|
||||
lpfc_nlp_get(ndlp);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_NODE,
|
||||
"8438 Devloss timeout reversed on DID x%x "
|
||||
"refcnt %d ndlp %p flag x%x "
|
||||
"refcnt %d ndlp %p flag x%lx "
|
||||
"port_state = x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp,
|
||||
ndlp->nlp_flag, vport->port_state);
|
||||
@ -455,7 +466,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
ndlp->nlp_DID, ndlp->nlp_type, ndlp->nlp_sid);
|
||||
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
|
||||
"3182 %s x%06x, nflag x%x xflags x%x refcnt %d\n",
|
||||
"3182 %s x%06x, nflag x%lx xflags x%x refcnt %d\n",
|
||||
__func__, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->fc4_xpt_flags, kref_read(&ndlp->kref));
|
||||
|
||||
@ -469,9 +480,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
*(name+4), *(name+5), *(name+6), *(name+7),
|
||||
ndlp->nlp_DID);
|
||||
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag);
|
||||
return fcf_inuse;
|
||||
}
|
||||
|
||||
@ -499,7 +508,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
}
|
||||
break;
|
||||
case Fabric_Cntl_DID:
|
||||
if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
|
||||
if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag))
|
||||
recovering = true;
|
||||
break;
|
||||
case FDMI_DID:
|
||||
@ -527,15 +536,13 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
* the following lpfc_nlp_put is necessary after fabric node is
|
||||
* recovered.
|
||||
*/
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag);
|
||||
if (recovering) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_DISCOVERY | LOG_NODE,
|
||||
"8436 Devloss timeout marked on "
|
||||
"DID x%x refcnt %d ndlp %p "
|
||||
"flag x%x port_state = x%x\n",
|
||||
"flag x%lx port_state = x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref),
|
||||
ndlp, ndlp->nlp_flag,
|
||||
vport->port_state);
|
||||
@ -552,7 +559,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
LOG_DISCOVERY | LOG_NODE,
|
||||
"8437 Devloss timeout ignored on "
|
||||
"DID x%x refcnt %d ndlp %p "
|
||||
"flag x%x port_state = x%x\n",
|
||||
"flag x%lx port_state = x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref),
|
||||
ndlp, ndlp->nlp_flag,
|
||||
vport->port_state);
|
||||
@ -572,7 +579,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0203 Devloss timeout on "
|
||||
"WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x "
|
||||
"NPort x%06x Data: x%x x%x x%x refcnt %d\n",
|
||||
"NPort x%06x Data: x%lx x%x x%x refcnt %d\n",
|
||||
*name, *(name+1), *(name+2), *(name+3),
|
||||
*(name+4), *(name+5), *(name+6), *(name+7),
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
@ -582,15 +589,13 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_TRACE_EVENT,
|
||||
"0204 Devloss timeout on "
|
||||
"WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x "
|
||||
"NPort x%06x Data: x%x x%x x%x\n",
|
||||
"NPort x%06x Data: x%lx x%x x%x\n",
|
||||
*name, *(name+1), *(name+2), *(name+3),
|
||||
*(name+4), *(name+5), *(name+6), *(name+7),
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, ndlp->nlp_rpi);
|
||||
}
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
clear_bit(NLP_IN_DEV_LOSS, &ndlp->nlp_flag);
|
||||
|
||||
/* If we are devloss, but we are in the process of rediscovering the
|
||||
* ndlp, don't issue a NLP_EVT_DEVICE_RM event.
|
||||
@ -1355,7 +1360,7 @@ lpfc_linkup_cleanup_nodes(struct lpfc_vport *vport)
|
||||
if (ndlp->nlp_DID != Fabric_DID)
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
} else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
|
||||
} else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) {
|
||||
/* Fail outstanding IO now since device is
|
||||
* marked for PLOGI.
|
||||
*/
|
||||
@ -3864,14 +3869,13 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
pmb->ctx_ndlp = NULL;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI | LOG_NODE | LOG_DISCOVERY,
|
||||
"0002 rpi:%x DID:%x flg:%x %d x%px\n",
|
||||
"0002 rpi:%x DID:%x flg:%lx %d x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
kref_read(&ndlp->kref),
|
||||
ndlp);
|
||||
if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
|
||||
if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL ||
|
||||
if (test_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag) ||
|
||||
ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) {
|
||||
/* We rcvd a rscn after issuing this
|
||||
* mbox reg login, we may have cycled
|
||||
@ -3881,16 +3885,14 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
* there is another reg login in
|
||||
* process.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag);
|
||||
|
||||
/*
|
||||
* We cannot leave the RPI registered because
|
||||
* if we go thru discovery again for this ndlp
|
||||
* a subsequent REG_RPI will fail.
|
||||
*/
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
}
|
||||
|
||||
@ -4203,7 +4205,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4)
|
||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type |= NLP_FABRIC;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
|
||||
|
||||
@ -4334,9 +4336,7 @@ lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
* reference.
|
||||
*/
|
||||
if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
|
||||
@ -4357,11 +4357,11 @@ lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4)
|
||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type |= NLP_FABRIC;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY,
|
||||
"0003 rpi:%x DID:%x flg:%x %d x%px\n",
|
||||
"0003 rpi:%x DID:%x flg:%lx %d x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
kref_read(&ndlp->kref),
|
||||
ndlp);
|
||||
@ -4453,8 +4453,8 @@ lpfc_mbx_cmpl_fc_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
__func__, ndlp->nlp_DID, ndlp->nlp_rpi,
|
||||
ndlp->nlp_state);
|
||||
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type |= NLP_FABRIC;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
|
||||
|
||||
@ -4488,7 +4488,7 @@ lpfc_register_remote_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT,
|
||||
"rport add: did:x%x flg:x%x type x%x",
|
||||
"rport add: did:x%x flg:x%lx type x%x",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type);
|
||||
|
||||
/* Don't add the remote port if unloading. */
|
||||
@ -4556,7 +4556,7 @@ lpfc_unregister_remote_port(struct lpfc_nodelist *ndlp)
|
||||
return;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT,
|
||||
"rport delete: did:x%x flg:x%x type x%x",
|
||||
"rport delete: did:x%x flg:x%lx type x%x",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
|
||||
@ -4672,7 +4672,7 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_ELS | LOG_NODE | LOG_DISCOVERY,
|
||||
"0999 %s Not regd: ndlp x%px rport x%px DID "
|
||||
"x%x FLG x%x XPT x%x\n",
|
||||
"x%x FLG x%lx XPT x%x\n",
|
||||
__func__, ndlp, ndlp->rport, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, ndlp->fc4_xpt_flags);
|
||||
return;
|
||||
@ -4688,7 +4688,7 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
} else if (!ndlp->rport) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_ELS | LOG_NODE | LOG_DISCOVERY,
|
||||
"1999 %s NDLP in devloss x%px DID x%x FLG x%x"
|
||||
"1999 %s NDLP in devloss x%px DID x%x FLG x%lx"
|
||||
" XPT x%x refcnt %u\n",
|
||||
__func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->fc4_xpt_flags,
|
||||
@ -4733,7 +4733,7 @@ lpfc_handle_adisc_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_type |= NLP_FC_NODE;
|
||||
fallthrough;
|
||||
case NLP_STE_MAPPED_NODE:
|
||||
ndlp->nlp_flag &= ~NLP_NODEV_REMOVE;
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
lpfc_nlp_reg_node(vport, ndlp);
|
||||
break;
|
||||
|
||||
@ -4744,7 +4744,7 @@ lpfc_handle_adisc_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
* backend, attempt it now
|
||||
*/
|
||||
case NLP_STE_NPR_NODE:
|
||||
ndlp->nlp_flag &= ~NLP_RCV_PLOGI;
|
||||
clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag);
|
||||
fallthrough;
|
||||
default:
|
||||
lpfc_nlp_unreg_node(vport, ndlp);
|
||||
@ -4765,13 +4765,13 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
}
|
||||
|
||||
if (new_state == NLP_STE_UNMAPPED_NODE) {
|
||||
ndlp->nlp_flag &= ~NLP_NODEV_REMOVE;
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type |= NLP_FC_NODE;
|
||||
}
|
||||
if (new_state == NLP_STE_MAPPED_NODE)
|
||||
ndlp->nlp_flag &= ~NLP_NODEV_REMOVE;
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
if (new_state == NLP_STE_NPR_NODE)
|
||||
ndlp->nlp_flag &= ~NLP_RCV_PLOGI;
|
||||
clear_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag);
|
||||
|
||||
/* Reg/Unreg for FCP and NVME Transport interface */
|
||||
if ((old_state == NLP_STE_MAPPED_NODE ||
|
||||
@ -4779,7 +4779,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* For nodes marked for ADISC, Handle unreg in ADISC cmpl
|
||||
* if linkup. In linkdown do unreg_node
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_NPR_ADISC) ||
|
||||
if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag) ||
|
||||
!lpfc_is_link_up(vport->phba))
|
||||
lpfc_nlp_unreg_node(vport, ndlp);
|
||||
}
|
||||
@ -4799,9 +4799,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
(!ndlp->rport ||
|
||||
ndlp->rport->scsi_target_id == -1 ||
|
||||
ndlp->rport->scsi_target_id >= LPFC_MAX_TARGET)) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_TGT_NO_SCSIID;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag);
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
|
||||
}
|
||||
}
|
||||
@ -4833,7 +4831,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
int state)
|
||||
{
|
||||
int old_state = ndlp->nlp_state;
|
||||
int node_dropped = ndlp->nlp_flag & NLP_DROPPED;
|
||||
bool node_dropped = test_bit(NLP_DROPPED, &ndlp->nlp_flag);
|
||||
char name1[16], name2[16];
|
||||
unsigned long iflags;
|
||||
|
||||
@ -4849,7 +4847,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
if (node_dropped && old_state == NLP_STE_UNUSED_NODE &&
|
||||
state != NLP_STE_UNUSED_NODE) {
|
||||
ndlp->nlp_flag &= ~NLP_DROPPED;
|
||||
clear_bit(NLP_DROPPED, &ndlp->nlp_flag);
|
||||
lpfc_nlp_get(ndlp);
|
||||
}
|
||||
|
||||
@ -4857,7 +4855,7 @@ lpfc_nlp_set_state(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
state != NLP_STE_NPR_NODE)
|
||||
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
||||
if (old_state == NLP_STE_UNMAPPED_NODE) {
|
||||
ndlp->nlp_flag &= ~NLP_TGT_NO_SCSIID;
|
||||
clear_bit(NLP_TGT_NO_SCSIID, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type &= ~NLP_FC_NODE;
|
||||
}
|
||||
|
||||
@ -4954,14 +4952,8 @@ lpfc_drop_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
* reference from lpfc_nlp_init. If set, don't drop it again and
|
||||
* introduce an imbalance.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
if (!(ndlp->nlp_flag & NLP_DROPPED)) {
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (!test_and_set_bit(NLP_DROPPED, &ndlp->nlp_flag))
|
||||
lpfc_nlp_put(ndlp);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -5076,9 +5068,9 @@ lpfc_check_sli_ndlp(struct lpfc_hba *phba,
|
||||
} else if (pring->ringno == LPFC_FCP_RING) {
|
||||
/* Skip match check if waiting to relogin to FCP target */
|
||||
if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
|
||||
(ndlp->nlp_flag & NLP_DELAY_TMO)) {
|
||||
test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ulp_context == ndlp->nlp_rpi)
|
||||
return 1;
|
||||
}
|
||||
@ -5148,7 +5140,7 @@ lpfc_no_rpi(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
|
||||
* Everything that matches on txcmplq will be returned
|
||||
* by firmware with a no rpi error.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
|
||||
if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) {
|
||||
if (phba->sli_rev != LPFC_SLI_REV4)
|
||||
lpfc_sli3_dequeue_nport_iocbs(phba, ndlp, &completions);
|
||||
else
|
||||
@ -5182,29 +5174,19 @@ lpfc_nlp_logo_unreg(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
lpfc_issue_els_logo(vport, ndlp, 0);
|
||||
|
||||
/* Check to see if there are any deferred events to process */
|
||||
if ((ndlp->nlp_flag & NLP_UNREG_INP) &&
|
||||
(ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING)) {
|
||||
if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) &&
|
||||
ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"1434 UNREG cmpl deferred logo x%x "
|
||||
"on NPort x%x Data: x%x x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_defer_did, ndlp);
|
||||
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING;
|
||||
lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
|
||||
} else {
|
||||
/* NLP_RELEASE_RPI is only set for SLI4 ports. */
|
||||
if (ndlp->nlp_flag & NLP_RELEASE_RPI) {
|
||||
lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_RELEASE_RPI;
|
||||
ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
}
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
}
|
||||
|
||||
/* The node has an outstanding reference for the unreg. Now
|
||||
@ -5224,8 +5206,6 @@ static void
|
||||
lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp, LPFC_MBOXQ_t *mbox)
|
||||
{
|
||||
unsigned long iflags;
|
||||
|
||||
/* Driver always gets a reference on the mailbox job
|
||||
* in support of async jobs.
|
||||
*/
|
||||
@ -5233,9 +5213,8 @@ lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
if (!mbox->ctx_ndlp)
|
||||
return;
|
||||
|
||||
if (ndlp->nlp_flag & NLP_ISSUE_LOGO) {
|
||||
if (test_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag)) {
|
||||
mbox->mbox_cmpl = lpfc_nlp_logo_unreg;
|
||||
|
||||
} else if (phba->sli_rev == LPFC_SLI_REV4 &&
|
||||
!test_bit(FC_UNLOADING, &vport->load_flag) &&
|
||||
(bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >=
|
||||
@ -5243,13 +5222,6 @@ lpfc_set_unreg_login_mbx_cmpl(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
(kref_read(&ndlp->kref) > 0)) {
|
||||
mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr;
|
||||
} else {
|
||||
if (test_bit(FC_UNLOADING, &vport->load_flag)) {
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag |= NLP_RELEASE_RPI;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
}
|
||||
}
|
||||
mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
|
||||
}
|
||||
}
|
||||
@ -5271,13 +5243,13 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
int rc, acc_plogi = 1;
|
||||
uint16_t rpi;
|
||||
|
||||
if (ndlp->nlp_flag & NLP_RPI_REGISTERED ||
|
||||
ndlp->nlp_flag & NLP_REG_LOGIN_SEND) {
|
||||
if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
|
||||
if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag)) {
|
||||
if (test_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag))
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"3366 RPI x%x needs to be "
|
||||
"unregistered nlp_flag x%x "
|
||||
"unregistered nlp_flag x%lx "
|
||||
"did x%x\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_flag,
|
||||
ndlp->nlp_DID);
|
||||
@ -5285,11 +5257,11 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
/* If there is already an UNREG in progress for this ndlp,
|
||||
* no need to queue up another one.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_UNREG_INP) {
|
||||
if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"1436 unreg_rpi SKIP UNREG x%x on "
|
||||
"NPort x%x deferred x%x flg x%x "
|
||||
"NPort x%x deferred x%x flg x%lx "
|
||||
"Data: x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_defer_did,
|
||||
@ -5312,27 +5284,24 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Accept PLOGIs after unreg_rpi_cmpl. */
|
||||
if (mbox->mbox_cmpl == lpfc_sli4_unreg_rpi_cmpl_clr)
|
||||
/*
|
||||
* accept PLOGIs after unreg_rpi_cmpl
|
||||
*/
|
||||
acc_plogi = 0;
|
||||
if (((ndlp->nlp_DID & Fabric_DID_MASK) !=
|
||||
Fabric_DID_MASK) &&
|
||||
(!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)))
|
||||
ndlp->nlp_flag |= NLP_UNREG_INP;
|
||||
|
||||
if (!test_bit(FC_OFFLINE_MODE, &vport->fc_flag))
|
||||
set_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"1433 unreg_rpi UNREG x%x on "
|
||||
"NPort x%x deferred flg x%x "
|
||||
"NPort x%x deferred flg x%lx "
|
||||
"Data:x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, ndlp);
|
||||
|
||||
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
acc_plogi = 1;
|
||||
lpfc_nlp_put(ndlp);
|
||||
@ -5342,7 +5311,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"1444 Failed to allocate mempool "
|
||||
"unreg_rpi UNREG x%x, "
|
||||
"DID x%x, flag x%x, "
|
||||
"DID x%x, flag x%lx, "
|
||||
"ndlp x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, ndlp);
|
||||
@ -5352,7 +5321,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
* not unloading.
|
||||
*/
|
||||
if (!test_bit(FC_UNLOADING, &vport->load_flag)) {
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
lpfc_issue_els_logo(vport, ndlp, 0);
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
@ -5365,13 +5334,13 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
out:
|
||||
if (phba->sli_rev != LPFC_SLI_REV4)
|
||||
ndlp->nlp_rpi = 0;
|
||||
ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
clear_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
if (acc_plogi)
|
||||
ndlp->nlp_flag &= ~NLP_LOGO_ACC;
|
||||
clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
return 1;
|
||||
}
|
||||
ndlp->nlp_flag &= ~NLP_LOGO_ACC;
|
||||
clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5399,7 +5368,7 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba)
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
|
||||
spin_lock_irqsave(&vports[i]->fc_nodes_list_lock, iflags);
|
||||
list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) {
|
||||
if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
|
||||
if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) {
|
||||
/* The mempool_alloc might sleep */
|
||||
spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock,
|
||||
iflags);
|
||||
@ -5487,7 +5456,7 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
/* Cleanup node for NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
|
||||
"0900 Cleanup node for NPort x%x "
|
||||
"Data: x%x x%x x%x\n",
|
||||
"Data: x%lx x%x x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, ndlp->nlp_rpi);
|
||||
lpfc_dequeue_node(vport, ndlp);
|
||||
@ -5532,9 +5501,7 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
|
||||
lpfc_els_abort(phba, ndlp);
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
|
||||
ndlp->nlp_last_elscmd = 0;
|
||||
del_timer_sync(&ndlp->nlp_delayfunc);
|
||||
@ -5543,10 +5510,6 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
list_del_init(&ndlp->dev_loss_evt.evt_listp);
|
||||
list_del_init(&ndlp->recovery_evt.evt_listp);
|
||||
lpfc_cleanup_vports_rrqs(vport, ndlp);
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
ndlp->nlp_flag |= NLP_RELEASE_RPI;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5620,7 +5583,7 @@ __lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did)
|
||||
);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE,
|
||||
"0929 FIND node DID "
|
||||
"Data: x%px x%x x%x x%x x%x x%px\n",
|
||||
"Data: x%px x%x x%lx x%x x%x x%px\n",
|
||||
ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, data1, ndlp->nlp_rpi,
|
||||
ndlp->active_rrqs_xri_bitmap);
|
||||
@ -5667,7 +5630,7 @@ lpfc_findnode_mapped(struct lpfc_vport *vport)
|
||||
iflags);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE,
|
||||
"2025 FIND node DID MAPPED "
|
||||
"Data: x%px x%x x%x x%x x%px\n",
|
||||
"Data: x%px x%x x%lx x%x x%px\n",
|
||||
ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, data1,
|
||||
ndlp->active_rrqs_xri_bitmap);
|
||||
@ -5701,13 +5664,11 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6453 Setup New Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%lx\n",
|
||||
"Data:x%lx x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
return ndlp;
|
||||
}
|
||||
|
||||
@ -5726,7 +5687,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6455 Setup RSCN Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%lx\n",
|
||||
"Data:x%lx x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
@ -5744,13 +5705,11 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
}
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6456 Skip Setup RSCN Node x%x "
|
||||
"Data:x%x x%x x%lx\n",
|
||||
"Data:x%lx x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
ndlp = NULL;
|
||||
@ -5758,7 +5717,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"6457 Setup Active Node 2B_DISC x%x "
|
||||
"Data:x%x x%x x%lx\n",
|
||||
"Data:x%lx x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_state, vport->fc_flag);
|
||||
|
||||
@ -5769,7 +5728,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
if (ndlp->nlp_state == NLP_STE_ADISC_ISSUE ||
|
||||
ndlp->nlp_state == NLP_STE_PLOGI_ISSUE ||
|
||||
(!vport->phba->nvmet_support &&
|
||||
ndlp->nlp_flag & NLP_RCV_PLOGI))
|
||||
test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag)))
|
||||
return NULL;
|
||||
|
||||
if (vport->phba->nvmet_support)
|
||||
@ -5779,10 +5738,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
* allows for rediscovery
|
||||
*/
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
}
|
||||
return ndlp;
|
||||
}
|
||||
@ -6153,7 +6109,7 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport)
|
||||
/* Clean up the ndlp on Fabric connections */
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
|
||||
} else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
|
||||
} else if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) {
|
||||
/* Fail outstanding IO now since device
|
||||
* is marked for PLOGI.
|
||||
*/
|
||||
@ -6366,11 +6322,11 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
|
||||
if (phba->sli_rev < LPFC_SLI_REV4)
|
||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
ndlp->nlp_type |= NLP_FABRIC;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY,
|
||||
"0004 rpi:%x DID:%x flg:%x %d x%px\n",
|
||||
"0004 rpi:%x DID:%x flg:%lx %d x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
kref_read(&ndlp->kref),
|
||||
ndlp);
|
||||
@ -6420,7 +6376,7 @@ __lpfc_find_node(struct lpfc_vport *vport, node_filter filter, void *param)
|
||||
if (filter(ndlp, param)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE_VERBOSE,
|
||||
"3185 FIND node filter %ps DID "
|
||||
"ndlp x%px did x%x flg x%x st x%x "
|
||||
"ndlp x%px did x%x flg x%lx st x%x "
|
||||
"xri x%x type x%x rpi x%x\n",
|
||||
filter, ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, ndlp->nlp_state,
|
||||
@ -6555,9 +6511,10 @@ lpfc_nlp_init(struct lpfc_vport *vport, uint32_t did)
|
||||
INIT_LIST_HEAD(&ndlp->nlp_listp);
|
||||
if (vport->phba->sli_rev == LPFC_SLI_REV4) {
|
||||
ndlp->nlp_rpi = rpi;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_DISCOVERY,
|
||||
"0007 Init New ndlp x%px, rpi:x%x DID:%x "
|
||||
"flg:x%x refcnt:%d\n",
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_ELS | LOG_NODE | LOG_DISCOVERY,
|
||||
"0007 Init New ndlp x%px, rpi:x%x DID:x%x "
|
||||
"flg:x%lx refcnt:%d\n",
|
||||
ndlp, ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, kref_read(&ndlp->kref));
|
||||
|
||||
@ -6589,7 +6546,7 @@ lpfc_nlp_release(struct kref *kref)
|
||||
struct lpfc_vport *vport = ndlp->vport;
|
||||
|
||||
lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE,
|
||||
"node release: did:x%x flg:x%x type:x%x",
|
||||
"node release: did:x%x flg:x%lx type:x%x",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_type);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
|
||||
@ -6601,19 +6558,12 @@ lpfc_nlp_release(struct kref *kref)
|
||||
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
||||
lpfc_cleanup_node(vport, ndlp);
|
||||
|
||||
/* Not all ELS transactions have registered the RPI with the port.
|
||||
* In these cases the rpi usage is temporary and the node is
|
||||
* released when the WQE is completed. Catch this case to free the
|
||||
* RPI to the pool. Because this node is in the release path, a lock
|
||||
* is unnecessary. All references are gone and the node has been
|
||||
* dequeued.
|
||||
/* All nodes are initialized with an RPI that needs to be released
|
||||
* now. All references are gone and the node has been dequeued.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_RELEASE_RPI) {
|
||||
if (ndlp->nlp_rpi != LPFC_RPI_ALLOC_ERROR &&
|
||||
!(ndlp->nlp_flag & (NLP_RPI_REGISTERED | NLP_UNREG_INP))) {
|
||||
lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi);
|
||||
ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
|
||||
}
|
||||
if (vport->phba->sli_rev == LPFC_SLI_REV4) {
|
||||
lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi);
|
||||
ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
|
||||
}
|
||||
|
||||
/* The node is not freed back to memory, it is released to a pool so
|
||||
@ -6642,7 +6592,7 @@ lpfc_nlp_get(struct lpfc_nodelist *ndlp)
|
||||
|
||||
if (ndlp) {
|
||||
lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE,
|
||||
"node get: did:x%x flg:x%x refcnt:x%x",
|
||||
"node get: did:x%x flg:x%lx refcnt:x%x",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
kref_read(&ndlp->kref));
|
||||
|
||||
@ -6674,7 +6624,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
if (ndlp) {
|
||||
lpfc_debugfs_disc_trc(ndlp->vport, LPFC_DISC_TRC_NODE,
|
||||
"node put: did:x%x flg:x%x refcnt:x%x",
|
||||
"node put: did:x%x flg:x%lx refcnt:x%x",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
kref_read(&ndlp->kref));
|
||||
} else {
|
||||
@ -6727,11 +6677,12 @@ lpfc_fcf_inuse(struct lpfc_hba *phba)
|
||||
spin_unlock_irqrestore(&vports[i]->fc_nodes_list_lock,
|
||||
iflags);
|
||||
goto out;
|
||||
} else if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
|
||||
} else if (test_bit(NLP_RPI_REGISTERED,
|
||||
&ndlp->nlp_flag)) {
|
||||
ret = 1;
|
||||
lpfc_printf_log(phba, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"2624 RPI %x DID %x flag %x "
|
||||
"2624 RPI %x DID %x flag %lx "
|
||||
"still logged in\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag);
|
||||
|
@ -1943,6 +1943,7 @@ lpfc_sli4_port_sta_fn_reset(struct lpfc_hba *phba, int mbx_action,
|
||||
|
||||
lpfc_offline_prep(phba, mbx_action);
|
||||
lpfc_sli_flush_io_rings(phba);
|
||||
lpfc_nvmels_flush_cmd(phba);
|
||||
lpfc_offline(phba);
|
||||
/* release interrupt for possible resource change */
|
||||
lpfc_sli4_disable_intr(phba);
|
||||
@ -3092,7 +3093,8 @@ lpfc_cleanup(struct lpfc_vport *vport)
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_ERR,
|
||||
LOG_DISCOVERY,
|
||||
"0282 did:x%x ndlp:x%px "
|
||||
"refcnt:%d xflags x%x nflag x%x\n",
|
||||
"refcnt:%d xflags x%x "
|
||||
"nflag x%lx\n",
|
||||
ndlp->nlp_DID, (void *)ndlp,
|
||||
kref_read(&ndlp->kref),
|
||||
ndlp->fc4_xpt_flags,
|
||||
@ -3379,7 +3381,7 @@ lpfc_block_mgmt_io(struct lpfc_hba *phba, int mbx_action)
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli4_node_prep - Assign RPIs for active nodes.
|
||||
* lpfc_sli4_node_rpi_restore - Recover assigned RPIs for active nodes.
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
*
|
||||
* Allocate RPIs for all active remote nodes. This is needed whenever
|
||||
@ -3387,7 +3389,7 @@ lpfc_block_mgmt_io(struct lpfc_hba *phba, int mbx_action)
|
||||
* is to fixup the temporary rpi assignments.
|
||||
**/
|
||||
void
|
||||
lpfc_sli4_node_prep(struct lpfc_hba *phba)
|
||||
lpfc_sli4_node_rpi_restore(struct lpfc_hba *phba)
|
||||
{
|
||||
struct lpfc_nodelist *ndlp, *next_ndlp;
|
||||
struct lpfc_vport **vports;
|
||||
@ -3397,10 +3399,10 @@ lpfc_sli4_node_prep(struct lpfc_hba *phba)
|
||||
return;
|
||||
|
||||
vports = lpfc_create_vport_work_array(phba);
|
||||
if (vports == NULL)
|
||||
if (!vports)
|
||||
return;
|
||||
|
||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
|
||||
for (i = 0; i <= phba->max_vports && vports[i]; i++) {
|
||||
if (test_bit(FC_UNLOADING, &vports[i]->load_flag))
|
||||
continue;
|
||||
|
||||
@ -3409,14 +3411,20 @@ lpfc_sli4_node_prep(struct lpfc_hba *phba)
|
||||
nlp_listp) {
|
||||
rpi = lpfc_sli4_alloc_rpi(phba);
|
||||
if (rpi == LPFC_RPI_ALLOC_ERROR) {
|
||||
/* TODO print log? */
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"0099 RPI alloc error for "
|
||||
"ndlp x%px DID:x%06x "
|
||||
"flg:x%lx\n",
|
||||
ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag);
|
||||
continue;
|
||||
}
|
||||
ndlp->nlp_rpi = rpi;
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"0009 Assign RPI x%x to ndlp x%px "
|
||||
"DID:x%06x flg:x%x\n",
|
||||
"DID:x%06x flg:x%lx\n",
|
||||
ndlp->nlp_rpi, ndlp, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag);
|
||||
}
|
||||
@ -3820,35 +3828,12 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)
|
||||
&vports[i]->fc_nodes,
|
||||
nlp_listp) {
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
if (offline || hba_pci_err) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_UNREG_INP |
|
||||
NLP_RPI_REGISTERED);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
lpfc_sli_rpi_release(vports[i],
|
||||
ndlp);
|
||||
} else {
|
||||
lpfc_unreg_rpi(vports[i], ndlp);
|
||||
}
|
||||
/*
|
||||
* Whenever an SLI4 port goes offline, free the
|
||||
* RPI. Get a new RPI when the adapter port
|
||||
* comes back online.
|
||||
*/
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
lpfc_printf_vlog(vports[i], KERN_INFO,
|
||||
LOG_NODE | LOG_DISCOVERY,
|
||||
"0011 Free RPI x%x on "
|
||||
"ndlp: x%px did x%x\n",
|
||||
ndlp->nlp_rpi, ndlp,
|
||||
ndlp->nlp_DID);
|
||||
lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi);
|
||||
ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
|
||||
clear_bit(NLP_UNREG_INP,
|
||||
&ndlp->nlp_flag);
|
||||
clear_bit(NLP_RPI_REGISTERED,
|
||||
&ndlp->nlp_flag);
|
||||
}
|
||||
|
||||
if (ndlp->nlp_type & NLP_FABRIC) {
|
||||
@ -6925,9 +6910,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
|
||||
*/
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_FDISC;
|
||||
vport->port_state = LPFC_FDISC;
|
||||
} else {
|
||||
@ -13518,6 +13501,8 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba)
|
||||
/* Disable FW logging to host memory */
|
||||
lpfc_ras_stop_fwlog(phba);
|
||||
|
||||
lpfc_sli4_queue_unset(phba);
|
||||
|
||||
/* Reset SLI4 HBA FCoE function */
|
||||
lpfc_pci_function_reset(phba);
|
||||
|
||||
|
@ -65,7 +65,7 @@ lpfc_check_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct lpfc_name *nn, struct lpfc_name *pn)
|
||||
{
|
||||
/* First, we MUST have a RPI registered */
|
||||
if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED))
|
||||
if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag))
|
||||
return 0;
|
||||
|
||||
/* Compare the ADISC rsp WWNN / WWPN matches our internal node
|
||||
@ -239,7 +239,7 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
|
||||
/* Abort outstanding I/O on NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"2819 Abort outstanding I/O on NPort x%x "
|
||||
"Data: x%x x%x x%x\n",
|
||||
"Data: x%lx x%x x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
|
||||
ndlp->nlp_rpi);
|
||||
/* Clean up all fabric IOs first.*/
|
||||
@ -340,7 +340,7 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox)
|
||||
|
||||
/* Now process the REG_RPI cmpl */
|
||||
lpfc_mbx_cmpl_reg_login(phba, login_mbox);
|
||||
ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
|
||||
clear_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag);
|
||||
kfree(save_iocb);
|
||||
}
|
||||
|
||||
@ -404,7 +404,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
/* PLOGI chkparm OK */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0114 PLOGI chkparm OK Data: x%x x%x x%x "
|
||||
"0114 PLOGI chkparm OK Data: x%x x%x x%lx "
|
||||
"x%x x%x x%lx\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state, ndlp->nlp_flag,
|
||||
ndlp->nlp_rpi, vport->port_state,
|
||||
@ -429,7 +429,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* if already logged in, do implicit logout */
|
||||
switch (ndlp->nlp_state) {
|
||||
case NLP_STE_NPR_NODE:
|
||||
if (!(ndlp->nlp_flag & NLP_NPR_ADISC))
|
||||
if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag))
|
||||
break;
|
||||
fallthrough;
|
||||
case NLP_STE_REG_LOGIN_ISSUE:
|
||||
@ -449,7 +449,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
|
||||
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER;
|
||||
ndlp->nlp_flag &= ~NLP_FIRSTBURST;
|
||||
clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag);
|
||||
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb,
|
||||
ndlp, NULL);
|
||||
@ -480,7 +480,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
|
||||
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER;
|
||||
ndlp->nlp_flag &= ~NLP_FIRSTBURST;
|
||||
clear_bit(NLP_FIRSTBURST, &ndlp->nlp_flag);
|
||||
|
||||
login_mbox = NULL;
|
||||
link_mbox = NULL;
|
||||
@ -552,13 +552,13 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
lpfc_can_disctmo(vport);
|
||||
}
|
||||
|
||||
ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP;
|
||||
clear_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag);
|
||||
if ((phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) &&
|
||||
sp->cmn.valid_vendor_ver_level) {
|
||||
vid = be32_to_cpu(sp->un.vv.vid);
|
||||
flag = be32_to_cpu(sp->un.vv.flags);
|
||||
if ((vid == LPFC_VV_EMLX_ID) && (flag & LPFC_VV_SUPPRESS_RSP))
|
||||
ndlp->nlp_flag |= NLP_SUPPRESS_RSP;
|
||||
set_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag);
|
||||
}
|
||||
|
||||
login_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
@ -627,10 +627,9 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
* this ELS request. The only way to do this is
|
||||
* to register, then unregister the RPI.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= (NLP_RM_DFLT_RPI | NLP_ACC_REGLOGIN |
|
||||
NLP_RCV_PLOGI);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_RM_DFLT_RPI, &ndlp->nlp_flag);
|
||||
set_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag);
|
||||
set_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag);
|
||||
}
|
||||
|
||||
stat.un.b.lsRjtRsnCode = LSRJT_INVALID_CMD;
|
||||
@ -665,9 +664,8 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
login_mbox->ctx_u.save_iocb = save_iocb; /* For PLOGI ACC */
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag);
|
||||
set_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag);
|
||||
|
||||
/* Start the ball rolling by issuing REG_LOGIN here */
|
||||
rc = lpfc_sli_issue_mbox(phba, login_mbox, MBX_NOWAIT);
|
||||
@ -797,7 +795,7 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
*/
|
||||
if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
|
||||
if ((ndlp->nlp_state != NLP_STE_MAPPED_NODE) &&
|
||||
!(ndlp->nlp_flag & NLP_NPR_ADISC))
|
||||
!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag))
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
NLP_STE_MAPPED_NODE);
|
||||
}
|
||||
@ -814,9 +812,7 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* 1 sec timeout */
|
||||
mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000));
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
@ -835,9 +831,7 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* Only call LOGO ACC for first LOGO, this avoids sending unnecessary
|
||||
* PLOGIs during LOGO storms from a device.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_LOGO_ACC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
if (els_cmd == ELS_CMD_PRLO)
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
|
||||
else
|
||||
@ -890,9 +884,7 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
*/
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_FDISC;
|
||||
vport->port_state = LPFC_FDISC;
|
||||
} else {
|
||||
@ -915,14 +907,12 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_state <= NLP_STE_PRLI_ISSUE)) {
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000 * 1));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_ELS | LOG_DISCOVERY,
|
||||
"3204 Start nlpdelay on DID x%06x "
|
||||
"nflag x%x lastels x%x ref cnt %u",
|
||||
"nflag x%lx lastels x%x ref cnt %u",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_last_elscmd,
|
||||
kref_read(&ndlp->kref));
|
||||
@ -935,9 +925,7 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
/* The driver has to wait until the ACC completes before it continues
|
||||
* processing the LOGO. The action will resume in
|
||||
* lpfc_cmpl_els_logo_acc routine. Since part of processing includes an
|
||||
@ -978,7 +966,7 @@ lpfc_rcv_prli_support_check(struct lpfc_vport *vport,
|
||||
out:
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY,
|
||||
"6115 Rcv PRLI (%x) check failed: ndlp rpi %d "
|
||||
"state x%x flags x%x port_type: x%x "
|
||||
"state x%x flags x%lx port_type: x%x "
|
||||
"npr->initfcn: x%x npr->tgtfcn: x%x\n",
|
||||
cmd, ndlp->nlp_rpi, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, vport->port_type,
|
||||
@ -1020,7 +1008,7 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
if (npr->prliType == PRLI_NVME_TYPE)
|
||||
ndlp->nlp_type |= NLP_NVME_TARGET;
|
||||
if (npr->writeXferRdyDis)
|
||||
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||
set_bit(NLP_FIRSTBURST, &ndlp->nlp_flag);
|
||||
}
|
||||
if (npr->Retry && ndlp->nlp_type &
|
||||
(NLP_FCP_INITIATOR | NLP_FCP_TARGET))
|
||||
@ -1057,7 +1045,7 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
roles |= FC_RPORT_ROLE_FCP_TARGET;
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_RPORT,
|
||||
"rport rolechg: role:x%x did:x%x flg:x%x",
|
||||
"rport rolechg: role:x%x did:x%x flg:x%lx",
|
||||
roles, ndlp->nlp_DID, ndlp->nlp_flag);
|
||||
|
||||
if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME)
|
||||
@ -1068,10 +1056,8 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
static uint32_t
|
||||
lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED)) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) {
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1081,16 +1067,12 @@ lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
(test_bit(FC_RSCN_MODE, &vport->fc_flag) ||
|
||||
((ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) &&
|
||||
(ndlp->nlp_type & NLP_FCP_TARGET)))) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
return 0;
|
||||
}
|
||||
@ -1115,10 +1097,10 @@ lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
/* If there is already an UNREG in progress for this ndlp,
|
||||
* no need to queue up another one.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_UNREG_INP) {
|
||||
if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"1435 release_rpi SKIP UNREG x%x on "
|
||||
"NPort x%x deferred x%x flg x%x "
|
||||
"NPort x%x deferred x%x flg x%lx "
|
||||
"Data: x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_defer_did,
|
||||
@ -1143,11 +1125,11 @@ lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport,
|
||||
|
||||
if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
|
||||
(!test_bit(FC_OFFLINE_MODE, &vport->fc_flag)))
|
||||
ndlp->nlp_flag |= NLP_UNREG_INP;
|
||||
set_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"1437 release_rpi UNREG x%x "
|
||||
"on NPort x%x flg x%x\n",
|
||||
"on NPort x%x flg x%lx\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag);
|
||||
|
||||
rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
|
||||
@ -1175,7 +1157,7 @@ lpfc_disc_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
}
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0271 Illegal State Transition: node x%x "
|
||||
"event x%x, state x%x Data: x%x x%x\n",
|
||||
"event x%x, state x%x Data: x%x x%lx\n",
|
||||
ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi,
|
||||
ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
@ -1190,13 +1172,12 @@ lpfc_cmpl_plogi_illegal(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
* working on the same NPortID, do nothing for this thread
|
||||
* to stop it.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_RCV_PLOGI)) {
|
||||
if (!test_bit(NLP_RCV_PLOGI, &ndlp->nlp_flag))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0272 Illegal State Transition: node x%x "
|
||||
"event x%x, state x%x Data: x%x x%x\n",
|
||||
"event x%x, state x%x Data: x%x x%lx\n",
|
||||
ndlp->nlp_DID, evt, ndlp->nlp_state,
|
||||
ndlp->nlp_rpi, ndlp->nlp_flag);
|
||||
}
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
|
||||
@ -1230,9 +1211,7 @@ lpfc_rcv_logo_unused_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
{
|
||||
struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_LOGO_ACC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
|
||||
|
||||
return ndlp->nlp_state;
|
||||
@ -1290,11 +1269,9 @@ lpfc_rcv_plogi_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
NULL);
|
||||
} else {
|
||||
if (lpfc_rcv_plogi(vport, ndlp, cmdiocb) &&
|
||||
(ndlp->nlp_flag & NLP_NPR_2B_DISC) &&
|
||||
(vport->num_disc_nodes)) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag) &&
|
||||
vport->num_disc_nodes) {
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
/* Check if there are more PLOGIs to be sent */
|
||||
lpfc_more_plogi(vport);
|
||||
if (vport->num_disc_nodes == 0) {
|
||||
@ -1356,9 +1333,7 @@ lpfc_rcv_els_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
/* Put ndlp in npr state set plogi timer for 1 sec */
|
||||
mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000 * 1));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
@ -1389,7 +1364,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
|
||||
if (test_bit(NLP_ACC_REGLOGIN, &ndlp->nlp_flag)) {
|
||||
/* Recovery from PLOGI collision logic */
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -1418,7 +1393,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
goto out;
|
||||
/* PLOGI chkparm OK */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0121 PLOGI chkparm OK Data: x%x x%x x%x x%x\n",
|
||||
"0121 PLOGI chkparm OK Data: x%x x%x x%lx x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
if (vport->cfg_fcp_class == 2 && (sp->cls2.classValid))
|
||||
@ -1446,14 +1421,14 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
ed_tov = (phba->fc_edtov + 999999) / 1000000;
|
||||
}
|
||||
|
||||
ndlp->nlp_flag &= ~NLP_SUPPRESS_RSP;
|
||||
clear_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag);
|
||||
if ((phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) &&
|
||||
sp->cmn.valid_vendor_ver_level) {
|
||||
vid = be32_to_cpu(sp->un.vv.vid);
|
||||
flag = be32_to_cpu(sp->un.vv.flags);
|
||||
if ((vid == LPFC_VV_EMLX_ID) &&
|
||||
(flag & LPFC_VV_SUPPRESS_RSP))
|
||||
ndlp->nlp_flag |= NLP_SUPPRESS_RSP;
|
||||
set_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1476,7 +1451,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
LOG_TRACE_EVENT,
|
||||
"0133 PLOGI: no memory "
|
||||
"for config_link "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
goto out;
|
||||
@ -1500,7 +1475,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
if (!mbox) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0018 PLOGI: no memory for reg_login "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
goto out;
|
||||
@ -1520,7 +1495,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
mbox->mbox_cmpl = lpfc_mbx_cmpl_fdmi_reg_login;
|
||||
break;
|
||||
default:
|
||||
ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
|
||||
set_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
|
||||
}
|
||||
|
||||
@ -1535,8 +1510,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
NLP_STE_REG_LOGIN_ISSUE);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
/* decrement node reference count to the failed mbox
|
||||
* command
|
||||
*/
|
||||
@ -1544,7 +1518,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0134 PLOGI: cannot issue reg_login "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
} else {
|
||||
@ -1552,7 +1526,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0135 PLOGI: cannot format reg_login "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%lx x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
}
|
||||
@ -1605,18 +1579,15 @@ static uint32_t
|
||||
lpfc_device_rm_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NODEV_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
} else {
|
||||
/* software abort outstanding PLOGI */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
/* software abort outstanding PLOGI */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -1636,9 +1607,8 @@ lpfc_device_recov_plogi_issue(struct lpfc_vport *vport,
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_PLOGI_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -1656,10 +1626,7 @@ lpfc_rcv_plogi_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
|
||||
if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) {
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_and_clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
if (vport->num_disc_nodes)
|
||||
lpfc_more_adisc(vport);
|
||||
}
|
||||
@ -1748,9 +1715,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport,
|
||||
/* 1 sec timeout */
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
|
||||
@ -1789,18 +1754,15 @@ static uint32_t
|
||||
lpfc_device_rm_adisc_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NODEV_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
} else {
|
||||
/* software abort outstanding ADISC */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
/* software abort outstanding ADISC */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -1820,9 +1782,8 @@ lpfc_device_recov_adisc_issue(struct lpfc_vport *vport,
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_disc_set_adisc(vport, ndlp);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -1856,7 +1817,7 @@ lpfc_rcv_prli_reglogin_issue(struct lpfc_vport *vport,
|
||||
* transition to UNMAPPED provided the RPI has completed
|
||||
* registration.
|
||||
*/
|
||||
if (ndlp->nlp_flag & NLP_RPI_REGISTERED) {
|
||||
if (test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag)) {
|
||||
lpfc_rcv_prli(vport, ndlp, cmdiocb);
|
||||
lpfc_els_rsp_prli_acc(vport, cmdiocb, ndlp);
|
||||
} else {
|
||||
@ -1895,7 +1856,7 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport,
|
||||
if ((mb = phba->sli.mbox_active)) {
|
||||
if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) &&
|
||||
(ndlp == mb->ctx_ndlp)) {
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
mb->ctx_ndlp = NULL;
|
||||
mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
|
||||
@ -1906,7 +1867,7 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport,
|
||||
list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) {
|
||||
if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) &&
|
||||
(ndlp == mb->ctx_ndlp)) {
|
||||
ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
|
||||
clear_bit(NLP_REG_LOGIN_SEND, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
list_del(&mb->list);
|
||||
phba->sli.mboxq_cnt--;
|
||||
@ -1976,9 +1937,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport,
|
||||
/* Put ndlp in npr state set plogi timer for 1 sec */
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000 * 1));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
|
||||
lpfc_issue_els_logo(vport, ndlp, 0);
|
||||
@ -1989,7 +1948,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport,
|
||||
if (phba->sli_rev < LPFC_SLI_REV4)
|
||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||
|
||||
ndlp->nlp_flag |= NLP_RPI_REGISTERED;
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
|
||||
/* Only if we are not a fabric nport do we issue PRLI */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
@ -2061,15 +2020,12 @@ lpfc_device_rm_reglogin_issue(struct lpfc_vport *vport,
|
||||
void *arg,
|
||||
uint32_t evt)
|
||||
{
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NODEV_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
} else {
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -2084,17 +2040,16 @@ lpfc_device_recov_reglogin_issue(struct lpfc_vport *vport,
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
|
||||
/* If we are a target we won't immediately transition into PRLI,
|
||||
* so if REG_LOGIN already completed we don't need to ignore it.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED) ||
|
||||
if (!test_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag) ||
|
||||
!vport->phba->nvmet_support)
|
||||
ndlp->nlp_flag |= NLP_IGNR_REG_CMPL;
|
||||
set_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag);
|
||||
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_disc_set_adisc(vport, ndlp);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -2228,7 +2183,8 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
if (npr->targetFunc) {
|
||||
ndlp->nlp_type |= NLP_FCP_TARGET;
|
||||
if (npr->writeXferRdyDis)
|
||||
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||
set_bit(NLP_FIRSTBURST,
|
||||
&ndlp->nlp_flag);
|
||||
}
|
||||
if (npr->Retry)
|
||||
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
||||
@ -2272,7 +2228,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* Both sides support FB. The target's first
|
||||
* burst size is a 512 byte encoded value.
|
||||
*/
|
||||
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||
set_bit(NLP_FIRSTBURST, &ndlp->nlp_flag);
|
||||
ndlp->nvme_fb_size = bf_get_be32(prli_fb_sz,
|
||||
nvpr);
|
||||
|
||||
@ -2287,7 +2243,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
||||
"6029 NVME PRLI Cmpl w1 x%08x "
|
||||
"w4 x%08x w5 x%08x flag x%x, "
|
||||
"w4 x%08x w5 x%08x flag x%lx, "
|
||||
"fcp_info x%x nlp_type x%x\n",
|
||||
be32_to_cpu(nvpr->word1),
|
||||
be32_to_cpu(nvpr->word4),
|
||||
@ -2299,9 +2255,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
(vport->port_type == LPFC_NPIV_PORT) &&
|
||||
vport->cfg_restrict_login) {
|
||||
out:
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_TARGET_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_TARGET_REMOVE, &ndlp->nlp_flag);
|
||||
lpfc_issue_els_logo(vport, ndlp, 0);
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
|
||||
@ -2353,18 +2307,15 @@ static uint32_t
|
||||
lpfc_device_rm_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NODEV_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
} else {
|
||||
/* software abort outstanding PLOGI */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
/* software abort outstanding PLOGI */
|
||||
lpfc_els_abort(vport->phba, ndlp);
|
||||
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
|
||||
|
||||
@ -2401,9 +2352,8 @@ lpfc_device_recov_prli_issue(struct lpfc_vport *vport,
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_disc_set_adisc(vport, ndlp);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -2442,9 +2392,7 @@ lpfc_rcv_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
{
|
||||
struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *)arg;
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_LOGO_ACC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -2483,9 +2431,8 @@ lpfc_cmpl_logo_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
{
|
||||
ndlp->nlp_prev_state = NLP_STE_LOGO_ISSUE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
lpfc_disc_set_adisc(vport, ndlp);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -2591,8 +2538,9 @@ lpfc_device_recov_unmap_node(struct lpfc_vport *vport,
|
||||
{
|
||||
ndlp->nlp_prev_state = NLP_STE_UNMAPPED_NODE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
lpfc_disc_set_adisc(vport, ndlp);
|
||||
@ -2653,9 +2601,7 @@ lpfc_rcv_prlo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
lpfc_sli_abort_iocb(vport, ndlp->nlp_sid, 0, LPFC_CTX_TGT);
|
||||
|
||||
/* Send PRLO_ACC */
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_LOGO_ACC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
|
||||
|
||||
/* Save ELS_CMD_PRLO as the last elscmd and then set to NPR.
|
||||
@ -2665,7 +2611,7 @@ lpfc_rcv_prlo_mapped_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
ndlp->nlp_prev_state = ndlp->nlp_state;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE | LOG_ELS | LOG_DISCOVERY,
|
||||
"3422 DID x%06x nflag x%x lastels x%x ref cnt %u\n",
|
||||
"3422 DID x%06x nflag x%lx lastels x%x ref cnt %u\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_last_elscmd,
|
||||
kref_read(&ndlp->kref));
|
||||
@ -2685,8 +2631,9 @@ lpfc_device_recov_mapped_node(struct lpfc_vport *vport,
|
||||
|
||||
ndlp->nlp_prev_state = NLP_STE_MAPPED_NODE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
return ndlp->nlp_state;
|
||||
@ -2699,16 +2646,16 @@ lpfc_rcv_plogi_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
|
||||
/* Ignore PLOGI if we have an outstanding LOGO */
|
||||
if (ndlp->nlp_flag & (NLP_LOGO_SND | NLP_LOGO_ACC))
|
||||
if (test_bit(NLP_LOGO_SND, &ndlp->nlp_flag) ||
|
||||
test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag))
|
||||
return ndlp->nlp_state;
|
||||
if (lpfc_rcv_plogi(vport, ndlp, cmdiocb)) {
|
||||
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NPR_ADISC | NLP_NPR_2B_DISC);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
} else if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
} else if (!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
/* send PLOGI immediately, move to PLOGI issue state */
|
||||
if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
|
||||
if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) {
|
||||
ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
|
||||
lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
|
||||
@ -2729,14 +2676,14 @@ lpfc_rcv_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
|
||||
lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
|
||||
|
||||
if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
|
||||
if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) {
|
||||
/*
|
||||
* ADISC nodes will be handled in regular discovery path after
|
||||
* receiving response from NS.
|
||||
*
|
||||
* For other nodes, Send PLOGI to trigger an implicit LOGO.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
|
||||
if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) {
|
||||
ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
|
||||
lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
|
||||
@ -2767,15 +2714,15 @@ lpfc_rcv_padisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
* or discovery in progress for this node. Starting discovery
|
||||
* here will affect the counting of discovery threads.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_DELAY_TMO) &&
|
||||
!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
|
||||
if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag) &&
|
||||
!test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
/*
|
||||
* ADISC nodes will be handled in regular discovery path after
|
||||
* receiving response from NS.
|
||||
*
|
||||
* For other nodes, Send PLOGI to trigger an implicit LOGO.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
|
||||
if (!test_bit(NLP_NPR_ADISC, &ndlp->nlp_flag)) {
|
||||
ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
|
||||
lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
|
||||
@ -2790,24 +2737,18 @@ lpfc_rcv_prlo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
{
|
||||
struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_LOGO_ACC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
|
||||
lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
|
||||
|
||||
if ((ndlp->nlp_flag & NLP_DELAY_TMO) == 0) {
|
||||
if (!test_bit(NLP_DELAY_TMO, &ndlp->nlp_flag)) {
|
||||
mod_timer(&ndlp->nlp_delayfunc,
|
||||
jiffies + msecs_to_jiffies(1000 * 1));
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_DELAY_TMO;
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
set_bit(NLP_DELAY_TMO, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
} else {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
clear_bit(NLP_NPR_ADISC, &ndlp->nlp_flag);
|
||||
}
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@ -2844,7 +2785,7 @@ lpfc_cmpl_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
|
||||
if (ulp_status && test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) {
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
@ -2877,7 +2818,7 @@ lpfc_cmpl_adisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
|
||||
ulp_status = get_job_ulpstatus(phba, rspiocb);
|
||||
|
||||
if (ulp_status && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
|
||||
if (ulp_status && test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) {
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
@ -2896,12 +2837,11 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_vport *vport,
|
||||
/* SLI4 ports have preallocated logical rpis. */
|
||||
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) {
|
||||
set_bit(NLP_RPI_REGISTERED, &ndlp->nlp_flag);
|
||||
if (test_bit(NLP_LOGO_ACC, &ndlp->nlp_flag))
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
}
|
||||
} else {
|
||||
if (ndlp->nlp_flag & NLP_NODEV_REMOVE) {
|
||||
if (test_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag)) {
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
@ -2913,10 +2853,8 @@ static uint32_t
|
||||
lpfc_device_rm_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
void *arg, uint32_t evt)
|
||||
{
|
||||
if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NODEV_REMOVE;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (test_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag)) {
|
||||
set_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
@ -2932,8 +2870,9 @@ lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
return ndlp->nlp_state;
|
||||
|
||||
lpfc_cancel_retry_delay_tmo(vport, ndlp);
|
||||
clear_bit(NLP_NODEV_REMOVE, &ndlp->nlp_flag);
|
||||
clear_bit(NLP_NPR_2B_DISC, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
|
||||
ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
return ndlp->nlp_state;
|
||||
@ -3146,7 +3085,7 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
/* DSM in event <evt> on NPort <nlp_DID> in state <cur_state> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0211 DSM in event x%x on NPort x%x in "
|
||||
"state %d rpi x%x Data: x%x x%x\n",
|
||||
"state %d rpi x%x Data: x%lx x%x\n",
|
||||
evt, ndlp->nlp_DID, cur_state, ndlp->nlp_rpi,
|
||||
ndlp->nlp_flag, data1);
|
||||
|
||||
@ -3163,12 +3102,12 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
((uint32_t)ndlp->nlp_type));
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
"0212 DSM out state %d on NPort x%x "
|
||||
"rpi x%x Data: x%x x%x\n",
|
||||
"rpi x%x Data: x%lx x%x\n",
|
||||
rc, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_flag,
|
||||
data1);
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM,
|
||||
"DSM out: ste:%d did:x%x flg:x%x",
|
||||
"DSM out: ste:%d did:x%x flg:x%lx",
|
||||
rc, ndlp->nlp_DID, ndlp->nlp_flag);
|
||||
/* Decrement the ndlp reference count held for this function */
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
@ -1232,7 +1232,7 @@ lpfc_nvme_prep_io_cmd(struct lpfc_vport *vport,
|
||||
|
||||
/* Word 5 */
|
||||
if ((phba->cfg_nvme_enable_fb) &&
|
||||
(pnode->nlp_flag & NLP_FIRSTBURST)) {
|
||||
test_bit(NLP_FIRSTBURST, &pnode->nlp_flag)) {
|
||||
req_len = lpfc_ncmd->nvmeCmd->payload_length;
|
||||
if (req_len < pnode->nvme_fb_size)
|
||||
wqe->fcp_iwrite.initial_xfer_len =
|
||||
@ -2231,6 +2231,7 @@ lpfc_nvme_lport_unreg_wait(struct lpfc_vport *vport,
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_sli4_hdw_queue *qp;
|
||||
int abts_scsi, abts_nvme;
|
||||
u16 nvmels_cnt;
|
||||
|
||||
/* Host transport has to clean up and confirm requiring an indefinite
|
||||
* wait. Print a message if a 10 second wait expires and renew the
|
||||
@ -2243,6 +2244,7 @@ lpfc_nvme_lport_unreg_wait(struct lpfc_vport *vport,
|
||||
pending = 0;
|
||||
abts_scsi = 0;
|
||||
abts_nvme = 0;
|
||||
nvmels_cnt = 0;
|
||||
for (i = 0; i < phba->cfg_hdw_queue; i++) {
|
||||
qp = &phba->sli4_hba.hdwq[i];
|
||||
if (!vport->localport || !qp || !qp->io_wq)
|
||||
@ -2255,6 +2257,11 @@ lpfc_nvme_lport_unreg_wait(struct lpfc_vport *vport,
|
||||
abts_scsi += qp->abts_scsi_io_bufs;
|
||||
abts_nvme += qp->abts_nvme_io_bufs;
|
||||
}
|
||||
if (phba->sli4_hba.nvmels_wq) {
|
||||
pring = phba->sli4_hba.nvmels_wq->pring;
|
||||
if (pring)
|
||||
nvmels_cnt = pring->txcmplq_cnt;
|
||||
}
|
||||
if (!vport->localport ||
|
||||
test_bit(HBA_PCI_ERR, &vport->phba->bit_flags) ||
|
||||
phba->link_state == LPFC_HBA_ERROR ||
|
||||
@ -2263,10 +2270,10 @@ lpfc_nvme_lport_unreg_wait(struct lpfc_vport *vport,
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"6176 Lport x%px Localport x%px wait "
|
||||
"timed out. Pending %d [%d:%d]. "
|
||||
"timed out. Pending %d [%d:%d:%d]. "
|
||||
"Renewing.\n",
|
||||
lport, vport->localport, pending,
|
||||
abts_scsi, abts_nvme);
|
||||
abts_scsi, abts_nvme, nvmels_cnt);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
@ -2644,14 +2651,11 @@ lpfc_nvme_unregister_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
* reference. Check if another thread has set
|
||||
* NLP_DROPPED.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
if (!(ndlp->nlp_flag & NLP_DROPPED)) {
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
if (!test_and_set_bit(NLP_DROPPED,
|
||||
&ndlp->nlp_flag)) {
|
||||
lpfc_nlp_put(ndlp);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2841,3 +2845,43 @@ lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
||||
(pwqeIn->cmd_cmpl)(phba, pwqeIn, pwqeIn);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_nvmels_flush_cmd - Clean up outstanding nvmels commands for a port
|
||||
* @phba: Pointer to HBA context object.
|
||||
*
|
||||
**/
|
||||
void
|
||||
lpfc_nvmels_flush_cmd(struct lpfc_hba *phba)
|
||||
{
|
||||
#if (IS_ENABLED(CONFIG_NVME_FC))
|
||||
LIST_HEAD(cancel_list);
|
||||
struct lpfc_sli_ring *pring = NULL;
|
||||
struct lpfc_iocbq *piocb, *tmp_iocb;
|
||||
unsigned long iflags;
|
||||
|
||||
if (phba->sli4_hba.nvmels_wq)
|
||||
pring = phba->sli4_hba.nvmels_wq->pring;
|
||||
|
||||
if (unlikely(!pring))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
spin_lock(&pring->ring_lock);
|
||||
list_splice_init(&pring->txq, &cancel_list);
|
||||
pring->txq_cnt = 0;
|
||||
list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
|
||||
if (piocb->cmd_flag & LPFC_IO_NVME_LS) {
|
||||
list_move_tail(&piocb->list, &cancel_list);
|
||||
pring->txcmplq_cnt--;
|
||||
piocb->cmd_flag &= ~LPFC_IO_ON_TXCMPLQ;
|
||||
}
|
||||
}
|
||||
spin_unlock(&pring->ring_lock);
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
|
||||
if (!list_empty(&cancel_list))
|
||||
lpfc_sli_cancel_iocbs(phba, &cancel_list, IOSTAT_LOCAL_REJECT,
|
||||
IOERR_SLI_DOWN);
|
||||
#endif
|
||||
}
|
||||
|
@ -2854,7 +2854,7 @@ lpfc_nvmet_prep_fcp_wqe(struct lpfc_hba *phba,
|
||||
/* In template ar=1 wqes=0 sup=0 irsp=0 irsplen=0 */
|
||||
|
||||
if (rsp->rsplen == LPFC_NVMET_SUCCESS_LEN) {
|
||||
if (ndlp->nlp_flag & NLP_SUPPRESS_RSP)
|
||||
if (test_bit(NLP_SUPPRESS_RSP, &ndlp->nlp_flag))
|
||||
bf_set(wqe_sup,
|
||||
&wqe->fcp_tsend.wqe_com, 1);
|
||||
} else {
|
||||
|
@ -4629,7 +4629,7 @@ static int lpfc_scsi_prep_cmnd_buf_s3(struct lpfc_vport *vport,
|
||||
iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
|
||||
iocb_cmd->ulpPU = PARM_READ_CHECK;
|
||||
if (vport->cfg_first_burst_size &&
|
||||
(pnode->nlp_flag & NLP_FIRSTBURST)) {
|
||||
test_bit(NLP_FIRSTBURST, &pnode->nlp_flag)) {
|
||||
u32 xrdy_len;
|
||||
|
||||
fcpdl = scsi_bufflen(scsi_cmnd);
|
||||
@ -5829,7 +5829,7 @@ lpfc_send_taskmgmt(struct lpfc_vport *vport, struct fc_rport *rport,
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
|
||||
"0702 Issue %s to TGT %d LUN %llu "
|
||||
"rpi x%x nlp_flag x%x Data: x%x x%x\n",
|
||||
"rpi x%x nlp_flag x%lx Data: x%x x%x\n",
|
||||
lpfc_taskmgmt_name(task_mgmt_cmd), tgt_id, lun_id,
|
||||
pnode->nlp_rpi, pnode->nlp_flag, iocbq->sli4_xritag,
|
||||
iocbq->cmd_flag);
|
||||
@ -6094,8 +6094,8 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0722 Target Reset rport failure: rdata x%px\n", rdata);
|
||||
if (pnode) {
|
||||
clear_bit(NLP_NPR_ADISC, &pnode->nlp_flag);
|
||||
spin_lock_irqsave(&pnode->lock, flags);
|
||||
pnode->nlp_flag &= ~NLP_NPR_ADISC;
|
||||
pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
spin_unlock_irqrestore(&pnode->lock, flags);
|
||||
}
|
||||
@ -6124,7 +6124,7 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
|
||||
!pnode->logo_waitq) {
|
||||
pnode->logo_waitq = &waitq;
|
||||
pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
pnode->nlp_flag |= NLP_ISSUE_LOGO;
|
||||
set_bit(NLP_ISSUE_LOGO, &pnode->nlp_flag);
|
||||
pnode->save_flags |= NLP_WAIT_FOR_LOGO;
|
||||
spin_unlock_irqrestore(&pnode->lock, flags);
|
||||
lpfc_unreg_rpi(vport, pnode);
|
||||
|
@ -1932,7 +1932,7 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
|
||||
union lpfc_wqe128 *wqe;
|
||||
struct lpfc_iocbq *sync_buf;
|
||||
unsigned long iflags;
|
||||
u32 ret_val;
|
||||
u32 ret_val, cgn_sig_freq;
|
||||
u32 atot, wtot, max;
|
||||
u8 warn_sync_period = 0;
|
||||
|
||||
@ -1987,8 +1987,10 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
|
||||
} else if (wtot) {
|
||||
if (phba->cgn_reg_signal == EDC_CG_SIG_WARN_ONLY ||
|
||||
phba->cgn_reg_signal == EDC_CG_SIG_WARN_ALARM) {
|
||||
cgn_sig_freq = phba->cgn_sig_freq ? phba->cgn_sig_freq :
|
||||
lpfc_fabric_cgn_frequency;
|
||||
/* We hit an Signal warning condition */
|
||||
max = LPFC_SEC_TO_MSEC / lpfc_fabric_cgn_frequency *
|
||||
max = LPFC_SEC_TO_MSEC / cgn_sig_freq *
|
||||
lpfc_acqe_cgn_frequency;
|
||||
bf_set(cmf_sync_wsigmax, &wqe->cmf_sync, max);
|
||||
bf_set(cmf_sync_wsigcnt, &wqe->cmf_sync, wtot);
|
||||
@ -2842,27 +2844,6 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
__lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
unsigned long iflags;
|
||||
|
||||
if (ndlp->nlp_flag & NLP_RELEASE_RPI) {
|
||||
lpfc_sli4_free_rpi(vport->phba, ndlp->nlp_rpi);
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag &= ~NLP_RELEASE_RPI;
|
||||
ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
}
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
}
|
||||
|
||||
void
|
||||
lpfc_sli_rpi_release(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
__lpfc_sli_rpi_release(vport, ndlp);
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli_def_mbox_cmpl - Default mailbox completion handler
|
||||
* @phba: Pointer to HBA context object.
|
||||
@ -2932,18 +2913,16 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
vport,
|
||||
KERN_INFO, LOG_MBOX | LOG_DISCOVERY,
|
||||
"1438 UNREG cmpl deferred mbox x%x "
|
||||
"on NPort x%x Data: x%x x%x x%px x%lx x%x\n",
|
||||
"on NPort x%x Data: x%lx x%x x%px x%lx x%x\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_flag, ndlp->nlp_defer_did,
|
||||
ndlp, vport->load_flag, kref_read(&ndlp->kref));
|
||||
|
||||
if ((ndlp->nlp_flag & NLP_UNREG_INP) &&
|
||||
(ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING)) {
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
if (test_bit(NLP_UNREG_INP, &ndlp->nlp_flag) &&
|
||||
ndlp->nlp_defer_did != NLP_EVT_NOTHING_PENDING) {
|
||||
clear_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
ndlp->nlp_defer_did = NLP_EVT_NOTHING_PENDING;
|
||||
lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
|
||||
} else {
|
||||
__lpfc_sli_rpi_release(vport, ndlp);
|
||||
}
|
||||
|
||||
/* The unreg_login mailbox is complete and had a
|
||||
@ -2991,6 +2970,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
{
|
||||
struct lpfc_vport *vport = pmb->vport;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
bool unreg_inp;
|
||||
|
||||
ndlp = pmb->ctx_ndlp;
|
||||
if (pmb->u.mb.mbxCommand == MBX_UNREG_LOGIN) {
|
||||
@ -3003,20 +2983,26 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
vport, KERN_INFO,
|
||||
LOG_MBOX | LOG_SLI | LOG_NODE,
|
||||
"0010 UNREG_LOGIN vpi:x%x "
|
||||
"rpi:%x DID:%x defer x%x flg x%x "
|
||||
"rpi:%x DID:%x defer x%x flg x%lx "
|
||||
"x%px\n",
|
||||
vport->vpi, ndlp->nlp_rpi,
|
||||
ndlp->nlp_DID, ndlp->nlp_defer_did,
|
||||
ndlp->nlp_flag,
|
||||
ndlp);
|
||||
ndlp->nlp_flag &= ~NLP_LOGO_ACC;
|
||||
|
||||
/* Cleanup the nlp_flag now that the UNREG RPI
|
||||
* has completed.
|
||||
*/
|
||||
unreg_inp = test_and_clear_bit(NLP_UNREG_INP,
|
||||
&ndlp->nlp_flag);
|
||||
clear_bit(NLP_LOGO_ACC, &ndlp->nlp_flag);
|
||||
|
||||
/* Check to see if there are any deferred
|
||||
* events to process
|
||||
*/
|
||||
if ((ndlp->nlp_flag & NLP_UNREG_INP) &&
|
||||
(ndlp->nlp_defer_did !=
|
||||
NLP_EVT_NOTHING_PENDING)) {
|
||||
if (unreg_inp &&
|
||||
ndlp->nlp_defer_did !=
|
||||
NLP_EVT_NOTHING_PENDING) {
|
||||
lpfc_printf_vlog(
|
||||
vport, KERN_INFO,
|
||||
LOG_MBOX | LOG_SLI | LOG_NODE,
|
||||
@ -3025,14 +3011,12 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
"NPort x%x Data: x%x x%px\n",
|
||||
ndlp->nlp_rpi, ndlp->nlp_DID,
|
||||
ndlp->nlp_defer_did, ndlp);
|
||||
ndlp->nlp_flag &= ~NLP_UNREG_INP;
|
||||
ndlp->nlp_defer_did =
|
||||
NLP_EVT_NOTHING_PENDING;
|
||||
lpfc_issue_els_plogi(
|
||||
vport, ndlp->nlp_DID, 0);
|
||||
} else {
|
||||
__lpfc_sli_rpi_release(vport, ndlp);
|
||||
}
|
||||
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
}
|
||||
@ -5291,6 +5275,8 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
|
||||
"0296 Restart HBA Data: x%x x%x\n",
|
||||
phba->pport->port_state, psli->sli_flag);
|
||||
|
||||
lpfc_sli4_queue_unset(phba);
|
||||
|
||||
rc = lpfc_sli4_brdreset(phba);
|
||||
if (rc) {
|
||||
phba->link_state = LPFC_HBA_ERROR;
|
||||
@ -8748,6 +8734,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
||||
lpfc_sli_config_mbox_opcode_get(
|
||||
phba, mboxq),
|
||||
rc, dd);
|
||||
|
||||
/*
|
||||
* Allocate all resources (xri,rpi,vpi,vfi) now. Subsequent
|
||||
* calls depends on these resources to complete port setup.
|
||||
@ -8760,6 +8747,8 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
||||
goto out_free_mbox;
|
||||
}
|
||||
|
||||
lpfc_sli4_node_rpi_restore(phba);
|
||||
|
||||
lpfc_set_host_data(phba, mboxq);
|
||||
|
||||
rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
|
||||
@ -8947,7 +8936,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
||||
rc = -ENODEV;
|
||||
goto out_free_iocblist;
|
||||
}
|
||||
lpfc_sli4_node_prep(phba);
|
||||
|
||||
if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) {
|
||||
if ((phba->nvmet_support == 0) || (phba->cfg_nvmet_mrq == 1)) {
|
||||
@ -14352,9 +14340,7 @@ lpfc_sli4_sp_handle_mbox_event(struct lpfc_hba *phba, struct lpfc_mcqe *mcqe)
|
||||
* an unsolicited PLOGI from the same NPortId from
|
||||
* starting another mailbox transaction.
|
||||
*/
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->nlp_flag |= NLP_UNREG_INP;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
set_bit(NLP_UNREG_INP, &ndlp->nlp_flag);
|
||||
lpfc_unreg_login(phba, vport->vpi,
|
||||
pmbox->un.varWords[0], pmb);
|
||||
pmb->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi;
|
||||
@ -17625,6 +17611,9 @@ lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq)
|
||||
if (!eq)
|
||||
return -ENODEV;
|
||||
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
|
||||
goto list_remove;
|
||||
|
||||
mbox = mempool_alloc(eq->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox)
|
||||
return -ENOMEM;
|
||||
@ -17651,10 +17640,12 @@ lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq)
|
||||
shdr_status, shdr_add_status, rc);
|
||||
status = -ENXIO;
|
||||
}
|
||||
mempool_free(mbox, eq->phba->mbox_mem_pool);
|
||||
|
||||
list_remove:
|
||||
/* Remove eq from any list */
|
||||
list_del_init(&eq->list);
|
||||
mempool_free(mbox, eq->phba->mbox_mem_pool);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -17682,6 +17673,10 @@ lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq)
|
||||
/* sanity check on queue memory */
|
||||
if (!cq)
|
||||
return -ENODEV;
|
||||
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
|
||||
goto list_remove;
|
||||
|
||||
mbox = mempool_alloc(cq->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox)
|
||||
return -ENOMEM;
|
||||
@ -17707,9 +17702,11 @@ lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq)
|
||||
shdr_status, shdr_add_status, rc);
|
||||
status = -ENXIO;
|
||||
}
|
||||
mempool_free(mbox, cq->phba->mbox_mem_pool);
|
||||
|
||||
list_remove:
|
||||
/* Remove cq from any list */
|
||||
list_del_init(&cq->list);
|
||||
mempool_free(mbox, cq->phba->mbox_mem_pool);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -17737,6 +17734,10 @@ lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq)
|
||||
/* sanity check on queue memory */
|
||||
if (!mq)
|
||||
return -ENODEV;
|
||||
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
|
||||
goto list_remove;
|
||||
|
||||
mbox = mempool_alloc(mq->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox)
|
||||
return -ENOMEM;
|
||||
@ -17762,9 +17763,11 @@ lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq)
|
||||
shdr_status, shdr_add_status, rc);
|
||||
status = -ENXIO;
|
||||
}
|
||||
mempool_free(mbox, mq->phba->mbox_mem_pool);
|
||||
|
||||
list_remove:
|
||||
/* Remove mq from any list */
|
||||
list_del_init(&mq->list);
|
||||
mempool_free(mbox, mq->phba->mbox_mem_pool);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -17792,6 +17795,10 @@ lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq)
|
||||
/* sanity check on queue memory */
|
||||
if (!wq)
|
||||
return -ENODEV;
|
||||
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
|
||||
goto list_remove;
|
||||
|
||||
mbox = mempool_alloc(wq->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox)
|
||||
return -ENOMEM;
|
||||
@ -17816,11 +17823,13 @@ lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq)
|
||||
shdr_status, shdr_add_status, rc);
|
||||
status = -ENXIO;
|
||||
}
|
||||
mempool_free(mbox, wq->phba->mbox_mem_pool);
|
||||
|
||||
list_remove:
|
||||
/* Remove wq from any list */
|
||||
list_del_init(&wq->list);
|
||||
kfree(wq->pring);
|
||||
wq->pring = NULL;
|
||||
mempool_free(mbox, wq->phba->mbox_mem_pool);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -17850,6 +17859,10 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq,
|
||||
/* sanity check on queue memory */
|
||||
if (!hrq || !drq)
|
||||
return -ENODEV;
|
||||
|
||||
if (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))
|
||||
goto list_remove;
|
||||
|
||||
mbox = mempool_alloc(hrq->phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!mbox)
|
||||
return -ENOMEM;
|
||||
@ -17890,9 +17903,11 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq,
|
||||
shdr_status, shdr_add_status, rc);
|
||||
status = -ENXIO;
|
||||
}
|
||||
mempool_free(mbox, hrq->phba->mbox_mem_pool);
|
||||
|
||||
list_remove:
|
||||
list_del_init(&hrq->list);
|
||||
list_del_init(&drq->list);
|
||||
mempool_free(mbox, hrq->phba->mbox_mem_pool);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -19074,9 +19089,9 @@ lpfc_sli4_seq_abort_rsp(struct lpfc_vport *vport,
|
||||
* to free ndlp when transmit completes
|
||||
*/
|
||||
if (ndlp->nlp_state == NLP_STE_UNUSED_NODE &&
|
||||
!(ndlp->nlp_flag & NLP_DROPPED) &&
|
||||
!test_bit(NLP_DROPPED, &ndlp->nlp_flag) &&
|
||||
!(ndlp->fc4_xpt_flags & (NVME_XPT_REGD | SCSI_XPT_REGD))) {
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
set_bit(NLP_DROPPED, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
}
|
||||
@ -21094,11 +21109,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport)
|
||||
/* Unregister the RPI when mailbox complete */
|
||||
mb->mbox_flag |= LPFC_MBX_IMED_UNREG;
|
||||
restart_loop = 1;
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
spin_lock(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
|
||||
spin_unlock(&ndlp->lock);
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -21113,9 +21124,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport)
|
||||
ndlp = mb->ctx_ndlp;
|
||||
mb->ctx_ndlp = NULL;
|
||||
if (ndlp) {
|
||||
spin_lock(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
|
||||
spin_unlock(&ndlp->lock);
|
||||
clear_bit(NLP_IGNR_REG_CMPL, &ndlp->nlp_flag);
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
}
|
||||
@ -21124,9 +21133,7 @@ lpfc_cleanup_pending_mbox(struct lpfc_vport *vport)
|
||||
|
||||
/* Release the ndlp with the cleaned-up active mailbox command */
|
||||
if (act_mbx_ndlp) {
|
||||
spin_lock(&act_mbx_ndlp->lock);
|
||||
act_mbx_ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
|
||||
spin_unlock(&act_mbx_ndlp->lock);
|
||||
clear_bit(NLP_IGNR_REG_CMPL, &act_mbx_ndlp->nlp_flag);
|
||||
lpfc_nlp_put(act_mbx_ndlp);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "14.4.0.5"
|
||||
#define LPFC_DRIVER_VERSION "14.4.0.6"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
|
@ -496,7 +496,7 @@ lpfc_send_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
!ndlp->logo_waitq) {
|
||||
ndlp->logo_waitq = &waitq;
|
||||
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
ndlp->nlp_flag |= NLP_ISSUE_LOGO;
|
||||
set_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag);
|
||||
ndlp->save_flags |= NLP_WAIT_FOR_LOGO;
|
||||
}
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
@ -515,8 +515,8 @@ lpfc_send_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
}
|
||||
|
||||
/* Error - clean up node flags. */
|
||||
clear_bit(NLP_ISSUE_LOGO, &ndlp->nlp_flag);
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag &= ~NLP_ISSUE_LOGO;
|
||||
ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
|
||||
@ -708,7 +708,7 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_VPORT | LOG_ELS,
|
||||
"1829 DA_ID issue status %d. "
|
||||
"SFlag x%x NState x%x, NFlag x%x "
|
||||
"SFlag x%x NState x%x, NFlag x%lx "
|
||||
"Rpi x%x\n",
|
||||
rc, ndlp->save_flags, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
|
Loading…
Reference in New Issue
Block a user