mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 07:34:12 +08:00
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>
This commit is contained in:
parent
5886d26fd2
commit
84b9cd3890
@ -18,6 +18,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.
|
||||
|
@ -3528,11 +3528,18 @@ static void mtk_get_strings(struct net_device *dev, u32 stringset, u8 *data)
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -3540,13 +3547,35 @@ static void mtk_get_strings(struct net_device *dev, u32 stringset, u8 *data)
|
||||
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)
|
||||
{
|
||||
@ -3574,6 +3603,8 @@ static void mtk_get_ethtool_stats(struct net_device *dev,
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user