mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2026-01-28 01:47:19 +01:00
libethernet: Improve counter logic on Airoha.
This commit is contained in:
parent
f565ac8144
commit
413817fc9d
1 changed files with 162 additions and 0 deletions
|
|
@ -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
|
||||
|
||||
Loading…
Add table
Reference in a new issue