96 lines
2.7 KiB
Diff
96 lines
2.7 KiB
Diff
From 84b9cd389036d4a262d8cee794d56c04095358a7 Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Fri, 22 Jul 2022 09:19:40 +0200
|
|
Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for
|
|
page_pool_get_stats
|
|
|
|
Introduce support for the page_pool stats API into mtk_eth_soc driver.
|
|
Report page_pool stats through ethtool.
|
|
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/ethernet/mediatek/Kconfig | 1 +
|
|
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 37 +++++++++++++++++++--
|
|
2 files changed, 35 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/mediatek/Kconfig
|
|
+++ b/drivers/net/ethernet/mediatek/Kconfig
|
|
@@ -17,6 +17,7 @@ config NET_MEDIATEK_SOC
|
|
select PHYLINK
|
|
select DIMLIB
|
|
select PAGE_POOL
|
|
+ select PAGE_POOL_STATS
|
|
help
|
|
This driver supports the gigabit ethernet MACs in the
|
|
MediaTek SoC family.
|
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
@@ -3487,11 +3487,18 @@ static void mtk_get_strings(struct net_d
|
|
int i;
|
|
|
|
switch (stringset) {
|
|
- case ETH_SS_STATS:
|
|
+ case ETH_SS_STATS: {
|
|
+ struct mtk_mac *mac = netdev_priv(dev);
|
|
+
|
|
for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++) {
|
|
memcpy(data, mtk_ethtool_stats[i].str, ETH_GSTRING_LEN);
|
|
data += ETH_GSTRING_LEN;
|
|
}
|
|
+ if (mtk_page_pool_enabled(mac->hw))
|
|
+ page_pool_ethtool_stats_get_strings(data);
|
|
+ break;
|
|
+ }
|
|
+ default:
|
|
break;
|
|
}
|
|
}
|
|
@@ -3499,13 +3506,35 @@ static void mtk_get_strings(struct net_d
|
|
static int mtk_get_sset_count(struct net_device *dev, int sset)
|
|
{
|
|
switch (sset) {
|
|
- case ETH_SS_STATS:
|
|
- return ARRAY_SIZE(mtk_ethtool_stats);
|
|
+ case ETH_SS_STATS: {
|
|
+ int count = ARRAY_SIZE(mtk_ethtool_stats);
|
|
+ struct mtk_mac *mac = netdev_priv(dev);
|
|
+
|
|
+ if (mtk_page_pool_enabled(mac->hw))
|
|
+ count += page_pool_ethtool_stats_get_count();
|
|
+ return count;
|
|
+ }
|
|
default:
|
|
return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
+static void mtk_ethtool_pp_stats(struct mtk_eth *eth, u64 *data)
|
|
+{
|
|
+ struct page_pool_stats stats = {};
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE(eth->rx_ring); i++) {
|
|
+ struct mtk_rx_ring *ring = ð->rx_ring[i];
|
|
+
|
|
+ if (!ring->page_pool)
|
|
+ continue;
|
|
+
|
|
+ page_pool_get_stats(ring->page_pool, &stats);
|
|
+ }
|
|
+ page_pool_ethtool_stats_get(data, &stats);
|
|
+}
|
|
+
|
|
static void mtk_get_ethtool_stats(struct net_device *dev,
|
|
struct ethtool_stats *stats, u64 *data)
|
|
{
|
|
@@ -3533,6 +3562,8 @@ static void mtk_get_ethtool_stats(struct
|
|
|
|
for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++)
|
|
*data_dst++ = *(data_src + mtk_ethtool_stats[i].offset);
|
|
+ if (mtk_page_pool_enabled(mac->hw))
|
|
+ mtk_ethtool_pp_stats(mac->hw, data_dst);
|
|
} while (u64_stats_fetch_retry_irq(&hwstats->syncp, start));
|
|
}
|
|
|