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