diff --git a/econet/ecnt_prvt.c b/econet/ecnt_prvt.c index a37fb493c0c8c7471831394b40e5dc141ec5f73e..2c42a0365c4dc66912f0657c5ccd27e364b859c6 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; \