lpfc: Update lpfc to revision 14.2.0.14
Subsystems (2)
cover lpfc: Update lpfc to revision 14.2.0.14
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.
Justin Tee (12):
lpfc: Pull out fw diagnostic dump log message from driver's trace
buffer
lpfc: Simplify fcp_abort transport callback log message
lpfc: Remove extra ndlp kref decrement in FLOGI cmpl for loop topology
lpfc: Qualify ndlp discovery state when processing RSCN
lpfc: Revise ndlp kref handling for dev_loss_tmo_callbk and
lpfc_drop_node
lpfc: Set Establish Image Pair service parameter only for Target
Functions
lpfc: Make fabric zone discovery more robust when handling unsolicited
LOGO
lpfc: Abort outstanding ELS cmds when mailbox timeout error is
detected
lpfc: Refactor cpu affinity assignment paths
lpfc: Clean up SLI-4 sysfs resource reporting
lpfc: Update lpfc version to 14.2.0.14
lpfc: Copyright updates for 14.2.0.14 patches
drivers/scsi/lpfc/lpfc.h | 20 +++++ drivers/scsi/lpfc/lpfc_attr.c | 136 +++++++++++++++++++++-------- drivers/scsi/lpfc/lpfc_ct.c | 20 +++-- drivers/scsi/lpfc/lpfc_els.c | 58 ++++++++---- drivers/scsi/lpfc/lpfc_hbadisc.c | 77 ++++++++++------ drivers/scsi/lpfc/lpfc_hw.h | 2 + drivers/scsi/lpfc/lpfc_init.c | 53 ++++++----- drivers/scsi/lpfc/lpfc_nportdisc.c | 94 +++++++++++--------- drivers/scsi/lpfc/lpfc_nvme.c | 16 ++-- drivers/scsi/lpfc/lpfc_nvmet.c | 5 +- drivers/scsi/lpfc/lpfc_sli.c | 8 +- drivers/scsi/lpfc/lpfc_version.h | 2 +- 12 files changed, 324 insertions(+), 167 deletions(-)
Signature · 1 line
2.38.0
PATCH 1/12 lpfc: Pull out fw diagnostic dump log message from driver's trace buffer
The firmware diagnostic dump log message does not need to be a part of the driver's log trace buffer because it is an expected user triggered event. Change LOG_TRACE_EVENT verbose flag to LOG_SLI.
--- drivers/scsi/lpfc/lpfc_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_init.c +1 -1
@@ -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 )
Signature · 1 line
2.38.0
PATCH 2/12 lpfc: Simplify fcp_abort transport callback log message
In reply to Justin TeeThe driver is reaching into a nvme_fc_cmd_iu ptr that belongs to the transport during an abort. This could cause an unintentional ptr dereference into memory that the driver does not own. Since the nvme_fc_cmd_iu ptr was for logging purposes only, simplify the log message such that the nvme_fc_cmd_iu reference is no longer needed.
--- drivers/scsi/lpfc/lpfc_nvme.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/scsi/lpfc/lpfc_nvme.c +2 -9
@@ -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:
Signature · 1 line
2.38.0
PATCH 3/12 lpfc: Remove extra ndlp kref decrement in FLOGI cmpl for loop topology
In reply to Justin TeeIn lpfc_cmpl_els_flogi, the return out: label decrements the ndlp kref signaling that FLOGI processing on the ndlp is complete. In loop topology path, there is an unnecessary ndlp put because it also branches to the out:
label. This also signals ndlp usage completion too soon. As such, remove the extra lpfc_nlp_put when in loop topology.
--- drivers/scsi/lpfc/lpfc_els.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_els.c +1 -2
@@ -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;
Signature · 1 line
2.38.0
PATCH 4/12 lpfc: Qualify ndlp discovery state when processing RSCN
In reply to Justin TeeConditionalize when to put an ndlp into recovery mode when processing RSCNs. As long as an ndlp state is beyond a PLOGI issue and has been mapped to a transport layer before, the ndlp qualifies to be put into recovery mode. Otherwise, treat the ndlp rport normally through the discovery engine.
--- drivers/scsi/lpfc/lpfc_hbadisc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_hbadisc.c +5 -2
@@ -5757,8 +5757,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 ;
Signature · 1 line
2.38.0
PATCH 5/12 lpfc: Revise ndlp kref handling for dev_loss_tmo_callbk and lpfc_drop_node
In reply to Justin TeeThe ndlp kref count implementation in lpfc_dev_loss_tmo_callbk removes the initial node reference when a vport is unloading. When lpfc_cleanup sends a DEVICE_RM event and is in NPR state, the driver calls lpfc_drop_node. Subsequently, lpfc_drop_node also removes an ndlp kref thinking it is the initial reference. This unintentionally introduces an extra kref decrement on the ndlp object.
Fix by using the NLP_DROPPED node flag in lpfc_dev_loss_tmo_callbk and lpfc_drop_node to coordinate the removal of the initial node reference.
In lpfc_dev_loss_tmo_callbk, remove the SCSI transport reference provided the node is registered in the dev_loss context because the driver cannot call the SCSI transport in dev_loss context or afterwards. And, have lpfc_drop_node not remove a reference if another thread is acting or has already acted on it.
--- drivers/scsi/lpfc/lpfc_hbadisc.c | 70 +++++++++++++++++++++----------- drivers/scsi/lpfc/lpfc_nvme.c | 5 ++- 2 files changed, 50 insertions(+), 25 deletions(-)
drivers/scsi/lpfc/lpfc_hbadisc.c +47 -23
@@ -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); }/*
drivers/scsi/lpfc/lpfc_nvme.c +3 -2
@@ -2503,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;
Signature · 1 line
2.38.0
PATCH 6/12 lpfc: Set Establish Image Pair service parameter only for Target Functions
In reply to Justin TeePreviously, Establish Image Pair was set in all PRLI_ACC responses regardless if the received PRLI was from an initiator or target function. Specific target vendors that can operate in both initiator and target mode, may view the PRLI_ACC with Establish Image Pair set as an invalid service parameter when operating in initiator only mode. This causes discovery issues later when the target switches on its target mode function.
Revise logic that determines an rport's role as an initiator or target and set the Establish Image Pair service parameter bit only if the Target Function bit is set.
--- drivers/scsi/lpfc/lpfc_els.c | 16 +++++++++++- drivers/scsi/lpfc/lpfc_hw.h | 2 ++ drivers/scsi/lpfc/lpfc_nportdisc.c | 39 +++++++++++++++++++----------- 3 files changed, 42 insertions(+), 15 deletions(-)
drivers/scsi/lpfc/lpfc_els.c +15 -1
@@ -6165,11 +6165,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;
drivers/scsi/lpfc/lpfc_hw.h +2 -0
@@ -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 */
drivers/scsi/lpfc/lpfc_nportdisc.c +25 -14
@@ -2148,6 +2148,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 +2183,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 && 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->Retry) - ndlp->nlp_fcp_info |=NLP_FCP_2_DEVICE ; +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) &&
Signature · 1 line
2.38.0
PATCH 7/12 lpfc: Make fabric zone discovery more robust when handling unsolicited LOGO
In reply to Justin TeeThis patch provides better target rport recovery when a target rport is running in initiator mode to discover the fabric. Such a target will issue a LOGO before switching back to strict target mode and changes are made to recover the login. Log messages are also updated accordingly.
--- drivers/scsi/lpfc/lpfc_ct.c | 20 +++++++---- drivers/scsi/lpfc/lpfc_els.c | 14 ++++---- drivers/scsi/lpfc/lpfc_nportdisc.c | 53 ++++++++++++++++-------------- 3 files changed, 50 insertions(+), 37 deletions(-)
drivers/scsi/lpfc/lpfc_ct.c +14 -6
@@ -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",
drivers/scsi/lpfc/lpfc_els.c +8 -6
@@ -2376,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))
@@ -2390,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; }/*
drivers/scsi/lpfc/lpfc_nportdisc.c +28 -25
71 lines not on this page · raw message
Signature · 1 line
2.38.0
PATCH 8/12 lpfc: Abort outstanding ELS cmds when mailbox timeout error is detected
In reply to Justin TeeA mailbox timeout error usually indicates something has gone wrong, and a follow up reset of the HBA is a typical recovery mechanism. Introduce a MBX_TMO_ERR flag to detect such cases and have lpfc_els_flush_cmd abort ELS commands if the MBX_TMO_ERR flag condition was set. This ensures all of the registered SGL resources meant for ELS traffic are not leaked after an HBA reset.
--- drivers/scsi/lpfc/lpfc.h | 1 + drivers/scsi/lpfc/lpfc_els.c | 25 ++++++++++++++++++------- drivers/scsi/lpfc/lpfc_init.c | 20 +++++++++++++++++--- drivers/scsi/lpfc/lpfc_sli.c | 8 +++++++- 4 files changed, 43 insertions(+), 11 deletions(-)
drivers/scsi/lpfc/lpfc.h +1 -0
@@ -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 {
drivers/scsi/lpfc/lpfc_els.c +18 -7
@@ -9603,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);
@@ -9629,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
@@ -9656,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); }
@@ -9669,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,
drivers/scsi/lpfc/lpfc_init.c +17 -3
@@ -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); + } }/**
drivers/scsi/lpfc/lpfc_sli.c +7 -1
@@ -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);
Signature · 1 line
2.38.0
PATCH 9/12 lpfc: Refactor cpu affinity assignment paths
In reply to Justin TeeDuring initialization, a lot of the same logic is used on MSI-X vector cpu affinity assignment.
Create a lpfc_next_present_cpu helper routine, and apply its usage for refactoring purposes.
--- drivers/scsi/lpfc/lpfc.h | 19 +++++++++++++++++++ drivers/scsi/lpfc/lpfc_init.c | 31 +++++++------------------------ drivers/scsi/lpfc/lpfc_nvmet.c | 5 +---- 3 files changed, 27 insertions(+), 28 deletions(-)
drivers/scsi/lpfc/lpfc.h +19 -0
@@ -1709,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.
drivers/scsi/lpfc/lpfc_init.c +7 -24
@@ -12512,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 ;
@@ -12527,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 "
@@ -12562,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,
@@ -12581,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 "
@@ -12654,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,
@@ -12668,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 */
@@ -12680,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,
drivers/scsi/lpfc/lpfc_nvmet.c +1 -4
@@ -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) {
Signature · 1 line
2.38.0
PATCH 10/12 lpfc: Clean up SLI-4 sysfs resource reporting
In reply to Justin TeeCurrently, we have dated logic to work around the differences between SLI-4 and SLI-3 resource reporting through sysfs.
Leave the SLI-3 path untouched, but for SLI4 path, retrieve resource values from the phba->sli4_hba->max_cfg_param structure. Max values are populated during ACQE events right after READ_CONFIG mbox cmd is sent. Instead of the dated subtraction logic, used resource calculation is directly fed into sysfs for display.
--- drivers/scsi/lpfc/lpfc_attr.c | 136 +++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 35 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +101 -35
@@ -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; + +/* 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 ; + *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; + } -/* 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 ; +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; + } -/* 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; + *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" ); }
Signature · 1 line
2.38.0
PATCH 11/12 lpfc: Update lpfc version to 14.2.0.14
In reply to Justin TeeUpdate lpfc version to 14.2.0.14
--- drivers/scsi/lpfc/lpfc_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_version.h +1 -1
@@ -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 */
Signature · 1 line
2.38.0
PATCH 12/12 lpfc: Copyright updates for 14.2.0.14 patches
In reply to Justin TeeUpdate copyrights to 2023 for files modified in the 14.2.0.14 patch set.
--- drivers/scsi/lpfc/lpfc_nportdisc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_nportdisc.c +1 -1
@@ -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. *
Signature · 1 line
2.38.0
Martin K. Petersen
AppliedJustin,
Quoted 6 lines
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.
Applied to 6.6/scsi-staging, thanks!
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Martin K. Petersen
AppliedQuoted 8 lines · Justin Tee
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.
[...]
Applied to 6.6/scsi-queue, thanks!
[01/12] lpfc: Pull out fw diagnostic dump log message from driver's trace buffer
https://git.kernel.org/mkp/scsi/c/4cf7cfa8bae1 [02/12] lpfc: Simplify fcp_abort transport callback log message https://git.kernel.org/mkp/scsi/c/1a5cd3d073ee [03/12] lpfc: Remove extra ndlp kref decrement in FLOGI cmpl for loop topology https://git.kernel.org/mkp/scsi/c/869ab8b8a31c [04/12] lpfc: Qualify ndlp discovery state when processing RSCN https://git.kernel.org/mkp/scsi/c/377d7abadd74 [05/12] lpfc: Revise ndlp kref handling for dev_loss_tmo_callbk and lpfc_drop_node https://git.kernel.org/mkp/scsi/c/90cec07f53e9 [06/12] lpfc: Set Establish Image Pair service parameter only for Target Functions https://git.kernel.org/mkp/scsi/c/04c320011492 [07/12] lpfc: Make fabric zone discovery more robust when handling unsolicited LOGO https://git.kernel.org/mkp/scsi/c/9388da303766 [08/12] lpfc: Abort outstanding ELS cmds when mailbox timeout error is detected https://git.kernel.org/mkp/scsi/c/089ea22e374a [09/12] lpfc: Refactor cpu affinity assignment paths https://git.kernel.org/mkp/scsi/c/d668b368efc2 [10/12] lpfc: Clean up SLI-4 sysfs resource reporting https://git.kernel.org/mkp/scsi/c/81907422cac0 [11/12] lpfc: Update lpfc version to 14.2.0.14 https://git.kernel.org/mkp/scsi/c/cfb9b8f506d5 [12/12] lpfc: Copyright updates for 14.2.0.14 patches https://git.kernel.org/mkp/scsi/c/71fe5ddac546
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering