Basic RX and TX stats are the same, just at a slightly different
offset, use iteration to save code.

Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com>
---
 .../net/ethernet/netronome/nfp/nfp_hstat.c    | 48 +++++--------------
 1 file changed, 12 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_hstat.c 
b/drivers/net/ethernet/netronome/nfp/nfp_hstat.c
index 9480d3b6caa5..d339008333bc 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_hstat.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_hstat.c
@@ -7,52 +7,29 @@
 
 /* NFD per-vNIC stats */
 static int
-nfp_hstat_vnic_nfd_basic_get_rx(struct net_device *netdev,
-                               struct rtnl_hstat_req *req,
-                               const struct rtnl_hstat_group *grp)
+nfp_hstat_vnic_nfd_basic_get(struct net_device *netdev,
+                            struct rtnl_hstat_req *req,
+                            const struct rtnl_hstat_group *grp)
 {
        struct nfp_net *nn = netdev_priv(netdev);
+       u32 off;
 
-       rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_PKTS,
-                       nn_readq(nn, NFP_NET_CFG_STATS_RX_FRAMES));
-       rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_BYTES,
-                       nn_readq(nn, NFP_NET_CFG_STATS_RX_OCTETS));
-       return 0;
-}
-
-static const struct rtnl_hstat_group nfp_hstat_vnic_nfd_rx = {
-       .qualifiers = {
-               RTNL_HSTATS_QUALS_BASIC(DEV, RX),
-       },
-
-       .get_stats = nfp_hstat_vnic_nfd_basic_get_rx,
-       .stats  = {
-               [0] =   RTNL_HSTATS_STAT_LINUX_PKTS_BIT |
-                       RTNL_HSTATS_STAT_LINUX_BYTES_BIT,
-       },
-       .stats_cnt = 2,
-};
-
-static int
-nfp_hstat_vnic_nfd_basic_get_tx(struct net_device *netdev,
-                               struct rtnl_hstat_req *req,
-                               const struct rtnl_hstat_group *grp)
-{
-       struct nfp_net *nn = netdev_priv(netdev);
+       off = rtnl_hstat_is_rx(req) ?
+               0 : NFP_NET_CFG_STATS_TX_OCTETS - NFP_NET_CFG_STATS_RX_OCTETS;
 
        rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_PKTS,
-                       nn_readq(nn, NFP_NET_CFG_STATS_TX_FRAMES));
+                       nn_readq(nn, NFP_NET_CFG_STATS_RX_FRAMES + off));
        rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_BYTES,
-                       nn_readq(nn, NFP_NET_CFG_STATS_TX_OCTETS));
+                       nn_readq(nn, NFP_NET_CFG_STATS_RX_OCTETS + off));
        return 0;
 }
 
-static const struct rtnl_hstat_group nfp_hstat_vnic_nfd_tx = {
+static const struct rtnl_hstat_group nfp_hstat_vnic_nfd = {
        .qualifiers = {
-               RTNL_HSTATS_QUALS_BASIC(DEV, TX),
+               RTNL_HSTATS_QUALS_BASIC_BIDIR(DEV),
        },
 
-       .get_stats = nfp_hstat_vnic_nfd_basic_get_tx,
+       .get_stats = nfp_hstat_vnic_nfd_basic_get,
        .stats  = {
                [0] =   RTNL_HSTATS_STAT_LINUX_PKTS_BIT |
                        RTNL_HSTATS_STAT_LINUX_BYTES_BIT,
@@ -63,8 +40,7 @@ static const struct rtnl_hstat_group nfp_hstat_vnic_nfd_tx = {
 int nfp_net_hstat_get_groups(const struct net_device *netdev,
                             struct rtnl_hstat_req *req)
 {
-       rtnl_hstat_add_grp(req, &nfp_hstat_vnic_nfd_rx);
-       rtnl_hstat_add_grp(req, &nfp_hstat_vnic_nfd_tx);
+       rtnl_hstat_add_grp(req, &nfp_hstat_vnic_nfd);
 
        return 0;
 }
-- 
2.19.2

Reply via email to