mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
ice: Update to 1.42.5-k
- Removes duplicate E825C printout - Fixes a package download issue with E830 - Updates mentions of E830-XXV to E830-L - Fix FW logging on load issue by limiting the setting of FW log masks and other global configuration to just the first PF of the controller - Update ice_hw_autogen.h with timesync registers (unused in this driver) - Fix possible overflow condition in NVM access function - Blocks RDMA load on E830 devices Signed-off-by: Eric Joyner <erj@FreeBSD.org> Tested by: Jeffrey Pieper <jeffrey.e.pieper@intel.com> Relnotes: yes Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D46950 (cherry picked from commit 440addc642496f8d04fe17af9eb905ac4a5bdbd8)
This commit is contained in:
parent
5cf8640220
commit
5f92347a9b
10 changed files with 124 additions and 107 deletions
|
|
@ -526,12 +526,13 @@ ice_download_pkg_sig_seg(struct ice_hw *hw, struct ice_sign_seg *seg)
|
|||
* @idx: segment index
|
||||
* @start: starting buffer
|
||||
* @count: buffer count
|
||||
* @last_seg: last segment being downloaded
|
||||
*
|
||||
* Note: idx must reference a ICE segment
|
||||
*/
|
||||
static enum ice_ddp_state
|
||||
ice_download_pkg_config_seg(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
|
||||
u32 idx, u32 start, u32 count)
|
||||
u32 idx, u32 start, u32 count, bool last_seg)
|
||||
{
|
||||
struct ice_buf_table *bufs;
|
||||
enum ice_ddp_state state;
|
||||
|
|
@ -549,7 +550,7 @@ ice_download_pkg_config_seg(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
|
|||
return ICE_DDP_PKG_ERR;
|
||||
|
||||
state = ice_dwnld_cfg_bufs_no_lock(hw, bufs->buf_array, start, count,
|
||||
true);
|
||||
last_seg);
|
||||
|
||||
return state;
|
||||
}
|
||||
|
|
@ -568,9 +569,11 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
|
|||
{
|
||||
enum ice_ddp_state state;
|
||||
struct ice_sign_seg *seg;
|
||||
bool last_seg = true;
|
||||
u32 conf_idx;
|
||||
u32 start;
|
||||
u32 count;
|
||||
u32 flags;
|
||||
|
||||
seg = (struct ice_sign_seg *)ice_get_pkg_seg_by_idx(pkg_hdr, idx);
|
||||
if (!seg) {
|
||||
|
|
@ -581,6 +584,10 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
|
|||
conf_idx = LE32_TO_CPU(seg->signed_seg_idx);
|
||||
start = LE32_TO_CPU(seg->signed_buf_start);
|
||||
count = LE32_TO_CPU(seg->signed_buf_count);
|
||||
flags = LE32_TO_CPU(seg->flags);
|
||||
|
||||
if (flags & ICE_SIGN_SEG_FLAGS_VALID)
|
||||
last_seg = !!(flags & ICE_SIGN_SEG_FLAGS_LAST);
|
||||
|
||||
state = ice_download_pkg_sig_seg(hw, seg);
|
||||
if (state)
|
||||
|
|
@ -595,7 +602,7 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
|
|||
}
|
||||
|
||||
state = ice_download_pkg_config_seg(hw, pkg_hdr, conf_idx, start,
|
||||
count);
|
||||
count, last_seg);
|
||||
|
||||
exit:
|
||||
return state;
|
||||
|
|
@ -2321,6 +2328,22 @@ void ice_release_change_lock(struct ice_hw *hw)
|
|||
ice_release_res(hw, ICE_CHANGE_LOCK_RES_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_is_get_tx_sched_new_format
|
||||
* @hw: pointer to the HW struct
|
||||
*
|
||||
* Determines if the new format for the Tx scheduler get api is supported
|
||||
*/
|
||||
static bool
|
||||
ice_is_get_tx_sched_new_format(struct ice_hw *hw)
|
||||
{
|
||||
if (ice_is_e830(hw))
|
||||
return true;
|
||||
if (ice_is_e825c(hw))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_get_set_tx_topo - get or set tx topology
|
||||
* @hw: pointer to the HW struct
|
||||
|
|
@ -2354,7 +2377,7 @@ ice_get_set_tx_topo(struct ice_hw *hw, u8 *buf, u16 buf_size,
|
|||
ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_tx_topo);
|
||||
cmd->get_flags = ICE_AQC_TX_TOPO_GET_RAM;
|
||||
|
||||
if (!ice_is_e830(hw))
|
||||
if (!ice_is_get_tx_sched_new_format(hw))
|
||||
desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_RD);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,10 @@ struct ice_sign_seg {
|
|||
__le32 signed_seg_idx;
|
||||
__le32 signed_buf_start;
|
||||
__le32 signed_buf_count;
|
||||
#define ICE_SIGN_SEG_RESERVED_COUNT 44
|
||||
#define ICE_SIGN_SEG_FLAGS_VALID 0x80000000
|
||||
#define ICE_SIGN_SEG_FLAGS_LAST 0x00000001
|
||||
__le32 flags;
|
||||
#define ICE_SIGN_SEG_RESERVED_COUNT 40
|
||||
u8 reserved[ICE_SIGN_SEG_RESERVED_COUNT];
|
||||
struct ice_buf_table buf_tbl;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -52,16 +52,16 @@
|
|||
#define ICE_DEV_ID_E830_SFP 0x12D3
|
||||
/* Intel(R) Ethernet Controller E830-C for backplane */
|
||||
#define ICE_DEV_ID_E830C_BACKPLANE 0x12D5
|
||||
/* Intel(R) Ethernet Controller E830-XXV for backplane */
|
||||
#define ICE_DEV_ID_E830_XXV_BACKPLANE 0x12DC
|
||||
/* Intel(R) Ethernet Controller E830-L for backplane */
|
||||
#define ICE_DEV_ID_E830_L_BACKPLANE 0x12DC
|
||||
/* Intel(R) Ethernet Controller E830-C for QSFP */
|
||||
#define ICE_DEV_ID_E830C_QSFP 0x12D8
|
||||
/* Intel(R) Ethernet Controller E830-XXV for QSFP */
|
||||
#define ICE_DEV_ID_E830_XXV_QSFP 0x12DD
|
||||
/* Intel(R) Ethernet Controller E830-L for QSFP */
|
||||
#define ICE_DEV_ID_E830_L_QSFP 0x12DD
|
||||
/* Intel(R) Ethernet Controller E830-C for SFP */
|
||||
#define ICE_DEV_ID_E830C_SFP 0x12DA
|
||||
/* Intel(R) Ethernet Controller E830-XXV for SFP */
|
||||
#define ICE_DEV_ID_E830_XXV_SFP 0x12DE
|
||||
/* Intel(R) Ethernet Controller E830-L for SFP */
|
||||
#define ICE_DEV_ID_E830_L_SFP 0x12DE
|
||||
/* Intel(R) Ethernet Controller E810-C for backplane */
|
||||
#define ICE_DEV_ID_E810C_BACKPLANE 0x1591
|
||||
/* Intel(R) Ethernet Controller E810-C for QSFP */
|
||||
|
|
|
|||
|
|
@ -62,16 +62,16 @@
|
|||
* @var ice_rc_version
|
||||
* @brief driver release candidate version number
|
||||
*/
|
||||
const char ice_driver_version[] = "1.42.1-k";
|
||||
const char ice_driver_version[] = "1.42.5-k";
|
||||
const uint8_t ice_major_version = 1;
|
||||
const uint8_t ice_minor_version = 42;
|
||||
const uint8_t ice_patch_version = 1;
|
||||
const uint8_t ice_patch_version = 5;
|
||||
const uint8_t ice_rc_version = 0;
|
||||
|
||||
#define PVIDV(vendor, devid, name) \
|
||||
PVID(vendor, devid, name " - 1.42.1-k")
|
||||
PVID(vendor, devid, name " - 1.42.5-k")
|
||||
#define PVIDV_OEM(vendor, devid, svid, sdevid, revid, name) \
|
||||
PVID_OEM(vendor, devid, svid, sdevid, revid, name " - 1.42.1-k")
|
||||
PVID_OEM(vendor, devid, svid, sdevid, revid, name " - 1.42.5-k")
|
||||
|
||||
/**
|
||||
* @var ice_vendor_info_array
|
||||
|
|
@ -217,12 +217,12 @@ static const pci_vendor_info_t ice_vendor_info_array[] = {
|
|||
"Intel(R) Ethernet Connection E830-C for QSFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830C_SFP,
|
||||
"Intel(R) Ethernet Connection E830-C for SFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_XXV_BACKPLANE,
|
||||
"Intel(R) Ethernet Connection E830-XXV for backplane"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_XXV_QSFP,
|
||||
"Intel(R) Ethernet Connection E830-XXV for QSFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_XXV_SFP,
|
||||
"Intel(R) Ethernet Connection E830-XXV for SFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_L_BACKPLANE,
|
||||
"Intel(R) Ethernet Connection E830-L for backplane"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_L_QSFP,
|
||||
"Intel(R) Ethernet Connection E830-L for QSFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E830_L_SFP,
|
||||
"Intel(R) Ethernet Connection E830-L for SFP"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E825C_BACKPLANE,
|
||||
"Intel(R) Ethernet Connection E825-C for backplane"),
|
||||
PVIDV(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E825C_QSFP,
|
||||
|
|
|
|||
|
|
@ -359,23 +359,6 @@ ice_add_fw_logging_tunables(struct ice_softc *sc, struct sysctl_oid *parent)
|
|||
"Firmware Logging");
|
||||
fwlog_list = SYSCTL_CHILDREN(fwlog_node);
|
||||
|
||||
cfg->log_resolution = 10;
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "log_resolution",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
0, ice_sysctl_fwlog_log_resolution,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_LOG_RESOLUTION);
|
||||
|
||||
cfg->options |= ICE_FWLOG_OPTION_ARQ_ENA;
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "arq_en",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
ICE_FWLOG_OPTION_ARQ_ENA, ice_sysctl_fwlog_set_cfg_options,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_ARQ_ENA);
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "uart_en",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
ICE_FWLOG_OPTION_UART_ENA, ice_sysctl_fwlog_set_cfg_options,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_UART_ENA);
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "on_load",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
ICE_FWLOG_OPTION_REGISTER_ON_INIT, ice_sysctl_fwlog_set_cfg_options,
|
||||
|
|
@ -386,23 +369,43 @@ ice_add_fw_logging_tunables(struct ice_softc *sc, struct sysctl_oid *parent)
|
|||
0, ice_sysctl_fwlog_register,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_REGISTER);
|
||||
|
||||
module_node = SYSCTL_ADD_NODE(ctx, fwlog_list, OID_AUTO, "severity",
|
||||
ICE_CTLFLAG_DEBUG | CTLFLAG_RD, NULL,
|
||||
"Level of log output");
|
||||
hw->pf_id = ice_get_pf_id(hw);
|
||||
if (hw->pf_id == 0) {
|
||||
module_node = SYSCTL_ADD_NODE(ctx, fwlog_list, OID_AUTO, "severity",
|
||||
ICE_CTLFLAG_DEBUG | CTLFLAG_RD, NULL,
|
||||
"Level of log output");
|
||||
|
||||
module_list = SYSCTL_CHILDREN(module_node);
|
||||
module_list = SYSCTL_CHILDREN(module_node);
|
||||
|
||||
for (i = 0; i < ICE_AQC_FW_LOG_ID_MAX; i++) {
|
||||
/* Setup some defaults */
|
||||
cfg->module_entries[i].module_id = i;
|
||||
cfg->module_entries[i].log_level = ICE_FWLOG_LEVEL_NONE;
|
||||
module = (enum ice_aqc_fw_logging_mod)i;
|
||||
for (i = 0; i < ICE_AQC_FW_LOG_ID_MAX; i++) {
|
||||
/* Setup some defaults */
|
||||
cfg->module_entries[i].module_id = i;
|
||||
cfg->module_entries[i].log_level = ICE_FWLOG_LEVEL_NONE;
|
||||
module = (enum ice_aqc_fw_logging_mod)i;
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, module_list,
|
||||
OID_AUTO, ice_fw_module_str(module),
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RWTUN, sc,
|
||||
module, ice_sysctl_fwlog_module_log_severity,
|
||||
"A", ICE_SYSCTL_HELP_FWLOG_MODULE_SEVERITY);
|
||||
SYSCTL_ADD_PROC(ctx, module_list,
|
||||
OID_AUTO, ice_fw_module_str(module),
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RWTUN, sc,
|
||||
module, ice_sysctl_fwlog_module_log_severity,
|
||||
"A", ICE_SYSCTL_HELP_FWLOG_MODULE_SEVERITY);
|
||||
}
|
||||
|
||||
cfg->log_resolution = 10;
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "log_resolution",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
0, ice_sysctl_fwlog_log_resolution,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_LOG_RESOLUTION);
|
||||
|
||||
cfg->options |= ICE_FWLOG_OPTION_ARQ_ENA;
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "arq_en",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
ICE_FWLOG_OPTION_ARQ_ENA, ice_sysctl_fwlog_set_cfg_options,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_ARQ_ENA);
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, fwlog_list, OID_AUTO, "uart_en",
|
||||
ICE_CTLFLAG_DEBUG | CTLTYPE_U8 | CTLFLAG_RWTUN, sc,
|
||||
ICE_FWLOG_OPTION_UART_ENA, ice_sysctl_fwlog_set_cfg_options,
|
||||
"CU", ICE_SYSCTL_HELP_FWLOG_UART_ENA);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,20 @@
|
|||
#define PRTMAC_CTL_RX_PAUSE_ENABLE_BY_MAC(hw) ((hw)->mac_type == ICE_MAC_E830 ? E830_PRTMAC_CTL_RX_PAUSE_ENABLE : E800_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE)
|
||||
#define PRTMAC_CTL_RX_PAUSE_ENABLE_RX_PAUSE_ENABLE_S_BY_MAC(hw) ((hw)->mac_type == ICE_MAC_E830 ? E830_PRTMAC_CTL_RX_PAUSE_ENABLE_RX_PAUSE_ENABLE_S : E800_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_S)
|
||||
#define PRTMAC_CTL_RX_PAUSE_ENABLE_RX_PAUSE_ENABLE_M_BY_MAC(hw) ((hw)->mac_type == ICE_MAC_E830 ? E830_PRTMAC_CTL_RX_PAUSE_ENABLE_RX_PAUSE_ENABLE_M : E800_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_M)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE(_i) (0x000FD000 + ((_i) * 64)) /* _i=0...7 */ /* Reset Source: CORER */
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_MAX_INDEX 7
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_START_S 0
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_START_M MAKEMASK(0x3F, 0)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_END_S 6
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_END_M MAKEMASK(0x3F, 6)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_VM_VF_TYPE_S 12
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_VM_VF_TYPE_M MAKEMASK(0x3, 12)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_VM_VF_NUM_S 14
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_VM_VF_NUM_M MAKEMASK(0x3FF, 14)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_PF_NUM_S 24
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_PF_NUM_M MAKEMASK(0x7, 24)
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_ENABLE_S 31
|
||||
#define E830_GLTCLAN_TSYN_REG_RANGE_ENFORCE_ENABLE_M BIT(31)
|
||||
#define GL_HIDA(_i) (0x00082000 + ((_i) * 4))
|
||||
#define GL_HIBA(_i) (0x00081000 + ((_i) * 4))
|
||||
#define GL_HICR 0x00082040
|
||||
|
|
|
|||
|
|
@ -11875,44 +11875,6 @@ ice_sysctl_allow_no_fec_mod_in_auto(SYSCTL_HANDLER_ARGS)
|
|||
return (0);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_print_dual_nac_info - Print NAC status/ID information
|
||||
* @sc: device softc structure
|
||||
*
|
||||
* Prints out information about the NAC mode if the device is capable of
|
||||
* being part of a system with multiple NACs.
|
||||
*
|
||||
* @pre Must be called after ice_init_hw() and ice_init_device_features()
|
||||
* sometime during driver load.
|
||||
*/
|
||||
void
|
||||
ice_print_dual_nac_info(struct ice_softc *sc)
|
||||
{
|
||||
struct ice_hw *hw = &sc->hw;
|
||||
device_t dev = sc->dev;
|
||||
bool is_dual_nac, is_primary_nac;
|
||||
u8 cpk_id;
|
||||
|
||||
is_dual_nac = (hw->dev_caps.nac_topo.mode & ICE_NAC_TOPO_DUAL_M);
|
||||
is_primary_nac = (hw->dev_caps.nac_topo.mode & ICE_NAC_TOPO_PRIMARY_M);
|
||||
cpk_id = hw->dev_caps.nac_topo.id;
|
||||
|
||||
if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_DUAL_NAC)) {
|
||||
log(LOG_INFO, "%s: In %s NAC mode\n",
|
||||
device_get_nameunit(dev),
|
||||
is_dual_nac ? "Dual" : "Single");
|
||||
|
||||
if (is_dual_nac) {
|
||||
ice_set_bit(ICE_FEATURE_DUAL_NAC, sc->feat_en);
|
||||
log(LOG_INFO,
|
||||
"%s: PF is configured in %s mode with IP instance ID %u\n",
|
||||
device_get_nameunit(dev),
|
||||
is_primary_nac ? "primary" : "secondary",
|
||||
cpk_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_sysctl_temperature - Retrieve NIC temp via AQ command
|
||||
* @oidp: sysctl oid structure
|
||||
|
|
|
|||
|
|
@ -1010,7 +1010,6 @@ void ice_init_health_events(struct ice_softc *sc);
|
|||
void ice_cfg_pba_num(struct ice_softc *sc);
|
||||
int ice_handle_debug_dump_ioctl(struct ice_softc *sc, struct ifdrv *ifd);
|
||||
u8 ice_dcb_get_tc_map(const struct ice_dcbx_cfg *dcbcfg);
|
||||
void ice_print_dual_nac_info(struct ice_softc *sc);
|
||||
void ice_do_dcb_reconfig(struct ice_softc *sc, bool pending_mib);
|
||||
int ice_setup_vsi_mirroring(struct ice_vsi *vsi);
|
||||
|
||||
|
|
|
|||
|
|
@ -711,6 +711,8 @@ int ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
|
|||
return status;
|
||||
}
|
||||
|
||||
#define check_add_overflow __builtin_add_overflow
|
||||
|
||||
/**
|
||||
* ice_get_pfa_module_tlv - Reads sub module TLV from NVM PFA
|
||||
* @hw: pointer to hardware structure
|
||||
|
|
@ -726,8 +728,7 @@ int
|
|||
ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
|
||||
u16 module_type)
|
||||
{
|
||||
u16 pfa_len, pfa_ptr;
|
||||
u32 next_tlv;
|
||||
u16 pfa_len, pfa_ptr, next_tlv, max_tlv;
|
||||
int status;
|
||||
|
||||
status = ice_read_sr_word(hw, ICE_SR_PFA_PTR, &pfa_ptr);
|
||||
|
|
@ -740,11 +741,23 @@ ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
|
|||
ice_debug(hw, ICE_DBG_INIT, "Failed to read PFA length.\n");
|
||||
return status;
|
||||
}
|
||||
/* Starting with first TLV after PFA length, iterate through the list
|
||||
|
||||
if (check_add_overflow(pfa_ptr, (u16)(pfa_len - 1), &max_tlv)) {
|
||||
ice_debug(hw, ICE_DBG_INIT, "PFA starts at offset %u. PFA length of %u caused 16-bit arithmetic overflow.\n",
|
||||
pfa_ptr, pfa_len);
|
||||
return ICE_ERR_INVAL_SIZE;
|
||||
}
|
||||
|
||||
/* The Preserved Fields Area contains a sequence of TLVs which define
|
||||
* its contents. The PFA length includes all of the TLVs, plus its
|
||||
* initial length word itself, *and* one final word at the end of all
|
||||
* of the TLVs.
|
||||
*
|
||||
* Starting with first TLV after PFA length, iterate through the list
|
||||
* of TLVs to find the requested one.
|
||||
*/
|
||||
next_tlv = pfa_ptr + 1;
|
||||
while (next_tlv < ((u32)pfa_ptr + pfa_len)) {
|
||||
while (next_tlv < max_tlv) {
|
||||
u16 tlv_sub_module_type;
|
||||
u16 tlv_len;
|
||||
|
||||
|
|
@ -761,10 +774,6 @@ ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
|
|||
ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV length.\n");
|
||||
break;
|
||||
}
|
||||
if (tlv_len > pfa_len) {
|
||||
ice_debug(hw, ICE_DBG_INIT, "Invalid TLV length.\n");
|
||||
return ICE_ERR_INVAL_SIZE;
|
||||
}
|
||||
if (tlv_sub_module_type == module_type) {
|
||||
if (tlv_len) {
|
||||
*module_tlv = (u16)next_tlv;
|
||||
|
|
@ -773,10 +782,13 @@ ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
|
|||
}
|
||||
return ICE_ERR_INVAL_SIZE;
|
||||
}
|
||||
/* Check next TLV, i.e. current TLV pointer + length + 2 words
|
||||
* (for current TLV's type and length)
|
||||
*/
|
||||
next_tlv = next_tlv + tlv_len + 2;
|
||||
|
||||
if (check_add_overflow(next_tlv, (u16)2, &next_tlv) ||
|
||||
check_add_overflow(next_tlv, tlv_len, &next_tlv)) {
|
||||
ice_debug(hw, ICE_DBG_INIT, "TLV of type %u and length 0x%04x caused 16-bit arithmetic overflow. The PFA starts at 0x%04x and has length of 0x%04x\n",
|
||||
tlv_sub_module_type, tlv_len, pfa_ptr, pfa_len);
|
||||
return ICE_ERR_INVAL_SIZE;
|
||||
}
|
||||
}
|
||||
/* Module does not exist */
|
||||
return ICE_ERR_DOES_NOT_EXIST;
|
||||
|
|
|
|||
|
|
@ -539,8 +539,6 @@ reinit_hw:
|
|||
|
||||
ice_init_device_features(sc);
|
||||
|
||||
ice_print_dual_nac_info(sc);
|
||||
|
||||
/* Keep flag set by default */
|
||||
ice_set_state(&sc->state, ICE_STATE_LINK_ACTIVE_ON_DOWN);
|
||||
|
||||
|
|
@ -2605,7 +2603,9 @@ ice_rebuild(struct ice_softc *sc)
|
|||
}
|
||||
|
||||
/* Re-enable FW logging. Keep going even if this fails */
|
||||
status = ice_fwlog_set(hw, &hw->fwlog_cfg);
|
||||
status = ICE_SUCCESS;
|
||||
if (hw->pf_id == 0)
|
||||
status = ice_fwlog_set(hw, &hw->fwlog_cfg);
|
||||
if (!status) {
|
||||
/*
|
||||
* We should have the most updated cached copy of the
|
||||
|
|
@ -2901,7 +2901,8 @@ ice_init_device_features(struct ice_softc *sc)
|
|||
/* Disable features due to hardware limitations... */
|
||||
if (!hw->func_caps.common_cap.rss_table_size)
|
||||
ice_clear_bit(ICE_FEATURE_RSS, sc->feat_cap);
|
||||
if (!hw->func_caps.common_cap.iwarp || !ice_enable_irdma)
|
||||
if (!hw->func_caps.common_cap.iwarp || !ice_enable_irdma ||
|
||||
ice_is_e830(hw))
|
||||
ice_clear_bit(ICE_FEATURE_RDMA, sc->feat_cap);
|
||||
if (!hw->func_caps.common_cap.dcb)
|
||||
ice_clear_bit(ICE_FEATURE_DCB, sc->feat_cap);
|
||||
|
|
|
|||
Loading…
Reference in a new issue