[v2,1/3] net/atlantic: exclude MACSEC counters from xstats

Message ID 85744ec877be5433cc028e25c7d00f7231fa927c.1568994395.git.Pavel.Belous@aquantia.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series net/atlantic: Atlantic PMD updates |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-dpdk_compile_ovs success Compile Testing PASS
ci/iol-dpdk_compile success Compile Testing PASS
ci/intel-Performance success Performance Testing PASS
ci/mellanox-Performance success Performance Testing PASS
ci/iol-dpdk_compile_spdk success Compile Testing PASS

Commit Message

Pavel Belous Sept. 20, 2019, 4:22 p.m. UTC
  From: Pavel Belous <Pavel.Belous@aquantia.com>

Currently, driver always return full set of xstats counters, including
MACSEC counters. But this driver also supports AQC100 chips, which
does not have MACSEC feature.
This fix adds checking for MACSEC availability (based on FW capability
bits) and returns xstats without MACSEC counters if MACSEC feature
is not available.

Fixes: 09d4dfa85359 ("net/atlantic: implement MACsec statistics")
Cc: stable@dpdk.org
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
---
 drivers/net/atlantic/atl_ethdev.c | 52 ++++++++++++++++++++++++++++-----------
 1 file changed, 38 insertions(+), 14 deletions(-)
  

Patch

diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c
index 3c1b349..178f7db 100644
--- a/drivers/net/atlantic/atl_ethdev.c
+++ b/drivers/net/atlantic/atl_ethdev.c
@@ -993,20 +993,42 @@  atl_dev_stats_reset(struct rte_eth_dev *dev)
 }
 
 static int
+atl_dev_xstats_get_count(struct rte_eth_dev *dev)
+{
+	struct atl_adapter *adapter =
+		(struct atl_adapter *)dev->data->dev_private;
+
+	struct aq_hw_s *hw = &adapter->hw;
+	unsigned int i, count = 0;
+
+	for (i = 0; i < RTE_DIM(atl_xstats_tbl); i++) {
+		if (atl_xstats_tbl[i].type == XSTATS_TYPE_MACSEC &&
+			((hw->caps_lo & BIT(CAPS_LO_MACSEC)) == 0))
+			continue;
+
+		count++;
+	}
+
+	return count;
+}
+
+static int
 atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
 			 struct rte_eth_xstat_name *xstats_names,
 			 unsigned int size)
 {
 	unsigned int i;
+	unsigned int count = atl_dev_xstats_get_count(dev);
 
-	if (!xstats_names)
-		return RTE_DIM(atl_xstats_tbl);
-
-	for (i = 0; i < size && i < RTE_DIM(atl_xstats_tbl); i++)
-		strlcpy(xstats_names[i].name, atl_xstats_tbl[i].name,
-			RTE_ETH_XSTATS_NAME_SIZE);
+	if (xstats_names) {
+		for (i = 0; i < size && i < count; i++) {
+			snprintf(xstats_names[i].name,
+				RTE_ETH_XSTATS_NAME_SIZE, "%s",
+				atl_xstats_tbl[i].name);
+		}
+	}
 
-	return i;
+	return count;
 }
 
 static int
@@ -1020,9 +1042,10 @@  atl_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,
 	struct macsec_msg_fw_response resp = { 0 };
 	int err = -1;
 	unsigned int i;
+	unsigned int count = atl_dev_xstats_get_count(dev);
 
 	if (!stats)
-		return 0;
+		return count;
 
 	if (hw->aq_fw_ops->send_macsec_req != NULL) {
 		req.ingress_sa_index = 0xff;
@@ -1035,7 +1058,7 @@  atl_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,
 		err = hw->aq_fw_ops->send_macsec_req(hw, &msg, &resp);
 	}
 
-	for (i = 0; i < n && i < RTE_DIM(atl_xstats_tbl); i++) {
+	for (i = 0; i < n && i < count; i++) {
 		stats[i].id = i;
 
 		switch (atl_xstats_tbl[i].type) {
@@ -1044,14 +1067,15 @@  atl_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,
 					 atl_xstats_tbl[i].offset);
 			break;
 		case XSTATS_TYPE_MACSEC:
-			if (err)
-				goto done;
-			stats[i].value = *(u64 *)((uint8_t *)&resp.stats +
-					 atl_xstats_tbl[i].offset);
+			if (!err) {
+				stats[i].value =
+					*(u64 *)((uint8_t *)&resp.stats +
+					atl_xstats_tbl[i].offset);
+			}
 			break;
 		}
 	}
-done:
+
 	return i;
 }