Skip to content

Commit fbf64c1

Browse files
wingmankwokdavem330
authored andcommitted
net: netcp: Consolidates statistics collection code
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-kwok2@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 208c6b9 commit fbf64c1

File tree

1 file changed

+54
-45
lines changed

1 file changed

+54
-45
lines changed

drivers/net/ethernet/ti/netcp_ethss.c

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,70 +1550,79 @@ static int keystone_get_sset_count(struct net_device *ndev, int stringset)
15501550
}
15511551
}
15521552

1553-
static void gbe_update_stats(struct gbe_priv *gbe_dev, uint64_t *data)
1553+
static inline void gbe_update_hw_stats_entry(struct gbe_priv *gbe_dev,
1554+
int et_stats_entry)
15541555
{
15551556
void __iomem *base = NULL;
15561557
u32 __iomem *p;
15571558
u32 tmp = 0;
1559+
1560+
/* The hw_stats_regs pointers are already
1561+
* properly set to point to the right base:
1562+
*/
1563+
base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[et_stats_entry].type];
1564+
p = base + gbe_dev->et_stats[et_stats_entry].offset;
1565+
tmp = readl(p);
1566+
gbe_dev->hw_stats[et_stats_entry] += tmp;
1567+
1568+
/* write-to-decrement:
1569+
* new register value = old register value - write value
1570+
*/
1571+
writel(tmp, p);
1572+
}
1573+
1574+
static void gbe_update_stats(struct gbe_priv *gbe_dev, uint64_t *data)
1575+
{
15581576
int i;
15591577

15601578
for (i = 0; i < gbe_dev->num_et_stats; i++) {
1561-
base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[i].type];
1562-
p = base + gbe_dev->et_stats[i].offset;
1563-
tmp = readl(p);
1564-
gbe_dev->hw_stats[i] = gbe_dev->hw_stats[i] + tmp;
1579+
gbe_update_hw_stats_entry(gbe_dev, i);
1580+
15651581
if (data)
15661582
data[i] = gbe_dev->hw_stats[i];
1567-
/* write-to-decrement:
1568-
* new register value = old register value - write value
1569-
*/
1570-
writel(tmp, p);
15711583
}
15721584
}
15731585

1574-
static void gbe_update_stats_ver14(struct gbe_priv *gbe_dev, uint64_t *data)
1586+
static inline void gbe_stats_mod_visible_ver14(struct gbe_priv *gbe_dev,
1587+
int stats_mod)
15751588
{
1576-
void __iomem *gbe_statsa = gbe_dev->hw_stats_regs[0];
1577-
void __iomem *gbe_statsb = gbe_dev->hw_stats_regs[1];
1578-
u64 *hw_stats = &gbe_dev->hw_stats[0];
1579-
void __iomem *base = NULL;
1580-
u32 __iomem *p;
1581-
u32 tmp = 0, val, pair_size = (gbe_dev->num_et_stats / 2);
1582-
int i, j, pair;
1589+
u32 val;
15831590

1584-
for (pair = 0; pair < 2; pair++) {
1585-
val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
1591+
val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
15861592

1587-
if (pair == 0)
1588-
val &= ~GBE_STATS_CD_SEL;
1589-
else
1590-
val |= GBE_STATS_CD_SEL;
1593+
switch (stats_mod) {
1594+
case GBE_STATSA_MODULE:
1595+
case GBE_STATSB_MODULE:
1596+
val &= ~GBE_STATS_CD_SEL;
1597+
break;
1598+
case GBE_STATSC_MODULE:
1599+
case GBE_STATSD_MODULE:
1600+
val |= GBE_STATS_CD_SEL;
1601+
break;
1602+
default:
1603+
return;
1604+
}
1605+
1606+
/* make the stat module visible */
1607+
writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
1608+
}
15911609

1592-
/* make the stat modules visible */
1593-
writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
1610+
static void gbe_update_stats_ver14(struct gbe_priv *gbe_dev, uint64_t *data)
1611+
{
1612+
u32 half_num_et_stats = (gbe_dev->num_et_stats / 2);
1613+
int et_entry, j, pair;
15941614

1595-
for (i = 0; i < pair_size; i++) {
1596-
j = pair * pair_size + i;
1597-
switch (gbe_dev->et_stats[j].type) {
1598-
case GBE_STATSA_MODULE:
1599-
case GBE_STATSC_MODULE:
1600-
base = gbe_statsa;
1601-
break;
1602-
case GBE_STATSB_MODULE:
1603-
case GBE_STATSD_MODULE:
1604-
base = gbe_statsb;
1605-
break;
1606-
}
1615+
for (pair = 0; pair < 2; pair++) {
1616+
gbe_stats_mod_visible_ver14(gbe_dev, (pair ?
1617+
GBE_STATSC_MODULE :
1618+
GBE_STATSA_MODULE));
1619+
1620+
for (j = 0; j < half_num_et_stats; j++) {
1621+
et_entry = pair * half_num_et_stats + j;
1622+
gbe_update_hw_stats_entry(gbe_dev, et_entry);
16071623

1608-
p = base + gbe_dev->et_stats[j].offset;
1609-
tmp = readl(p);
1610-
hw_stats[j] += tmp;
16111624
if (data)
1612-
data[j] = hw_stats[j];
1613-
/* write-to-decrement:
1614-
* new register value = old register value - write value
1615-
*/
1616-
writel(tmp, p);
1625+
data[et_entry] = gbe_dev->hw_stats[et_entry];
16171626
}
16181627
}
16191628
}

0 commit comments

Comments
 (0)