| Message ID | 20260918133243.4169311-1-aleksandr.loktionov@intel.com |
|---|---|
| State | Changes Requested |
| Headers | show |
| Series | [iwl-net,v3] ice: fix LLDP AQ filter fallback not working on E82x and E830 hardware | expand |
On 9/18/2026 6:32 AM, Aleksandr Loktionov wrote: ... > diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c > index 0463310..b31be52 100644 > --- a/drivers/net/ethernet/intel/ice/ice_common.c > +++ b/drivers/net/ethernet/intel/ice/ice_common.c > @@ -6375,15 +6375,28 @@ ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size, > /** > * ice_fw_supports_lldp_fltr_ctrl - check NVM version supports lldp_fltr_ctrl > * @hw: pointer to HW struct > + * > + * Check if firmware supports the LLDP filter control feature (AQ command > + * 0x0A0A). Different hardware families require different minimum firmware > + * API versions: > + * - E810 and E82x: API version >= 1.7.1 > + * - E830: API version >= 1.7.11 > */ > bool ice_fw_supports_lldp_fltr_ctrl(struct ice_hw *hw) > { > - if (hw->mac_type != ICE_MAC_E810) > + switch (hw->mac_type) { > + case ICE_MAC_E830: > + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ_E830, > + ICE_FW_API_LLDP_FLTR_MIN_E830, > + ICE_FW_API_LLDP_FLTR_PATCH_E830); > + case ICE_MAC_E810: > + case ICE_MAC_GENERIC: > + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ, > + ICE_FW_API_LLDP_FLTR_MIN, > + ICE_FW_API_LLDP_FLTR_PATCH); Sashiko on a previous version of this patch reported: " Does this switch statement intentionally omit ICE_MAC_GENERIC_3K_E825? Since E825 devices use ICE_MAC_GENERIC_3K_E825, they will fall through to the default case and return false. This causes the fallback function ice_lldp_fltr_add_remove() to return -EOPNOTSUPP on E825 hardware, leaving these devices without an LLDP filter. Would it be better to include case ICE_MAC_GENERIC_3K_E825 here, or use the ice_is_generic_mac() helper? " I believe ICE_MAC_GENERIC_3K_E825 also supports this and should be included? Thanks, Tony > + default: > return false; > - > - return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ, > - ICE_FW_API_LLDP_FLTR_MIN, > - ICE_FW_API_LLDP_FLTR_PATCH); > + } > } >
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index 0463310..b31be52 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -6375,15 +6375,28 @@ ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size, /** * ice_fw_supports_lldp_fltr_ctrl - check NVM version supports lldp_fltr_ctrl * @hw: pointer to HW struct + * + * Check if firmware supports the LLDP filter control feature (AQ command + * 0x0A0A). Different hardware families require different minimum firmware + * API versions: + * - E810 and E82x: API version >= 1.7.1 + * - E830: API version >= 1.7.11 */ bool ice_fw_supports_lldp_fltr_ctrl(struct ice_hw *hw) { - if (hw->mac_type != ICE_MAC_E810) + switch (hw->mac_type) { + case ICE_MAC_E830: + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ_E830, + ICE_FW_API_LLDP_FLTR_MIN_E830, + ICE_FW_API_LLDP_FLTR_PATCH_E830); + case ICE_MAC_E810: + case ICE_MAC_GENERIC: + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ, + ICE_FW_API_LLDP_FLTR_MIN, + ICE_FW_API_LLDP_FLTR_PATCH); + default: return false; - - return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ, - ICE_FW_API_LLDP_FLTR_MIN, - ICE_FW_API_LLDP_FLTR_PATCH); + } } /** diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h index cf147a2..710c519 100644 --- a/drivers/net/ethernet/intel/ice/ice_type.h +++ b/drivers/net/ethernet/intel/ice/ice_type.h @@ -1217,11 +1217,16 @@ struct ice_aq_get_set_rss_lut_params { #define ICE_SR_WORDS_IN_1KB 512 -/* AQ API version for LLDP_FILTER_CONTROL */ +/* AQ API version for LLDP_FILTER_CONTROL - E810 and E82x */ #define ICE_FW_API_LLDP_FLTR_MAJ 1 #define ICE_FW_API_LLDP_FLTR_MIN 7 #define ICE_FW_API_LLDP_FLTR_PATCH 1 +/* AQ API version for LLDP_FILTER_CONTROL - E830 */ +#define ICE_FW_API_LLDP_FLTR_MAJ_E830 1 +#define ICE_FW_API_LLDP_FLTR_MIN_E830 7 +#define ICE_FW_API_LLDP_FLTR_PATCH_E830 11 + /* AQ API version for report default configuration */ #define ICE_FW_API_REPORT_DFLT_CFG_MAJ 1 #define ICE_FW_API_REPORT_DFLT_CFG_MIN 7
Commit 4d5a1c4e6d49 ("ice: do not add LLDP-specific filter if not necessary") restructured ice_vsi_cfg_sw_lldp() to first attempt a generic ethernet Rx filter and, on failure, fall back to the specialized LLDP filter control AQ command (0x0A0A) via ice_lldp_fltr_add_remove(). This fallback is gated by ice_fw_supports_lldp_fltr_ctrl(), which only accepted E810, causing two distinct omissions. E82x (ICE_MAC_GENERIC, e.g. E822/E823) support the same LLDP filter control AQ command with the same minimum firmware API version as E810 (>= 1.7.1). On E82x systems where the generic ethernet LLDP Rx filter cannot be added, the AQ fallback silently returns -EOPNOTSUPP and the port is left with no LLDP Rx filter. E830 has been supported since kernel 6.9 and implements the same AQ command but requires a higher minimum API version (>= 1.7.11). Starting with NVM 1.2 / FW 7.9.1, the generic ethernet LLDP Rx filter path is blocked on E830, making the AQ fallback the only viable option. With ice_fw_supports_lldp_fltr_ctrl() returning false for E830, no LLDP Rx filter is installed after a firmware-update-triggered reset (e.g. NVM 1.1->1.2 on an E830-CC in HPE DL380 Gen11), and the interface stays link-down with complete loss of network connectivity. Replace the single-type if-chain with a switch on hw->mac_type so each family's version requirement is explicit. E810 and E82x share the 1.7.1 constants; E830 gets its own 1.7.11 constants. The default branch returns false, covering any future MAC type that does not implement the command. Fixes: 4d5a1c4e6d49 ("ice: do not add LLDP-specific filter if not necessary") Cc: stable@vger.kernel.org Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Reviewed-by: Simon Horman <horms@kernel.org> --- v1 -> v2: rewrite as a single combined patch using a switch on hw->mac_type, instead of two separate patches (E82x fix, then a follow-up E830 fix layered on top). v2 -> v3: no code changes, resending to pick up Reviewed-by. --- drivers/net/ethernet/intel/ice/ice_common.c | 23 ++++++++++++++++----- drivers/net/ethernet/intel/ice/ice_type.h | 7 ++++++- 2 files changed, 24 insertions(+), 6 deletions(-)