libethernet: Improve counter logic on Airoha.

This commit is contained in:
Markus Gothe 2024-08-22 22:09:58 +02:00
parent f565ac8144
commit 413817fc9d

View file

@ -0,0 +1,162 @@
From 6e7216e657dfb59e869e393ef58e6b4593c16fc7 Mon Sep 17 00:00:00 2001
From: Markus Gothe <markus.gothe@genexis.eu>
Date: Thu, 22 Aug 2024 22:00:25 +0200
Subject: [PATCH] libethernet: Improve counter logic for Airoha.
Improve the counter logic to support 64-bit counters
for internal switch and different MACs for 'ae_wan'.
Also add support for represeting TX/RX bytes and errors.
Fix calculation of unicast packets.
---
econet/ecnt_prvt.c | 76 +++++++++++++++++++++++++++++++---------------
1 file changed, 51 insertions(+), 25 deletions(-)
diff --git a/econet/ecnt_prvt.c b/econet/ecnt_prvt.c
index a37fb49..2c42a03 100644
--- a/econet/ecnt_prvt.c
+++ b/econet/ecnt_prvt.c
@@ -143,10 +143,10 @@ static void fill_stats_tx_from_gdma(struct eth_stats *stats, struct eth_rmon_sta
return;
if (stats != NULL) {
- stats->tx_bytes = 0;
+ stats->tx_bytes = tx_stats->frame_len;
stats->tx_packets = tx_stats->frame_cnt;
stats->tx_errors = 0;
- stats->tx_ucast_packets = 0;
+ stats->tx_ucast_packets = tx_stats->frame_cnt - (tx_stats->broadcast + tx_stats->multicast);
stats->tx_mcast_packets = tx_stats->broadcast;
stats->tx_bcast_packets = tx_stats->multicast;
stats->tx_discard_packets = tx_stats->drop_cnt;
@@ -154,7 +154,7 @@ static void fill_stats_tx_from_gdma(struct eth_stats *stats, struct eth_rmon_sta
if (rstats != NULL) {
rstats->tx.packets = tx_stats->frame_cnt;
- rstats->tx.bytes = 0;
+ rstats->tx.bytes = tx_stats->frame_len;
rstats->tx.bcast_packets = tx_stats->broadcast;
rstats->tx.mcast_packets = tx_stats->multicast;
rstats->tx.crc_err_packets = 0;
@@ -175,10 +175,10 @@ static void fill_stats_rx_from_gdma(struct eth_stats *stats, struct eth_rmon_sta
return;
if (stats != NULL) {
- stats->rx_bytes = 0;
+ stats->rx_bytes = rx_stats->frame_len;
stats->rx_packets = rx_stats->frame_cnt;
- stats->rx_errors = 0;
- stats->rx_ucast_packets = 0;
+ stats->rx_errors = rx_stats->crc + rx_stats->jabber + rx_stats->fragment + rx_stats->undersize + rx_stats->oversize;
+ stats->rx_ucast_packets = rx_stats->frame_cnt - (rx_stats->broadcast + rx_stats->multicast);
stats->rx_mcast_packets = rx_stats->broadcast;
stats->rx_bcast_packets = rx_stats->multicast;
stats->rx_discard_packets = rx_stats->drop_cnt;
@@ -187,12 +187,12 @@ static void fill_stats_rx_from_gdma(struct eth_stats *stats, struct eth_rmon_sta
if (rstats != NULL) {
rstats->rx.packets = rx_stats->frame_cnt;
- rstats->rx.bytes = 0;
+ rstats->rx.bytes = rx_stats->frame_len;
rstats->rx.bcast_packets = rx_stats->broadcast;
rstats->rx.mcast_packets = rx_stats->multicast;
- rstats->rx.crc_err_packets = 0;
- rstats->rx.under_sz_packets = 0;
- rstats->rx.over_sz_packets = 0;
+ rstats->rx.crc_err_packets = rx_stats->crc;
+ rstats->rx.under_sz_packets = rx_stats->undersize;
+ rstats->rx.over_sz_packets = rx_stats->oversize;
rstats->rx.packets_64bytes = rx_stats->eq_64;
rstats->rx.packets_65to127bytes = rx_stats->from_65_to_127;
rstats->rx.packets_256to511bytes = rx_stats->from_256_to_511;
@@ -259,23 +259,50 @@ int hsgmii_lan_prvt_get_port_statistics(char *ifname, struct eth_stats *stats, s
}
int ae_wan_prvt_get_port_statistics(struct eth_stats *stats, struct eth_rmon_stats *rstats) {
+ char cmdbuf[512] = {0};
ECNT_FEMGR_GDMA2_TX_STATISTICS tx_stats;
ECNT_FEMGR_GDMA2_RX_STATISTICS rx_stats;
memset(&tx_stats, 0, sizeof(ECNT_FEMGR_GDMA2_TX_STATISTICS));
memset(&rx_stats, 0, sizeof(ECNT_FEMGR_GDMA2_RX_STATISTICS));
- if (!fe_lib_get_gdma2_tx_statistics(&tx_stats)) {
- fill_stats_tx_from_gdma(stats, rstats, &tx_stats);
- }
+ chrCmd(cmdbuf, sizeof(cmdbuf), "cat /proc/tc3162/ae_wan_switch_hsgmii_lan");
+ if (cmdbuf[0] != '\0' && strcmp(cmdbuf, "pon") != 0) {
+ int i = 0, hsgmii_index = -1;
+ for (; i < ARRAY_SIZE(hsgmii_lookup_tbl); i++) {
+ if (!strcmp(cmdbuf, hsgmii_lookup_tbl[i].iftype)) {
+ hsgmii_index = hsgmii_lookup_tbl[i].idx;
+ break;
+ }
+ }
- if (!fe_lib_get_gdma2_rx_statistics(&rx_stats)) {
- fill_stats_rx_from_gdma(stats, rstats, &rx_stats);
- }
+ if (hsgmii_index == -1)
+ return -1;
- if (rstats != NULL) {
- get_pause_stats_from_proc("", "ae_wan", &rstats->rx.pause_packets,
- &rstats->tx.pause_packets);
+ if (!fe_lib_get_hsgmii_tx_statistics(&tx_stats, hsgmii_index)) {
+ fill_stats_tx_from_gdma(stats, rstats, &tx_stats);
+ }
+ if (!fe_lib_get_hsgmii_rx_statistics(&rx_stats, hsgmii_index)) {
+ fill_stats_rx_from_gdma(stats, rstats, &rx_stats);
+ }
+
+ if (rstats != NULL) {
+ get_pause_stats_from_proc("hsgmii_", cmdbuf, &rstats->rx.pause_packets,
+ &rstats->tx.pause_packets);
+ }
+ } else {
+ if (!fe_lib_get_gdma2_tx_statistics(&tx_stats)) {
+ fill_stats_tx_from_gdma(stats, rstats, &tx_stats);
+ }
+
+ if (!fe_lib_get_gdma2_rx_statistics(&rx_stats)) {
+ fill_stats_rx_from_gdma(stats, rstats, &rx_stats);
+ }
+
+ if (rstats != NULL) {
+ get_pause_stats_from_proc("", "ae_wan", &rstats->rx.pause_packets,
+ &rstats->tx.pause_packets);
+ }
}
return 0;
@@ -305,14 +332,12 @@ int ecnt_prvt_get_port_statistics(uint32_t port,
}
if (stats != NULL) {
- stats->tx_bytes =
- portcnt.TxBytesCnt_Lo;
- stats->rx_bytes =
- portcnt.RxBytesCnt_Lo;
+ stats->tx_bytes = (((uint64_t)portcnt.TxBytesCnt_Hi) << 32) + portcnt.TxBytesCnt_Lo;
+ stats->rx_bytes = (((uint64_t)portcnt.RxBytesCnt_Hi) << 32) + portcnt.RxBytesCnt_Lo;
stats->tx_packets = portcnt.TxPktsCnt;
stats->rx_packets = portcnt.RxPktsCnt;
stats->tx_errors = 0;
- stats->rx_errors = 0;
+ stats->rx_errors = portcnt.RxAlignmentErrorCnt + portcnt.RxCRCFramesCnt + portcnt.RxUnderSizePktsCnt + portcnt.RxFragmentErrorCnt + portcnt.RxOverSizePktsCnt;
stats->tx_ucast_packets = portcnt.TxUniPktsCnt;
stats->rx_ucast_packets = portcnt.RxUniPktsCnt;
stats->tx_mcast_packets = portcnt.TxMultiPktsCnt;
@@ -330,7 +355,8 @@ int ecnt_prvt_get_port_statistics(uint32_t port,
rstats->__rmon_field.drop_events = \
portcnt.__ecnt_prefix ## DropFramesCnt; \
rstats->__rmon_field.bytes = \
- portcnt.__ecnt_prefix ## BytesCnt_Lo; \
+ (((uint64_t)portcnt.__ecnt_prefix ## BytesCnt_Hi) << 32) \
+ + portcnt.__ecnt_prefix ## BytesCnt_Lo; \
rstats->__rmon_field.packets = portcnt.__ecnt_prefix ## PktsCnt;\
rstats->__rmon_field.bcast_packets = \
portcnt.__ecnt_prefix ## BroadPktsCnt; \
--
2.46.0