Different Keystone2 platforms have different number and
layouts of hw statistics modules.  This patch consolidates
the statistics processing of different Keystone2 platforms
for easy maintenance.

Signed-off-by: WingMan Kwok <w-kw...@ti.com>
---
 drivers/net/ethernet/ti/netcp_ethss.c |   99 ++++++++++++++++++---------------
 1 file changed, 54 insertions(+), 45 deletions(-)

diff --git a/drivers/net/ethernet/ti/netcp_ethss.c 
b/drivers/net/ethernet/ti/netcp_ethss.c
index 3976516..b06f210 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -1550,70 +1550,79 @@ static int keystone_get_sset_count(struct net_device 
*ndev, int stringset)
        }
 }
 
-static void gbe_update_stats(struct gbe_priv *gbe_dev, uint64_t *data)
+static inline void gbe_update_hw_stats_entry(struct gbe_priv *gbe_dev,
+                                            int et_stats_entry)
 {
        void __iomem *base = NULL;
        u32  __iomem *p;
        u32 tmp = 0;
+
+       /* The hw_stats_regs pointers are already
+        * properly set to point to the right base:
+        */
+       base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[et_stats_entry].type];
+       p = base + gbe_dev->et_stats[et_stats_entry].offset;
+       tmp = readl(p);
+       gbe_dev->hw_stats[et_stats_entry] += tmp;
+
+       /* write-to-decrement:
+        * new register value = old register value - write value
+        */
+       writel(tmp, p);
+}
+
+static void gbe_update_stats(struct gbe_priv *gbe_dev, uint64_t *data)
+{
        int i;
 
        for (i = 0; i < gbe_dev->num_et_stats; i++) {
-               base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[i].type];
-               p = base + gbe_dev->et_stats[i].offset;
-               tmp = readl(p);
-               gbe_dev->hw_stats[i] = gbe_dev->hw_stats[i] + tmp;
+               gbe_update_hw_stats_entry(gbe_dev, i);
+
                if (data)
                        data[i] = gbe_dev->hw_stats[i];
-               /* write-to-decrement:
-                * new register value = old register value - write value
-                */
-               writel(tmp, p);
        }
 }
 
-static void gbe_update_stats_ver14(struct gbe_priv *gbe_dev, uint64_t *data)
+static inline void gbe_stats_mod_visible_ver14(struct gbe_priv *gbe_dev,
+                                              int stats_mod)
 {
-       void __iomem *gbe_statsa = gbe_dev->hw_stats_regs[0];
-       void __iomem *gbe_statsb = gbe_dev->hw_stats_regs[1];
-       u64 *hw_stats = &gbe_dev->hw_stats[0];
-       void __iomem *base = NULL;
-       u32  __iomem *p;
-       u32 tmp = 0, val, pair_size = (gbe_dev->num_et_stats / 2);
-       int i, j, pair;
+       u32 val;
 
-       for (pair = 0; pair < 2; pair++) {
-               val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
+       val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
 
-               if (pair == 0)
-                       val &= ~GBE_STATS_CD_SEL;
-               else
-                       val |= GBE_STATS_CD_SEL;
+       switch (stats_mod) {
+       case GBE_STATSA_MODULE:
+       case GBE_STATSB_MODULE:
+               val &= ~GBE_STATS_CD_SEL;
+               break;
+       case GBE_STATSC_MODULE:
+       case GBE_STATSD_MODULE:
+               val |= GBE_STATS_CD_SEL;
+               break;
+       default:
+               return;
+       }
+
+       /* make the stat module visible */
+       writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
+}
 
-               /* make the stat modules visible */
-               writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
+static void gbe_update_stats_ver14(struct gbe_priv *gbe_dev, uint64_t *data)
+{
+       u32 half_num_et_stats = (gbe_dev->num_et_stats / 2);
+       int et_entry, j, pair;
 
-               for (i = 0; i < pair_size; i++) {
-                       j = pair * pair_size + i;
-                       switch (gbe_dev->et_stats[j].type) {
-                       case GBE_STATSA_MODULE:
-                       case GBE_STATSC_MODULE:
-                               base = gbe_statsa;
-                       break;
-                       case GBE_STATSB_MODULE:
-                       case GBE_STATSD_MODULE:
-                               base  = gbe_statsb;
-                       break;
-                       }
+       for (pair = 0; pair < 2; pair++) {
+               gbe_stats_mod_visible_ver14(gbe_dev, (pair ?
+                                                     GBE_STATSC_MODULE :
+                                                     GBE_STATSA_MODULE));
+
+               for (j = 0; j < half_num_et_stats; j++) {
+                       et_entry = pair * half_num_et_stats + j;
+                       gbe_update_hw_stats_entry(gbe_dev, et_entry);
 
-                       p = base + gbe_dev->et_stats[j].offset;
-                       tmp = readl(p);
-                       hw_stats[j] += tmp;
                        if (data)
-                               data[j] = hw_stats[j];
-                       /* write-to-decrement:
-                        * new register value = old register value - write value
-                        */
-                       writel(tmp, p);
+                               data[et_entry] = gbe_dev->hw_stats[et_entry];
                }
        }
 }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to