mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
Merge patch series "lpfc: Update lpfc to revision 14.2.0.16"
Justin Tee <justintee8345@gmail.com> says: Update lpfc to revision 14.2.0.16 This patch set contains a user input range check correction, static code analyzer fixes, refactoring of clean up code, and logging enhancements. The patches were cut against Martin's 6.7/scsi-queue tree. Link: https://lore.kernel.org/r/20231031191224.150862-1-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
2aee050cef
@ -33,6 +33,7 @@
|
||||
struct lpfc_sli2_slim;
|
||||
|
||||
#define ELX_MODEL_NAME_SIZE 80
|
||||
#define ELX_FW_NAME_SIZE 84
|
||||
|
||||
#define LPFC_PCI_DEV_LP 0x1
|
||||
#define LPFC_PCI_DEV_OC 0x2
|
||||
|
@ -5905,11 +5905,11 @@ LPFC_ATTR_RW(ras_fwlog_level, 0, 0, 4, "Firmware Logging Level");
|
||||
/*
|
||||
* lpfc_ras_fwlog_func: Firmware logging enabled on function number
|
||||
* Default function which has RAS support : 0
|
||||
* Value Range is [0..7].
|
||||
* Value Range is [0..3].
|
||||
* FW logging is a global action and enablement is via a specific
|
||||
* port.
|
||||
*/
|
||||
LPFC_ATTR_RW(ras_fwlog_func, 0, 0, 7, "Firmware Logging Enabled on Function");
|
||||
LPFC_ATTR_RW(ras_fwlog_func, 0, 0, 3, "Firmware Logging Enabled on Function");
|
||||
|
||||
/*
|
||||
* lpfc_enable_bbcr: Enable BB Credit Recovery
|
||||
|
@ -2062,8 +2062,9 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* PLOGI completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0102 PLOGI completes to NPort x%06x "
|
||||
"Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_fc4_type,
|
||||
"IoTag x%x Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, iotag,
|
||||
ndlp->nlp_fc4_type,
|
||||
ulp_status, ulp_word4,
|
||||
disc, vport->num_disc_nodes);
|
||||
|
||||
@ -2128,8 +2129,8 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
NLP_EVT_DEVICE_RM);
|
||||
} else {
|
||||
/* Good status, call state machine */
|
||||
prsp = list_entry(cmdiocb->cmd_dmabuf->list.next,
|
||||
struct lpfc_dmabuf, list);
|
||||
prsp = list_get_first(&cmdiocb->cmd_dmabuf->list,
|
||||
struct lpfc_dmabuf, list);
|
||||
if (!prsp)
|
||||
goto out;
|
||||
if (!lpfc_is_els_acc_rsp(prsp))
|
||||
@ -2362,9 +2363,10 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* PRLI completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0103 PRLI completes to NPort x%06x "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
"Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, ulp_status, ulp_word4,
|
||||
vport->num_disc_nodes, ndlp->fc4_prli_sent);
|
||||
vport->num_disc_nodes, ndlp->fc4_prli_sent,
|
||||
ndlp->fc4_xpt_flags);
|
||||
|
||||
/* Check to see if link went down during discovery */
|
||||
if (lpfc_els_chk_latt(vport))
|
||||
@ -2805,7 +2807,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
IOCB_t *irsp;
|
||||
struct lpfc_nodelist *ndlp;
|
||||
int disc;
|
||||
u32 ulp_status, ulp_word4, tmo;
|
||||
u32 ulp_status, ulp_word4, tmo, iotag;
|
||||
bool release_node = false;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
@ -2818,9 +2820,11 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
tmo = get_wqe_tmo(cmdiocb);
|
||||
iotag = get_wqe_reqtag(cmdiocb);
|
||||
} else {
|
||||
irsp = &rspiocb->iocb;
|
||||
tmo = irsp->ulpTimeout;
|
||||
iotag = irsp->ulpIoTag;
|
||||
}
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
@ -2838,9 +2842,11 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* ADISC completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0104 ADISC completes to NPort x%x "
|
||||
"Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, ulp_status, ulp_word4,
|
||||
"IoTag x%x Data: x%x x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, iotag,
|
||||
ulp_status, ulp_word4,
|
||||
tmo, disc, vport->num_disc_nodes);
|
||||
|
||||
/* Check to see if link went down during discovery */
|
||||
if (lpfc_els_chk_latt(vport)) {
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
@ -3001,7 +3007,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
int wake_up_waiter = 0;
|
||||
u32 ulp_status;
|
||||
u32 ulp_word4;
|
||||
u32 tmo;
|
||||
u32 tmo, iotag;
|
||||
|
||||
/* we pass cmdiocb to state machine which needs rspiocb as well */
|
||||
cmdiocb->rsp_iocb = rspiocb;
|
||||
@ -3011,9 +3017,11 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
tmo = get_wqe_tmo(cmdiocb);
|
||||
iotag = get_wqe_reqtag(cmdiocb);
|
||||
} else {
|
||||
irsp = &rspiocb->iocb;
|
||||
tmo = irsp->ulpTimeout;
|
||||
iotag = irsp->ulpIoTag;
|
||||
}
|
||||
|
||||
spin_lock_irq(&ndlp->lock);
|
||||
@ -3032,9 +3040,11 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* LOGO completes to NPort <nlp_DID> */
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0105 LOGO completes to NPort x%x "
|
||||
"refcnt %d nflags x%x Data: x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
|
||||
ulp_status, ulp_word4,
|
||||
"IoTag x%x refcnt %d nflags x%x xflags x%x "
|
||||
"Data: x%x x%x x%x x%x\n",
|
||||
ndlp->nlp_DID, iotag,
|
||||
kref_read(&ndlp->kref), ndlp->nlp_flag,
|
||||
ndlp->fc4_xpt_flags, ulp_status, ulp_word4,
|
||||
tmo, vport->num_disc_nodes);
|
||||
|
||||
if (lpfc_els_chk_latt(vport)) {
|
||||
@ -5075,16 +5085,19 @@ out_retry:
|
||||
if (logerr) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0137 No retry ELS command x%x to remote "
|
||||
"NPORT x%x: Out of Resources: Error:x%x/%x\n",
|
||||
cmd, did, ulp_status,
|
||||
ulp_word4);
|
||||
"NPORT x%x: Out of Resources: Error:x%x/%x "
|
||||
"IoTag x%x\n",
|
||||
cmd, did, ulp_status, ulp_word4,
|
||||
cmdiocb->iotag);
|
||||
}
|
||||
else {
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
|
||||
"0108 No retry ELS command x%x to remote "
|
||||
"NPORT x%x Retried:%d Error:x%x/%x\n",
|
||||
cmd, did, cmdiocb->retry, ulp_status,
|
||||
ulp_word4);
|
||||
"0108 No retry ELS command x%x to remote "
|
||||
"NPORT x%x Retried:%d Error:x%x/%x "
|
||||
"IoTag x%x nflags x%x\n",
|
||||
cmd, did, cmdiocb->retry, ulp_status,
|
||||
ulp_word4, cmdiocb->iotag,
|
||||
(ndlp ? ndlp->nlp_flag : 0));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -411,7 +411,7 @@ lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
|
||||
"port_state = x%x\n",
|
||||
ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp,
|
||||
ndlp->nlp_flag, vport->port_state);
|
||||
spin_lock_irqsave(&ndlp->lock, iflags);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irqrestore(&ndlp->lock, iflags);
|
||||
}
|
||||
|
@ -14721,7 +14721,7 @@ out:
|
||||
int
|
||||
lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
|
||||
{
|
||||
uint8_t file_name[ELX_MODEL_NAME_SIZE];
|
||||
char file_name[ELX_FW_NAME_SIZE] = {0};
|
||||
int ret;
|
||||
const struct firmware *fw;
|
||||
|
||||
@ -14730,7 +14730,7 @@ lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
|
||||
LPFC_SLI_INTF_IF_TYPE_2)
|
||||
return -EPERM;
|
||||
|
||||
snprintf(file_name, ELX_MODEL_NAME_SIZE, "%s.grp", phba->ModelName);
|
||||
scnprintf(file_name, sizeof(file_name), "%s.grp", phba->ModelName);
|
||||
|
||||
if (fw_upgrade == INT_FW_UPGRADE) {
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
|
@ -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. *
|
||||
@ -1814,7 +1814,9 @@ lpfc_sli4_mbox_cmd_free(struct lpfc_hba *phba, struct lpfcMboxq *mbox)
|
||||
dma_free_coherent(&phba->pcidev->dev, SLI4_PAGE_SIZE,
|
||||
mbox->sge_array->addr[sgentry], phyaddr);
|
||||
}
|
||||
/* Free the sge address array memory */
|
||||
/* Reinitialize the context pointers to avoid stale usage. */
|
||||
mbox->ctx_buf = NULL;
|
||||
mbox->context3 = NULL;
|
||||
kfree(mbox->sge_array);
|
||||
/* Finally, free the mailbox command itself */
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
|
@ -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-2014 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
@ -48,6 +48,29 @@
|
||||
#define LPFC_RRQ_POOL_SIZE 256 /* max elements in non-DMA pool */
|
||||
#define LPFC_MBX_POOL_SIZE 256 /* max elements in MBX non-DMA pool */
|
||||
|
||||
/* lpfc_mbox_free_sli_mbox
|
||||
*
|
||||
* @phba: HBA to free memory for
|
||||
* @mbox: mailbox command to free
|
||||
*
|
||||
* This routine detects the mbox type and calls the correct
|
||||
* free routine to fully release all associated memory.
|
||||
*/
|
||||
static void
|
||||
lpfc_mem_free_sli_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
|
||||
{
|
||||
/* Detect if the caller's mbox is an SLI4_CONFIG type. If so, this
|
||||
* mailbox type requires a different cleanup routine. Otherwise, the
|
||||
* mailbox is just an mbuf and mem_pool release.
|
||||
*/
|
||||
if (phba->sli_rev == LPFC_SLI_REV4 &&
|
||||
bf_get(lpfc_mqe_command, &mbox->u.mqe) == MBX_SLI4_CONFIG) {
|
||||
lpfc_sli4_mbox_cmd_free(phba, mbox);
|
||||
} else {
|
||||
lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
lpfc_mem_alloc_active_rrq_pool_s4(struct lpfc_hba *phba) {
|
||||
size_t bytes;
|
||||
@ -288,27 +311,16 @@ lpfc_mem_free_all(struct lpfc_hba *phba)
|
||||
{
|
||||
struct lpfc_sli *psli = &phba->sli;
|
||||
LPFC_MBOXQ_t *mbox, *next_mbox;
|
||||
struct lpfc_dmabuf *mp;
|
||||
|
||||
/* Free memory used in mailbox queue back to mailbox memory pool */
|
||||
list_for_each_entry_safe(mbox, next_mbox, &psli->mboxq, list) {
|
||||
mp = (struct lpfc_dmabuf *)(mbox->ctx_buf);
|
||||
if (mp) {
|
||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||
kfree(mp);
|
||||
}
|
||||
list_del(&mbox->list);
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
lpfc_mem_free_sli_mbox(phba, mbox);
|
||||
}
|
||||
/* Free memory used in mailbox cmpl list back to mailbox memory pool */
|
||||
list_for_each_entry_safe(mbox, next_mbox, &psli->mboxq_cmpl, list) {
|
||||
mp = (struct lpfc_dmabuf *)(mbox->ctx_buf);
|
||||
if (mp) {
|
||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||
kfree(mp);
|
||||
}
|
||||
list_del(&mbox->list);
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
lpfc_mem_free_sli_mbox(phba, mbox);
|
||||
}
|
||||
/* Free the active mailbox command back to the mailbox memory pool */
|
||||
spin_lock_irq(&phba->hbalock);
|
||||
@ -316,12 +328,7 @@ lpfc_mem_free_all(struct lpfc_hba *phba)
|
||||
spin_unlock_irq(&phba->hbalock);
|
||||
if (psli->mbox_active) {
|
||||
mbox = psli->mbox_active;
|
||||
mp = (struct lpfc_dmabuf *)(mbox->ctx_buf);
|
||||
if (mp) {
|
||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||
kfree(mp);
|
||||
}
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
lpfc_mem_free_sli_mbox(phba, mbox);
|
||||
psli->mbox_active = NULL;
|
||||
}
|
||||
|
||||
|
@ -2995,8 +2995,9 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
LPFC_SLI_INTF_IF_TYPE_2)) {
|
||||
if (ndlp) {
|
||||
lpfc_printf_vlog(
|
||||
vport, KERN_INFO, LOG_MBOX | LOG_SLI,
|
||||
"0010 UNREG_LOGIN vpi:%x "
|
||||
vport, KERN_INFO,
|
||||
LOG_MBOX | LOG_SLI | LOG_NODE,
|
||||
"0010 UNREG_LOGIN vpi:x%x "
|
||||
"rpi:%x DID:%x defer x%x flg x%x "
|
||||
"x%px\n",
|
||||
vport->vpi, ndlp->nlp_rpi,
|
||||
@ -3012,7 +3013,8 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
(ndlp->nlp_defer_did !=
|
||||
NLP_EVT_NOTHING_PENDING)) {
|
||||
lpfc_printf_vlog(
|
||||
vport, KERN_INFO, LOG_DISCOVERY,
|
||||
vport, KERN_INFO,
|
||||
LOG_MBOX | LOG_SLI | LOG_NODE,
|
||||
"4111 UNREG cmpl deferred "
|
||||
"clr x%x on "
|
||||
"NPort x%x Data: x%x x%px\n",
|
||||
@ -3938,6 +3940,9 @@ void lpfc_poll_eratt(struct timer_list *t)
|
||||
if (!(phba->hba_flag & HBA_SETUP))
|
||||
return;
|
||||
|
||||
if (phba->pport->load_flag & FC_UNLOADING)
|
||||
return;
|
||||
|
||||
/* Here we will also keep track of interrupts per sec of the hba */
|
||||
sli_intr = phba->sli.slistat.sli_intr;
|
||||
|
||||
@ -10141,11 +10146,12 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
||||
"(%d):0354 Mbox cmd issue - Enqueue Data: "
|
||||
"x%x (x%x/x%x) x%x x%x x%x\n",
|
||||
"x%x (x%x/x%x) x%x x%x x%x x%x\n",
|
||||
mboxq->vport ? mboxq->vport->vpi : 0xffffff,
|
||||
bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
||||
lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
||||
lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
||||
mboxq->u.mb.un.varUnregLogin.rpi,
|
||||
phba->pport->port_state,
|
||||
psli->sli_flag, MBX_NOWAIT);
|
||||
/* Wake up worker thread to transport mailbox command from head */
|
||||
@ -22167,6 +22173,12 @@ struct lpfc_io_buf *lpfc_get_io_buf(struct lpfc_hba *phba,
|
||||
* The data will be truncated if datasz is not large enough.
|
||||
* Version 1 is not supported with Embedded mbox cmd, so we must use version 0.
|
||||
* Returns the actual bytes read from the object.
|
||||
*
|
||||
* This routine is hard coded to use a poll completion. Unlike other
|
||||
* sli4_config mailboxes, it uses lpfc_mbuf memory which is not
|
||||
* cleaned up in lpfc_sli4_cmd_mbox_free. If this routine is modified
|
||||
* to use interrupt-based completions, code is needed to fully cleanup
|
||||
* the memory.
|
||||
*/
|
||||
int
|
||||
lpfc_read_object(struct lpfc_hba *phba, char *rdobject, uint32_t *datap,
|
||||
|
@ -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. *
|
||||
@ -182,9 +182,11 @@ typedef struct lpfcMboxq {
|
||||
struct lpfc_mqe mqe;
|
||||
} u;
|
||||
struct lpfc_vport *vport; /* virtual port pointer */
|
||||
void *ctx_ndlp; /* caller ndlp information */
|
||||
void *ctx_buf; /* caller buffer information */
|
||||
void *context3;
|
||||
void *ctx_ndlp; /* an lpfc_nodelist pointer */
|
||||
void *ctx_buf; /* an lpfc_dmabuf pointer */
|
||||
void *context3; /* a generic pointer. Code must
|
||||
* accommodate the actual datatype.
|
||||
*/
|
||||
|
||||
void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
|
||||
uint8_t mbox_flag;
|
||||
|
@ -20,7 +20,7 @@
|
||||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.15"
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.16"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
|
Loading…
Reference in New Issue
Block a user