aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch')
-rw-r--r--target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch b/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch
new file mode 100644
index 0000000000..d372f022c7
--- /dev/null
+++ b/target/linux/generic/backport-5.15/706-04-v6.0-net-ethernet-mtk_eth_soc-add-support-for-page_pool_g.patch
@@ -0,0 +1,95 @@
+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
+@@ -3485,11 +3485,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;
+ }
+ }
+@@ -3497,13 +3504,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 = &eth->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)
+ {
+@@ -3531,6 +3560,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));
+ }
+