DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Ivan Malov <ivan.malov@arknetworks.am>
To: dev@dpdk.org
Cc: Andy Moreton <andy.moreton@amd.com>,
	Viacheslav Galaktionov <viacheslav.galaktionov@arknetworks.am>,
	Roman Zhukov <Roman.Zhukov@arknetworks.am>,
	Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>,
	Stephen Hemminger <stephen@networkplumber.org>,
	Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,
	stable@dpdk.org
Subject: [PATCH v3 13/14] common/sfc_efx/base: rework SW mask to HW enum converter
Date: Fri, 14 Aug 2026 16:54:37 +0400	[thread overview]
Message-ID: <20260814125438.13283-14-ivan.malov@arknetworks.am> (raw)
In-Reply-To: <20260814125438.13283-1-ivan.malov@arknetworks.am>

From: Andy Moreton <andy.moreton@amd.com>

Code analysis reports that *enum_hwp is not written on successful
return on some paths through this function. Refactor to simplify the
code, and adjust the annotations so it is clear that *enum_hwp is only
written on successful return. Adjust FEC handling in efx_np_link_ctrl
to allow for *supportedp always being updated.

Code analysis also reports that the optional filter_arg can be NULL
when invoking filter_cb, but the callback argument is not optional.
Check that filter_arg is non-NULL to ensure correct usage.

The refactoring adds an explicit default for the HW enum for the case when
no software capability bit is found in the map. For the link technology,
this default becomes AUTO, replacing the implicit NONE. This change is
intentional and yields the correct instruction to firmware.

Fixes: 8e79cd30230d ("common/sfc_efx/base: implement PHY link control for Medford4")
Cc: stable@dpdk.org

Signed-off-by: Andy Moreton <andy.moreton@amd.com>
Reviewed-by: Ivan Malov <ivan.malov@arknetworks.am>
Reviewed-by: Viacheslav Galaktionov <viacheslav.galaktionov@arknetworks.am>
---
 drivers/common/sfc_efx/base/efx_np.c | 68 ++++++++++++++--------------
 1 file changed, 34 insertions(+), 34 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_np.c b/drivers/common/sfc_efx/base/efx_np.c
index 6fc024e17b..06cb33e39b 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -1211,60 +1211,59 @@ efx_np_cap_mask_sw_to_hw(
 	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw),			\
 	    (_filter_cb), (_filter_arg), (_mask_hwp))
 
-static					void
+__success(*supportedp != 0)	static	void
 efx_np_cap_sw_mask_to_hw_enum(
 	__in_ecount(hw_sw_map_nentries)	const struct efx_np_cap_map *hw_sw_map,
 	__in				unsigned int hw_sw_map_nentries,
 	__in_bcount(hw_cap_data_nbytes)	const uint8_t *hw_cap_data,
 	__in				size_t hw_cap_data_nbytes,
 	__in				uint32_t mask_sw,
+	__in				uint16_t enum_hw_def,
 	__in_opt			efx_np_cap_filter_cb *filter_cb,
 	__in_opt			void *filter_arg,
 	__out				boolean_t *supportedp,
 	__out_opt			uint16_t *enum_hwp)
 {
-	unsigned int sw_nflags_req = 0;
-	uint32_t sw_check_mask = 0;
+	boolean_t supported = B_FALSE;
+	uint32_t matched_mask = 0;
+	uint32_t flags_seen = 0;
 	unsigned int i;
 
 	for (i = 0; i < hw_sw_map_nentries; ++i) {
-		uint32_t flag_sw = 1U << hw_sw_map->encm_sw;
-		unsigned int byte_idx = CAP_BYTE(hw_sw_map);
-		uint8_t flag_hw = CAP_FLAG(hw_sw_map);
+		uint32_t flag_sw = 1U << hw_sw_map[i].encm_sw;
+		unsigned int byte_idx = CAP_BYTE(&hw_sw_map[i]);
+		uint8_t flag_hw = CAP_FLAG(&hw_sw_map[i]);
 
-		if (byte_idx >= hw_cap_data_nbytes) {
-			++(hw_sw_map);
+		if (byte_idx >= hw_cap_data_nbytes)
 			continue;
-		}
 
-		if ((mask_sw & flag_sw) == flag_sw) {
-			if ((sw_check_mask & flag_sw) == 0)
-				++(sw_nflags_req);
+		if ((mask_sw & flag_sw) != flag_sw)
+			continue;
 
-			sw_check_mask |= flag_sw;
+		flags_seen |= flag_sw;
 
-			if ((hw_cap_data[byte_idx] & flag_hw) == flag_hw) {
-				if (filter_cb == NULL ||
-				    filter_cb(hw_sw_map->encm_hw, filter_arg) !=
-				    B_FALSE) {
-					mask_sw &= ~(flag_sw);
+		if ((hw_cap_data[byte_idx] & flag_hw) != flag_hw)
+			continue;
 
-					if (enum_hwp != NULL)
-						*enum_hwp = hw_sw_map->encm_hw;
-				}
-			}
-		}
+		if ((filter_cb != NULL) && (filter_arg != NULL) &&
+		    (filter_cb(hw_sw_map[i].encm_hw, filter_arg) == B_FALSE))
+			continue;
 
-		++(hw_sw_map);
+		if (enum_hwp != NULL && (matched_mask & flag_sw) == 0)
+			*enum_hwp = hw_sw_map[i].encm_hw;
+
+		matched_mask |= flag_sw;
+		supported = B_TRUE;
 	}
 
-	if (sw_check_mask != 0 && (mask_sw & sw_check_mask) == sw_check_mask) {
-		/* Failed to select the enum by at least one capability bit. */
-		*supportedp = B_FALSE;
-		return;
+	if (flags_seen == 0) {
+		if (enum_hwp != NULL)
+			*enum_hwp = enum_hw_def;
+
+		supported = B_TRUE;
 	}
 
-	*supportedp = B_TRUE;
+	*supportedp = supported;
 }
 
 /*
@@ -1276,12 +1275,13 @@ efx_np_cap_sw_mask_to_hw_enum(
  */
 #define	EFX_NP_CAP_SW_MASK_TO_HW_ENUM(					\
 	    _hw_sw_cap_map, _hw_cap_section, _hw_cap_data,		\
-	    _mask_sw, _filter_cb, _filter_arg, _supportedp, _enum_hwp)	\
+	    _mask_sw, _enum_hw_def, _filter_cb, _filter_arg,		\
+	    _supportedp, _enum_hwp)					\
 	efx_np_cap_sw_mask_to_hw_enum((_hw_sw_cap_map),			\
 	    EFX_ARRAY_SIZE(_hw_sw_cap_map),				\
 	    MCDI_STRUCT_MEMBER((_hw_cap_data), const uint8_t,		\
 		    MC_CMD_##_hw_cap_section),				\
-	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw),			\
+	    MC_CMD_##_hw_cap_section##_LEN, (_mask_sw), (_enum_hw_def),	\
 	    (_filter_cb), (_filter_arg),				\
 	    (_supportedp), (_enum_hwp))
 
@@ -1396,6 +1396,7 @@ efx_np_link_ctrl(
 	} else {
 		EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_tech,
 		    ETH_AN_FIELDS_TECH_MASK, cap_data_raw, cap_mask_sw,
+		    MC_CMD_ETH_TECH_AUTO,
 		    efx_np_filter_tech_by_lane_count_cb, &lane_count,
 		    &supported, &link_tech);
 
@@ -1424,10 +1425,9 @@ efx_np_link_ctrl(
 		 */
 		EFX_NP_CAP_SW_MASK_TO_HW_ENUM(efx_np_cap_map_fec_req,
 		    ETH_AN_FIELDS_FEC_MASK, cap_data_raw, cap_mask_sw,
-		    NULL, NULL, &supported, &cap_enum_hw);
+		    cap_enum_hw, NULL, NULL, &supported, &cap_enum_hw);
 
-		if ((cap_mask_sw & EFX_PHY_CAP_FEC_MASK) != 0
-		    && supported == B_FALSE) {
+		if (supported == B_FALSE) {
 			rc = ENOTSUP;
 			goto fail5;
 		}
-- 
2.47.3


  parent reply	other threads:[~2026-08-14 12:56 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-11 17:48 [PATCH 00/14] common/sfc_efx/base: fix code analysis issues Ivan Malov
2026-08-11 17:48 ` [PATCH 01/14] common/sfc_efx/base: reduce stack in RSS context table write Ivan Malov
2026-08-11 17:48 ` [PATCH 02/14] common/sfc_efx/base: reduce stack in get addr regions MCDI Ivan Malov
2026-08-11 17:48 ` [PATCH 03/14] common/sfc_efx/base: reduce stack in set " Ivan Malov
2026-08-11 17:48 ` [PATCH 04/14] common/sfc_efx/base: reduce stack in netport stat describe Ivan Malov
2026-08-11 17:48 ` [PATCH 05/14] common/sfc_efx/base: fix filter saved spec handling Ivan Malov
2026-08-11 17:48 ` [PATCH 06/14] common/sfc_efx/base: fix annotations in client MAC addr get Ivan Malov
2026-08-11 17:48 ` [PATCH 07/14] common/sfc_efx/base: fix annotations in HW-SW mask converter Ivan Malov
2026-08-11 17:48 ` [PATCH 08/14] common/sfc_efx/base: fix annotations in get fixed port props Ivan Malov
2026-08-11 17:48 ` [PATCH 09/14] common/sfc_efx/base: fix annotations in SW-HW enum converter Ivan Malov
2026-08-11 17:48 ` [PATCH 10/14] common/sfc_efx/base: fix annotation in netport stat describe Ivan Malov
2026-08-11 17:48 ` [PATCH 11/14] common/sfc_efx/base: fix flex array " Ivan Malov
2026-08-11 17:48 ` [PATCH 12/14] common/sfc_efx/base: fix filter in SW-HW mask converter Ivan Malov
2026-08-11 17:48 ` [PATCH 13/14] common/sfc_efx/base: rework SW mask to HW enum converter Ivan Malov
2026-08-11 17:48 ` [PATCH 14/14] common/sfc_efx/base: cleanup wider type comparisons in loops Ivan Malov
2026-08-11 20:24 ` [PATCH 00/14] common/sfc_efx/base: fix code analysis issues Stephen Hemminger
2026-08-12 17:08 ` [PATCH v2 " Ivan Malov
2026-08-12 17:08   ` [PATCH v2 01/14] common/sfc_efx/base: reduce stack in RSS context table write Ivan Malov
2026-08-12 17:08   ` [PATCH v2 02/14] common/sfc_efx/base: reduce stack in get addr regions MCDI Ivan Malov
2026-08-12 17:08   ` [PATCH v2 03/14] common/sfc_efx/base: reduce stack in set " Ivan Malov
2026-08-12 17:08   ` [PATCH v2 04/14] common/sfc_efx/base: reduce stack in netport stat describe Ivan Malov
2026-08-12 17:08   ` [PATCH v2 05/14] common/sfc_efx/base: fix filter saved spec handling Ivan Malov
2026-08-12 17:08   ` [PATCH v2 06/14] common/sfc_efx/base: fix annotations in client MAC addr get Ivan Malov
2026-08-12 17:08   ` [PATCH v2 07/14] common/sfc_efx/base: fix annotations in HW-SW mask converter Ivan Malov
2026-08-12 17:08   ` [PATCH v2 08/14] common/sfc_efx/base: fix annotations in get fixed port props Ivan Malov
2026-08-12 17:08   ` [PATCH v2 09/14] common/sfc_efx/base: fix annotations in SW-HW enum converter Ivan Malov
2026-08-12 17:08   ` [PATCH v2 10/14] common/sfc_efx/base: fix annotation in netport stat describe Ivan Malov
2026-08-12 17:08   ` [PATCH v2 11/14] common/sfc_efx/base: fix flex array " Ivan Malov
2026-08-12 17:08   ` [PATCH v2 12/14] common/sfc_efx/base: fix filter in SW-HW mask converter Ivan Malov
2026-08-12 17:08   ` [PATCH v2 13/14] common/sfc_efx/base: rework SW mask to HW enum converter Ivan Malov
2026-08-12 17:08   ` [PATCH v2 14/14] common/sfc_efx/base: cleanup wider type comparisons in loops Ivan Malov
2026-08-13  2:35   ` [PATCH v2 00/14] common/sfc_efx/base: fix code analysis issues Stephen Hemminger
2026-08-13  3:37     ` Ivan Malov
2026-08-14 12:54 ` [PATCH v3 " Ivan Malov
2026-08-14 12:54   ` [PATCH v3 01/14] common/sfc_efx/base: reduce stack in RSS context table write Ivan Malov
2026-08-14 12:54   ` [PATCH v3 02/14] common/sfc_efx/base: reduce stack in get addr regions MCDI Ivan Malov
2026-08-14 12:54   ` [PATCH v3 03/14] common/sfc_efx/base: reduce stack in set " Ivan Malov
2026-08-14 12:54   ` [PATCH v3 04/14] common/sfc_efx/base: reduce stack in netport stat describe Ivan Malov
2026-08-14 12:54   ` [PATCH v3 05/14] common/sfc_efx/base: fix filter saved spec handling Ivan Malov
2026-08-14 12:54   ` [PATCH v3 06/14] common/sfc_efx/base: fix annotations in client MAC addr get Ivan Malov
2026-08-14 12:54   ` [PATCH v3 07/14] common/sfc_efx/base: fix annotations in HW-SW mask converter Ivan Malov
2026-08-14 12:54   ` [PATCH v3 08/14] common/sfc_efx/base: fix annotations in get fixed port props Ivan Malov
2026-08-14 12:54   ` [PATCH v3 09/14] common/sfc_efx/base: fix annotations in SW-HW enum converter Ivan Malov
2026-08-14 12:54   ` [PATCH v3 10/14] common/sfc_efx/base: fix annotation in netport stat describe Ivan Malov
2026-08-14 12:54   ` [PATCH v3 11/14] common/sfc_efx/base: fix flex array " Ivan Malov
2026-08-14 12:54   ` [PATCH v3 12/14] common/sfc_efx/base: fix filter in SW-HW mask converter Ivan Malov
2026-08-14 12:54   ` Ivan Malov [this message]
2026-08-14 12:54   ` [PATCH v3 14/14] common/sfc_efx/base: cleanup wider type comparisons in loops Ivan Malov
2026-08-15 15:44   ` [PATCH v3 00/14] common/sfc_efx/base: fix code analysis issues Stephen Hemminger
2026-08-14 12:55 ` [PATCH v3 0/3] net/sfc: miscellaneous bug fixes Ivan Malov
2026-08-14 12:55   ` [PATCH v3 1/3] net/sfc: set Rx queue type flags from scratch on queue setup Ivan Malov
2026-08-14 12:55   ` [PATCH v3 2/3] net/sfc: drop wrong static qualifier from iterator variable Ivan Malov
2026-08-14 12:55   ` [PATCH v3 3/3] common/sfc_efx/base: fix reading advertised autoneg ability Ivan Malov
2026-08-14 12:56 ` [PATCH v3 0/3] common/sfc_efx/base: add VADAPTER statistics for Medford4 Ivan Malov
2026-08-14 12:56   ` [PATCH v3 1/3] common/sfc_efx/base: update MCDI headers Ivan Malov
2026-08-16 16:55     ` Stephen Hemminger
2026-08-14 12:56   ` [PATCH v3 2/3] common/sfc_efx/base: add support for VADAPTER statistics IDs Ivan Malov
2026-08-14 12:56   ` [PATCH v3 3/3] common/sfc_efx/base: switch netport stats to use EVB port ID Ivan Malov
2026-08-14 12:56 ` [PATCH v3 0/6] common/sfc_efx/base: add Medford4 VF support Ivan Malov
2026-08-14 12:56   ` [PATCH v3 1/6] common/sfc_efx/base: let Medford4 PF manage VFs Ivan Malov
2026-08-14 12:56   ` [PATCH v3 2/6] common/sfc_efx/base: indicate dummy netport properties on VF Ivan Malov
2026-08-14 12:56   ` [PATCH v3 3/6] common/sfc_efx/base: skip netport event subscriptions on VFs Ivan Malov
2026-08-14 12:56   ` [PATCH v3 4/6] common/sfc_efx/base: deny tuning FCS and flow control to VFs Ivan Malov
2026-08-14 12:56   ` [PATCH v3 5/6] common/sfc_efx/base: deny periodic MAC stats delivery " Ivan Malov
2026-08-14 12:56   ` [PATCH v3 6/6] doc: announce VF support of AMD Solarflare X45xx family NICs Ivan Malov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260814125438.13283-14-ivan.malov@arknetworks.am \
    --to=ivan.malov@arknetworks.am \
    --cc=Roman.Zhukov@arknetworks.am \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=andy.moreton@amd.com \
    --cc=dev@dpdk.org \
    --cc=pieter.jansen-van-vuuren@amd.com \
    --cc=stable@dpdk.org \
    --cc=stephen@networkplumber.org \
    --cc=viacheslav.galaktionov@arknetworks.am \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox