diff --git a/libethernet/patches/0002-libethernet-Improve-counter-logic-for-Airoha.patch b/libethernet/patches/0002-libethernet-Improve-counter-logic-for-Airoha.patch new file mode 100644 index 000000000..4815b7fe9 --- /dev/null +++ b/libethernet/patches/0002-libethernet-Improve-counter-logic-for-Airoha.patch @@ -0,0 +1,162 @@ +From 6e7216e657dfb59e869e393ef58e6b4593c16fc7 Mon Sep 17 00:00:00 2001 +From: Markus Gothe +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 +