[RFC PATCH net-next 19/28] net: ethernet: ti: cpsw-proxy-client: implement and register ndo_get_stats64

From: Siddharth Vadapalli
Date: Sat May 18 2024 - 08:48:27 EST


Add the function "vport_ndo_get_stats()" and register it as the driver's
ndo_get_stats64 callback.

Signed-off-by: Siddharth Vadapalli <s-vadapalli@xxxxxx>
---
drivers/net/ethernet/ti/cpsw-proxy-client.c | 35 +++++++++++++++++++++
1 file changed, 35 insertions(+)

diff --git a/drivers/net/ethernet/ti/cpsw-proxy-client.c b/drivers/net/ethernet/ti/cpsw-proxy-client.c
index 7cbe1d4b5112..6886557aa2a1 100644
--- a/drivers/net/ethernet/ti/cpsw-proxy-client.c
+++ b/drivers/net/ethernet/ti/cpsw-proxy-client.c
@@ -1562,10 +1562,45 @@ static netdev_tx_t vport_ndo_xmit(struct sk_buff *skb, struct net_device *ndev)
return NETDEV_TX_BUSY;
}

+static void vport_ndo_get_stats(struct net_device *ndev,
+ struct rtnl_link_stats64 *stats)
+{
+ struct vport_netdev_priv *ndev_priv = netdev_priv(ndev);
+ unsigned int start;
+ int cpu;
+
+ for_each_possible_cpu(cpu) {
+ struct vport_netdev_stats *cpu_stats;
+ u64 rx_packets;
+ u64 rx_bytes;
+ u64 tx_packets;
+ u64 tx_bytes;
+
+ cpu_stats = per_cpu_ptr(ndev_priv->stats, cpu);
+ do {
+ start = u64_stats_fetch_begin(&cpu_stats->syncp);
+ rx_packets = cpu_stats->rx_packets;
+ rx_bytes = cpu_stats->rx_bytes;
+ tx_packets = cpu_stats->tx_packets;
+ tx_bytes = cpu_stats->tx_bytes;
+ } while (u64_stats_fetch_retry(&cpu_stats->syncp, start));
+
+ stats->rx_packets += rx_packets;
+ stats->rx_bytes += rx_bytes;
+ stats->tx_packets += tx_packets;
+ stats->tx_bytes += tx_bytes;
+ }
+
+ stats->rx_errors = ndev->stats.rx_errors;
+ stats->rx_dropped = ndev->stats.rx_dropped;
+ stats->tx_dropped = ndev->stats.tx_dropped;
+}
+
static const struct net_device_ops cpsw_proxy_client_netdev_ops = {
.ndo_open = vport_ndo_open,
.ndo_stop = vport_ndo_stop,
.ndo_start_xmit = vport_ndo_xmit,
+ .ndo_get_stats64 = vport_ndo_get_stats,
};

static int init_netdev(struct cpsw_proxy_priv *proxy_priv, struct virtual_port *vport)
--
2.40.1