DPAA2 driver has 4 XDP counters which align just fine with the standard XDP stats. Convert the driver to use the new approach. Note that those counters are stored per-channel, but originally were being given to Ethtool as sums across all channels. This change makes them per-channel in Ethtool as well by providing a number of channels to the standard stats infra. Signed-off-by: Alexander Lobakin <alexandr.lobakin@xxxxxxxxx> Reviewed-by: Jesse Brandeburg <jesse.brandeburg@xxxxxxxxx> --- .../net/ethernet/freescale/dpaa2/dpaa2-eth.h | 4 +-- .../ethernet/freescale/dpaa2/dpaa2-ethtool.c | 36 ++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h index 8cb57f103d6b..fbba28fbb527 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h @@ -377,13 +377,13 @@ struct dpaa2_eth_ch_stats { __u64 pull_err; /* Number of CDANs; useful to estimate avg NAPI len */ __u64 cdan; + /* The rest of the structure does not show up in ethtool stats */ + struct { } __eth_end; /* XDP counters */ __u64 xdp_drop; __u64 xdp_tx; __u64 xdp_tx_err; __u64 xdp_redirect; - /* The rest of the structure does not show up in ethtool stats */ - struct { } __eth_end; /* Must be last */ __u64 frames; }; diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c index 95ae83905458..6529fa35c532 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c @@ -53,10 +53,6 @@ static char dpaa2_ethtool_extras[][ETH_GSTRING_LEN] = { "[drv] dequeue portal busy", "[drv] channel pull errors", "[drv] cdan", - "[drv] xdp drop", - "[drv] xdp tx", - "[drv] xdp tx errors", - "[drv] xdp redirect", /* FQ stats */ "[qbman] rx pending frames", "[qbman] rx pending bytes", @@ -317,6 +313,36 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev, dpaa2_mac_get_ethtool_stats(priv->mac, data + i); } +static int dpaa2_eth_get_std_stats_channels(struct net_device *net_dev, + u32 sset) +{ + const struct dpaa2_eth_priv *priv = netdev_priv(net_dev); + + switch (sset) { + case ETH_SS_STATS_XDP: + return priv->num_channels; + default: + return -EOPNOTSUPP; + } +} + +static void dpaa2_eth_get_xdp_stats(struct net_device *net_dev, + struct ethtool_xdp_stats *xdp_stats) +{ + const struct dpaa2_eth_priv *priv = netdev_priv(net_dev); + const struct dpaa2_eth_ch_stats *ch_stats; + u32 i; + + for (i = 0; i < priv->num_channels; i++) { + ch_stats = &priv->channel[i]->stats; + + xdp_stats[i].drop = ch_stats->xdp_drop; + xdp_stats[i].redirect = ch_stats->xdp_redirect; + xdp_stats[i].tx = ch_stats->xdp_tx; + xdp_stats[i].tx_errors = ch_stats->xdp_tx_err; + } +} + static int dpaa2_eth_prep_eth_rule(struct ethhdr *eth_value, struct ethhdr *eth_mask, void *key, void *mask, u64 *fields) { @@ -836,4 +862,6 @@ const struct ethtool_ops dpaa2_ethtool_ops = { .get_ts_info = dpaa2_eth_get_ts_info, .get_tunable = dpaa2_eth_get_tunable, .set_tunable = dpaa2_eth_set_tunable, + .get_std_stats_channels = dpaa2_eth_get_std_stats_channels, + .get_xdp_stats = dpaa2_eth_get_xdp_stats, }; -- 2.31.1