Commit 2c0d808f authored by MD Danish Anwar's avatar MD Danish Anwar Committed by Jakub Kicinski
Browse files

net: ti: icssg-prueth: Fix tx_total_bytes count



ICSSG HW stats on TX side considers 8 preamble bytes as data bytes. Due
to this the tx_bytes of ICSSG interface doesn't match the rx_bytes of the
link partner. There is no public errata available yet.

As a workaround to fix this, decrease tx_bytes by 8 bytes for every tx
frame.

Fixes: c1e10d5d ("net: ti: icssg-prueth: Add ICSSG Stats")
Signed-off-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Link: https://lore.kernel.org/r/20231012064626.977466-1-danishanwar@ti.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a258c804
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@
#include "icssg_stats.h"
#include <linux/regmap.h>

#define ICSSG_TX_PACKET_OFFSET	0xA0
#define ICSSG_TX_BYTE_OFFSET	0xEC

static u32 stats_base[] = {	0x54c,	/* Slice 0 stats start */
				0xb18,	/* Slice 1 stats start */
};
@@ -18,6 +21,7 @@ void emac_update_hardware_stats(struct prueth_emac *emac)
	struct prueth *prueth = emac->prueth;
	int slice = prueth_emac_slice(emac);
	u32 base = stats_base[slice];
	u32 tx_pkt_cnt = 0;
	u32 val;
	int i;

@@ -29,7 +33,12 @@ void emac_update_hardware_stats(struct prueth_emac *emac)
			     base + icssg_all_stats[i].offset,
			     val);

		if (icssg_all_stats[i].offset == ICSSG_TX_PACKET_OFFSET)
			tx_pkt_cnt = val;

		emac->stats[i] += val;
		if (icssg_all_stats[i].offset == ICSSG_TX_BYTE_OFFSET)
			emac->stats[i] -= tx_pkt_cnt * 8;
	}
}