git: 440addc64249 - main - ice: Update to 1.42.5-k

From: Eric Joyner <erj_at_FreeBSD.org>
Date: Mon, 28 Oct 2024 23:17:43 UTC
The branch main has been updated by erj:

URL: https://cgit.FreeBSD.org/src/commit/?id=440addc642496f8d04fe17af9eb905ac4a5bdbd8

commit 440addc642496f8d04fe17af9eb905ac4a5bdbd8
Author:     Eric Joyner <erj@FreeBSD.org>
AuthorDate: 2024-08-30 00:28:59 +0000
Commit:     Eric Joyner <erj@FreeBSD.org>
CommitDate: 2024-10-28 23:17:18 +0000

    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>
    MFC after:      2 days
    Relnotes:       yes
    Sponsored by:   Intel Corporation
    Differential Revision:  https://reviews.freebsd.org/D46950
---
 sys/dev/ice/ice_ddp_common.c | 31 +++++++++++++++++---
 sys/dev/ice/ice_ddp_common.h |  5 +++-
 sys/dev/ice/ice_devids.h     | 12 ++++----
 sys/dev/ice/ice_drv_info.h   | 20 ++++++-------
 sys/dev/ice/ice_fw_logging.c | 69 +++++++++++++++++++++++---------------------
 sys/dev/ice/ice_hw_autogen.h | 14 +++++++++
 sys/dev/ice/ice_lib.c        | 38 ------------------------
 sys/dev/ice/ice_lib.h        |  1 -
 sys/dev/ice/ice_nvm.c        | 36 +++++++++++++++--------
 sys/dev/ice/if_ice_iflib.c   |  9 +++---
 10 files changed, 126 insertions(+), 109 deletions(-)

diff --git a/sys/dev/ice/ice_ddp_common.c b/sys/dev/ice/ice_ddp_common.c
index 87ecdad5e7bf..dfc50cc1f966 100644
--- a/sys/dev/ice/ice_ddp_common.c
+++ b/sys/dev/ice/ice_ddp_common.c
@@ -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);
 	}
 
diff --git a/sys/dev/ice/ice_ddp_common.h b/sys/dev/ice/ice_ddp_common.h
index b7dae1f526f0..a7b717c3e15e 100644
--- a/sys/dev/ice/ice_ddp_common.h
+++ b/sys/dev/ice/ice_ddp_common.h
@@ -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;
 };
diff --git a/sys/dev/ice/ice_devids.h b/sys/dev/ice/ice_devids.h
index 396f59b9d6d9..9b142a1110b2 100644
--- a/sys/dev/ice/ice_devids.h
+++ b/sys/dev/ice/ice_devids.h
@@ -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 */
diff --git a/sys/dev/ice/ice_drv_info.h b/sys/dev/ice/ice_drv_info.h
index 6f4d5f05edd0..22e23ee53491 100644
--- a/sys/dev/ice/ice_drv_info.h
+++ b/sys/dev/ice/ice_drv_info.h
@@ -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,
diff --git a/sys/dev/ice/ice_fw_logging.c b/sys/dev/ice/ice_fw_logging.c
index 8e52e34b2752..0025a65d73fc 100644
--- a/sys/dev/ice/ice_fw_logging.c
+++ b/sys/dev/ice/ice_fw_logging.c
@@ -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");
-
-	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;
+	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);
+
+		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);
 	}
 }
 
diff --git a/sys/dev/ice/ice_hw_autogen.h b/sys/dev/ice/ice_hw_autogen.h
index 47256263d66c..3f2778d91a4b 100644
--- a/sys/dev/ice/ice_hw_autogen.h
+++ b/sys/dev/ice/ice_hw_autogen.h
@@ -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
diff --git a/sys/dev/ice/ice_lib.c b/sys/dev/ice/ice_lib.c
index ef55df061f3c..d2d13cd2db60 100644
--- a/sys/dev/ice/ice_lib.c
+++ b/sys/dev/ice/ice_lib.c
@@ -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
diff --git a/sys/dev/ice/ice_lib.h b/sys/dev/ice/ice_lib.h
index b524db61403c..afc03ebd3b51 100644
--- a/sys/dev/ice/ice_lib.h
+++ b/sys/dev/ice/ice_lib.h
@@ -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);
 
diff --git a/sys/dev/ice/ice_nvm.c b/sys/dev/ice/ice_nvm.c
index 9a41f30386c0..ff30adfe8fa7 100644
--- a/sys/dev/ice/ice_nvm.c
+++ b/sys/dev/ice/ice_nvm.c
@@ -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;
diff --git a/sys/dev/ice/if_ice_iflib.c b/sys/dev/ice/if_ice_iflib.c
index 65690ea7e429..0fb7faecb2d7 100644
--- a/sys/dev/ice/if_ice_iflib.c
+++ b/sys/dev/ice/if_ice_iflib.c
@@ -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);