Commit 359aeb86 authored by Martin K. Petersen's avatar Martin K. Petersen
Browse files

Merge patch series "Update lpfc to revision 14.4.0.5"

Justin Tee <justintee8345@gmail.com> says:

Update lpfc to revision 14.4.0.5

This patch set contains bug fixes related to HBA state clean ups, FCP
discovery on older adapters, kref imbalances, log message improvements,
and support for a new diagnostic loopback testing mode.

The patches were cut against Martin's 6.12/scsi-queue tree.

Link: https://lore.kernel.org/r/20240912232447.45607-1-justintee8345@gmail.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parents 95474648 b071c1a9
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3208,6 +3208,9 @@ lpfc_bsg_diag_loopback_run(struct bsg_job *job)
	cmdiocbq->num_bdes = num_bde;
	cmdiocbq->cmd_flag |= LPFC_IO_LIBDFC;
	cmdiocbq->cmd_flag |= LPFC_IO_LOOPBACK;
	if (phba->cfg_vmid_app_header)
		cmdiocbq->cmd_flag |= LPFC_IO_VMID;

	cmdiocbq->vport = phba->pport;
	cmdiocbq->cmd_cmpl = NULL;
	cmdiocbq->bpl_dmabuf = txbmp;
+17 −5
Original line number Diff line number Diff line
@@ -1572,8 +1572,8 @@ lpfc_cmpl_ct_cmd_gft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			}
		}
	} else
		lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
				 "3065 GFT_ID failed x%08x\n", ulp_status);
		lpfc_vlog_msg(vport, KERN_WARNING, LOG_DISCOVERY,
			      "3065 GFT_ID status x%08x\n", ulp_status);

out:
	lpfc_ct_free_iocb(phba, cmdiocb);
@@ -1647,6 +1647,18 @@ lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
	}

out:
	/* If the caller wanted a synchronous DA_ID completion, signal the
	 * wait obj and clear flag to reset the vport.
	 */
	if (ndlp->save_flags & NLP_WAIT_FOR_DA_ID) {
		if (ndlp->da_id_waitq)
			wake_up(ndlp->da_id_waitq);
	}

	spin_lock_irq(&ndlp->lock);
	ndlp->save_flags &= ~NLP_WAIT_FOR_DA_ID;
	spin_unlock_irq(&ndlp->lock);

	lpfc_ct_free_iocb(phba, cmdiocb);
	lpfc_nlp_put(ndlp);
	return;
@@ -2246,7 +2258,7 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		}

		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
				 "0229 FDMI cmd %04x failed, latt = %d "
				 "0229 FDMI cmd %04x latt = %d "
				 "ulp_status: x%x, rid x%x\n",
				 be16_to_cpu(fdmi_cmd), latt, ulp_status,
				 ulp_word4);
@@ -2263,9 +2275,9 @@ lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
	/* Check for a CT LS_RJT response */
	cmd =  be16_to_cpu(fdmi_cmd);
	if (be16_to_cpu(fdmi_rsp) == SLI_CT_RESPONSE_FS_RJT) {
		/* FDMI rsp failed */
		/* Log FDMI reject */
		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_ELS,
				 "0220 FDMI cmd failed FS_RJT Data: x%x", cmd);
				 "0220 FDMI cmd FS_RJT Data: x%x", cmd);

		/* Should we fallback to FDMI-2 / FDMI-1 ? */
		switch (cmd) {
+7 −0
Original line number Diff line number Diff line
@@ -90,6 +90,8 @@ enum lpfc_nlp_save_flags {
	NLP_IN_RECOV_POST_DEV_LOSS	= 0x1,
	/* wait for outstanding LOGO to cmpl */
	NLP_WAIT_FOR_LOGO		= 0x2,
	/* wait for outstanding DA_ID to finish */
	NLP_WAIT_FOR_DA_ID              = 0x4
};

struct lpfc_nodelist {
@@ -159,7 +161,12 @@ struct lpfc_nodelist {
	uint32_t nvme_fb_size; /* NVME target's supported byte cnt */
#define NVME_FB_BIT_SHIFT 9    /* PRLI Rsp first burst in 512B units. */
	uint32_t nlp_defer_did;

	/* These wait objects are NPIV specific.  These IOs must complete
	 * synchronously.
	 */
	wait_queue_head_t *logo_waitq;
	wait_queue_head_t *da_id_waitq;
};

struct lpfc_node_rrq {
+63 −69
Original line number Diff line number Diff line
@@ -979,7 +979,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
				phba->fcoe_cvl_eventtag_attn =
					phba->fcoe_cvl_eventtag;
			lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS,
					"2611 FLOGI failed on FCF (x%x), "
					"2611 FLOGI FCF (x%x), "
					"status:x%x/x%x, tmo:x%x, perform "
					"roundrobin FCF failover\n",
					phba->fcf.current_rec.fcf_indx,
@@ -997,8 +997,8 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		if (!(ulp_status == IOSTAT_LOCAL_REJECT &&
		      ((ulp_word4 & IOERR_PARAM_MASK) ==
					IOERR_LOOP_OPEN_FAILURE)))
			lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
					 "2858 FLOGI failure Status:x%x/x%x TMO"
			lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
				      "2858 FLOGI Status:x%x/x%x TMO"
				      ":x%x Data x%lx x%x\n",
				      ulp_status, ulp_word4, tmo,
				      phba->hba_flag, phba->fcf.fcf_flag);
@@ -1023,7 +1023,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			lpfc_nlp_put(ndlp);

		lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
				 "0150 FLOGI failure Status:x%x/x%x "
				 "0150 FLOGI Status:x%x/x%x "
				 "xri x%x TMO:x%x refcnt %d\n",
				 ulp_status, ulp_word4, cmdiocb->sli4_xritag,
				 tmo, kref_read(&ndlp->kref));
@@ -1032,9 +1032,9 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		if (!(ulp_status == IOSTAT_LOCAL_REJECT &&
		      ((ulp_word4 & IOERR_PARAM_MASK) ==
					IOERR_LOOP_OPEN_FAILURE))) {
			/* FLOGI failure */
			lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
					 "0100 FLOGI failure Status:x%x/x%x "
			/* Warn FLOGI status */
			lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
				      "0100 FLOGI Status:x%x/x%x "
				      "TMO:x%x\n",
				      ulp_status, ulp_word4, tmo);
			goto flogifail;
@@ -1964,13 +1964,13 @@ lpfc_cmpl_els_rrq(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,

	if (ulp_status) {
		/* Check for retry */
		/* RRQ failed Don't print the vport to vport rjts */
		/* Warn RRQ status Don't print the vport to vport rjts */
		if (ulp_status != IOSTAT_LS_RJT ||
		    (((ulp_word4) >> 16 != LSRJT_INVALID_CMD) &&
		     ((ulp_word4) >> 16 != LSRJT_UNABLE_TPC)) ||
		    (phba)->pport->cfg_log_verbose & LOG_ELS)
			lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
					 "2881 RRQ failure DID:%06X Status:"
			lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
				      "2881 RRQ DID:%06X Status:"
				      "x%x/x%x\n",
				      ndlp->nlp_DID, ulp_status,
				      ulp_word4);
@@ -2077,13 +2077,13 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			}
			goto out;
		}
		/* PLOGI failed Don't print the vport to vport rjts */
		/* Warn PLOGI status Don't print the vport to vport rjts */
		if (ulp_status != IOSTAT_LS_RJT ||
		    (((ulp_word4) >> 16 != LSRJT_INVALID_CMD) &&
		     ((ulp_word4) >> 16 != LSRJT_UNABLE_TPC)) ||
		    (phba)->pport->cfg_log_verbose & LOG_ELS)
			lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
					 "2753 PLOGI failure DID:%06X "
			lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
				      "2753 PLOGI DID:%06X "
				      "Status:x%x/x%x\n",
				      ndlp->nlp_DID, ulp_status,
				      ulp_word4);
@@ -2323,7 +2323,6 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
	struct lpfc_vport *vport = cmdiocb->vport;
	struct lpfc_nodelist *ndlp;
	char *mode;
	u32 loglevel;
	u32 ulp_status;
	u32 ulp_word4;
	bool release_node = false;
@@ -2372,17 +2371,14 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		 * could be expected.
		 */
		if (test_bit(FC_FABRIC, &vport->fc_flag) ||
		    vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH) {
			mode = KERN_ERR;
			loglevel =  LOG_TRACE_EVENT;
		} else {
		    vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)
			mode = KERN_WARNING;
		else
			mode = KERN_INFO;
			loglevel =  LOG_ELS;
		}

		/* PRLI failed */
		lpfc_printf_vlog(vport, mode, loglevel,
				 "2754 PRLI failure DID:%06X Status:x%x/x%x, "
		/* Warn PRLI status */
		lpfc_printf_vlog(vport, mode, LOG_ELS,
				 "2754 PRLI DID:%06X Status:x%x/x%x, "
				 "data: x%x x%x x%x\n",
				 ndlp->nlp_DID, ulp_status,
				 ulp_word4, ndlp->nlp_state,
@@ -2854,9 +2850,9 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			}
			goto out;
		}
		/* ADISC failed */
		lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
				 "2755 ADISC failure DID:%06X Status:x%x/x%x\n",
		/* Warn ADISC status */
		lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
			      "2755 ADISC DID:%06X Status:x%x/x%x\n",
			      ndlp->nlp_DID, ulp_status,
			      ulp_word4);
		lpfc_disc_state_machine(vport, ndlp, cmdiocb,
@@ -3045,9 +3041,9 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
	 * discovery.  The PLOGI will retry.
	 */
	if (ulp_status) {
		/* LOGO failed */
		lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
				 "2756 LOGO failure, No Retry DID:%06X "
		/* Warn LOGO status */
		lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
			      "2756 LOGO, No Retry DID:%06X "
			      "Status:x%x/x%x\n",
			      ndlp->nlp_DID, ulp_status,
			      ulp_word4);
@@ -4837,9 +4833,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
			  (cmd == ELS_CMD_FDISC) &&
			  (stat.un.b.lsRjtRsnCodeExp == LSEXP_OUT_OF_RESOURCE)){
				lpfc_printf_vlog(vport, KERN_ERR,
						 LOG_TRACE_EVENT,
						 "0125 FDISC Failed (x%x). "
				lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
					      "0125 FDISC (x%x). "
					      "Fabric out of resources\n",
					      stat.un.lsRjtError);
				lpfc_vport_set_state(vport,
@@ -4877,9 +4872,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
						LSEXP_NOTHING_MORE) {
				vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf;
				retry = 1;
				lpfc_printf_vlog(vport, KERN_ERR,
						 LOG_TRACE_EVENT,
						 "0820 FLOGI Failed (x%x). "
				lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
					      "0820 FLOGI (x%x). "
					      "BBCredit Not Supported\n",
					      stat.un.lsRjtError);
			}
@@ -4891,9 +4885,8 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			  ((stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_PNAME) ||
			  (stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
			  ) {
				lpfc_printf_vlog(vport, KERN_ERR,
						 LOG_TRACE_EVENT,
						 "0122 FDISC Failed (x%x). "
				lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
					      "0122 FDISC (x%x). "
					      "Fabric Detected Bad WWN\n",
					      stat.un.lsRjtError);
				lpfc_vport_set_state(vport,
@@ -5355,8 +5348,8 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
	u32 ulp_status, ulp_word4, tmo, did, iotag;

	if (!vport) {
		lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
				"3177 ELS response failed\n");
		lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
				"3177 null vport in ELS rsp\n");
		goto out;
	}
	if (cmdiocb->context_un.mbox)
@@ -9658,11 +9651,12 @@ lpfc_els_flush_cmd(struct lpfc_vport *vport)
		if (piocb->cmd_flag & LPFC_DRIVER_ABORTED && !mbx_tmo_err)
			continue;

		/* On the ELS ring we can have ELS_REQUESTs or
		 * GEN_REQUESTs waiting for a response.
		/* On the ELS ring we can have ELS_REQUESTs, ELS_RSPs,
		 * or GEN_REQUESTs waiting for a CQE response.
		 */
		ulp_command = get_job_cmnd(phba, piocb);
		if (ulp_command == CMD_ELS_REQUEST64_CR) {
		if (ulp_command == CMD_ELS_REQUEST64_WQE ||
		    ulp_command == CMD_XMIT_ELS_RSP64_WQE) {
			list_add_tail(&piocb->dlist, &abort_list);

			/* If the link is down when flushing ELS commands
@@ -11327,9 +11321,9 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		/* Check for retry */
		if (lpfc_els_retry(phba, cmdiocb, rspiocb))
			goto out;
		/* FDISC failed */
		lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
				 "0126 FDISC failed. (x%x/x%x)\n",
		/* Warn FDISC status */
		lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
			      "0126 FDISC cmpl status: x%x/x%x)\n",
			      ulp_status, ulp_word4);
		goto fdisc_failed;
	}
+4 −6
Original line number Diff line number Diff line
@@ -527,6 +527,9 @@ 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);
		if (recovering) {
			lpfc_printf_vlog(vport, KERN_INFO,
					 LOG_DISCOVERY | LOG_NODE,
@@ -539,6 +542,7 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
			spin_lock_irqsave(&ndlp->lock, iflags);
			ndlp->save_flags |= NLP_IN_RECOV_POST_DEV_LOSS;
			spin_unlock_irqrestore(&ndlp->lock, iflags);
			return fcf_inuse;
		} else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
			/* Fabric node fully recovered before this dev_loss_tmo
			 * queue work is processed.  Thus, ignore the
@@ -552,15 +556,9 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
					 ndlp->nlp_DID, kref_read(&ndlp->kref),
					 ndlp, ndlp->nlp_flag,
					 vport->port_state);
			spin_lock_irqsave(&ndlp->lock, iflags);
			ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
			spin_unlock_irqrestore(&ndlp->lock, iflags);
			return fcf_inuse;
		}

		spin_lock_irqsave(&ndlp->lock, iflags);
		ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
		spin_unlock_irqrestore(&ndlp->lock, iflags);
		lpfc_nlp_put(ndlp);
		return fcf_inuse;
	}
Loading