Skip to content
Snippets Groups Projects
Commit 6e7216e6 authored by Markus Gothe's avatar Markus Gothe :ok_hand:
Browse files

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.
parent d94e3029
Branches
No related tags found
1 merge request!22libethernet: Improve counter logic for Airoha.
Pipeline #190597 passed
......@@ -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; \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment