net: ti: icssg-prueth: Fix tx_total_bytes count
authorMD Danish Anwar <danishanwar@ti.com>
Thu, 12 Oct 2023 06:46:26 +0000 (12:16 +0530)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Oct 2023 00:32:19 +0000 (17:32 -0700)
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: c1e10d5dc7a1 ("net: ti: icssg-prueth: Add ICSSG Stats")
Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
Link: https://lore.kernel.org/r/20231012064626.977466-1-danishanwar@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/icssg/icssg_stats.c

index bb0b339..3dbaddd 100644 (file)
@@ -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;
        }
 }