mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
Merge patch series "lpfc: Update lpfc to revision 14.2.0.10"
Justin Tee <justintee8345@gmail.com> says: Update lpfc to revision 14.2.0.10 This patch set contains fixes for bugs, kernel test robot, and introduces new attention type event handling. Link: https://lore.kernel.org/r/20230109233317.54737-1-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
commit
dae0bb3e1a
@ -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. *
|
||||
@ -1592,8 +1592,6 @@ struct lpfc_hba {
|
||||
struct timer_list cpuhp_poll_timer;
|
||||
struct list_head poll_list; /* slowpath eq polling list */
|
||||
#define LPFC_POLL_HB 1 /* slowpath heartbeat */
|
||||
#define LPFC_POLL_FASTPATH 0 /* called from fastpath */
|
||||
#define LPFC_POLL_SLOWPATH 1 /* called from slowpath */
|
||||
|
||||
char os_host_name[MAXHOSTNAMELEN];
|
||||
|
||||
|
@ -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. *
|
||||
@ -1905,8 +1905,7 @@ lpfc_xcvr_data_show(struct device *dev, struct device_attribute *attr,
|
||||
goto out_free_rdp;
|
||||
}
|
||||
|
||||
strncpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_NAME], 16);
|
||||
chbuf[16] = 0;
|
||||
strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_NAME], 16);
|
||||
|
||||
len = scnprintf(buf, PAGE_SIZE - len, "VendorName:\t%s\n", chbuf);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
@ -1914,17 +1913,13 @@ lpfc_xcvr_data_show(struct device *dev, struct device_attribute *attr,
|
||||
(uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI],
|
||||
(uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI + 1],
|
||||
(uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI + 2]);
|
||||
strncpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_PN], 16);
|
||||
chbuf[16] = 0;
|
||||
strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_PN], 16);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "VendorPN:\t%s\n", chbuf);
|
||||
strncpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_SN], 16);
|
||||
chbuf[16] = 0;
|
||||
strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_SN], 16);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "VendorSN:\t%s\n", chbuf);
|
||||
strncpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_REV], 4);
|
||||
chbuf[4] = 0;
|
||||
strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_REV], 4);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "VendorRev:\t%s\n", chbuf);
|
||||
strncpy(chbuf, &rdp_context->page_a0[SSF_DATE_CODE], 8);
|
||||
chbuf[8] = 0;
|
||||
strscpy(chbuf, &rdp_context->page_a0[SSF_DATE_CODE], 8);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "DateCode:\t%s\n", chbuf);
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "Identifier:\t%xh\n",
|
||||
(uint8_t)rdp_context->page_a0[SSF_IDENTIFIER]);
|
||||
@ -1941,33 +1936,25 @@ lpfc_xcvr_data_show(struct device *dev, struct device_attribute *attr,
|
||||
&rdp_context->page_a0[SSF_TRANSCEIVER_CODE_B7];
|
||||
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "Speeds: \t");
|
||||
if (*(uint8_t *)trasn_code_byte7 == 0) {
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"Unknown\n");
|
||||
} else {
|
||||
if (trasn_code_byte7->fc_sp_100MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"1 ");
|
||||
if (trasn_code_byte7->fc_sp_200mb)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"2 ");
|
||||
if (trasn_code_byte7->fc_sp_400MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"4 ");
|
||||
if (trasn_code_byte7->fc_sp_800MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"8 ");
|
||||
if (trasn_code_byte7->fc_sp_1600MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"16 ");
|
||||
if (trasn_code_byte7->fc_sp_3200MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"32 ");
|
||||
if (trasn_code_byte7->speed_chk_ecc)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"64 ");
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "GB\n");
|
||||
}
|
||||
if (*(uint8_t *)trasn_code_byte7 == 0) {
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "Unknown\n");
|
||||
} else {
|
||||
if (trasn_code_byte7->fc_sp_100MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "1 ");
|
||||
if (trasn_code_byte7->fc_sp_200mb)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "2 ");
|
||||
if (trasn_code_byte7->fc_sp_400MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "4 ");
|
||||
if (trasn_code_byte7->fc_sp_800MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "8 ");
|
||||
if (trasn_code_byte7->fc_sp_1600MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "16 ");
|
||||
if (trasn_code_byte7->fc_sp_3200MB)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "32 ");
|
||||
if (trasn_code_byte7->speed_chk_ecc)
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "64 ");
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len, "GB\n");
|
||||
}
|
||||
temperature = (rdp_context->page_a2[SFF_TEMPERATURE_B1] << 8 |
|
||||
rdp_context->page_a2[SFF_TEMPERATURE_B0]);
|
||||
vcc = (rdp_context->page_a2[SFF_VCC_B1] << 8 |
|
||||
|
@ -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. *
|
||||
@ -253,7 +253,6 @@ int lpfc_read_object(struct lpfc_hba *phba, char *s, uint32_t *datap,
|
||||
uint32_t len);
|
||||
|
||||
void lpfc_sli4_cleanup_poll_list(struct lpfc_hba *phba);
|
||||
int lpfc_sli4_poll_eq(struct lpfc_queue *q, uint8_t path);
|
||||
void lpfc_sli4_poll_hbtimer(struct timer_list *t);
|
||||
void lpfc_sli4_start_polling(struct lpfc_queue *q);
|
||||
void lpfc_sli4_stop_polling(struct lpfc_queue *q);
|
||||
@ -684,6 +683,7 @@ int lpfc_vmid_get_appid(struct lpfc_vport *vport, char *uuid,
|
||||
union lpfc_vmid_io_tag *tag);
|
||||
void lpfc_vmid_vport_cleanup(struct lpfc_vport *vport);
|
||||
int lpfc_issue_els_qfpa(struct lpfc_vport *vport);
|
||||
void lpfc_reinit_vmid(struct lpfc_vport *vport);
|
||||
|
||||
void lpfc_sli_rpi_release(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp);
|
||||
|
@ -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. *
|
||||
@ -1123,6 +1123,9 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
if (sp->cmn.priority_tagging)
|
||||
vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
|
||||
LPFC_VMID_TYPE_PRIO);
|
||||
/* reinitialize the VMID datastructure before returning */
|
||||
if (lpfc_is_vmid_enabled(phba))
|
||||
lpfc_reinit_vmid(vport);
|
||||
|
||||
/*
|
||||
* Address a timing race with dev_loss. If dev_loss is active on
|
||||
@ -2373,15 +2376,30 @@ 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\n",
|
||||
"data: x%x x%x\n",
|
||||
ndlp->nlp_DID, ulp_status,
|
||||
ulp_word4, ndlp->fc4_prli_sent);
|
||||
ulp_word4, ndlp->nlp_state,
|
||||
ndlp->fc4_prli_sent);
|
||||
|
||||
/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
|
||||
if (!lpfc_error_lost_link(ulp_status, ulp_word4))
|
||||
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
|
||||
NLP_EVT_CMPL_PRLI);
|
||||
|
||||
/* The following condition catches an inflight transition
|
||||
* 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) {
|
||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_NODE,
|
||||
"2784 PRLI cmpl: state mismatch "
|
||||
"DID x%06x nstate x%x nflag x%x\n",
|
||||
ndlp->nlp_DID, ndlp->nlp_state,
|
||||
ndlp->nlp_flag);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* For P2P topology, retain the node so that PLOGI can be
|
||||
* attempted on it again.
|
||||
@ -4673,6 +4691,15 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
/* the nameserver fails */
|
||||
maxretry = 0;
|
||||
delay = 100;
|
||||
} else if (cmd == ELS_CMD_PRLI &&
|
||||
ndlp->nlp_state != NLP_STE_PRLI_ISSUE) {
|
||||
/* State-command disagreement. The PRLI was
|
||||
* failed with an invalid rpi meaning there
|
||||
* some unexpected state change. Don't retry.
|
||||
*/
|
||||
maxretry = 0;
|
||||
retry = 0;
|
||||
break;
|
||||
}
|
||||
retry = 1;
|
||||
break;
|
||||
|
@ -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. *
|
||||
@ -1129,21 +1129,6 @@ lpfc_cleanup_rpis(struct lpfc_vport *vport, int remove)
|
||||
struct lpfc_nodelist *ndlp, *next_ndlp;
|
||||
|
||||
list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
|
||||
if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
|
||||
/* It's possible the FLOGI to the fabric node never
|
||||
* successfully completed and never registered with the
|
||||
* transport. In this case there is no way to clean up
|
||||
* the node.
|
||||
*/
|
||||
if (ndlp->nlp_DID == Fabric_DID) {
|
||||
if (ndlp->nlp_prev_state ==
|
||||
NLP_STE_UNUSED_NODE &&
|
||||
!ndlp->fc4_xpt_flags)
|
||||
lpfc_nlp_put(ndlp);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) ||
|
||||
((vport->port_type == LPFC_NPIV_PORT) &&
|
||||
((ndlp->nlp_DID == NameServer_DID) ||
|
||||
|
@ -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) 2009-2016 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
@ -4201,6 +4201,8 @@ struct lpfc_acqe_fc_la {
|
||||
#define LPFC_FC_LA_TYPE_MDS_LOOPBACK 0x5
|
||||
#define LPFC_FC_LA_TYPE_UNEXP_WWPN 0x6
|
||||
#define LPFC_FC_LA_TYPE_TRUNKING_EVENT 0x7
|
||||
#define LPFC_FC_LA_TYPE_ACTIVATE_FAIL 0x8
|
||||
#define LPFC_FC_LA_TYPE_LINK_RESET_PRTCL_EVT 0x9
|
||||
#define lpfc_acqe_fc_la_port_type_SHIFT 6
|
||||
#define lpfc_acqe_fc_la_port_type_MASK 0x00000003
|
||||
#define lpfc_acqe_fc_la_port_type_WORD word0
|
||||
@ -4242,6 +4244,9 @@ struct lpfc_acqe_fc_la {
|
||||
#define lpfc_acqe_fc_la_fault_SHIFT 0
|
||||
#define lpfc_acqe_fc_la_fault_MASK 0x000000FF
|
||||
#define lpfc_acqe_fc_la_fault_WORD word1
|
||||
#define lpfc_acqe_fc_la_link_status_SHIFT 8
|
||||
#define lpfc_acqe_fc_la_link_status_MASK 0x0000007F
|
||||
#define lpfc_acqe_fc_la_link_status_WORD word1
|
||||
#define lpfc_acqe_fc_la_trunk_fault_SHIFT 0
|
||||
#define lpfc_acqe_fc_la_trunk_fault_MASK 0x0000000F
|
||||
#define lpfc_acqe_fc_la_trunk_fault_WORD word1
|
||||
|
@ -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. *
|
||||
@ -5189,16 +5189,25 @@ static void
|
||||
lpfc_sli4_parse_latt_fault(struct lpfc_hba *phba,
|
||||
struct lpfc_acqe_link *acqe_link)
|
||||
{
|
||||
switch (bf_get(lpfc_acqe_link_fault, acqe_link)) {
|
||||
case LPFC_ASYNC_LINK_FAULT_NONE:
|
||||
case LPFC_ASYNC_LINK_FAULT_LOCAL:
|
||||
case LPFC_ASYNC_LINK_FAULT_REMOTE:
|
||||
case LPFC_ASYNC_LINK_FAULT_LR_LRR:
|
||||
switch (bf_get(lpfc_acqe_fc_la_att_type, acqe_link)) {
|
||||
case LPFC_FC_LA_TYPE_LINK_DOWN:
|
||||
case LPFC_FC_LA_TYPE_TRUNKING_EVENT:
|
||||
case LPFC_FC_LA_TYPE_ACTIVATE_FAIL:
|
||||
case LPFC_FC_LA_TYPE_LINK_RESET_PRTCL_EVT:
|
||||
break;
|
||||
default:
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0398 Unknown link fault code: x%x\n",
|
||||
bf_get(lpfc_acqe_link_fault, acqe_link));
|
||||
switch (bf_get(lpfc_acqe_link_fault, acqe_link)) {
|
||||
case LPFC_ASYNC_LINK_FAULT_NONE:
|
||||
case LPFC_ASYNC_LINK_FAULT_LOCAL:
|
||||
case LPFC_ASYNC_LINK_FAULT_REMOTE:
|
||||
case LPFC_ASYNC_LINK_FAULT_LR_LRR:
|
||||
break;
|
||||
default:
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"0398 Unknown link fault code: x%x\n",
|
||||
bf_get(lpfc_acqe_link_fault, acqe_link));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -6281,6 +6290,7 @@ lpfc_sli4_async_fc_evt(struct lpfc_hba *phba, struct lpfc_acqe_fc_la *acqe_fc)
|
||||
LPFC_MBOXQ_t *pmb;
|
||||
MAILBOX_t *mb;
|
||||
struct lpfc_mbx_read_top *la;
|
||||
char *log_level;
|
||||
int rc;
|
||||
|
||||
if (bf_get(lpfc_trailer_type, acqe_fc) !=
|
||||
@ -6312,25 +6322,70 @@ lpfc_sli4_async_fc_evt(struct lpfc_hba *phba, struct lpfc_acqe_fc_la *acqe_fc)
|
||||
bf_get(lpfc_acqe_fc_la_port_number, acqe_fc);
|
||||
phba->sli4_hba.link_state.fault =
|
||||
bf_get(lpfc_acqe_link_fault, acqe_fc);
|
||||
phba->sli4_hba.link_state.link_status =
|
||||
bf_get(lpfc_acqe_fc_la_link_status, acqe_fc);
|
||||
|
||||
if (bf_get(lpfc_acqe_fc_la_att_type, acqe_fc) ==
|
||||
LPFC_FC_LA_TYPE_LINK_DOWN)
|
||||
phba->sli4_hba.link_state.logical_speed = 0;
|
||||
else if (!phba->sli4_hba.conf_trunk)
|
||||
phba->sli4_hba.link_state.logical_speed =
|
||||
/*
|
||||
* Only select attention types need logical speed modification to what
|
||||
* was previously set.
|
||||
*/
|
||||
if (phba->sli4_hba.link_state.status >= LPFC_FC_LA_TYPE_LINK_UP &&
|
||||
phba->sli4_hba.link_state.status < LPFC_FC_LA_TYPE_ACTIVATE_FAIL) {
|
||||
if (bf_get(lpfc_acqe_fc_la_att_type, acqe_fc) ==
|
||||
LPFC_FC_LA_TYPE_LINK_DOWN)
|
||||
phba->sli4_hba.link_state.logical_speed = 0;
|
||||
else if (!phba->sli4_hba.conf_trunk)
|
||||
phba->sli4_hba.link_state.logical_speed =
|
||||
bf_get(lpfc_acqe_fc_la_llink_spd, acqe_fc) * 10;
|
||||
}
|
||||
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
||||
"2896 Async FC event - Speed:%dGBaud Topology:x%x "
|
||||
"LA Type:x%x Port Type:%d Port Number:%d Logical speed:"
|
||||
"%dMbps Fault:%d\n",
|
||||
"%dMbps Fault:x%x Link Status:x%x\n",
|
||||
phba->sli4_hba.link_state.speed,
|
||||
phba->sli4_hba.link_state.topology,
|
||||
phba->sli4_hba.link_state.status,
|
||||
phba->sli4_hba.link_state.type,
|
||||
phba->sli4_hba.link_state.number,
|
||||
phba->sli4_hba.link_state.logical_speed,
|
||||
phba->sli4_hba.link_state.fault);
|
||||
phba->sli4_hba.link_state.fault,
|
||||
phba->sli4_hba.link_state.link_status);
|
||||
|
||||
/*
|
||||
* The following attention types are informational only, providing
|
||||
* further details about link status. Overwrite the value of
|
||||
* link_state.status appropriately. No further action is required.
|
||||
*/
|
||||
if (phba->sli4_hba.link_state.status >= LPFC_FC_LA_TYPE_ACTIVATE_FAIL) {
|
||||
switch (phba->sli4_hba.link_state.status) {
|
||||
case LPFC_FC_LA_TYPE_ACTIVATE_FAIL:
|
||||
log_level = KERN_WARNING;
|
||||
phba->sli4_hba.link_state.status =
|
||||
LPFC_FC_LA_TYPE_LINK_DOWN;
|
||||
break;
|
||||
case LPFC_FC_LA_TYPE_LINK_RESET_PRTCL_EVT:
|
||||
/*
|
||||
* During bb credit recovery establishment, receiving
|
||||
* this attention type is normal. Link Up attention
|
||||
* type is expected to occur before this informational
|
||||
* attention type so keep the Link Up status.
|
||||
*/
|
||||
log_level = KERN_INFO;
|
||||
phba->sli4_hba.link_state.status =
|
||||
LPFC_FC_LA_TYPE_LINK_UP;
|
||||
break;
|
||||
default:
|
||||
log_level = KERN_INFO;
|
||||
break;
|
||||
}
|
||||
lpfc_log_msg(phba, log_level, LOG_SLI,
|
||||
"2992 Async FC event - Informational Link "
|
||||
"Attention Type x%x\n",
|
||||
bf_get(lpfc_acqe_fc_la_att_type, acqe_fc));
|
||||
return;
|
||||
}
|
||||
|
||||
pmb = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!pmb) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
@ -13917,6 +13972,13 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||
if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE)
|
||||
sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE;
|
||||
|
||||
rc = dma_set_max_seg_size(&phba->pcidev->dev, sli4_params->sge_supp_len);
|
||||
if (unlikely(rc)) {
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
|
||||
"6400 Can't set dma maximum segment size\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether the adapter supports an embedded copy of the
|
||||
* FCP CMD IU within the WQE for FCP_Ixxx commands. In order
|
||||
|
@ -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. *
|
||||
@ -1689,7 +1689,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
struct lpfc_pde6 *pde6 = NULL;
|
||||
struct lpfc_pde7 *pde7 = NULL;
|
||||
dma_addr_t dataphysaddr, protphysaddr;
|
||||
unsigned short curr_data = 0, curr_prot = 0;
|
||||
unsigned short curr_prot = 0;
|
||||
unsigned int split_offset;
|
||||
unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder;
|
||||
unsigned int protgrp_blks, protgrp_bytes;
|
||||
@ -1858,7 +1858,6 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
bpl->tus.w = le32_to_cpu(bpl->tus.w);
|
||||
|
||||
num_bde++;
|
||||
curr_data++;
|
||||
|
||||
if (split_offset)
|
||||
break;
|
||||
@ -2119,7 +2118,7 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
struct scatterlist *sgpe = NULL; /* s/g prot entry */
|
||||
struct sli4_sge_diseed *diseed = NULL;
|
||||
dma_addr_t dataphysaddr, protphysaddr;
|
||||
unsigned short curr_data = 0, curr_prot = 0;
|
||||
unsigned short curr_prot = 0;
|
||||
unsigned int split_offset;
|
||||
unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder;
|
||||
unsigned int protgrp_blks, protgrp_bytes;
|
||||
@ -2364,7 +2363,6 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
dma_offset += dma_len;
|
||||
|
||||
num_sge++;
|
||||
curr_data++;
|
||||
|
||||
if (split_offset) {
|
||||
sgl++;
|
||||
|
@ -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. *
|
||||
@ -11270,6 +11270,30 @@ lpfc_sli4_calc_ring(struct lpfc_hba *phba, struct lpfc_iocbq *piocb)
|
||||
}
|
||||
}
|
||||
|
||||
inline void lpfc_sli4_poll_eq(struct lpfc_queue *eq)
|
||||
{
|
||||
struct lpfc_hba *phba = eq->phba;
|
||||
|
||||
/*
|
||||
* Unlocking an irq is one of the entry point to check
|
||||
* for re-schedule, but we are good for io submission
|
||||
* path as midlayer does a get_cpu to glue us in. Flush
|
||||
* out the invalidate queue so we can see the updated
|
||||
* value for flag.
|
||||
*/
|
||||
smp_rmb();
|
||||
|
||||
if (READ_ONCE(eq->mode) == LPFC_EQ_POLL)
|
||||
/* We will not likely get the completion for the caller
|
||||
* during this iteration but i guess that's fine.
|
||||
* Future io's coming on this eq should be able to
|
||||
* pick it up. As for the case of single io's, they
|
||||
* will be handled through a sched from polling timer
|
||||
* function which is currently triggered every 1msec.
|
||||
*/
|
||||
lpfc_sli4_process_eq(phba, eq, LPFC_QUEUE_NOARM);
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli_issue_iocb - Wrapper function for __lpfc_sli_issue_iocb
|
||||
* @phba: Pointer to HBA context object.
|
||||
@ -11309,7 +11333,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number,
|
||||
rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb, flag);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
lpfc_sli4_poll_eq(eq, LPFC_POLL_FASTPATH);
|
||||
lpfc_sli4_poll_eq(eq);
|
||||
} else {
|
||||
/* For now, SLI2/3 will still use hbalock */
|
||||
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||
@ -15625,12 +15649,11 @@ void lpfc_sli4_poll_hbtimer(struct timer_list *t)
|
||||
{
|
||||
struct lpfc_hba *phba = from_timer(phba, t, cpuhp_poll_timer);
|
||||
struct lpfc_queue *eq;
|
||||
int i = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(eq, &phba->poll_list, _poll_list)
|
||||
i += lpfc_sli4_poll_eq(eq, LPFC_POLL_SLOWPATH);
|
||||
lpfc_sli4_poll_eq(eq);
|
||||
if (!list_empty(&phba->poll_list))
|
||||
mod_timer(&phba->cpuhp_poll_timer,
|
||||
jiffies + msecs_to_jiffies(LPFC_POLL_HB));
|
||||
@ -15638,33 +15661,6 @@ void lpfc_sli4_poll_hbtimer(struct timer_list *t)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
inline int lpfc_sli4_poll_eq(struct lpfc_queue *eq, uint8_t path)
|
||||
{
|
||||
struct lpfc_hba *phba = eq->phba;
|
||||
int i = 0;
|
||||
|
||||
/*
|
||||
* Unlocking an irq is one of the entry point to check
|
||||
* for re-schedule, but we are good for io submission
|
||||
* path as midlayer does a get_cpu to glue us in. Flush
|
||||
* out the invalidate queue so we can see the updated
|
||||
* value for flag.
|
||||
*/
|
||||
smp_rmb();
|
||||
|
||||
if (READ_ONCE(eq->mode) == LPFC_EQ_POLL)
|
||||
/* We will not likely get the completion for the caller
|
||||
* during this iteration but i guess that's fine.
|
||||
* Future io's coming on this eq should be able to
|
||||
* pick it up. As for the case of single io's, they
|
||||
* will be handled through a sched from polling timer
|
||||
* function which is currently triggered every 1msec.
|
||||
*/
|
||||
i = lpfc_sli4_process_eq(phba, eq, LPFC_QUEUE_NOARM);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline void lpfc_sli4_add_to_poll_list(struct lpfc_queue *eq)
|
||||
{
|
||||
struct lpfc_hba *phba = eq->phba;
|
||||
@ -20819,6 +20815,7 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
|
||||
struct lpfc_mbx_wr_object *wr_object;
|
||||
LPFC_MBOXQ_t *mbox;
|
||||
int rc = 0, i = 0;
|
||||
int mbox_status = 0;
|
||||
uint32_t shdr_status, shdr_add_status, shdr_add_status_2;
|
||||
uint32_t shdr_change_status = 0, shdr_csf = 0;
|
||||
uint32_t mbox_tmo;
|
||||
@ -20864,11 +20861,15 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
|
||||
wr_object->u.request.bde_count = i;
|
||||
bf_set(lpfc_wr_object_write_length, &wr_object->u.request, written);
|
||||
if (!phba->sli4_hba.intr_enable)
|
||||
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
||||
mbox_status = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
||||
else {
|
||||
mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
||||
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
||||
mbox_status = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
||||
}
|
||||
|
||||
/* The mbox status needs to be maintained to detect MBOX_TIMEOUT. */
|
||||
rc = mbox_status;
|
||||
|
||||
/* The IOCTL status is embedded in the mailbox subheader. */
|
||||
shdr_status = bf_get(lpfc_mbox_hdr_status,
|
||||
&wr_object->header.cfg_shdr.response);
|
||||
@ -20883,10 +20884,6 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
|
||||
&wr_object->u.response);
|
||||
}
|
||||
|
||||
if (!phba->sli4_hba.intr_enable)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
else if (rc != MBX_TIMEOUT)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
if (shdr_status || shdr_add_status || shdr_add_status_2 || rc) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
||||
"3025 Write Object mailbox failed with "
|
||||
@ -20904,6 +20901,12 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
|
||||
lpfc_log_fw_write_cmpl(phba, shdr_status, shdr_add_status,
|
||||
shdr_add_status_2, shdr_change_status,
|
||||
shdr_csf);
|
||||
|
||||
if (!phba->sli4_hba.intr_enable)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
else if (mbox_status != MBX_TIMEOUT)
|
||||
mempool_free(mbox, phba->mbox_mem_pool);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -21276,7 +21279,7 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
|
||||
lpfc_sli_ringtxcmpl_put(phba, pring, pwqe);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
lpfc_sli4_poll_eq(qp->hba_eq, LPFC_POLL_FASTPATH);
|
||||
lpfc_sli4_poll_eq(qp->hba_eq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -21298,7 +21301,7 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
|
||||
lpfc_sli_ringtxcmpl_put(phba, pring, pwqe);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
lpfc_sli4_poll_eq(qp->hba_eq, LPFC_POLL_FASTPATH);
|
||||
lpfc_sli4_poll_eq(qp->hba_eq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -21328,7 +21331,7 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
|
||||
lpfc_sli_ringtxcmpl_put(phba, pring, pwqe);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
lpfc_sli4_poll_eq(qp->hba_eq, LPFC_POLL_FASTPATH);
|
||||
lpfc_sli4_poll_eq(qp->hba_eq);
|
||||
return 0;
|
||||
}
|
||||
return WQE_ERROR;
|
||||
|
@ -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) 2009-2016 Emulex. All rights reserved. *
|
||||
* EMULEX and SLI are trademarks of Emulex. *
|
||||
@ -291,8 +291,9 @@ struct lpfc_sli4_link {
|
||||
uint8_t type;
|
||||
uint8_t number;
|
||||
uint8_t fault;
|
||||
uint32_t logical_speed;
|
||||
uint8_t link_status;
|
||||
uint16_t topology;
|
||||
uint32_t logical_speed;
|
||||
};
|
||||
|
||||
struct lpfc_fcf_rec {
|
||||
|
@ -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. *
|
||||
@ -20,7 +20,7 @@
|
||||
* included with this package. *
|
||||
*******************************************************************/
|
||||
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.9"
|
||||
#define LPFC_DRIVER_VERSION "14.2.0.10"
|
||||
#define LPFC_DRIVER_NAME "lpfc"
|
||||
|
||||
/* Used for SLI 2/3 */
|
||||
@ -32,6 +32,6 @@
|
||||
|
||||
#define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \
|
||||
LPFC_DRIVER_VERSION
|
||||
#define LPFC_COPYRIGHT "Copyright (C) 2017-2022 Broadcom. All Rights " \
|
||||
#define LPFC_COPYRIGHT "Copyright (C) 2017-2023 Broadcom. All Rights " \
|
||||
"Reserved. The term \"Broadcom\" refers to Broadcom Inc. " \
|
||||
"and/or its subsidiaries."
|
||||
|
@ -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. *
|
||||
@ -284,3 +284,42 @@ int lpfc_vmid_get_appid(struct lpfc_vport *vport, char *uuid,
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* lpfc_reinit_vmid - reinitializes the vmid data structure
|
||||
* @vport: pointer to vport data structure
|
||||
*
|
||||
* This routine reinitializes the vmid post flogi completion
|
||||
*
|
||||
* Return codes
|
||||
* None
|
||||
*/
|
||||
void
|
||||
lpfc_reinit_vmid(struct lpfc_vport *vport)
|
||||
{
|
||||
u32 bucket, i, cpu;
|
||||
struct lpfc_vmid *cur;
|
||||
struct lpfc_vmid *vmp = NULL;
|
||||
struct hlist_node *tmp;
|
||||
|
||||
write_lock(&vport->vmid_lock);
|
||||
vport->cur_vmid_cnt = 0;
|
||||
|
||||
for (i = 0; i < vport->max_vmid; i++) {
|
||||
vmp = &vport->vmid[i];
|
||||
vmp->flag = LPFC_VMID_SLOT_FREE;
|
||||
memset(vmp->host_vmid, 0, sizeof(vmp->host_vmid));
|
||||
vmp->io_rd_cnt = 0;
|
||||
vmp->io_wr_cnt = 0;
|
||||
|
||||
if (vmp->last_io_time)
|
||||
for_each_possible_cpu(cpu)
|
||||
*per_cpu_ptr(vmp->last_io_time, cpu) = 0;
|
||||
}
|
||||
|
||||
/* for all elements in the hash table */
|
||||
if (!hash_empty(vport->hash_table))
|
||||
hash_for_each_safe(vport->hash_table, bucket, tmp, cur, hnode)
|
||||
hash_del(&cur->hnode);
|
||||
write_unlock(&vport->vmid_lock);
|
||||
}
|
||||
|
@ -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. *
|
||||
@ -534,7 +534,7 @@ disable_vport(struct fc_vport *fc_vport)
|
||||
{
|
||||
struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;
|
||||
struct lpfc_hba *phba = vport->phba;
|
||||
struct lpfc_nodelist *ndlp = NULL, *next_ndlp = NULL;
|
||||
struct lpfc_nodelist *ndlp = NULL;
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
|
||||
/* Can't disable during an outstanding delete. */
|
||||
@ -546,17 +546,7 @@ disable_vport(struct fc_vport *fc_vport)
|
||||
(void)lpfc_send_npiv_logo(vport, ndlp);
|
||||
|
||||
lpfc_sli_host_down(vport);
|
||||
|
||||
/* Mark all nodes for discovery so we can remove them by
|
||||
* calling lpfc_cleanup_rpis(vport, 1)
|
||||
*/
|
||||
list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
|
||||
if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
|
||||
continue;
|
||||
lpfc_disc_state_machine(vport, ndlp, NULL,
|
||||
NLP_EVT_DEVICE_RECOVERY);
|
||||
}
|
||||
lpfc_cleanup_rpis(vport, 1);
|
||||
lpfc_cleanup_rpis(vport, 0);
|
||||
|
||||
lpfc_stop_vport_timers(vport);
|
||||
lpfc_unreg_all_rpis(vport);
|
||||
|
Loading…
Reference in New Issue
Block a user