mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 09:14:07 -04:00
Merge patch series "lpfc: Update lpfc to revision 14.2.0.14"
Justin Tee <justintee8345@gmail.com> says: Update lpfc to revision 14.2.0.14 This patch set contains logging improvements, kref handling fixes, discovery bug fixes, and refactoring of repeated code. The patches were cut against Martin's 6.6/scsi-queue tree. Link: https://lore.kernel.org/r/20230712180522.112722-1-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
@@ -872,6 +872,7 @@ enum lpfc_irq_chann_mode {
|
||||
enum lpfc_hba_bit_flags {
|
||||
FABRIC_COMANDS_BLOCKED,
|
||||
HBA_PCI_ERR,
|
||||
MBX_TMO_ERR,
|
||||
};
|
||||
|
||||
struct lpfc_hba {
|
||||
@@ -1708,6 +1709,25 @@ lpfc_next_online_cpu(const struct cpumask *mask, unsigned int start)
|
||||
|
||||
return cpu_it;
|
||||
}
|
||||
/**
|
||||
* lpfc_next_present_cpu - Finds next present CPU after n
|
||||
* @n: the cpu prior to search
|
||||
*
|
||||
* Note: If no next present cpu, then fallback to first present cpu.
|
||||
*
|
||||
**/
|
||||
static inline unsigned int lpfc_next_present_cpu(int n)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
cpu = cpumask_next(n, cpu_present_mask);
|
||||
|
||||
if (cpu >= nr_cpu_ids)
|
||||
cpu = cpumask_first(cpu_present_mask);
|
||||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli4_mod_hba_eq_delay - update EQ delay
|
||||
* @phba: Pointer to HBA context object.
|
||||
|
||||
@@ -2127,11 +2127,12 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
|
||||
uint32_t *mrpi, uint32_t *arpi,
|
||||
uint32_t *mvpi, uint32_t *avpi)
|
||||
{
|
||||
struct lpfc_mbx_read_config *rd_config;
|
||||
LPFC_MBOXQ_t *pmboxq;
|
||||
MAILBOX_t *pmb;
|
||||
int rc = 0;
|
||||
uint32_t max_vpi;
|
||||
struct lpfc_sli4_hba *sli4_hba;
|
||||
struct lpfc_max_cfg_param *max_cfg_param;
|
||||
u16 rsrc_ext_cnt, rsrc_ext_size, max_vpi;
|
||||
|
||||
/*
|
||||
* prevent udev from issuing mailbox commands until the port is
|
||||
@@ -2167,31 +2168,65 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
|
||||
}
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
rd_config = &pmboxq->u.mqe.un.rd_config;
|
||||
if (mrpi)
|
||||
*mrpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config);
|
||||
if (arpi)
|
||||
*arpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config) -
|
||||
phba->sli4_hba.max_cfg_param.rpi_used;
|
||||
if (mxri)
|
||||
*mxri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config);
|
||||
if (axri)
|
||||
*axri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config) -
|
||||
phba->sli4_hba.max_cfg_param.xri_used;
|
||||
sli4_hba = &phba->sli4_hba;
|
||||
max_cfg_param = &sli4_hba->max_cfg_param;
|
||||
|
||||
/* Account for differences with SLI-3. Get vpi count from
|
||||
* mailbox data and subtract one for max vpi value.
|
||||
*/
|
||||
max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
|
||||
(bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
|
||||
/* Normally, extents are not used */
|
||||
if (!phba->sli4_hba.extents_in_use) {
|
||||
if (mrpi)
|
||||
*mrpi = max_cfg_param->max_rpi;
|
||||
if (mxri)
|
||||
*mxri = max_cfg_param->max_xri;
|
||||
if (mvpi) {
|
||||
max_vpi = max_cfg_param->max_vpi;
|
||||
|
||||
/* Limit the max we support */
|
||||
if (max_vpi > LPFC_MAX_VPI)
|
||||
max_vpi = LPFC_MAX_VPI;
|
||||
if (mvpi)
|
||||
*mvpi = max_vpi;
|
||||
if (avpi)
|
||||
*avpi = max_vpi - phba->sli4_hba.max_cfg_param.vpi_used;
|
||||
/* Limit the max we support */
|
||||
if (max_vpi > LPFC_MAX_VPI)
|
||||
max_vpi = LPFC_MAX_VPI;
|
||||
*mvpi = max_vpi;
|
||||
}
|
||||
} else { /* Extents in use */
|
||||
if (mrpi) {
|
||||
if (lpfc_sli4_get_avail_extnt_rsrc(phba,
|
||||
LPFC_RSC_TYPE_FCOE_RPI,
|
||||
&rsrc_ext_cnt,
|
||||
&rsrc_ext_size)) {
|
||||
rc = 0;
|
||||
goto free_pmboxq;
|
||||
}
|
||||
|
||||
*mrpi = rsrc_ext_cnt * rsrc_ext_size;
|
||||
}
|
||||
|
||||
if (mxri) {
|
||||
if (lpfc_sli4_get_avail_extnt_rsrc(phba,
|
||||
LPFC_RSC_TYPE_FCOE_XRI,
|
||||
&rsrc_ext_cnt,
|
||||
&rsrc_ext_size)) {
|
||||
rc = 0;
|
||||
goto free_pmboxq;
|
||||
}
|
||||
|
||||
*mxri = rsrc_ext_cnt * rsrc_ext_size;
|
||||
}
|
||||
|
||||
if (mvpi) {
|
||||
if (lpfc_sli4_get_avail_extnt_rsrc(phba,
|
||||
LPFC_RSC_TYPE_FCOE_VPI,
|
||||
&rsrc_ext_cnt,
|
||||
&rsrc_ext_size)) {
|
||||
rc = 0;
|
||||
goto free_pmboxq;
|
||||
}
|
||||
|
||||
max_vpi = rsrc_ext_cnt * rsrc_ext_size;
|
||||
|
||||
/* Limit the max we support */
|
||||
if (max_vpi > LPFC_MAX_VPI)
|
||||
max_vpi = LPFC_MAX_VPI;
|
||||
*mvpi = max_vpi;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (mrpi)
|
||||
*mrpi = pmb->un.varRdConfig.max_rpi;
|
||||
@@ -2212,8 +2247,12 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
|
||||
}
|
||||
}
|
||||
|
||||
/* Success */
|
||||
rc = 1;
|
||||
|
||||
free_pmboxq:
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
return 1;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2265,10 +2304,19 @@ lpfc_used_rpi_show(struct device *dev, struct device_attribute *attr,
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t cnt, acnt;
|
||||
struct lpfc_sli4_hba *sli4_hba;
|
||||
struct lpfc_max_cfg_param *max_cfg_param;
|
||||
u32 cnt = 0, acnt = 0;
|
||||
|
||||
if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
sli4_hba = &phba->sli4_hba;
|
||||
max_cfg_param = &sli4_hba->max_cfg_param;
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n",
|
||||
max_cfg_param->rpi_used);
|
||||
} else {
|
||||
if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
}
|
||||
return scnprintf(buf, PAGE_SIZE, "Unknown\n");
|
||||
}
|
||||
|
||||
@@ -2321,10 +2369,19 @@ lpfc_used_xri_show(struct device *dev, struct device_attribute *attr,
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t cnt, acnt;
|
||||
struct lpfc_sli4_hba *sli4_hba;
|
||||
struct lpfc_max_cfg_param *max_cfg_param;
|
||||
u32 cnt = 0, acnt = 0;
|
||||
|
||||
if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
sli4_hba = &phba->sli4_hba;
|
||||
max_cfg_param = &sli4_hba->max_cfg_param;
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n",
|
||||
max_cfg_param->xri_used);
|
||||
} else {
|
||||
if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
}
|
||||
return scnprintf(buf, PAGE_SIZE, "Unknown\n");
|
||||
}
|
||||
|
||||
@@ -2377,10 +2434,19 @@ lpfc_used_vpi_show(struct device *dev, struct device_attribute *attr,
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
uint32_t cnt, acnt;
|
||||
struct lpfc_sli4_hba *sli4_hba;
|
||||
struct lpfc_max_cfg_param *max_cfg_param;
|
||||
u32 cnt = 0, acnt = 0;
|
||||
|
||||
if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
sli4_hba = &phba->sli4_hba;
|
||||
max_cfg_param = &sli4_hba->max_cfg_param;
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n",
|
||||
max_cfg_param->vpi_used);
|
||||
} else {
|
||||
if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt))
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
|
||||
}
|
||||
return scnprintf(buf, PAGE_SIZE, "Unknown\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -1557,7 +1557,8 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
ndlp->nlp_fc4_type |= NLP_FC4_FCP;
|
||||
if (fc4_data_1 & LPFC_FC4_TYPE_BITMASK)
|
||||
ndlp->nlp_fc4_type |= NLP_FC4_NVME;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_DISCOVERY | LOG_NODE,
|
||||
"3064 Setting ndlp x%px, DID x%06x "
|
||||
"with FC4 x%08x, Data: x%08x x%08x "
|
||||
"%d\n",
|
||||
@@ -1568,14 +1569,21 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE &&
|
||||
ndlp->nlp_fc4_type) {
|
||||
ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
|
||||
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
NLP_STE_PRLI_ISSUE);
|
||||
lpfc_issue_els_prli(vport, ndlp, 0);
|
||||
/* This is a fabric topology so if discovery
|
||||
* started with an unsolicited PLOGI, don't
|
||||
* send a PRLI. Targets don't issue PLOGI or
|
||||
* PRLI when acting as a target. Likely this is
|
||||
* an initiator function.
|
||||
*/
|
||||
if (!(ndlp->nlp_flag & NLP_RCV_PLOGI)) {
|
||||
lpfc_nlp_set_state(vport, ndlp,
|
||||
NLP_STE_PRLI_ISSUE);
|
||||
lpfc_issue_els_prli(vport, ndlp, 0);
|
||||
}
|
||||
} else if (!ndlp->nlp_fc4_type) {
|
||||
/* If fc4 type is still unknown, then LOGO */
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_DISCOVERY,
|
||||
LOG_DISCOVERY | LOG_NODE,
|
||||
"6443 Sending LOGO ndlp x%px,"
|
||||
"DID x%06x with fc4_type: "
|
||||
"x%08x, state: %d\n",
|
||||
|
||||
@@ -1041,7 +1041,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
!(ndlp->fc4_xpt_flags & SCSI_XPT_REGD))
|
||||
lpfc_nlp_put(ndlp);
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_TRACE_EVENT,
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
|
||||
"0150 FLOGI failure Status:x%x/x%x "
|
||||
"xri x%x TMO:x%x refcnt %d\n",
|
||||
ulp_status, ulp_word4, cmdiocb->sli4_xritag,
|
||||
@@ -1091,7 +1091,6 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (!lpfc_error_lost_link(vport, ulp_status, ulp_word4))
|
||||
lpfc_issue_reg_vfi(vport);
|
||||
|
||||
lpfc_nlp_put(ndlp);
|
||||
goto out;
|
||||
}
|
||||
goto flogifail;
|
||||
@@ -2377,10 +2376,10 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* PRLI failed */
|
||||
lpfc_printf_vlog(vport, mode, loglevel,
|
||||
"2754 PRLI failure DID:%06X Status:x%x/x%x, "
|
||||
"data: x%x x%x\n",
|
||||
"data: x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4, ndlp->nlp_state,
|
||||
ndlp->fc4_prli_sent);
|
||||
ndlp->fc4_prli_sent, ndlp->nlp_flag);
|
||||
|
||||
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
|
||||
if (!lpfc_error_lost_link(vport, ulp_status, ulp_word4))
|
||||
@@ -2391,14 +2390,16 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
* mismatch typically caused by an RSCN. Skip any
|
||||
* processing to allow recovery.
|
||||
*/
|
||||
if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE &&
|
||||
ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) {
|
||||
if ((ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE &&
|
||||
ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) ||
|
||||
(ndlp->nlp_state == NLP_STE_NPR_NODE &&
|
||||
ndlp->nlp_flag & NLP_DELAY_TMO)) {
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_NODE,
|
||||
"2784 PRLI cmpl: state mismatch "
|
||||
"2784 PRLI cmpl: Allow Node recovery "
|
||||
"DID x%06x nstate x%x nflag x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag);
|
||||
goto out;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -6166,11 +6167,25 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
|
||||
npr->TaskRetryIdReq = 1;
|
||||
}
|
||||
npr->acceptRspCode = PRLI_REQ_EXECUTED;
|
||||
npr->estabImagePair = 1;
|
||||
|
||||
/* Set image pair for complementary pairs only. */
|
||||
if (ndlp->nlp_type & NLP_FCP_TARGET)
|
||||
npr->estabImagePair = 1;
|
||||
else
|
||||
npr->estabImagePair = 0;
|
||||
npr->readXferRdyDis = 1;
|
||||
npr->ConfmComplAllowed = 1;
|
||||
npr->prliType = PRLI_FCP_TYPE;
|
||||
npr->initiatorFunc = 1;
|
||||
|
||||
/* Xmit PRLI ACC response tag <ulpIoTag> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_ELS | LOG_NODE | LOG_DISCOVERY,
|
||||
"6014 FCP issue PRLI ACC imgpair %d "
|
||||
"retry %d task %d\n",
|
||||
npr->estabImagePair,
|
||||
npr->Retry, npr->TaskRetryIdReq);
|
||||
|
||||
} else if (prli_fc4_req == PRLI_NVME_TYPE) {
|
||||
/* Respond with an NVME PRLI Type */
|
||||
npr_nvme = (struct lpfc_nvme_prli *) pcmd;
|
||||
@@ -9588,11 +9603,13 @@ void
|
||||
lpfc_els_flush_cmd(struct lpfc_vport *vport)
|
||||
{
|
||||
LIST_HEAD(abort_list);
|
||||
LIST_HEAD(cancel_list);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_sli_ring *pring;
|
||||
struct lpfc_iocbq *tmp_iocb, *piocb;
|
||||
u32 ulp_command;
|
||||
unsigned long iflags = 0;
|
||||
bool mbx_tmo_err;
|
||||
|
||||
lpfc_fabric_abort_vport(vport);
|
||||
|
||||
@@ -9614,15 +9631,16 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
spin_lock(&pring->ring_lock);
|
||||
|
||||
mbx_tmo_err = test_bit(MBX_TMO_ERR, &phba->bit_flags);
|
||||
/* First we need to issue aborts to outstanding cmds on txcmpl */
|
||||
list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
|
||||
if (piocb->cmd_flag & LPFC_IO_LIBDFC)
|
||||
if (piocb->cmd_flag & LPFC_IO_LIBDFC && !mbx_tmo_err)
|
||||
continue;
|
||||
|
||||
if (piocb->vport != vport)
|
||||
continue;
|
||||
|
||||
if (piocb->cmd_flag & LPFC_DRIVER_ABORTED)
|
||||
if (piocb->cmd_flag & LPFC_DRIVER_ABORTED && !mbx_tmo_err)
|
||||
continue;
|
||||
|
||||
/* On the ELS ring we can have ELS_REQUESTs or
|
||||
@@ -9641,8 +9659,8 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
|
||||
*/
|
||||
if (phba->link_state == LPFC_LINK_DOWN)
|
||||
piocb->cmd_cmpl = lpfc_cmpl_els_link_down;
|
||||
}
|
||||
if (ulp_command == CMD_GEN_REQUEST64_CR)
|
||||
} else if (ulp_command == CMD_GEN_REQUEST64_CR ||
|
||||
mbx_tmo_err)
|
||||
list_add_tail(&piocb->dlist, &abort_list);
|
||||
}
|
||||
|
||||
@@ -9654,11 +9672,19 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
|
||||
list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
list_del_init(&piocb->dlist);
|
||||
lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
|
||||
if (mbx_tmo_err)
|
||||
list_move_tail(&piocb->list, &cancel_list);
|
||||
else
|
||||
lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
|
||||
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
}
|
||||
/* Make sure HBA is alive */
|
||||
lpfc_issue_hb_tmo(phba);
|
||||
if (!list_empty(&cancel_list))
|
||||
lpfc_sli_cancel_iocbs(phba, &cancel_list, IOSTAT_LOCAL_REJECT,
|
||||
IOERR_SLI_ABORTED);
|
||||
else
|
||||
/* Make sure HBA is alive */
|
||||
lpfc_issue_hb_tmo(phba);
|
||||
|
||||
if (!list_empty(&abort_list))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
|
||||
@@ -169,29 +169,44 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
|
||||
lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
|
||||
"3181 dev_loss_callbk x%06x, rport x%px flg x%x "
|
||||
"load_flag x%x refcnt %d state %d xpt x%x\n",
|
||||
"load_flag x%x refcnt %u state %d xpt x%x\n",
|
||||
ndlp->nlp_DID, ndlp->rport, ndlp->nlp_flag,
|
||||
vport->load_flag, kref_read(&ndlp->kref),
|
||||
ndlp->nlp_state, ndlp->fc4_xpt_flags);
|
||||
|
||||
/* Don't schedule a worker thread event if the vport is going down.
|
||||
* The teardown process cleans up the node via lpfc_drop_node.
|
||||
*/
|
||||
/* Don't schedule a worker thread event if the vport is going down. */
|
||||
if (vport->load_flag & FC_UNLOADING) {
|
||||
((struct lpfc_rport_data *)rport->dd_data)->pnode = NULL;
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
ndlp->rport = NULL;
|
||||
|
||||
ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD;
|
||||
/* clear the NLP_XPT_REGD if the node is not registered
|
||||
* with nvme-fc
|
||||
/* 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.
|
||||
*/
|
||||
if (ndlp->fc4_xpt_flags == NLP_XPT_REGD)
|
||||
ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD;
|
||||
if (ndlp->fc4_xpt_flags & (NLP_XPT_REGD | SCSI_XPT_REGD)) {
|
||||
ndlp->fc4_xpt_flags &= ~SCSI_XPT_REGD;
|
||||
|
||||
/* Remove the node reference from remote_port_add now.
|
||||
* The driver will not call remote_port_delete.
|
||||
/* NVME transport-registered rports need the
|
||||
* NLP_XPT_REGD flag to complete an unregister.
|
||||
*/
|
||||
if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD))
|
||||
ndlp->fc4_xpt_flags &= ~NLP_XPT_REGD;
|
||||
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.
|
||||
*/
|
||||
lpfc_nlp_put(ndlp);
|
||||
if (!(ndlp->nlp_flag & NLP_DROPPED)) {
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
lpfc_nlp_put(ndlp);
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4686,7 +4701,8 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
if (!(ndlp->fc4_xpt_flags & NLP_XPT_REGD)) {
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
|
||||
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",
|
||||
__func__, ndlp, ndlp->rport, ndlp->nlp_DID,
|
||||
@@ -4702,9 +4718,10 @@ lpfc_nlp_unreg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
vport->phba->nport_event_cnt++;
|
||||
lpfc_unregister_remote_port(ndlp);
|
||||
} else if (!ndlp->rport) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
|
||||
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"
|
||||
" XPT x%x refcnt %d\n",
|
||||
" XPT x%x refcnt %u\n",
|
||||
__func__, ndlp, ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->fc4_xpt_flags,
|
||||
kref_read(&ndlp->kref));
|
||||
@@ -4954,22 +4971,29 @@ lpfc_drop_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
{
|
||||
/*
|
||||
* Use of lpfc_drop_node and UNUSED list: lpfc_drop_node should
|
||||
* be used if we wish to issue the "last" lpfc_nlp_put() to remove
|
||||
* the ndlp from the vport. The ndlp marked as UNUSED on the list
|
||||
* until ALL other outstanding threads have completed. We check
|
||||
* that the ndlp not already in the UNUSED state before we proceed.
|
||||
* be used when lpfc wants to remove the "last" lpfc_nlp_put() to
|
||||
* release the ndlp from the vport when conditions are correct.
|
||||
*/
|
||||
if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
|
||||
return;
|
||||
lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNUSED_NODE);
|
||||
ndlp->nlp_flag |= NLP_DROPPED;
|
||||
if (vport->phba->sli_rev == LPFC_SLI_REV4) {
|
||||
lpfc_cleanup_vports_rrqs(vport, ndlp);
|
||||
lpfc_unreg_rpi(vport, ndlp);
|
||||
}
|
||||
|
||||
lpfc_nlp_put(ndlp);
|
||||
return;
|
||||
/* NLP_DROPPED means another thread already removed the initial
|
||||
* 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);
|
||||
lpfc_nlp_put(ndlp);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5757,8 +5781,11 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
|
||||
(NLP_FCP_TARGET | NLP_NVME_TARGET)))
|
||||
return NULL;
|
||||
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
if (ndlp->nlp_state > NLP_STE_UNUSED_NODE &&
|
||||
ndlp->nlp_state < NLP_STE_NPR_NODE) {
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
}
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->nlp_flag |= NLP_NPR_2B_DISC;
|
||||
|
||||
@@ -764,6 +764,8 @@ typedef struct _PRLI { /* Structure is in Big Endian format */
|
||||
#define PRLI_PREDEF_CONFIG 0x5
|
||||
#define PRLI_PARTIAL_SUCCESS 0x6
|
||||
#define PRLI_INVALID_PAGE_CNT 0x7
|
||||
#define PRLI_INV_SRV_PARM 0x8
|
||||
|
||||
uint8_t word0Reserved3; /* FC Parm Word 0, bit 0:7 */
|
||||
|
||||
uint32_t origProcAssoc; /* FC Parm Word 1, bit 0:31 */
|
||||
|
||||
@@ -2123,7 +2123,7 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
|
||||
en_rn_msg = false;
|
||||
} else if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 &&
|
||||
reg_err2 == SLIPORT_ERR2_REG_FORCED_DUMP)
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
||||
"3144 Port Down: Debug Dump\n");
|
||||
else if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 &&
|
||||
reg_err2 == SLIPORT_ERR2_REG_FUNC_PROVISON)
|
||||
@@ -7550,6 +7550,8 @@ lpfc_disable_pci_dev(struct lpfc_hba *phba)
|
||||
void
|
||||
lpfc_reset_hba(struct lpfc_hba *phba)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
/* If resets are disabled then set error state and return. */
|
||||
if (!phba->cfg_enable_hba_reset) {
|
||||
phba->link_state = LPFC_HBA_ERROR;
|
||||
@@ -7560,13 +7562,25 @@ lpfc_reset_hba(struct lpfc_hba *phba)
|
||||
if (phba->sli.sli_flag & LPFC_SLI_ACTIVE) {
|
||||
lpfc_offline_prep(phba, LPFC_MBX_WAIT);
|
||||
} else {
|
||||
if (test_bit(MBX_TMO_ERR, &phba->bit_flags)) {
|
||||
/* Perform a PCI function reset to start from clean */
|
||||
rc = lpfc_pci_function_reset(phba);
|
||||
lpfc_els_flush_all_cmd(phba);
|
||||
}
|
||||
lpfc_offline_prep(phba, LPFC_MBX_NO_WAIT);
|
||||
lpfc_sli_flush_io_rings(phba);
|
||||
}
|
||||
lpfc_offline(phba);
|
||||
lpfc_sli_brdrestart(phba);
|
||||
lpfc_online(phba);
|
||||
lpfc_unblock_mgmt_io(phba);
|
||||
clear_bit(MBX_TMO_ERR, &phba->bit_flags);
|
||||
if (unlikely(rc)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
||||
"8888 PCI function reset failed rc %x\n",
|
||||
rc);
|
||||
} else {
|
||||
lpfc_sli_brdrestart(phba);
|
||||
lpfc_online(phba);
|
||||
lpfc_unblock_mgmt_io(phba);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12498,10 +12512,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
(new_cpup->eq != LPFC_VECTOR_MAP_EMPTY) &&
|
||||
(new_cpup->phys_id == cpup->phys_id))
|
||||
goto found_same;
|
||||
new_cpu = cpumask_next(
|
||||
new_cpu, cpu_present_mask);
|
||||
if (new_cpu >= nr_cpu_ids)
|
||||
new_cpu = first_cpu;
|
||||
new_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
}
|
||||
/* At this point, we leave the CPU as unassigned */
|
||||
continue;
|
||||
@@ -12513,9 +12524,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
* chance of having multiple unassigned CPU entries
|
||||
* selecting the same IRQ.
|
||||
*/
|
||||
start_cpu = cpumask_next(new_cpu, cpu_present_mask);
|
||||
if (start_cpu >= nr_cpu_ids)
|
||||
start_cpu = first_cpu;
|
||||
start_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
|
||||
"3337 Set Affinity: CPU %d "
|
||||
@@ -12548,10 +12557,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
if (!(new_cpup->flag & LPFC_CPU_MAP_UNASSIGN) &&
|
||||
(new_cpup->eq != LPFC_VECTOR_MAP_EMPTY))
|
||||
goto found_any;
|
||||
new_cpu = cpumask_next(
|
||||
new_cpu, cpu_present_mask);
|
||||
if (new_cpu >= nr_cpu_ids)
|
||||
new_cpu = first_cpu;
|
||||
new_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
}
|
||||
/* We should never leave an entry unassigned */
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
@@ -12567,9 +12573,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
* chance of having multiple unassigned CPU entries
|
||||
* selecting the same IRQ.
|
||||
*/
|
||||
start_cpu = cpumask_next(new_cpu, cpu_present_mask);
|
||||
if (start_cpu >= nr_cpu_ids)
|
||||
start_cpu = first_cpu;
|
||||
start_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
|
||||
"3338 Set Affinity: CPU %d "
|
||||
@@ -12640,9 +12644,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
new_cpup->core_id == cpup->core_id) {
|
||||
goto found_hdwq;
|
||||
}
|
||||
new_cpu = cpumask_next(new_cpu, cpu_present_mask);
|
||||
if (new_cpu >= nr_cpu_ids)
|
||||
new_cpu = first_cpu;
|
||||
new_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
}
|
||||
|
||||
/* If we can't match both phys_id and core_id,
|
||||
@@ -12654,10 +12656,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
if (new_cpup->hdwq != LPFC_VECTOR_MAP_EMPTY &&
|
||||
new_cpup->phys_id == cpup->phys_id)
|
||||
goto found_hdwq;
|
||||
|
||||
new_cpu = cpumask_next(new_cpu, cpu_present_mask);
|
||||
if (new_cpu >= nr_cpu_ids)
|
||||
new_cpu = first_cpu;
|
||||
new_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
}
|
||||
|
||||
/* Otherwise just round robin on cfg_hdw_queue */
|
||||
@@ -12666,9 +12665,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
|
||||
goto logit;
|
||||
found_hdwq:
|
||||
/* We found an available entry, copy the IRQ info */
|
||||
start_cpu = cpumask_next(new_cpu, cpu_present_mask);
|
||||
if (start_cpu >= nr_cpu_ids)
|
||||
start_cpu = first_cpu;
|
||||
start_cpu = lpfc_next_present_cpu(new_cpu);
|
||||
cpup->hdwq = new_cpup->hdwq;
|
||||
logit:
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
|
||||
|
||||
@@ -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-2023 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. *
|
||||
@@ -879,23 +879,34 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
lpfc_retry_pport_discovery(phba);
|
||||
}
|
||||
} else if ((!(ndlp->nlp_type & NLP_FABRIC) &&
|
||||
((ndlp->nlp_type & NLP_FCP_TARGET) ||
|
||||
(ndlp->nlp_type & NLP_NVME_TARGET) ||
|
||||
(vport->fc_flag & FC_PT2PT))) ||
|
||||
(ndlp->nlp_state == NLP_STE_ADISC_ISSUE)) {
|
||||
/* Only try to re-login if this is NOT a Fabric Node
|
||||
* AND the remote NPORT is a FCP/NVME Target or we
|
||||
* are in pt2pt mode. NLP_STE_ADISC_ISSUE is a special
|
||||
* case for LOGO as a response to ADISC behavior.
|
||||
*/
|
||||
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);
|
||||
} else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_NODE | LOG_ELS | LOG_DISCOVERY,
|
||||
"3203 LOGO recover nport x%06x state x%x "
|
||||
"ntype x%x fc_flag x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_type, vport->fc_flag);
|
||||
|
||||
ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
|
||||
/* Special cases for rports that recover post LOGO. */
|
||||
if ((!(ndlp->nlp_type == NLP_FABRIC) &&
|
||||
(ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) ||
|
||||
vport->fc_flag & FC_PT2PT)) ||
|
||||
(ndlp->nlp_state >= NLP_STE_ADISC_ISSUE ||
|
||||
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);
|
||||
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",
|
||||
ndlp->nlp_DID, ndlp->nlp_flag,
|
||||
ndlp->nlp_last_elscmd,
|
||||
kref_read(&ndlp->kref));
|
||||
}
|
||||
}
|
||||
out:
|
||||
/* Unregister from backend, could have been skipped due to ADISC */
|
||||
@@ -1854,7 +1865,6 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport,
|
||||
struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
LPFC_MBOXQ_t *mb;
|
||||
LPFC_MBOXQ_t *nextmb;
|
||||
struct lpfc_nodelist *ns_ndlp;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
|
||||
@@ -1882,13 +1892,6 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_vport *vport,
|
||||
}
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
|
||||
/* software abort if any GID_FT is outstanding */
|
||||
if (vport->cfg_enable_fc4_type != LPFC_ENABLE_FCP) {
|
||||
ns_ndlp = lpfc_findnode_did(vport, NameServer_DID);
|
||||
if (ns_ndlp)
|
||||
lpfc_els_abort(phba, ns_ndlp);
|
||||
}
|
||||
|
||||
lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
|
||||
return ndlp->nlp_state;
|
||||
}
|
||||
@@ -2148,6 +2151,7 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
struct lpfc_nvme_prli *nvpr;
|
||||
void *temp_ptr;
|
||||
u32 ulp_status;
|
||||
bool acc_imode_sps = false;
|
||||
|
||||
cmdiocb = (struct lpfc_iocbq *) arg;
|
||||
rspiocb = cmdiocb->rsp_iocb;
|
||||
@@ -2182,22 +2186,32 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (npr && (npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
|
||||
(npr->prliType == PRLI_FCP_TYPE)) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
|
||||
"6028 FCP NPR PRLI Cmpl Init %d Target %d\n",
|
||||
npr->initiatorFunc,
|
||||
npr->targetFunc);
|
||||
if (npr->initiatorFunc)
|
||||
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
||||
if (npr->targetFunc) {
|
||||
ndlp->nlp_type |= NLP_FCP_TARGET;
|
||||
if (npr->writeXferRdyDis)
|
||||
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||
}
|
||||
if (npr->Retry)
|
||||
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
||||
if (npr && npr->prliType == PRLI_FCP_TYPE) {
|
||||
lpfc_printf_vlog(vport, KERN_INFO,
|
||||
LOG_ELS | LOG_NODE | LOG_DISCOVERY,
|
||||
"6028 FCP NPR PRLI Cmpl Init %d Target %d "
|
||||
"EIP %d AccCode x%x\n",
|
||||
npr->initiatorFunc, npr->targetFunc,
|
||||
npr->estabImagePair, npr->acceptRspCode);
|
||||
|
||||
if (npr->acceptRspCode == PRLI_INV_SRV_PARM) {
|
||||
/* Strict initiators don't establish an image pair. */
|
||||
if (npr->initiatorFunc && !npr->targetFunc &&
|
||||
!npr->estabImagePair)
|
||||
acc_imode_sps = true;
|
||||
}
|
||||
|
||||
if (npr->acceptRspCode == PRLI_REQ_EXECUTED || acc_imode_sps) {
|
||||
if (npr->initiatorFunc)
|
||||
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
||||
if (npr->targetFunc) {
|
||||
ndlp->nlp_type |= NLP_FCP_TARGET;
|
||||
if (npr->writeXferRdyDis)
|
||||
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||
}
|
||||
if (npr->Retry)
|
||||
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
||||
}
|
||||
} else if (nvpr &&
|
||||
(bf_get_be32(prli_acc_rsp_code, nvpr) ==
|
||||
PRLI_REQ_EXECUTED) &&
|
||||
|
||||
@@ -1864,7 +1864,6 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
|
||||
struct lpfc_nvme_fcpreq_priv *freqpriv;
|
||||
unsigned long flags;
|
||||
int ret_val;
|
||||
struct nvme_fc_cmd_iu *cp;
|
||||
|
||||
/* Validate pointers. LLDD fault handling with transport does
|
||||
* have timing races.
|
||||
@@ -1988,16 +1987,10 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Command Id from cmd to plug into response. This
|
||||
* code is not needed in the next NVME Transport drop.
|
||||
*/
|
||||
cp = (struct nvme_fc_cmd_iu *)lpfc_nbuf->nvmeCmd->cmdaddr;
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_ABTS,
|
||||
"6138 Transport Abort NVME Request Issued for "
|
||||
"ox_id x%x nvme opcode x%x nvme cmd_id x%x\n",
|
||||
nvmereq_wqe->sli4_xritag, cp->sqe.common.opcode,
|
||||
cp->sqe.common.command_id);
|
||||
"ox_id x%x\n",
|
||||
nvmereq_wqe->sli4_xritag);
|
||||
return;
|
||||
|
||||
out_unlock:
|
||||
@@ -2510,8 +2503,9 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
|
||||
lpfc_printf_vlog(vport, KERN_ERR,
|
||||
LOG_TRACE_EVENT,
|
||||
"6031 RemotePort Registration failed "
|
||||
"err: %d, DID x%06x\n",
|
||||
ret, ndlp->nlp_DID);
|
||||
"err: %d, DID x%06x ref %u\n",
|
||||
ret, ndlp->nlp_DID, kref_read(&ndlp->kref));
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1620,10 +1620,7 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba)
|
||||
cpu = cpumask_first(cpu_present_mask);
|
||||
continue;
|
||||
}
|
||||
cpu = cpumask_next(cpu, cpu_present_mask);
|
||||
if (cpu == nr_cpu_ids)
|
||||
cpu = cpumask_first(cpu_present_mask);
|
||||
|
||||
cpu = lpfc_next_present_cpu(cpu);
|
||||
}
|
||||
|
||||
for_each_present_cpu(i) {
|
||||
|
||||
@@ -3935,6 +3935,8 @@ void lpfc_poll_eratt(struct timer_list *t)
|
||||
uint64_t sli_intr, cnt;
|
||||
|
||||
phba = from_timer(phba, t, eratt_poll);
|
||||
if (!(phba->hba_flag & HBA_SETUP))
|
||||
return;
|
||||
|
||||
/* Here we will also keep track of interrupts per sec of the hba */
|
||||
sli_intr = phba->sli.slistat.sli_intr;
|
||||
@@ -7693,7 +7695,9 @@ lpfc_sli4_repost_sgl_list(struct lpfc_hba *phba,
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
} else {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3161 Failure to post sgl to port.\n");
|
||||
"3161 Failure to post sgl to port,status %x "
|
||||
"blkcnt %d totalcnt %d postcnt %d\n",
|
||||
status, block_cnt, total_cnt, post_cnt);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -8478,6 +8482,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
}
|
||||
}
|
||||
phba->hba_flag &= ~HBA_SETUP;
|
||||
|
||||
lpfc_sli4_dip(phba);
|
||||
|
||||
@@ -9282,6 +9287,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba)
|
||||
* would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing
|
||||
* it to fail all outstanding SCSI IO.
|
||||
*/
|
||||
set_bit(MBX_TMO_ERR, &phba->bit_flags);
|
||||
spin_lock_irq(&phba->pport->work_port_lock);
|
||||
phba->pport->work_port_events &= ~WORKER_MBOX_TMO;
|
||||
spin_unlock_irq(&phba->pport->work_port_lock);
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.13"
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.14"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
|
||||
Reference in New Issue
Block a user