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; \