Commit fbf64c19 authored by WingMan Kwok's avatar WingMan Kwok Committed by David S. Miller
Browse files

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: default avatarWingMan Kwok <w-kwok2@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 208c6b9a
Loading
Loading
Loading
Loading
+54 −45
Original line number Original line Diff line number Diff line
@@ -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;
	void __iomem *base = NULL;
	u32  __iomem *p;
	u32  __iomem *p;
	u32 tmp = 0;
	u32 tmp = 0;
	int i;


	for (i = 0; i < gbe_dev->num_et_stats; i++) {
	/* The hw_stats_regs pointers are already
		base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[i].type];
	 * properly set to point to the right base:
		p = base + gbe_dev->et_stats[i].offset;
	 */
	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);
	tmp = readl(p);
		gbe_dev->hw_stats[i] = gbe_dev->hw_stats[i] + tmp;
	gbe_dev->hw_stats[et_stats_entry] += tmp;
		if (data)

			data[i] = gbe_dev->hw_stats[i];
	/* write-to-decrement:
	/* write-to-decrement:
	 * new register value = old register value - write value
	 * new register value = old register value - write value
	 */
	 */
	writel(tmp, p);
	writel(tmp, p);
}
}
}


static void gbe_update_stats_ver14(struct gbe_priv *gbe_dev, uint64_t *data)
static void gbe_update_stats(struct gbe_priv *gbe_dev, uint64_t *data)
{
{
	void __iomem *gbe_statsa = gbe_dev->hw_stats_regs[0];
	int i;
	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;


	for (pair = 0; pair < 2; pair++) {
	for (i = 0; i < gbe_dev->num_et_stats; i++) {
		val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
		gbe_update_hw_stats_entry(gbe_dev, i);


		if (pair == 0)
		if (data)
			val &= ~GBE_STATS_CD_SEL;
			data[i] = gbe_dev->hw_stats[i];
		else
	}
			val |= GBE_STATS_CD_SEL;
}


		/* make the stat modules visible */
static inline void gbe_stats_mod_visible_ver14(struct gbe_priv *gbe_dev,
		writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
					       int stats_mod)
{
	u32 val;


		for (i = 0; i < pair_size; i++) {
	val = readl(GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
			j = pair * pair_size + i;

			switch (gbe_dev->et_stats[j].type) {
	switch (stats_mod) {
	case GBE_STATSA_MODULE:
	case GBE_STATSA_MODULE:
			case GBE_STATSC_MODULE:
				base = gbe_statsa;
			break;
	case GBE_STATSB_MODULE:
	case GBE_STATSB_MODULE:
		val &= ~GBE_STATS_CD_SEL;
		break;
	case GBE_STATSC_MODULE:
	case GBE_STATSD_MODULE:
	case GBE_STATSD_MODULE:
				base  = gbe_statsb;
		val |= GBE_STATS_CD_SEL;
		break;
		break;
	default:
		return;
	}
	}


			p = base + gbe_dev->et_stats[j].offset;
	/* make the stat module visible */
			tmp = readl(p);
	writel(val, GBE_REG_ADDR(gbe_dev, switch_regs, stat_port_en));
			hw_stats[j] += tmp;
}

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 (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);

			if (data)
			if (data)
				data[j] = hw_stats[j];
				data[et_entry] = gbe_dev->hw_stats[et_entry];
			/* write-to-decrement:
			 * new register value = old register value - write value
			 */
			writel(tmp, p);
		}
		}
	}
	}
}
}