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: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
359aeb8648
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
|
@ -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,11 +997,11 @@ stop_rr_fcf_flogi:
|
||||
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"
|
||||
":x%x Data x%lx x%x\n",
|
||||
ulp_status, ulp_word4, tmo,
|
||||
phba->hba_flag, phba->fcf.fcf_flag);
|
||||
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);
|
||||
|
||||
/* Check for retry */
|
||||
if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
|
||||
@ -1023,7 +1023,7 @@ stop_rr_fcf_flogi:
|
||||
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,11 +1032,11 @@ stop_rr_fcf_flogi:
|
||||
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 "
|
||||
"TMO:x%x\n",
|
||||
ulp_status, ulp_word4, tmo);
|
||||
/* 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,16 +1964,16 @@ 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:"
|
||||
"x%x/x%x\n",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4);
|
||||
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);
|
||||
}
|
||||
|
||||
lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
|
||||
@ -2077,16 +2077,16 @@ 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 "
|
||||
"Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4);
|
||||
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);
|
||||
|
||||
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
|
||||
if (!lpfc_error_lost_link(vport, 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,11 +2850,11 @@ 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",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4);
|
||||
/* 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,
|
||||
NLP_EVT_CMPL_ADISC);
|
||||
|
||||
@ -3045,12 +3041,12 @@ 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 "
|
||||
"Status:x%x/x%x\n",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4);
|
||||
/* 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);
|
||||
|
||||
if (lpfc_error_lost_link(vport, ulp_status, ulp_word4))
|
||||
skip_recovery = 1;
|
||||
@ -4837,11 +4833,10 @@ 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). "
|
||||
"Fabric out of resources\n",
|
||||
stat.un.lsRjtError);
|
||||
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,
|
||||
FC_VPORT_NO_FABRIC_RSCS);
|
||||
}
|
||||
@ -4877,11 +4872,10 @@ 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). "
|
||||
"BBCredit Not Supported\n",
|
||||
stat.un.lsRjtError);
|
||||
lpfc_vlog_msg(vport, KERN_WARNING, LOG_ELS,
|
||||
"0820 FLOGI (x%x). "
|
||||
"BBCredit Not Supported\n",
|
||||
stat.un.lsRjtError);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -4891,11 +4885,10 @@ 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). "
|
||||
"Fabric Detected Bad WWN\n",
|
||||
stat.un.lsRjtError);
|
||||
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,
|
||||
FC_VPORT_FABRIC_REJ_WWN);
|
||||
}
|
||||
@ -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,10 +11321,10 @@ 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",
|
||||
ulp_status, ulp_word4);
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -561,6 +561,27 @@ struct fc_vft_header {
|
||||
|
||||
#include <uapi/scsi/fc/fc_els.h>
|
||||
|
||||
/*
|
||||
* Application Header
|
||||
*/
|
||||
struct fc_app_header {
|
||||
uint32_t dst_app_id;
|
||||
uint32_t src_app_id;
|
||||
#define LOOPBACK_SRC_APPID 0x4321
|
||||
uint32_t word2;
|
||||
uint32_t word3;
|
||||
};
|
||||
|
||||
/*
|
||||
* dfctl optional header definition
|
||||
*/
|
||||
enum lpfc_fc_dfctl {
|
||||
LPFC_FC_NO_DEVICE_HEADER,
|
||||
LPFC_FC_16B_DEVICE_HEADER,
|
||||
LPFC_FC_32B_DEVICE_HEADER,
|
||||
LPFC_FC_64B_DEVICE_HEADER,
|
||||
};
|
||||
|
||||
/*
|
||||
* Extended Link Service LS_COMMAND codes (Payload Word 0)
|
||||
*/
|
||||
|
@ -4847,6 +4847,7 @@ struct fcp_iwrite64_wqe {
|
||||
#define cmd_buff_len_SHIFT 16
|
||||
#define cmd_buff_len_MASK 0x00000ffff
|
||||
#define cmd_buff_len_WORD word3
|
||||
/* Note: payload_offset_len field depends on ASIC support */
|
||||
#define payload_offset_len_SHIFT 0
|
||||
#define payload_offset_len_MASK 0x0000ffff
|
||||
#define payload_offset_len_WORD word3
|
||||
@ -4863,6 +4864,7 @@ struct fcp_iread64_wqe {
|
||||
#define cmd_buff_len_SHIFT 16
|
||||
#define cmd_buff_len_MASK 0x00000ffff
|
||||
#define cmd_buff_len_WORD word3
|
||||
/* Note: payload_offset_len field depends on ASIC support */
|
||||
#define payload_offset_len_SHIFT 0
|
||||
#define payload_offset_len_MASK 0x0000ffff
|
||||
#define payload_offset_len_WORD word3
|
||||
@ -4879,6 +4881,7 @@ struct fcp_icmnd64_wqe {
|
||||
#define cmd_buff_len_SHIFT 16
|
||||
#define cmd_buff_len_MASK 0x00000ffff
|
||||
#define cmd_buff_len_WORD word3
|
||||
/* Note: payload_offset_len field depends on ASIC support */
|
||||
#define payload_offset_len_SHIFT 0
|
||||
#define payload_offset_len_MASK 0x0000ffff
|
||||
#define payload_offset_len_WORD word3
|
||||
|
@ -4699,6 +4699,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
||||
uint64_t wwn;
|
||||
bool use_no_reset_hba = false;
|
||||
int rc;
|
||||
u8 if_type;
|
||||
|
||||
if (lpfc_no_hba_reset_cnt) {
|
||||
if (phba->sli_rev < LPFC_SLI_REV4 &&
|
||||
@ -4773,10 +4774,24 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
|
||||
shost->max_id = LPFC_MAX_TARGET;
|
||||
shost->max_lun = vport->cfg_max_luns;
|
||||
shost->this_id = -1;
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
|
||||
else
|
||||
|
||||
/* Set max_cmd_len applicable to ASIC support */
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
if_type = bf_get(lpfc_sli_intf_if_type,
|
||||
&phba->sli4_hba.sli_intf);
|
||||
switch (if_type) {
|
||||
case LPFC_SLI_INTF_IF_TYPE_2:
|
||||
fallthrough;
|
||||
case LPFC_SLI_INTF_IF_TYPE_6:
|
||||
shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
|
||||
break;
|
||||
default:
|
||||
shost->max_cmd_len = LPFC_FCP_CDB_LEN;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
shost->max_cmd_len = LPFC_FCP_CDB_LEN;
|
||||
}
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
if (!phba->cfg_fcp_mq_threshold ||
|
||||
@ -10436,6 +10451,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
|
||||
struct lpfc_vector_map_info *cpup;
|
||||
struct lpfc_vector_map_info *eqcpup;
|
||||
struct lpfc_eq_intr_info *eqi;
|
||||
u32 wqesize;
|
||||
|
||||
/*
|
||||
* Create HBA Record arrays.
|
||||
@ -10655,9 +10671,15 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
|
||||
* Create ELS Work Queues
|
||||
*/
|
||||
|
||||
/* Create slow-path ELS Work Queue */
|
||||
/*
|
||||
* Create slow-path ELS Work Queue.
|
||||
* Increase the ELS WQ size when WQEs contain an embedded cdb
|
||||
*/
|
||||
wqesize = (phba->fcp_embed_io) ?
|
||||
LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize;
|
||||
|
||||
qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
|
||||
phba->sli4_hba.wq_esize,
|
||||
wqesize,
|
||||
phba->sli4_hba.wq_ecount, cpu);
|
||||
if (!qdesc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
|
@ -4760,7 +4760,7 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport,
|
||||
|
||||
/* Word 3 */
|
||||
bf_set(payload_offset_len, &wqe->fcp_icmd,
|
||||
sizeof(struct fcp_cmnd32) + sizeof(struct fcp_rsp));
|
||||
sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp));
|
||||
|
||||
/* Word 6 */
|
||||
bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
|
||||
|
@ -1940,12 +1940,15 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
|
||||
atot = atomic_xchg(&phba->cgn_sync_alarm_cnt, 0);
|
||||
wtot = atomic_xchg(&phba->cgn_sync_warn_cnt, 0);
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
|
||||
/* ONLY Managed mode will send the CMF_SYNC_WQE to the HBA */
|
||||
if (phba->cmf_active_mode != LPFC_CFG_MANAGED ||
|
||||
phba->link_state == LPFC_LINK_DOWN)
|
||||
return 0;
|
||||
phba->link_state < LPFC_LINK_UP) {
|
||||
ret_val = 0;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
sync_buf = __lpfc_sli_get_iocbq(phba);
|
||||
if (!sync_buf) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_CGN_MGMT,
|
||||
@ -11090,9 +11093,17 @@ __lpfc_sli_prep_xmit_seq64_s4(struct lpfc_iocbq *cmdiocbq,
|
||||
/* Word 9 */
|
||||
bf_set(wqe_rcvoxid, &wqe->xmit_sequence.wqe_com, ox_id);
|
||||
|
||||
/* Word 12 */
|
||||
if (cmdiocbq->cmd_flag & (LPFC_IO_LIBDFC | LPFC_IO_LOOPBACK))
|
||||
if (cmdiocbq->cmd_flag & (LPFC_IO_LIBDFC | LPFC_IO_LOOPBACK)) {
|
||||
/* Word 10 */
|
||||
if (cmdiocbq->cmd_flag & LPFC_IO_VMID) {
|
||||
bf_set(wqe_appid, &wqe->xmit_sequence.wqe_com, 1);
|
||||
bf_set(wqe_wqes, &wqe->xmit_sequence.wqe_com, 1);
|
||||
wqe->words[31] = LOOPBACK_SRC_APPID;
|
||||
}
|
||||
|
||||
/* Word 12 */
|
||||
wqe->xmit_sequence.xmit_len = full_size;
|
||||
}
|
||||
else
|
||||
wqe->xmit_sequence.xmit_len =
|
||||
wqe->xmit_sequence.bde.tus.f.bdeSize;
|
||||
@ -18431,6 +18442,7 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr)
|
||||
{
|
||||
/* make rctl_names static to save stack space */
|
||||
struct fc_vft_header *fc_vft_hdr;
|
||||
struct fc_app_header *fc_app_hdr;
|
||||
uint32_t *header = (uint32_t *) fc_hdr;
|
||||
|
||||
#define FC_RCTL_MDS_DIAGS 0xF4
|
||||
@ -18486,6 +18498,32 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (unlikely(phba->link_flag == LS_LOOPBACK_MODE &&
|
||||
phba->cfg_vmid_app_header)) {
|
||||
/* Application header is 16B device header */
|
||||
if (fc_hdr->fh_df_ctl & LPFC_FC_16B_DEVICE_HEADER) {
|
||||
fc_app_hdr = (struct fc_app_header *) (fc_hdr + 1);
|
||||
if (be32_to_cpu(fc_app_hdr->src_app_id) !=
|
||||
LOOPBACK_SRC_APPID) {
|
||||
lpfc_printf_log(phba, KERN_WARNING,
|
||||
LOG_ELS | LOG_LIBDFC,
|
||||
"1932 Loopback src app id "
|
||||
"not matched, app_id:x%x\n",
|
||||
be32_to_cpu(fc_app_hdr->src_app_id));
|
||||
|
||||
goto drop;
|
||||
}
|
||||
} else {
|
||||
lpfc_printf_log(phba, KERN_WARNING,
|
||||
LOG_ELS | LOG_LIBDFC,
|
||||
"1933 Loopback df_ctl bit not set, "
|
||||
"df_ctl:x%x\n",
|
||||
fc_hdr->fh_df_ctl);
|
||||
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
|
||||
"2538 Received frame rctl:x%x, type:x%x, "
|
||||
"frame Data:%08x %08x %08x %08x %08x %08x %08x\n",
|
||||
|
@ -20,7 +20,7 @@
|
||||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "14.4.0.4"
|
||||
#define LPFC_DRIVER_VERSION "14.4.0.5"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
|
@ -626,6 +626,7 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
int rc;
|
||||
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq);
|
||||
|
||||
if (vport->port_type == LPFC_PHYSICAL_PORT) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -679,21 +680,49 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
|
||||
if (!ndlp)
|
||||
goto skip_logo;
|
||||
|
||||
/* Send the DA_ID and Fabric LOGO to cleanup the NPIV fabric entries. */
|
||||
if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE &&
|
||||
phba->link_state >= LPFC_LINK_UP &&
|
||||
phba->fc_topology != LPFC_TOPOLOGY_LOOP) {
|
||||
if (vport->cfg_enable_da_id) {
|
||||
/* Send DA_ID and wait for a completion. */
|
||||
/* Send DA_ID and wait for a completion. This is best
|
||||
* effort. If the DA_ID fails, likely the fabric will
|
||||
* "leak" NportIDs but at least the driver issued the
|
||||
* command.
|
||||
*/
|
||||
ndlp = lpfc_findnode_did(vport, NameServer_DID);
|
||||
if (!ndlp)
|
||||
goto issue_logo;
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->da_id_waitq = &waitq;
|
||||
ndlp->save_flags |= NLP_WAIT_FOR_DA_ID;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
|
||||
rc = lpfc_ns_cmd(vport, SLI_CTNS_DA_ID, 0, 0);
|
||||
if (rc) {
|
||||
lpfc_printf_log(vport->phba, KERN_WARNING,
|
||||
LOG_VPORT,
|
||||
"1829 CT command failed to "
|
||||
"delete objects on fabric, "
|
||||
"rc %d\n", rc);
|
||||
if (!rc) {
|
||||
wait_event_timeout(waitq,
|
||||
!(ndlp->save_flags & NLP_WAIT_FOR_DA_ID),
|
||||
msecs_to_jiffies(phba->fc_ratov * 2000));
|
||||
}
|
||||
|
||||
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 "
|
||||
"Rpi x%x\n",
|
||||
rc, ndlp->save_flags, ndlp->nlp_state,
|
||||
ndlp->nlp_flag, ndlp->nlp_rpi);
|
||||
|
||||
/* Remove the waitq and save_flags. It no
|
||||
* longer matters if the wake happened.
|
||||
*/
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
ndlp->da_id_waitq = NULL;
|
||||
ndlp->save_flags &= ~NLP_WAIT_FOR_DA_ID;
|
||||
spin_unlock_irq(&ndlp->lock);
|
||||
}
|
||||
|
||||
issue_logo:
|
||||
/*
|
||||
* If the vpi is not registered, then a valid FDISC doesn't
|
||||
* exist and there is no need for a ELS LOGO. Just cleanup
|
||||
|
Loading…
Reference in New Issue
Block a user