xref: /openbmc/u-boot/cmd/aspeed/nettest/mac.c (revision e12dfc2c7187d9ba6a722242cec57f059ebf37a8)
1d82a9689SDylan Hung // SPDX-License-Identifier: GPL-2.0+
25c8f9400Sryan_chen /*
3d82a9689SDylan Hung  * Copyright (C) ASPEED Technology Inc.
45c8f9400Sryan_chen  */
55c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_MAC
65c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_PHY
75c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_SCU
85c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_WDT
95c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_SDR
105c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_SMB
115c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_TIMER
125c8f9400Sryan_chen //#define MAC_DEBUG_REGRW_GPIO
135c8f9400Sryan_chen //#define MAC_DEBUG_MEMRW_Dat
145c8f9400Sryan_chen //#define MAC_DEBUG_MEMRW_Des
155c8f9400Sryan_chen 
165c8f9400Sryan_chen #define MAC_C
175c8f9400Sryan_chen 
185c8f9400Sryan_chen #include "swfunc.h"
195c8f9400Sryan_chen 
205c8f9400Sryan_chen #include "comminf.h"
215c8f9400Sryan_chen #include <command.h>
225c8f9400Sryan_chen #include <common.h>
235c8f9400Sryan_chen #include <malloc.h>
245c8f9400Sryan_chen #include "mem_io.h"
255c8f9400Sryan_chen // -------------------------------------------------------------
265c8f9400Sryan_chen const uint32_t ARP_org_data[16] = {
275c8f9400Sryan_chen     0xffffffff,
285c8f9400Sryan_chen     0x0000ffff, // SA:00-00-
295c8f9400Sryan_chen     0x12345678, // SA:78-56-34-12
305c8f9400Sryan_chen     0x01000608, // ARP(0x0806)
315c8f9400Sryan_chen     0x04060008,
325c8f9400Sryan_chen     0x00000100, // sender MAC Address: 00 00
335c8f9400Sryan_chen     0x12345678, // sender MAC Address: 12 34 56 78
345c8f9400Sryan_chen     0xeb00a8c0, // sender IP Address:  192.168.0.235 (C0.A8.0.EB)
355c8f9400Sryan_chen     0x00000000, // target MAC Address: 00 00 00 00
365c8f9400Sryan_chen     0xa8c00000, // target MAC Address: 00 00, target IP Address:192.168
375c8f9400Sryan_chen     0x00005c00, // target IP Address:  0.92 (C0.A8.0.5C)
385c8f9400Sryan_chen 		//	0x00000100, // target IP Address:  0.1 (C0.A8.0.1)
395c8f9400Sryan_chen 		//	0x0000de00, // target IP Address:  0.222 (C0.A8.0.DE)
405c8f9400Sryan_chen     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc68e2bd5};
415c8f9400Sryan_chen 
425c8f9400Sryan_chen //------------------------------------------------------------
435c8f9400Sryan_chen // Read Memory
445c8f9400Sryan_chen //------------------------------------------------------------
Read_Mem_Dat_NCSI_DD(uint32_t addr)455c8f9400Sryan_chen uint32_t Read_Mem_Dat_NCSI_DD(uint32_t addr)
465c8f9400Sryan_chen {
475c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Dat
485c8f9400Sryan_chen 	printf("[MEMRd-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( readl(addr) ) );
495c8f9400Sryan_chen #endif
505c8f9400Sryan_chen 	return ( SWAP_4B_LEDN_MEM( readl(addr) ) );
515c8f9400Sryan_chen }
525c8f9400Sryan_chen 
Read_Mem_Des_NCSI_DD(uint32_t addr)535c8f9400Sryan_chen uint32_t Read_Mem_Des_NCSI_DD(uint32_t addr)
545c8f9400Sryan_chen {
555c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Des
565c8f9400Sryan_chen 	printf("[MEMRd-Des] %08x = %08x\n", addr,
575c8f9400Sryan_chen 	       SWAP_4B_LEDN_MEM(readl(addr)));
585c8f9400Sryan_chen #endif
595c8f9400Sryan_chen 	return (SWAP_4B_LEDN_MEM(readl(addr)));
605c8f9400Sryan_chen }
615c8f9400Sryan_chen 
Read_Mem_Dat_DD(uint32_t addr)625c8f9400Sryan_chen uint32_t Read_Mem_Dat_DD(uint32_t addr)
635c8f9400Sryan_chen {
645c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Dat
655c8f9400Sryan_chen 	printf("[MEMRd-Dat] %08x = %08x\n", addr,
665c8f9400Sryan_chen 	       SWAP_4B_LEDN_MEM(readl(addr)));
675c8f9400Sryan_chen #endif
685c8f9400Sryan_chen 	return (SWAP_4B_LEDN_MEM(readl(addr)));
695c8f9400Sryan_chen }
705c8f9400Sryan_chen 
Read_Mem_Des_DD(uint32_t addr)715c8f9400Sryan_chen uint32_t Read_Mem_Des_DD(uint32_t addr)
725c8f9400Sryan_chen {
735c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Des
745c8f9400Sryan_chen 	printf("[MEMRd-Des] %08x = %08x\n", addr,
755c8f9400Sryan_chen 	       SWAP_4B_LEDN_MEM(readl(addr)));
765c8f9400Sryan_chen #endif
775c8f9400Sryan_chen 	return (SWAP_4B_LEDN_MEM(readl(addr)));
785c8f9400Sryan_chen }
795c8f9400Sryan_chen 
805c8f9400Sryan_chen //------------------------------------------------------------
815c8f9400Sryan_chen // Read Register
825c8f9400Sryan_chen //------------------------------------------------------------
mac_reg_read(MAC_ENGINE * p_eng,uint32_t addr)835c8f9400Sryan_chen uint32_t mac_reg_read(MAC_ENGINE *p_eng, uint32_t addr)
845c8f9400Sryan_chen {
855c8f9400Sryan_chen 	return readl(p_eng->run.mac_base + addr);
865c8f9400Sryan_chen }
875c8f9400Sryan_chen 
885c8f9400Sryan_chen //------------------------------------------------------------
895c8f9400Sryan_chen // Write Memory
905c8f9400Sryan_chen //------------------------------------------------------------
Write_Mem_Dat_NCSI_DD(uint32_t addr,uint32_t data)915c8f9400Sryan_chen void Write_Mem_Dat_NCSI_DD (uint32_t addr, uint32_t data) {
925c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Dat
935c8f9400Sryan_chen 	printf("[MEMWr-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) );
945c8f9400Sryan_chen #endif
955c8f9400Sryan_chen 	writel(data, addr);
965c8f9400Sryan_chen }
Write_Mem_Des_NCSI_DD(uint32_t addr,uint32_t data)975c8f9400Sryan_chen void Write_Mem_Des_NCSI_DD (uint32_t addr, uint32_t data) {
985c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Des
995c8f9400Sryan_chen 	printf("[MEMWr-Des] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) );
1005c8f9400Sryan_chen #endif
1015c8f9400Sryan_chen 	writel(data, addr);
1025c8f9400Sryan_chen }
Write_Mem_Dat_DD(uint32_t addr,uint32_t data)1035c8f9400Sryan_chen void Write_Mem_Dat_DD (uint32_t addr, uint32_t data) {
1045c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Dat
1055c8f9400Sryan_chen 	printf("[MEMWr-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) );
1065c8f9400Sryan_chen #endif
1075c8f9400Sryan_chen 	writel(data, addr);
1085c8f9400Sryan_chen }
Write_Mem_Des_DD(uint32_t addr,uint32_t data)1095c8f9400Sryan_chen void Write_Mem_Des_DD (uint32_t addr, uint32_t data) {
1105c8f9400Sryan_chen #ifdef MAC_DEBUG_MEMRW_Des
1115c8f9400Sryan_chen 	printf("[MEMWr-Des] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) );
1125c8f9400Sryan_chen #endif
1135c8f9400Sryan_chen 	writel(data, addr);
1145c8f9400Sryan_chen }
1155c8f9400Sryan_chen 
1165c8f9400Sryan_chen //------------------------------------------------------------
1175c8f9400Sryan_chen // Write Register
1185c8f9400Sryan_chen //------------------------------------------------------------
mac_reg_write(MAC_ENGINE * p_eng,uint32_t addr,uint32_t data)1195c8f9400Sryan_chen void mac_reg_write(MAC_ENGINE *p_eng, uint32_t addr, uint32_t data)
1205c8f9400Sryan_chen {
1215c8f9400Sryan_chen 	writel(data, p_eng->run.mac_base + addr);
1225c8f9400Sryan_chen }
1235c8f9400Sryan_chen 
1245c8f9400Sryan_chen 
1255c8f9400Sryan_chen //------------------------------------------------------------
1265c8f9400Sryan_chen // Others
1275c8f9400Sryan_chen //------------------------------------------------------------
debug_pause(void)1285c8f9400Sryan_chen void debug_pause (void) {
1295c8f9400Sryan_chen #ifdef DbgPrn_Enable_Debug_pause
1305c8f9400Sryan_chen 	GET_CAHR();
1315c8f9400Sryan_chen #endif
1325c8f9400Sryan_chen }
1335c8f9400Sryan_chen 
1345c8f9400Sryan_chen //------------------------------------------------------------
dump_mac_ROreg(MAC_ENGINE * p_eng)1355c8f9400Sryan_chen void dump_mac_ROreg(MAC_ENGINE *p_eng)
1365c8f9400Sryan_chen {
1375c8f9400Sryan_chen 	int i = 0xa0;
1385c8f9400Sryan_chen 
1395c8f9400Sryan_chen 	printf("\nMAC%d base 0x%08x", p_eng->run.mac_idx, p_eng->run.mac_base);
1405c8f9400Sryan_chen 	printf("\n%02x:", i);
1415c8f9400Sryan_chen 	for (i = 0xa0; i <= 0xc8; i += 4) {
1425c8f9400Sryan_chen 		printf("%08x ", mac_reg_read(p_eng, i));
1435c8f9400Sryan_chen 		if ((i & 0xf) == 0xc)
1445c8f9400Sryan_chen 			printf("\n%02x:", i + 4);
1455c8f9400Sryan_chen 	}
1465c8f9400Sryan_chen 	printf("\n");
1475c8f9400Sryan_chen }
1485c8f9400Sryan_chen 
1495c8f9400Sryan_chen //------------------------------------------------------------
1505c8f9400Sryan_chen // IO delay
1515c8f9400Sryan_chen //------------------------------------------------------------
get_mac_1g_delay_1(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)1525c8f9400Sryan_chen static void get_mac_1g_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
1535c8f9400Sryan_chen {
1545c8f9400Sryan_chen 	int tx_d, rx_d;
1555c8f9400Sryan_chen 	mac_delay_1g_t reg;
1565c8f9400Sryan_chen 
1575c8f9400Sryan_chen 	reg.w = readl(addr);
1585c8f9400Sryan_chen 	tx_d = reg.b.tx_delay_1;
1595c8f9400Sryan_chen 	rx_d = reg.b.rx_delay_1;
1605c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
1615c8f9400Sryan_chen 	if (reg.b.rx_clk_inv_1 == 1) {
1625c8f9400Sryan_chen 		rx_d = (-1) * rx_d;
1635c8f9400Sryan_chen 	}
1645c8f9400Sryan_chen #endif
1655c8f9400Sryan_chen 	*p_tx_d = tx_d;
1665c8f9400Sryan_chen 	*p_rx_d = rx_d;
1675c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
1685c8f9400Sryan_chen 	       rx_d, tx_d);
1695c8f9400Sryan_chen }
1705c8f9400Sryan_chen 
get_mac_1g_delay_2(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)1715c8f9400Sryan_chen static void get_mac_1g_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
1725c8f9400Sryan_chen {
1735c8f9400Sryan_chen 	int tx_d, rx_d;
1745c8f9400Sryan_chen 	mac_delay_1g_t reg;
1755c8f9400Sryan_chen 
1765c8f9400Sryan_chen 	reg.w = readl(addr);
1775c8f9400Sryan_chen 	tx_d = reg.b.tx_delay_2;
1785c8f9400Sryan_chen 	rx_d = reg.b.rx_delay_2;
1795c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
1805c8f9400Sryan_chen 	if (reg.b.rx_clk_inv_2 == 1) {
1815c8f9400Sryan_chen 		rx_d = (-1) * rx_d;
1825c8f9400Sryan_chen 	}
1835c8f9400Sryan_chen #endif
1845c8f9400Sryan_chen 	*p_tx_d = tx_d;
1855c8f9400Sryan_chen 	*p_rx_d = rx_d;
1865c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
1875c8f9400Sryan_chen 	       rx_d, tx_d);
1885c8f9400Sryan_chen }
1895c8f9400Sryan_chen 
get_mac_100_10_delay_1(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)1905c8f9400Sryan_chen static void get_mac_100_10_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
1915c8f9400Sryan_chen {
1925c8f9400Sryan_chen 	int tx_d, rx_d;
1935c8f9400Sryan_chen 	mac_delay_100_10_t reg;
1945c8f9400Sryan_chen 
1955c8f9400Sryan_chen 	reg.w = readl(addr);
1965c8f9400Sryan_chen 	tx_d = reg.b.tx_delay_1;
1975c8f9400Sryan_chen 	rx_d = reg.b.rx_delay_1;
1985c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
1995c8f9400Sryan_chen 	if (reg.b.rx_clk_inv_1 == 1) {
2005c8f9400Sryan_chen 		rx_d = (-1) * rx_d;
2015c8f9400Sryan_chen 	}
2025c8f9400Sryan_chen #endif
2035c8f9400Sryan_chen 	*p_tx_d = tx_d;
2045c8f9400Sryan_chen 	*p_rx_d = rx_d;
2055c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
2065c8f9400Sryan_chen 	       rx_d, tx_d);
2075c8f9400Sryan_chen }
2085c8f9400Sryan_chen 
get_mac_100_10_delay_2(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)2095c8f9400Sryan_chen static void get_mac_100_10_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
2105c8f9400Sryan_chen {
2115c8f9400Sryan_chen 	int tx_d, rx_d;
2125c8f9400Sryan_chen 	mac_delay_100_10_t reg;
2135c8f9400Sryan_chen 
2145c8f9400Sryan_chen 	reg.w = readl(addr);
2155c8f9400Sryan_chen 	tx_d = reg.b.tx_delay_2;
2165c8f9400Sryan_chen 	rx_d = reg.b.rx_delay_2;
2175c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
2185c8f9400Sryan_chen 	if (reg.b.rx_clk_inv_2 == 1) {
2195c8f9400Sryan_chen 		rx_d = (-1) * rx_d;
2205c8f9400Sryan_chen 	}
2215c8f9400Sryan_chen #endif
2225c8f9400Sryan_chen 	*p_tx_d = tx_d;
2235c8f9400Sryan_chen 	*p_rx_d = rx_d;
2245c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
2255c8f9400Sryan_chen 	       rx_d, tx_d);
2265c8f9400Sryan_chen }
2275c8f9400Sryan_chen 
get_mac_rmii_delay_1(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)2285c8f9400Sryan_chen static void get_mac_rmii_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
2295c8f9400Sryan_chen {
2305c8f9400Sryan_chen 	mac_delay_1g_t reg;
2315c8f9400Sryan_chen 
2325c8f9400Sryan_chen 	reg.w = readl(addr);
2335c8f9400Sryan_chen 	*p_rx_d = reg.b.rx_delay_1;
2345c8f9400Sryan_chen 	*p_tx_d = reg.b.rmii_tx_data_at_falling_1;
2355c8f9400Sryan_chen 
2365c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
2375c8f9400Sryan_chen 	       *p_rx_d, *p_tx_d);
2385c8f9400Sryan_chen }
get_mac_rmii_delay_2(uint32_t addr,int32_t * p_rx_d,int32_t * p_tx_d)2395c8f9400Sryan_chen static void get_mac_rmii_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d)
2405c8f9400Sryan_chen {
2415c8f9400Sryan_chen 	mac_delay_1g_t reg;
2425c8f9400Sryan_chen 
2435c8f9400Sryan_chen 	reg.w = readl(addr);
2445c8f9400Sryan_chen 	*p_rx_d = reg.b.rx_delay_2;
2455c8f9400Sryan_chen 	*p_tx_d = reg.b.rmii_tx_data_at_falling_2;
2465c8f9400Sryan_chen 
2475c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
2485c8f9400Sryan_chen 	       *p_rx_d, *p_tx_d);
2495c8f9400Sryan_chen }
2505c8f9400Sryan_chen 
2515c8f9400Sryan_chen static
get_mac1_1g_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2525c8f9400Sryan_chen void get_mac1_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2535c8f9400Sryan_chen {
2545c8f9400Sryan_chen 	get_mac_1g_delay_1(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d);
2555c8f9400Sryan_chen }
2565c8f9400Sryan_chen static
get_mac1_100m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2575c8f9400Sryan_chen void get_mac1_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2585c8f9400Sryan_chen {
2595c8f9400Sryan_chen 	get_mac_100_10_delay_1(p_eng->io.mac12_100m_delay.addr, p_rx_d, p_tx_d);
2605c8f9400Sryan_chen }
2615c8f9400Sryan_chen static
get_mac1_10m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2625c8f9400Sryan_chen void get_mac1_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2635c8f9400Sryan_chen {
2645c8f9400Sryan_chen 	get_mac_100_10_delay_1(p_eng->io.mac12_10m_delay.addr, p_rx_d, p_tx_d);
2655c8f9400Sryan_chen }
2665c8f9400Sryan_chen static
get_mac2_1g_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2675c8f9400Sryan_chen void get_mac2_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2685c8f9400Sryan_chen {
2695c8f9400Sryan_chen 	get_mac_1g_delay_2(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d);
2705c8f9400Sryan_chen }
2715c8f9400Sryan_chen static
get_mac2_100m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2725c8f9400Sryan_chen void get_mac2_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2735c8f9400Sryan_chen {
2745c8f9400Sryan_chen 	get_mac_100_10_delay_2(p_eng->io.mac12_100m_delay.addr, p_rx_d, p_tx_d);
2755c8f9400Sryan_chen }
2765c8f9400Sryan_chen static
get_mac2_10m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2775c8f9400Sryan_chen void get_mac2_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2785c8f9400Sryan_chen {
2795c8f9400Sryan_chen 	get_mac_100_10_delay_2(p_eng->io.mac12_10m_delay.addr, p_rx_d, p_tx_d);
2805c8f9400Sryan_chen }
2815c8f9400Sryan_chen static
get_mac3_1g_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2825c8f9400Sryan_chen void get_mac3_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2835c8f9400Sryan_chen {
2845c8f9400Sryan_chen 	get_mac_1g_delay_1(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d);
2855c8f9400Sryan_chen }
2865c8f9400Sryan_chen static
get_mac3_100m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2875c8f9400Sryan_chen void get_mac3_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2885c8f9400Sryan_chen {
2895c8f9400Sryan_chen 	get_mac_100_10_delay_1(p_eng->io.mac34_100m_delay.addr, p_rx_d, p_tx_d);
2905c8f9400Sryan_chen }
2915c8f9400Sryan_chen static
get_mac3_10m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2925c8f9400Sryan_chen void get_mac3_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2935c8f9400Sryan_chen {
2945c8f9400Sryan_chen 	get_mac_100_10_delay_1(p_eng->io.mac34_10m_delay.addr, p_rx_d, p_tx_d);
2955c8f9400Sryan_chen }
2965c8f9400Sryan_chen static
get_mac4_1g_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)2975c8f9400Sryan_chen void get_mac4_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
2985c8f9400Sryan_chen {
2995c8f9400Sryan_chen 	get_mac_1g_delay_2(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d);
3005c8f9400Sryan_chen }
3015c8f9400Sryan_chen static
get_mac4_100m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3025c8f9400Sryan_chen void get_mac4_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3035c8f9400Sryan_chen {
3045c8f9400Sryan_chen 	get_mac_100_10_delay_2(p_eng->io.mac34_100m_delay.addr, p_rx_d, p_tx_d);
3055c8f9400Sryan_chen }
3065c8f9400Sryan_chen static
get_mac4_10m_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3075c8f9400Sryan_chen void get_mac4_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3085c8f9400Sryan_chen {
3095c8f9400Sryan_chen 	get_mac_100_10_delay_2(p_eng->io.mac34_10m_delay.addr, p_rx_d, p_tx_d);
3105c8f9400Sryan_chen }
3115c8f9400Sryan_chen static
get_mac1_rmii_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3125c8f9400Sryan_chen void get_mac1_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3135c8f9400Sryan_chen {
3145c8f9400Sryan_chen 	get_mac_rmii_delay_1(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d);
3155c8f9400Sryan_chen }
3165c8f9400Sryan_chen static
get_mac2_rmii_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3175c8f9400Sryan_chen void get_mac2_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3185c8f9400Sryan_chen {
3195c8f9400Sryan_chen 	get_mac_rmii_delay_2(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d);
3205c8f9400Sryan_chen }
3215c8f9400Sryan_chen static
get_mac3_rmii_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3225c8f9400Sryan_chen void get_mac3_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3235c8f9400Sryan_chen {
3245c8f9400Sryan_chen 	get_mac_rmii_delay_1(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d);
3255c8f9400Sryan_chen }
3265c8f9400Sryan_chen static
get_mac4_rmii_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3275c8f9400Sryan_chen void get_mac4_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3285c8f9400Sryan_chen {
3295c8f9400Sryan_chen 	get_mac_rmii_delay_2(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d);
3305c8f9400Sryan_chen }
3314fad5549SDylan Hung #if !defined(CONFIG_ASPEED_AST2600)
3325c8f9400Sryan_chen static
get_dummy_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3335c8f9400Sryan_chen void get_dummy_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3345c8f9400Sryan_chen {
3355c8f9400Sryan_chen 	debug("%s\n", __func__);
3365c8f9400Sryan_chen }
3374fad5549SDylan Hung #endif
3385c8f9400Sryan_chen 
3395c8f9400Sryan_chen /**
3405c8f9400Sryan_chen  * @brief function pointer table to get current delay setting
3415c8f9400Sryan_chen  *
3425c8f9400Sryan_chen  * get_delay_func_tbl[rmii/rgmii][mac_idx][speed_idx 1g/100m/10m]
3435c8f9400Sryan_chen */
3445c8f9400Sryan_chen typedef void (*pfn_get_delay) (MAC_ENGINE *, int32_t *, int32_t *);
3455c8f9400Sryan_chen pfn_get_delay get_delay_func_tbl[2][4][3] = {
3465c8f9400Sryan_chen 	{
3475c8f9400Sryan_chen 		{get_mac1_rmii_delay, get_mac1_rmii_delay, get_mac1_rmii_delay},
3485c8f9400Sryan_chen 		{get_mac2_rmii_delay, get_mac2_rmii_delay, get_mac2_rmii_delay},
3495c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
3505c8f9400Sryan_chen 		{get_mac3_rmii_delay, get_mac3_rmii_delay, get_mac3_rmii_delay},
3515c8f9400Sryan_chen 		{get_mac4_rmii_delay, get_mac4_rmii_delay, get_mac4_rmii_delay},
3525c8f9400Sryan_chen #else
3535c8f9400Sryan_chen 		{get_dummy_delay, get_dummy_delay, get_dummy_delay},
3545c8f9400Sryan_chen 		{get_dummy_delay, get_dummy_delay, get_dummy_delay},
3555c8f9400Sryan_chen #endif
3565c8f9400Sryan_chen 	},
3575c8f9400Sryan_chen 	{
3585c8f9400Sryan_chen 		{get_mac1_1g_delay, get_mac1_100m_delay, get_mac1_10m_delay},
3595c8f9400Sryan_chen 		{get_mac2_1g_delay, get_mac2_100m_delay, get_mac2_10m_delay},
3605c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
3615c8f9400Sryan_chen 		{get_mac3_1g_delay, get_mac3_100m_delay, get_mac3_10m_delay},
3625c8f9400Sryan_chen 		{get_mac4_1g_delay, get_mac4_100m_delay, get_mac4_10m_delay},
3635c8f9400Sryan_chen #else
3645c8f9400Sryan_chen 		{get_dummy_delay, get_dummy_delay, get_dummy_delay},
3655c8f9400Sryan_chen 		{get_dummy_delay, get_dummy_delay, get_dummy_delay},
3665c8f9400Sryan_chen #endif
3675c8f9400Sryan_chen 	}
3685c8f9400Sryan_chen };
mac_get_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3695c8f9400Sryan_chen void mac_get_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3705c8f9400Sryan_chen {
3715c8f9400Sryan_chen #if 1
3725c8f9400Sryan_chen 	uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii;
3735c8f9400Sryan_chen 	uint32_t mac_idx = p_eng->run.mac_idx;
3745c8f9400Sryan_chen 	uint32_t speed_idx = p_eng->run.speed_idx;
3755c8f9400Sryan_chen 
3765c8f9400Sryan_chen 	get_delay_func_tbl[rgmii][mac_idx][speed_idx] (p_eng, p_rx_d, p_tx_d);
3775c8f9400Sryan_chen #else
3785c8f9400Sryan_chen 	/* for test */
3795c8f9400Sryan_chen 	uint32_t rgmii;
3805c8f9400Sryan_chen 	uint32_t mac_idx;
3815c8f9400Sryan_chen 	uint32_t speed_idx;
3825c8f9400Sryan_chen 	for (rgmii = 0; rgmii < 2; rgmii++)
3835c8f9400Sryan_chen 		for (mac_idx = 0; mac_idx < 4; mac_idx++)
3845c8f9400Sryan_chen 			for (speed_idx = 0; speed_idx < 3; speed_idx++)
3855c8f9400Sryan_chen 				get_delay_func_tbl[rgmii][mac_idx][speed_idx](
3865c8f9400Sryan_chen 				    p_eng, p_rx_d, p_tx_d);
3875c8f9400Sryan_chen #endif
3885c8f9400Sryan_chen }
3895c8f9400Sryan_chen 
mac_get_max_available_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)3905c8f9400Sryan_chen void mac_get_max_available_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
3915c8f9400Sryan_chen {
3925c8f9400Sryan_chen 	uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii;
3935c8f9400Sryan_chen 	uint32_t mac_idx = p_eng->run.mac_idx;
3945c8f9400Sryan_chen 	int32_t tx_max, rx_max;
3955c8f9400Sryan_chen 
3965c8f9400Sryan_chen 	if (rgmii) {
3975c8f9400Sryan_chen 		if (mac_idx > 1) {
3985c8f9400Sryan_chen 			tx_max = p_eng->io.mac34_1g_delay.tx_max;
3995c8f9400Sryan_chen 			rx_max = p_eng->io.mac34_1g_delay.rx_max;
4005c8f9400Sryan_chen 		} else {
4015c8f9400Sryan_chen 			tx_max = p_eng->io.mac12_1g_delay.tx_max;
4025c8f9400Sryan_chen 			rx_max = p_eng->io.mac12_1g_delay.rx_max;
4035c8f9400Sryan_chen 		}
4045c8f9400Sryan_chen 	} else {
4055c8f9400Sryan_chen 		if (mac_idx > 1) {
4065c8f9400Sryan_chen 			tx_max = p_eng->io.mac34_1g_delay.rmii_tx_max;
4075c8f9400Sryan_chen 			rx_max = p_eng->io.mac34_1g_delay.rmii_rx_max;
4085c8f9400Sryan_chen 		} else {
4095c8f9400Sryan_chen 			tx_max = p_eng->io.mac12_1g_delay.rmii_tx_max;
4105c8f9400Sryan_chen 			rx_max = p_eng->io.mac12_1g_delay.rmii_rx_max;
4115c8f9400Sryan_chen 		}
4125c8f9400Sryan_chen 	}
4135c8f9400Sryan_chen 	*p_tx_d = tx_max;
4145c8f9400Sryan_chen 	*p_rx_d = rx_max;
4155c8f9400Sryan_chen }
4165c8f9400Sryan_chen 
mac_get_min_available_delay(MAC_ENGINE * p_eng,int32_t * p_rx_d,int32_t * p_tx_d)4175c8f9400Sryan_chen void mac_get_min_available_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d)
4185c8f9400Sryan_chen {
4195c8f9400Sryan_chen 	uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii;
4205c8f9400Sryan_chen 	uint32_t mac_idx = p_eng->run.mac_idx;
4215c8f9400Sryan_chen 	int32_t tx_min, rx_min;
4225c8f9400Sryan_chen 
4235c8f9400Sryan_chen 	if (rgmii) {
4245c8f9400Sryan_chen 		if (mac_idx > 1) {
4255c8f9400Sryan_chen 			tx_min = p_eng->io.mac34_1g_delay.tx_min;
4265c8f9400Sryan_chen 			rx_min = p_eng->io.mac34_1g_delay.rx_min;
4275c8f9400Sryan_chen 		} else {
4285c8f9400Sryan_chen 			tx_min = p_eng->io.mac12_1g_delay.tx_min;
4295c8f9400Sryan_chen 			rx_min = p_eng->io.mac12_1g_delay.rx_min;
4305c8f9400Sryan_chen 		}
4315c8f9400Sryan_chen 	} else {
4325c8f9400Sryan_chen 		if (mac_idx > 1) {
4335c8f9400Sryan_chen 			tx_min = p_eng->io.mac34_1g_delay.rmii_tx_min;
4345c8f9400Sryan_chen 			rx_min = p_eng->io.mac34_1g_delay.rmii_rx_min;
4355c8f9400Sryan_chen 		} else {
4365c8f9400Sryan_chen 			tx_min = p_eng->io.mac12_1g_delay.rmii_tx_min;
4375c8f9400Sryan_chen 			rx_min = p_eng->io.mac12_1g_delay.rmii_rx_min;
4385c8f9400Sryan_chen 		}
4395c8f9400Sryan_chen 	}
4405c8f9400Sryan_chen 	*p_tx_d = tx_min;
4415c8f9400Sryan_chen 	*p_rx_d = rx_min;
4425c8f9400Sryan_chen }
4435c8f9400Sryan_chen 
set_mac_1g_delay_1(uint32_t addr,int32_t rx_d,int32_t tx_d)4445c8f9400Sryan_chen static void set_mac_1g_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d)
4455c8f9400Sryan_chen {
4465c8f9400Sryan_chen 	mac_delay_1g_t reg;
4475c8f9400Sryan_chen 
4485c8f9400Sryan_chen 	reg.w = readl(addr);
4495c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
4505c8f9400Sryan_chen 	if (rx_d < 0) {
4515c8f9400Sryan_chen 		reg.b.rx_clk_inv_1 = 1;
4525c8f9400Sryan_chen 		rx_d = abs(rx_d);
4535c8f9400Sryan_chen 	}
4545c8f9400Sryan_chen #endif
4555c8f9400Sryan_chen 	reg.b.rx_delay_1 = rx_d;
4565c8f9400Sryan_chen 	reg.b.tx_delay_1 = tx_d;
4575c8f9400Sryan_chen 	writel(reg.w, addr);
4585c8f9400Sryan_chen 
4595c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
4605c8f9400Sryan_chen 	       rx_d, tx_d);
4615c8f9400Sryan_chen }
4625c8f9400Sryan_chen 
set_mac_1g_delay_2(uint32_t addr,int32_t rx_d,int32_t tx_d)4635c8f9400Sryan_chen static void set_mac_1g_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d)
4645c8f9400Sryan_chen {
4655c8f9400Sryan_chen 	mac_delay_1g_t reg;
4665c8f9400Sryan_chen 
4675c8f9400Sryan_chen 	reg.w = readl(addr);
4685c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
4695c8f9400Sryan_chen 	if (rx_d < 0) {
4705c8f9400Sryan_chen 		reg.b.rx_clk_inv_2 = 1;
4715c8f9400Sryan_chen 		rx_d = abs(rx_d);
4725c8f9400Sryan_chen 	}
4735c8f9400Sryan_chen #endif
4745c8f9400Sryan_chen 	reg.b.rx_delay_2 = rx_d;
4755c8f9400Sryan_chen 	reg.b.tx_delay_2 = tx_d;
4765c8f9400Sryan_chen 	writel(reg.w, addr);
4775c8f9400Sryan_chen 
4785c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
4795c8f9400Sryan_chen 	       rx_d, tx_d);
4805c8f9400Sryan_chen }
4815c8f9400Sryan_chen 
set_mac_100_10_delay_1(uint32_t addr,int32_t rx_d,int32_t tx_d)4825c8f9400Sryan_chen static void set_mac_100_10_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d)
4835c8f9400Sryan_chen {
4845c8f9400Sryan_chen 	mac_delay_100_10_t reg;
4855c8f9400Sryan_chen 
4865c8f9400Sryan_chen 	reg.w = readl(addr);
4875c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
4885c8f9400Sryan_chen 	if (rx_d < 0) {
4895c8f9400Sryan_chen 		reg.b.rx_clk_inv_1 = 1;
4905c8f9400Sryan_chen 		rx_d = abs(rx_d);
4915c8f9400Sryan_chen 	}
4925c8f9400Sryan_chen #endif
4935c8f9400Sryan_chen 	reg.b.rx_delay_1 = rx_d;
4945c8f9400Sryan_chen 	reg.b.tx_delay_1 = tx_d;
4955c8f9400Sryan_chen 	writel(reg.w, addr);
4965c8f9400Sryan_chen 
4975c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
4985c8f9400Sryan_chen 	       rx_d, tx_d);
4995c8f9400Sryan_chen }
5005c8f9400Sryan_chen 
set_mac_100_10_delay_2(uint32_t addr,int32_t rx_d,int32_t tx_d)5015c8f9400Sryan_chen static void set_mac_100_10_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d)
5025c8f9400Sryan_chen {
5035c8f9400Sryan_chen 	mac_delay_100_10_t reg;
5045c8f9400Sryan_chen 
5055c8f9400Sryan_chen 	reg.w = readl(addr);
5065c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
5075c8f9400Sryan_chen 	if (rx_d < 0) {
5085c8f9400Sryan_chen 		reg.b.rx_clk_inv_2 = 1;
5095c8f9400Sryan_chen 		rx_d = abs(rx_d);
5105c8f9400Sryan_chen 	}
5115c8f9400Sryan_chen #endif
5125c8f9400Sryan_chen 	reg.b.rx_delay_2 = rx_d;
5135c8f9400Sryan_chen 	reg.b.tx_delay_2 = tx_d;
5145c8f9400Sryan_chen 	writel(reg.w, addr);
5155c8f9400Sryan_chen 
5165c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
5175c8f9400Sryan_chen 	       rx_d, tx_d);
5185c8f9400Sryan_chen }
5195c8f9400Sryan_chen 
set_mac_rmii_delay_1(uint32_t addr,int32_t rx_d,int32_t tx_d)5205c8f9400Sryan_chen static void set_mac_rmii_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d)
5215c8f9400Sryan_chen {
5225c8f9400Sryan_chen 	mac_delay_1g_t reg;
5235c8f9400Sryan_chen 
5245c8f9400Sryan_chen 	reg.w = readl(addr);
5255c8f9400Sryan_chen 	reg.b.rmii_tx_data_at_falling_1 = tx_d;
5265c8f9400Sryan_chen 	reg.b.rx_delay_1 = rx_d;
5275c8f9400Sryan_chen 	writel(reg.w, addr);
5285c8f9400Sryan_chen 
5295c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
5305c8f9400Sryan_chen 	       rx_d, tx_d);
5315c8f9400Sryan_chen }
5325c8f9400Sryan_chen 
set_mac_rmii_delay_2(uint32_t addr,int32_t rx_d,int32_t tx_d)5335c8f9400Sryan_chen static void set_mac_rmii_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d)
5345c8f9400Sryan_chen {
5355c8f9400Sryan_chen 	mac_delay_1g_t reg;
5365c8f9400Sryan_chen 
5375c8f9400Sryan_chen 	reg.w = readl(addr);
5385c8f9400Sryan_chen 	reg.b.rmii_tx_data_at_falling_2 = tx_d;
5395c8f9400Sryan_chen 	reg.b.rx_delay_2 = rx_d;
5405c8f9400Sryan_chen 	writel(reg.w, addr);
5415c8f9400Sryan_chen 
5425c8f9400Sryan_chen 	debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w,
5435c8f9400Sryan_chen 	       rx_d, tx_d);
5445c8f9400Sryan_chen }
5455c8f9400Sryan_chen 
5465c8f9400Sryan_chen 
set_mac1_1g_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5475c8f9400Sryan_chen static void set_mac1_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5485c8f9400Sryan_chen {
5495c8f9400Sryan_chen 	set_mac_1g_delay_1(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d);
5505c8f9400Sryan_chen }
set_mac1_100m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5515c8f9400Sryan_chen static void set_mac1_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5525c8f9400Sryan_chen {
5535c8f9400Sryan_chen 	set_mac_100_10_delay_1(p_eng->io.mac12_100m_delay.addr, rx_d, tx_d);
5545c8f9400Sryan_chen }
set_mac1_10m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5555c8f9400Sryan_chen static void set_mac1_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5565c8f9400Sryan_chen {
5575c8f9400Sryan_chen 	set_mac_100_10_delay_1(p_eng->io.mac12_10m_delay.addr, rx_d, tx_d);
5585c8f9400Sryan_chen }
set_mac2_1g_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5595c8f9400Sryan_chen static void set_mac2_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5605c8f9400Sryan_chen {
5615c8f9400Sryan_chen 	set_mac_1g_delay_2(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d);
5625c8f9400Sryan_chen }
set_mac2_100m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5635c8f9400Sryan_chen static void set_mac2_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5645c8f9400Sryan_chen {
5655c8f9400Sryan_chen 	set_mac_100_10_delay_2(p_eng->io.mac12_100m_delay.addr, rx_d, tx_d);
5665c8f9400Sryan_chen }
set_mac2_10m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5675c8f9400Sryan_chen static void set_mac2_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5685c8f9400Sryan_chen {
5695c8f9400Sryan_chen 	set_mac_100_10_delay_2(p_eng->io.mac12_10m_delay.addr, rx_d, tx_d);
5705c8f9400Sryan_chen }
set_mac3_1g_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5715c8f9400Sryan_chen static void set_mac3_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5725c8f9400Sryan_chen {
5735c8f9400Sryan_chen 	set_mac_1g_delay_1(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d);
5745c8f9400Sryan_chen }
set_mac3_100m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5755c8f9400Sryan_chen static void set_mac3_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5765c8f9400Sryan_chen {
5775c8f9400Sryan_chen 	set_mac_100_10_delay_1(p_eng->io.mac34_100m_delay.addr, rx_d, tx_d);
5785c8f9400Sryan_chen }
set_mac3_10m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5795c8f9400Sryan_chen static void set_mac3_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5805c8f9400Sryan_chen {
5815c8f9400Sryan_chen 	set_mac_100_10_delay_1(p_eng->io.mac34_10m_delay.addr, rx_d, tx_d);
5825c8f9400Sryan_chen }
set_mac4_1g_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5835c8f9400Sryan_chen static void set_mac4_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5845c8f9400Sryan_chen {
5855c8f9400Sryan_chen 	set_mac_1g_delay_2(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d);
5865c8f9400Sryan_chen }
set_mac4_100m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5875c8f9400Sryan_chen static void set_mac4_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5885c8f9400Sryan_chen {
5895c8f9400Sryan_chen 	set_mac_100_10_delay_2(p_eng->io.mac34_100m_delay.addr, rx_d, tx_d);
5905c8f9400Sryan_chen }
set_mac4_10m_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5915c8f9400Sryan_chen static void set_mac4_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5925c8f9400Sryan_chen {
5935c8f9400Sryan_chen 	set_mac_100_10_delay_2(p_eng->io.mac34_10m_delay.addr, rx_d, tx_d);
5945c8f9400Sryan_chen }
set_mac1_rmii_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5955c8f9400Sryan_chen static void set_mac1_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
5965c8f9400Sryan_chen {
5975c8f9400Sryan_chen 	set_mac_rmii_delay_1(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d);
5985c8f9400Sryan_chen }
set_mac2_rmii_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)5995c8f9400Sryan_chen static void set_mac2_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
6005c8f9400Sryan_chen {
6015c8f9400Sryan_chen 	set_mac_rmii_delay_2(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d);
6025c8f9400Sryan_chen }
6035c8f9400Sryan_chen 
set_mac3_rmii_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)6045c8f9400Sryan_chen static void set_mac3_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
6055c8f9400Sryan_chen {
6065c8f9400Sryan_chen 	set_mac_rmii_delay_1(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d);
6075c8f9400Sryan_chen }
6085c8f9400Sryan_chen 
set_mac4_rmii_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)6095c8f9400Sryan_chen static void set_mac4_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
6105c8f9400Sryan_chen {
6115c8f9400Sryan_chen 	set_mac_rmii_delay_2(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d);
6125c8f9400Sryan_chen }
6135c8f9400Sryan_chen 
set_dummy_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)6145c8f9400Sryan_chen void set_dummy_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
6155c8f9400Sryan_chen {
6165c8f9400Sryan_chen 	printf("%s: %d, %d\n", __func__, rx_d, tx_d);
6175c8f9400Sryan_chen }
6185c8f9400Sryan_chen 
6195c8f9400Sryan_chen /**
6205c8f9400Sryan_chen  * @brief function pointer table for delay setting
6215c8f9400Sryan_chen  *
6225c8f9400Sryan_chen  * set_delay_func_tbl[rmii/rgmii][mac_idx][speed_idx 1g/100m/10m]
6235c8f9400Sryan_chen */
6245c8f9400Sryan_chen typedef void (*pfn_set_delay) (MAC_ENGINE *, int32_t, int32_t);
6255c8f9400Sryan_chen pfn_set_delay set_delay_func_tbl[2][4][3] = {
6265c8f9400Sryan_chen 	{
6275c8f9400Sryan_chen 		{set_mac1_rmii_delay, set_mac1_rmii_delay, set_mac1_rmii_delay},
6285c8f9400Sryan_chen 		{set_mac2_rmii_delay, set_mac2_rmii_delay, set_mac2_rmii_delay},
6295c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
6305c8f9400Sryan_chen 		{set_mac3_rmii_delay, set_mac3_rmii_delay, set_mac3_rmii_delay},
6315c8f9400Sryan_chen 		{set_mac4_rmii_delay, set_mac4_rmii_delay, set_mac4_rmii_delay},
6325c8f9400Sryan_chen #else
6335c8f9400Sryan_chen 		{set_dummy_delay, set_dummy_delay, set_dummy_delay},
6345c8f9400Sryan_chen 		{set_dummy_delay, set_dummy_delay, set_dummy_delay},
6355c8f9400Sryan_chen #endif
6365c8f9400Sryan_chen 	},
6375c8f9400Sryan_chen 	{
6385c8f9400Sryan_chen 		{set_mac1_1g_delay, set_mac1_100m_delay, set_mac1_10m_delay},
6395c8f9400Sryan_chen 		{set_mac2_1g_delay, set_mac2_100m_delay, set_mac2_10m_delay},
6405c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
6415c8f9400Sryan_chen 		{set_mac3_1g_delay, set_mac3_100m_delay, set_mac3_10m_delay},
6425c8f9400Sryan_chen 		{set_mac4_1g_delay, set_mac4_100m_delay, set_mac4_10m_delay},
6435c8f9400Sryan_chen #else
6445c8f9400Sryan_chen 		{set_dummy_delay, set_dummy_delay, set_dummy_delay},
6455c8f9400Sryan_chen 		{set_dummy_delay, set_dummy_delay, set_dummy_delay},
6465c8f9400Sryan_chen #endif
6475c8f9400Sryan_chen 	}
6485c8f9400Sryan_chen };
6495c8f9400Sryan_chen 
mac_set_delay(MAC_ENGINE * p_eng,int32_t rx_d,int32_t tx_d)6505c8f9400Sryan_chen void mac_set_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d)
6515c8f9400Sryan_chen {
6525c8f9400Sryan_chen 	uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii;
6535c8f9400Sryan_chen 	uint32_t mac_idx = p_eng->run.mac_idx;
6546c473e55SDylan Hung 	u32 speed_idx = p_eng->run.speed_idx;
6555c8f9400Sryan_chen 
6565c8f9400Sryan_chen 	set_delay_func_tbl[rgmii][mac_idx][speed_idx] (p_eng, rx_d, tx_d);
6575c8f9400Sryan_chen }
6585c8f9400Sryan_chen 
mac_get_driving_strength(MAC_ENGINE * p_eng)6595c8f9400Sryan_chen uint32_t mac_get_driving_strength(MAC_ENGINE *p_eng)
6605c8f9400Sryan_chen {
6615c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
6625c8f9400Sryan_chen 	mac34_drv_t reg;
6635c8f9400Sryan_chen 
6645c8f9400Sryan_chen 	reg.w = readl(p_eng->io.mac34_drv_reg.addr);
6655c8f9400Sryan_chen 	/* ast2600 : only MAC#3 & MAC#4 have driving strength setting */
6665c8f9400Sryan_chen 	if (p_eng->run.mac_idx == 2) {
6675c8f9400Sryan_chen 		return (reg.b.mac3_tx_drv);
6685c8f9400Sryan_chen 	} else if (p_eng->run.mac_idx == 3) {
6695c8f9400Sryan_chen 		return (reg.b.mac4_tx_drv);
6705c8f9400Sryan_chen 	} else {
6715c8f9400Sryan_chen 		return 0;
6725c8f9400Sryan_chen 	}
6735c8f9400Sryan_chen #else
6745c8f9400Sryan_chen 	mac12_drv_t reg;
6755c8f9400Sryan_chen 
6765c8f9400Sryan_chen 	reg.w = readl(p_eng->io.mac12_drv_reg.addr);
6775c8f9400Sryan_chen 
6785c8f9400Sryan_chen 	if (p_eng->run.mac_idx == 0) {
6796c473e55SDylan Hung 		return reg.b.mac1_rgmii_tx_drv;
6805c8f9400Sryan_chen 	} else if (p_eng->run.mac_idx == 1) {
6816c473e55SDylan Hung 		return reg.b.mac2_rgmii_tx_drv;
6825c8f9400Sryan_chen 	} else {
6835c8f9400Sryan_chen 		return 0;
6845c8f9400Sryan_chen 	}
6855c8f9400Sryan_chen #endif
6865c8f9400Sryan_chen }
mac_set_driving_strength(MAC_ENGINE * p_eng,uint32_t strength)6875c8f9400Sryan_chen void mac_set_driving_strength(MAC_ENGINE *p_eng, uint32_t strength)
6885c8f9400Sryan_chen {
6895c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
6905c8f9400Sryan_chen 	mac34_drv_t reg;
6915c8f9400Sryan_chen 
6925c8f9400Sryan_chen 	if (strength > p_eng->io.mac34_drv_reg.drv_max) {
6935c8f9400Sryan_chen 		printf("invalid driving strength value\n");
6945c8f9400Sryan_chen 		return;
6955c8f9400Sryan_chen 	}
6965c8f9400Sryan_chen 
6975c8f9400Sryan_chen 	/**
6985c8f9400Sryan_chen 	 * read->modify->write for driving strength control register
6995c8f9400Sryan_chen 	 * ast2600 : only MAC#3 & MAC#4 have driving strength setting
7005c8f9400Sryan_chen 	 */
7015c8f9400Sryan_chen 	reg.w = readl(p_eng->io.mac34_drv_reg.addr);
7025c8f9400Sryan_chen 
7035c8f9400Sryan_chen 	/* ast2600 : only MAC#3 & MAC#4 have driving strength setting */
7045c8f9400Sryan_chen 	if (p_eng->run.mac_idx == 2) {
7055c8f9400Sryan_chen 		reg.b.mac3_tx_drv = strength;
7065c8f9400Sryan_chen 	} else if (p_eng->run.mac_idx == 3) {
7075c8f9400Sryan_chen 		reg.b.mac4_tx_drv = strength;
7085c8f9400Sryan_chen 	}
7095c8f9400Sryan_chen 
7105c8f9400Sryan_chen 	writel(reg.w, p_eng->io.mac34_drv_reg.addr);
7115c8f9400Sryan_chen #else
7125c8f9400Sryan_chen 	mac12_drv_t reg;
7135c8f9400Sryan_chen 
7145c8f9400Sryan_chen 	if (strength > p_eng->io.mac12_drv_reg.drv_max) {
7155c8f9400Sryan_chen 		printf("invalid driving strength value\n");
7165c8f9400Sryan_chen 		return;
7175c8f9400Sryan_chen 	}
7185c8f9400Sryan_chen 
7195c8f9400Sryan_chen 	/* read->modify->write for driving strength control register */
7205c8f9400Sryan_chen 	reg.w = readl(p_eng->io.mac12_drv_reg.addr);
7215c8f9400Sryan_chen 	if (p_eng->run.is_rgmii) {
7225c8f9400Sryan_chen 		if (p_eng->run.mac_idx == 0) {
7235c8f9400Sryan_chen 			reg.b.mac1_rgmii_tx_drv =
7245c8f9400Sryan_chen 			    strength;
7255c8f9400Sryan_chen 		} else if (p_eng->run.mac_idx == 2) {
7265c8f9400Sryan_chen 			reg.b.mac2_rgmii_tx_drv =
7275c8f9400Sryan_chen 			    strength;
7285c8f9400Sryan_chen 		}
7295c8f9400Sryan_chen 	} else {
7305c8f9400Sryan_chen 		if (p_eng->run.mac_idx == 0) {
7315c8f9400Sryan_chen 			reg.b.mac1_rmii_tx_drv =
7325c8f9400Sryan_chen 			    strength;
7335c8f9400Sryan_chen 		} else if (p_eng->run.mac_idx == 1) {
7345c8f9400Sryan_chen 			reg.b.mac2_rmii_tx_drv =
7355c8f9400Sryan_chen 			    strength;
7365c8f9400Sryan_chen 		}
7375c8f9400Sryan_chen 	}
7385c8f9400Sryan_chen 	writel(reg.w, p_eng->io.mac12_drv_reg.addr);
7395c8f9400Sryan_chen #endif
7405c8f9400Sryan_chen }
7415c8f9400Sryan_chen 
mac_set_rmii_50m_output_enable(MAC_ENGINE * p_eng)7425c8f9400Sryan_chen void mac_set_rmii_50m_output_enable(MAC_ENGINE *p_eng)
7435c8f9400Sryan_chen {
7445c8f9400Sryan_chen 	uint32_t addr;
7455c8f9400Sryan_chen 	mac_delay_1g_t value;
7465c8f9400Sryan_chen 
7475c8f9400Sryan_chen 	if (p_eng->run.mac_idx > 1) {
7485c8f9400Sryan_chen 		addr = p_eng->io.mac34_1g_delay.addr;
7495c8f9400Sryan_chen 	} else {
7505c8f9400Sryan_chen 		addr = p_eng->io.mac12_1g_delay.addr;
7515c8f9400Sryan_chen 	}
7525c8f9400Sryan_chen 
7535c8f9400Sryan_chen 	value.w = readl(addr);
7545c8f9400Sryan_chen 	if (p_eng->run.mac_idx & BIT(0)) {
7555c8f9400Sryan_chen 		value.b.rmii_50m_oe_2 = 1;
7565c8f9400Sryan_chen 	} else {
7575c8f9400Sryan_chen 		value.b.rmii_50m_oe_1 = 1;
7585c8f9400Sryan_chen 	}
7595c8f9400Sryan_chen 	writel(value.w, addr);
7605c8f9400Sryan_chen }
7615c8f9400Sryan_chen 
7625c8f9400Sryan_chen //------------------------------------------------------------
mac_set_scan_boundary(MAC_ENGINE * p_eng)7635c8f9400Sryan_chen int mac_set_scan_boundary(MAC_ENGINE *p_eng)
7645c8f9400Sryan_chen {
7655c8f9400Sryan_chen 	int32_t rx_cur, tx_cur;
7665c8f9400Sryan_chen 	int32_t rx_min, rx_max, tx_min, tx_max;
7675c8f9400Sryan_chen 	int32_t rx_scaling, tx_scaling;
7685c8f9400Sryan_chen 
7695c8f9400Sryan_chen 	nt_log_func_name();
7705c8f9400Sryan_chen 
7715c8f9400Sryan_chen 	/* get current delay setting */
7725c8f9400Sryan_chen 	mac_get_delay(p_eng, &rx_cur, &tx_cur);
7735c8f9400Sryan_chen 
7745c8f9400Sryan_chen 	/* get physical boundaries */
7755c8f9400Sryan_chen 	mac_get_max_available_delay(p_eng, &rx_max, &tx_max);
7765c8f9400Sryan_chen 	mac_get_min_available_delay(p_eng, &rx_min, &tx_min);
7775c8f9400Sryan_chen 
7785c8f9400Sryan_chen 	if ((p_eng->run.is_rgmii) && (p_eng->arg.ctrl.b.inv_rgmii_rxclk)) {
7795c8f9400Sryan_chen 		rx_max = (rx_max > 0) ? 0 : rx_max;
7805c8f9400Sryan_chen 	} else {
7815c8f9400Sryan_chen 		rx_min = (rx_min < 0) ? 0 : rx_min;
7825c8f9400Sryan_chen 	}
7835c8f9400Sryan_chen 
7845c8f9400Sryan_chen 	if (p_eng->run.TM_IOTiming) {
7855c8f9400Sryan_chen 		if (p_eng->arg.ctrl.b.full_range) {
7865c8f9400Sryan_chen 			tx_scaling = 0;
7875c8f9400Sryan_chen 			rx_scaling = 0;
7885c8f9400Sryan_chen 		} else {
7895c8f9400Sryan_chen 			/* down-scaling to save test time */
7905c8f9400Sryan_chen 			tx_scaling = TX_DELAY_SCALING;
7915c8f9400Sryan_chen 			rx_scaling = RX_DELAY_SCALING;
7925c8f9400Sryan_chen 		}
7935c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.step = 1;
7945c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.step = 1;
7955c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.begin = rx_min >> rx_scaling;
7965c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.end = rx_max >> rx_scaling;
7975c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.begin = tx_min >> tx_scaling;
7985c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.end = tx_max >> tx_scaling;
7995c8f9400Sryan_chen 	} else if (p_eng->run.delay_margin) {
8005c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.step = 1;
8015c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.step = 1;
8025c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.begin = rx_cur - p_eng->run.delay_margin;
8035c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.end = rx_cur + p_eng->run.delay_margin;
8045c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.begin = tx_cur - p_eng->run.delay_margin;
8055c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.end = tx_cur + p_eng->run.delay_margin;
8065c8f9400Sryan_chen 	} else {
8075c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.step = 1;
8085c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.step = 1;
8095c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.begin = 0;
8105c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.end = 0;
8115c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.begin = 0;
8125c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.end = 0;
8135c8f9400Sryan_chen 	}
8145c8f9400Sryan_chen 
8155c8f9400Sryan_chen 	/* backup current setting as the original for plotting result */
8165c8f9400Sryan_chen 	p_eng->io.rx_delay_scan.orig = rx_cur;
8175c8f9400Sryan_chen 	p_eng->io.tx_delay_scan.orig = tx_cur;
8185c8f9400Sryan_chen 
8195c8f9400Sryan_chen 	/* check if setting is legal or not */
8205c8f9400Sryan_chen 	if (p_eng->io.rx_delay_scan.begin < rx_min)
8215c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.begin = rx_min;
8225c8f9400Sryan_chen 
8235c8f9400Sryan_chen 	if (p_eng->io.tx_delay_scan.begin < tx_min)
8245c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.begin = tx_min;
8255c8f9400Sryan_chen 
8265c8f9400Sryan_chen 	if (p_eng->io.rx_delay_scan.end > rx_max)
8275c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.end = rx_max;
8285c8f9400Sryan_chen 
8295c8f9400Sryan_chen 	if (p_eng->io.tx_delay_scan.end > tx_max)
8305c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.end = tx_max;
8315c8f9400Sryan_chen 
8325c8f9400Sryan_chen 	if (p_eng->io.rx_delay_scan.begin > p_eng->io.rx_delay_scan.end)
8335c8f9400Sryan_chen 		p_eng->io.rx_delay_scan.begin = p_eng->io.rx_delay_scan.end;
8345c8f9400Sryan_chen 
8355c8f9400Sryan_chen 	if (p_eng->io.tx_delay_scan.begin > p_eng->io.tx_delay_scan.end)
8365c8f9400Sryan_chen 		p_eng->io.tx_delay_scan.begin = p_eng->io.tx_delay_scan.end;
8375c8f9400Sryan_chen 
8385c8f9400Sryan_chen 	if (p_eng->run.IO_MrgChk) {
8395c8f9400Sryan_chen 		if ((p_eng->io.rx_delay_scan.orig <
8405c8f9400Sryan_chen 		     p_eng->io.rx_delay_scan.begin) ||
8415c8f9400Sryan_chen 		    (p_eng->io.rx_delay_scan.orig >
8425c8f9400Sryan_chen 		     p_eng->io.rx_delay_scan.end)) {
8435c8f9400Sryan_chen 			printf("Warning: current delay is not in the "
8445c8f9400Sryan_chen 			       "scan-range\n");
8455c8f9400Sryan_chen 			printf("RX delay scan range:%d ~ %d, curr:%d\n",
8465c8f9400Sryan_chen 			       p_eng->io.rx_delay_scan.begin,
8475c8f9400Sryan_chen 			       p_eng->io.rx_delay_scan.end,
8485c8f9400Sryan_chen 			       p_eng->io.rx_delay_scan.orig);
8495c8f9400Sryan_chen 			printf("TX delay scan range:%d ~ %d, curr:%d\n",
8505c8f9400Sryan_chen 			       p_eng->io.tx_delay_scan.begin,
8515c8f9400Sryan_chen 			       p_eng->io.tx_delay_scan.end,
8525c8f9400Sryan_chen 			       p_eng->io.tx_delay_scan.orig);
8535c8f9400Sryan_chen 		}
8545c8f9400Sryan_chen 	}
8555c8f9400Sryan_chen 
8565c8f9400Sryan_chen 	return (0);
8575c8f9400Sryan_chen }
8585c8f9400Sryan_chen 
8595c8f9400Sryan_chen //------------------------------------------------------------
8605c8f9400Sryan_chen // MAC
8615c8f9400Sryan_chen //------------------------------------------------------------
mac_set_addr(MAC_ENGINE * p_eng)8625c8f9400Sryan_chen void mac_set_addr(MAC_ENGINE *p_eng)
8635c8f9400Sryan_chen {
8645c8f9400Sryan_chen 	nt_log_func_name();
8655c8f9400Sryan_chen 
8665c8f9400Sryan_chen 	uint32_t madr = p_eng->reg.mac_madr;
8675c8f9400Sryan_chen 	uint32_t ladr = p_eng->reg.mac_ladr;
8685c8f9400Sryan_chen 
8695c8f9400Sryan_chen 	if (((madr == 0x0000) && (ladr == 0x00000000)) ||
8705c8f9400Sryan_chen 	    ((madr == 0xffff) && (ladr == 0xffffffff))) {
8715c8f9400Sryan_chen 		/* FIXME: shall use random gen */
8725c8f9400Sryan_chen 		madr = 0x0000000a;
8735c8f9400Sryan_chen 		ladr = 0xf7837dd4;
8745c8f9400Sryan_chen 	}
8755c8f9400Sryan_chen 
8765c8f9400Sryan_chen 	p_eng->inf.SA[0] = (madr >> 8) & 0xff; // MSB
8775c8f9400Sryan_chen 	p_eng->inf.SA[1] = (madr >> 0) & 0xff;
8785c8f9400Sryan_chen 	p_eng->inf.SA[2] = (ladr >> 24) & 0xff;
8795c8f9400Sryan_chen 	p_eng->inf.SA[3] = (ladr >> 16) & 0xff;
8805c8f9400Sryan_chen 	p_eng->inf.SA[4] = (ladr >> 8) & 0xff;
8815c8f9400Sryan_chen 	p_eng->inf.SA[5] = (ladr >> 0) & 0xff; // LSB
882dde36621SDylan Hung 
8838b605555SDylan Hung 	printf("mac address: ");
8848b605555SDylan Hung 	for (int i = 0; i < 6; i++) {
8858b605555SDylan Hung 		printf("%02x:", p_eng->inf.SA[i]);
8868b605555SDylan Hung 	}
8878b605555SDylan Hung 	printf("\n");
8885c8f9400Sryan_chen }
8895c8f9400Sryan_chen 
mac_set_interal_loopback(MAC_ENGINE * p_eng)8905c8f9400Sryan_chen void mac_set_interal_loopback(MAC_ENGINE *p_eng)
8915c8f9400Sryan_chen {
8925c8f9400Sryan_chen 	uint32_t reg = mac_reg_read(p_eng, 0x40);
8935c8f9400Sryan_chen 	mac_reg_write(p_eng, 0x40, reg | BIT(30));
8945c8f9400Sryan_chen }
8955c8f9400Sryan_chen 
8965c8f9400Sryan_chen //------------------------------------------------------------
init_mac(MAC_ENGINE * eng)8975c8f9400Sryan_chen void init_mac (MAC_ENGINE *eng)
8985c8f9400Sryan_chen {
8995c8f9400Sryan_chen 	nt_log_func_name();
9005c8f9400Sryan_chen 
9015c8f9400Sryan_chen 	mac_cr_t maccr;
9025c8f9400Sryan_chen 
9035c8f9400Sryan_chen #ifdef Enable_MAC_SWRst
9045c8f9400Sryan_chen 	maccr.w = 0;
9055c8f9400Sryan_chen 	maccr.b.sw_rst = 1;
9065c8f9400Sryan_chen 	mac_reg_write(eng, 0x50, maccr.w);
9075c8f9400Sryan_chen 
9085c8f9400Sryan_chen 	do {
9095c8f9400Sryan_chen 		DELAY(Delay_MACRst);
9105c8f9400Sryan_chen 		maccr.w = mac_reg_read(eng, 0x50);
9115c8f9400Sryan_chen 	} while(maccr.b.sw_rst);
9125c8f9400Sryan_chen #endif
9135c8f9400Sryan_chen 
9145c8f9400Sryan_chen 	mac_reg_write(eng, 0x20, eng->run.tdes_base - ASPEED_DRAM_BASE);
9155c8f9400Sryan_chen 	mac_reg_write(eng, 0x24, eng->run.rdes_base - ASPEED_DRAM_BASE);
9165c8f9400Sryan_chen 
9175c8f9400Sryan_chen 	mac_reg_write(eng, 0x08, eng->reg.mac_madr);
9185c8f9400Sryan_chen 	mac_reg_write(eng, 0x0c, eng->reg.mac_ladr);
9195c8f9400Sryan_chen 
9205c8f9400Sryan_chen #ifdef MAC_030_def
9215c8f9400Sryan_chen 	mac_reg_write( eng, 0x30, MAC_030_def );//Int Thr/Cnt
9225c8f9400Sryan_chen #endif
9235c8f9400Sryan_chen #ifdef MAC_034_def
9245c8f9400Sryan_chen 	mac_reg_write( eng, 0x34, MAC_034_def );//Poll Cnt
9255c8f9400Sryan_chen #endif
9265c8f9400Sryan_chen #ifdef MAC_038_def
9275c8f9400Sryan_chen 	mac_reg_write( eng, 0x38, MAC_038_def );
9285c8f9400Sryan_chen #endif
9295c8f9400Sryan_chen #ifdef MAC_048_def
9305c8f9400Sryan_chen 	mac_reg_write( eng, 0x48, MAC_048_def );
9315c8f9400Sryan_chen #endif
9325c8f9400Sryan_chen #ifdef MAC_058_def
9335c8f9400Sryan_chen 	mac_reg_write( eng, 0x58, MAC_058_def );
9345c8f9400Sryan_chen #endif
9355c8f9400Sryan_chen 
9365c8f9400Sryan_chen 	if ( eng->arg.run_mode == MODE_NCSI )
9375c8f9400Sryan_chen 		mac_reg_write( eng, 0x4c, NCSI_RxDMA_PakSize );
9385c8f9400Sryan_chen 	else
9395c8f9400Sryan_chen 		mac_reg_write( eng, 0x4c, DMA_PakSize );
9405c8f9400Sryan_chen 
9415c8f9400Sryan_chen 	maccr.b.txdma_en = 1;
9425c8f9400Sryan_chen 	maccr.b.rxdma_en = 1;
9435c8f9400Sryan_chen 	maccr.b.txmac_en = 1;
9445c8f9400Sryan_chen 	maccr.b.rxmac_en = 1;
9455c8f9400Sryan_chen 	maccr.b.fulldup = 1;
9465c8f9400Sryan_chen 	maccr.b.crc_apd = 1;
9475c8f9400Sryan_chen 
9485c8f9400Sryan_chen 	if (eng->run.speed_sel[0]) {
9495c8f9400Sryan_chen 		maccr.b.gmac_mode = 1;
9505c8f9400Sryan_chen 	} else if (eng->run.speed_sel[1]) {
9515c8f9400Sryan_chen 		maccr.b.speed_100 = 1;
9525c8f9400Sryan_chen 	}
9535c8f9400Sryan_chen 
9545c8f9400Sryan_chen 	if (eng->arg.run_mode == MODE_NCSI) {
9555c8f9400Sryan_chen 		maccr.b.rx_broadpkt_en = 1;
9565c8f9400Sryan_chen 		maccr.b.speed_100 = 1;
9575c8f9400Sryan_chen 	}
9585c8f9400Sryan_chen 	else {
9595c8f9400Sryan_chen 		maccr.b.rx_alladr = 1;
9605c8f9400Sryan_chen #ifdef Enable_Runt
9615c8f9400Sryan_chen 		maccr.b.rx_runt = 1;
9625c8f9400Sryan_chen #endif
9635c8f9400Sryan_chen 	}
9645c8f9400Sryan_chen 	mac_reg_write(eng, 0x50, maccr.w);
9655c8f9400Sryan_chen 	DELAY(Delay_MACRst);
9665c8f9400Sryan_chen } // End void init_mac (MAC_ENGINE *eng)
9675c8f9400Sryan_chen 
9685c8f9400Sryan_chen //------------------------------------------------------------
9695c8f9400Sryan_chen // Basic
9705c8f9400Sryan_chen //------------------------------------------------------------
FPri_RegValue(MAC_ENGINE * eng,uint8_t option)9715c8f9400Sryan_chen void FPri_RegValue (MAC_ENGINE *eng, uint8_t option)
9725c8f9400Sryan_chen {
9735c8f9400Sryan_chen 	nt_log_func_name();
9745c8f9400Sryan_chen 
9755c8f9400Sryan_chen 	PRINTF( option, "[SRAM] Date:%08x\n", SRAM_RD( 0x88 ) );
9765c8f9400Sryan_chen 	PRINTF( option, "[SRAM]  80:%08x %08x %08x %08x\n", SRAM_RD( 0x80 ), SRAM_RD( 0x84 ), SRAM_RD( 0x88 ), SRAM_RD( 0x8c ) );
9775c8f9400Sryan_chen 
9785c8f9400Sryan_chen 	PRINTF( option, "[SCU]  a0:%08x  a4:%08x  b8:%08x  bc:%08x\n", SCU_RD( 0x0a0 ), SCU_RD( 0x0a4 ), SCU_RD( 0x0b8 ), SCU_RD( 0x0bc ));
9795c8f9400Sryan_chen 
9805c8f9400Sryan_chen 	PRINTF( option, "[SCU] 13c:%08x 140:%08x 144:%08x 1dc:%08x\n", SCU_RD( 0x13c ), SCU_RD( 0x140 ), SCU_RD( 0x144 ), SCU_RD( 0x1dc ) );
9815c8f9400Sryan_chen 	PRINTF( option, "[WDT]  0c:%08x  2c:%08x  4c:%08x\n", eng->reg.WDT_00c, eng->reg.WDT_02c, eng->reg.WDT_04c );
9825c8f9400Sryan_chen 	PRINTF( option, "[MAC]  A0|%08x %08x %08x %08x\n", mac_reg_read( eng, 0xa0 ), mac_reg_read( eng, 0xa4 ), mac_reg_read( eng, 0xa8 ), mac_reg_read( eng, 0xac ) );
9835c8f9400Sryan_chen 	PRINTF( option, "[MAC]  B0|%08x %08x %08x %08x\n", mac_reg_read( eng, 0xb0 ), mac_reg_read( eng, 0xb4 ), mac_reg_read( eng, 0xb8 ), mac_reg_read( eng, 0xbc ) );
9845c8f9400Sryan_chen 	PRINTF( option, "[MAC]  C0|%08x %08x %08x\n",       mac_reg_read( eng, 0xc0 ), mac_reg_read( eng, 0xc4 ), mac_reg_read( eng, 0xc8 ) );
9855c8f9400Sryan_chen 
9865c8f9400Sryan_chen } // End void FPri_RegValue (MAC_ENGINE *eng, uint8_t *fp)
9875c8f9400Sryan_chen 
9885c8f9400Sryan_chen //------------------------------------------------------------
FPri_End(MAC_ENGINE * eng,uint8_t option)9895c8f9400Sryan_chen void FPri_End (MAC_ENGINE *eng, uint8_t option)
9905c8f9400Sryan_chen {
9915c8f9400Sryan_chen 	nt_log_func_name();
9925c8f9400Sryan_chen 	if ((0 == eng->run.is_rgmii) && (eng->phy.RMIICK_IOMode != 0) &&
9935c8f9400Sryan_chen 	    eng->run.IO_MrgChk && eng->flg.all_fail) {
9945c8f9400Sryan_chen 		if ( eng->arg.ctrl.b.rmii_phy_in == 0 ) {
9955c8f9400Sryan_chen 			PRINTF( option, "\n\n\n\n\n\n[Info] The PHY's RMII reference clock pin is setting to the OUTPUT mode now.\n" );
9965c8f9400Sryan_chen 			PRINTF( option, "       Maybe you can run the INPUT mode command \"mactest  %d %d %d %d %d %d %d\".\n\n\n\n", eng->arg.mac_idx, eng->arg.run_speed, (eng->arg.ctrl.w | 0x80), eng->arg.loop_max, eng->arg.test_mode, eng->arg.phy_addr, eng->arg.delay_scan_range );
9975c8f9400Sryan_chen 		}
9985c8f9400Sryan_chen 		else {
9995c8f9400Sryan_chen 			PRINTF( option, "\n\n\n\n\n\n[Info] The PHY's RMII reference clock pin is setting to the INPUT mode now.\n" );
10005c8f9400Sryan_chen 			PRINTF( option, "       Maybe you can run the OUTPUT mode command \"mactest  %d %d %d %d %d %d %d\".\n\n\n\n", eng->arg.mac_idx, eng->arg.run_speed, (eng->arg.ctrl.w & 0x7f), eng->arg.loop_max, eng->arg.test_mode, eng->arg.phy_addr, eng->arg.delay_scan_range );
10015c8f9400Sryan_chen 		}
10025c8f9400Sryan_chen 	}
10035c8f9400Sryan_chen 
10045c8f9400Sryan_chen 	if (!eng->run.TM_RxDataEn) {
1005783c0c9bSDylan Hung 	} else if (eng->flg.error) {
10065c8f9400Sryan_chen 		PRINTF(option, "                    \n----> fail !!!\n");
10075c8f9400Sryan_chen 	}
10085c8f9400Sryan_chen 
10095c8f9400Sryan_chen 	//------------------------------
10105c8f9400Sryan_chen 	//[Warning] PHY Address
10115c8f9400Sryan_chen 	//------------------------------
10125c8f9400Sryan_chen 	if ( eng->arg.run_mode == MODE_DEDICATED ) {
10135c8f9400Sryan_chen 		if ( eng->arg.phy_addr != eng->phy.Adr )
10145c8f9400Sryan_chen 			PRINTF( option, "\n[Warning] PHY Address change from %d to %d !!!\n", eng->arg.phy_addr, eng->phy.Adr );
10155c8f9400Sryan_chen 	}
10165c8f9400Sryan_chen 
1017e502e789SDylan Hung 	/* [Warning] IO Strength */
1018e502e789SDylan Hung 	if (eng->io.init_done) {
10195c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
1020e502e789SDylan Hung 		if ((eng->io.mac34_drv_reg.value.b.mac3_tx_drv != 0x3) ||
1021e502e789SDylan Hung 		    (eng->io.mac34_drv_reg.value.b.mac4_tx_drv != 0x3)) {
10225c8f9400Sryan_chen 			PRINTF(option,
1023e502e789SDylan Hung 			       "\n[Warning] [%08x] bit[3:0] 0x%02x is not the recommended value "
10245c8f9400Sryan_chen 			       "0xf.\n",
10255c8f9400Sryan_chen 			       eng->io.mac34_drv_reg.addr,
1026e502e789SDylan Hung 			       eng->io.mac34_drv_reg.value.w & 0xf);
1027e502e789SDylan Hung 		}
10285c8f9400Sryan_chen #else
1029*e12dfc2cSDylan Hung 		if (eng->io.mac12_drv_reg.value.w & GENMASK(11, 8)) {
10305c8f9400Sryan_chen 			PRINTF(option,
1031e502e789SDylan Hung 			       "\n[Warning] [%08X] 0x%08x is not the recommended value "
10325c8f9400Sryan_chen 			       "0.\n",
10335c8f9400Sryan_chen 			       eng->io.mac12_drv_reg.addr,
10345c8f9400Sryan_chen 			       eng->io.mac12_drv_reg.value.w);
1035e502e789SDylan Hung 		}
10365c8f9400Sryan_chen #endif
10375c8f9400Sryan_chen 	}
10385c8f9400Sryan_chen 
10395c8f9400Sryan_chen 	//------------------------------
10405c8f9400Sryan_chen 	//[Warning] IO Timing
10415c8f9400Sryan_chen 	//------------------------------
10425c8f9400Sryan_chen 	if ( eng->arg.run_mode == MODE_NCSI ) {
10435c8f9400Sryan_chen 		PRINTF( option, "\n[Arg] %d %d %d %d %d %d %d {%d}\n", eng->arg.mac_idx, eng->arg.GPackageTolNum, eng->arg.GChannelTolNum, eng->arg.test_mode, eng->arg.delay_scan_range, eng->arg.ctrl.w, eng->arg.GARPNumCnt, TIME_OUT_NCSI );
10445c8f9400Sryan_chen 
10455c8f9400Sryan_chen 		switch ( eng->ncsi_cap.PCI_DID_VID ) {
10465c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82574L             : { PRINTF( option, "[NC]%08x %08x: Intel 82574L       \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10475c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82575_10d6         : { PRINTF( option, "[NC]%08x %08x: Intel 82575        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10485c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82575_10a7         : { PRINTF( option, "[NC]%08x %08x: Intel 82575        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10495c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82575_10a9         : { PRINTF( option, "[NC]%08x %08x: Intel 82575        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10505c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_10c9         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10515c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_10e6         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10525c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_10e7         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10535c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_10e8         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10545c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_1518         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10555c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_1526         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10565c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_150a         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10575c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82576_150d         : { PRINTF( option, "[NC]%08x %08x: Intel 82576        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10585c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82599_10fb         : { PRINTF( option, "[NC]%08x %08x: Intel 82599        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10595c8f9400Sryan_chen 			case PCI_DID_VID_Intel_82599_1557         : { PRINTF( option, "[NC]%08x %08x: Intel 82599        \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10605c8f9400Sryan_chen 			case PCI_DID_VID_Intel_I210_1533          : { PRINTF( option, "[NC]%08x %08x: Intel I210         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10615c8f9400Sryan_chen 			case PCI_DID_VID_Intel_I210_1537          : { PRINTF( option, "[NC]%08x %08x: Intel I210         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10625c8f9400Sryan_chen 			case PCI_DID_VID_Intel_I350_1521          : { PRINTF( option, "[NC]%08x %08x: Intel I350         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10635c8f9400Sryan_chen 			case PCI_DID_VID_Intel_I350_1523          : { PRINTF( option, "[NC]%08x %08x: Intel I350         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10645c8f9400Sryan_chen 			case PCI_DID_VID_Intel_X540               : { PRINTF( option, "[NC]%08x %08x: Intel X540         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10655c8f9400Sryan_chen 			case PCI_DID_VID_Intel_X550               : { PRINTF( option, "[NC]%08x %08x: Intel X550         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10665c8f9400Sryan_chen 			case PCI_DID_VID_Intel_Broadwell_DE       : { PRINTF( option, "[NC]%08x %08x: Intel Broadwell-DE \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10675c8f9400Sryan_chen 			case PCI_DID_VID_Intel_X722_37d0          : { PRINTF( option, "[NC]%08x %08x: Intel X722         \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10685c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM5718         : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5718   \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10695c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM5719         : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5719   \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10705c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM5720         : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5720   \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10715c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM5725         : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5725   \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10725c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM57810S       : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM57810S \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10735c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_Cumulus         : { PRINTF( option, "[NC]%08x %08x: Broadcom Cumulus   \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10745c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM57302        : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM57302  \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10755c8f9400Sryan_chen 			case PCI_DID_VID_Broadcom_BCM957452       : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM957452 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10765c8f9400Sryan_chen 			case PCI_DID_VID_Mellanox_ConnectX_3_1003 : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-3\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10775c8f9400Sryan_chen 			case PCI_DID_VID_Mellanox_ConnectX_3_1007 : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-3\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10785c8f9400Sryan_chen 			case PCI_DID_VID_Mellanox_ConnectX_4      : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-4\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10795c8f9400Sryan_chen 			default:
10805c8f9400Sryan_chen 			switch ( eng->ncsi_cap.manufacturer_id ) {
10815c8f9400Sryan_chen 				case ManufacturerID_Intel    : { PRINTF( option, "[NC]%08x %08x: Intel              \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10825c8f9400Sryan_chen 				case ManufacturerID_Broadcom : { PRINTF( option, "[NC]%08x %08x: Broadcom           \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10835c8f9400Sryan_chen 				case ManufacturerID_Mellanox : { PRINTF( option, "[NC]%08x %08x: Mellanox           \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10845c8f9400Sryan_chen 				case ManufacturerID_Mellanox1: { PRINTF( option, "[NC]%08x %08x: Mellanox           \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10855c8f9400Sryan_chen 				case ManufacturerID_Emulex   : { PRINTF( option, "[NC]%08x %08x: Emulex             \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10865c8f9400Sryan_chen 				default                      : { PRINTF( option, "[NC]%08x %08x                     \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; }
10875c8f9400Sryan_chen 			} // End switch ( eng->ncsi_cap.manufacturer_id )
10885c8f9400Sryan_chen 		} // End switch ( eng->ncsi_cap.PCI_DID_VID )
10895c8f9400Sryan_chen 	}
10905c8f9400Sryan_chen 	else {
1091daba96f3SDylan Hung 		PRINTF(option, "[PHY] @addr %d: id = %04x_%04x (%s)\n",
1092daba96f3SDylan Hung 		       eng->phy.Adr, eng->phy.id1, eng->phy.id2,
1093daba96f3SDylan Hung 		       eng->phy.phy_name);
10945c8f9400Sryan_chen 	} // End if ( eng->arg.run_mode == MODE_NCSI )
10955c8f9400Sryan_chen } // End void FPri_End (MAC_ENGINE *eng, uint8_t option)
10965c8f9400Sryan_chen 
10975c8f9400Sryan_chen //------------------------------------------------------------
FPri_ErrFlag(MAC_ENGINE * eng,uint8_t option)10985c8f9400Sryan_chen void FPri_ErrFlag (MAC_ENGINE *eng, uint8_t option)
10995c8f9400Sryan_chen {
11005c8f9400Sryan_chen 	nt_log_func_name();
11015c8f9400Sryan_chen 	if ( eng->flg.print_en ) {
1102783c0c9bSDylan Hung 		if ( eng->flg.warn ) {
1103783c0c9bSDylan Hung 			if ( eng->flg.warn & Wrn_Flag_IOMarginOUF ) {
11045c8f9400Sryan_chen 				PRINTF(option, "[Warning] IO timing testing "
11055c8f9400Sryan_chen 					       "range out of boundary\n");
11065c8f9400Sryan_chen 
11075c8f9400Sryan_chen 				if (0 == eng->run.is_rgmii) {
11085c8f9400Sryan_chen 					PRINTF( option, "      (reg:%d,%d) %dx1(%d~%d,%d)\n", eng->io.Dly_in_reg_idx,
11095c8f9400Sryan_chen 											      eng->io.Dly_out_reg_idx,
11105c8f9400Sryan_chen 											      eng->run.delay_margin,
11115c8f9400Sryan_chen 											      eng->io.Dly_in_min,
11125c8f9400Sryan_chen 											      eng->io.Dly_in_max,
11135c8f9400Sryan_chen 											      eng->io.Dly_out_min );
11145c8f9400Sryan_chen 				}
11155c8f9400Sryan_chen 				else {
11165c8f9400Sryan_chen 					PRINTF( option, "      (reg:%d,%d) %dx%d(%d~%d,%d~%d)\n", eng->io.Dly_in_reg_idx,
11175c8f9400Sryan_chen 												  eng->io.Dly_out_reg_idx,
11185c8f9400Sryan_chen 												  eng->run.delay_margin,
11195c8f9400Sryan_chen 												  eng->run.delay_margin,
11205c8f9400Sryan_chen 												  eng->io.Dly_in_min,
11215c8f9400Sryan_chen 												  eng->io.Dly_in_max,
11225c8f9400Sryan_chen 												  eng->io.Dly_out_min,
11235c8f9400Sryan_chen 												  eng->io.Dly_out_max );
11245c8f9400Sryan_chen 				}
1125783c0c9bSDylan Hung 			} // End if ( eng->flg.warn & Wrn_Flag_IOMarginOUF )
1126783c0c9bSDylan Hung 			if ( eng->flg.warn & Wrn_Flag_RxErFloatting ) {
11275c8f9400Sryan_chen 				PRINTF( option, "[Warning] NCSI RXER pin may be floatting to the MAC !!!\n" );
11285c8f9400Sryan_chen 				PRINTF( option, "          Please contact with the ASPEED Inc. for more help.\n" );
1129783c0c9bSDylan Hung 			} // End if ( eng->flg.warn & Wrn_Flag_RxErFloatting )
1130783c0c9bSDylan Hung 		} // End if ( eng->flg.warn )
11315c8f9400Sryan_chen 
1132783c0c9bSDylan Hung 		if ( eng->flg.error ) {
11335c8f9400Sryan_chen 			PRINTF( option, "\n\n" );
1134783c0c9bSDylan Hung //PRINTF( option, "error: %x\n\n", eng->flg.error );
11355c8f9400Sryan_chen 
1136783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_PHY_Type                ) { PRINTF( option, "[Err] Unidentifiable PHY                                     \n" ); }
1137783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_MALLOC_FrmSize          ) { PRINTF( option, "[Err] Malloc fail at frame size buffer                       \n" ); }
1138783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_MALLOC_LastWP           ) { PRINTF( option, "[Err] Malloc fail at last WP buffer                          \n" ); }
1139783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_Check_Buf_Data          ) { PRINTF( option, "[Err] Received data mismatch                                 \n" ); }
1140783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_Check_TxOwnTimeOut ) { PRINTF( option, "[Err] Time out of checking Tx owner bit in NCSI packet       \n" ); }
1141783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_Check_RxOwnTimeOut ) { PRINTF( option, "[Err] Time out of checking Rx owner bit in NCSI packet       \n" ); }
1142783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_Check_ARPOwnTimeOut) { PRINTF( option, "[Err] Time out of checking ARP owner bit in NCSI packet      \n" ); }
1143783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_No_PHY             ) { PRINTF( option, "[Err] Can not find NCSI PHY                                  \n" ); }
1144783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_Channel_Num        ) { PRINTF( option, "[Err] NCSI Channel Number Mismatch                           \n" ); }
1145783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NCSI_Package_Num        ) { PRINTF( option, "[Err] NCSI Package Number Mismatch                           \n" ); }
1146783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_PHY_TimeOut_RW          ) { PRINTF( option, "[Err] Time out of read/write PHY register                    \n" ); }
1147783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_PHY_TimeOut_Rst         ) { PRINTF( option, "[Err] Time out of reset PHY register                         \n" ); }
1148783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_RXBUF_UNAVA             ) { PRINTF( option, "[Err] MAC00h[2]:Receiving buffer unavailable                 \n" ); }
1149783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_RPKT_LOST               ) { PRINTF( option, "[Err] MAC00h[3]:Received packet lost due to RX FIFO full     \n" ); }
1150783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_NPTXBUF_UNAVA           ) { PRINTF( option, "[Err] MAC00h[6]:Normal priority transmit buffer unavailable  \n" ); }
1151783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_TPKT_LOST               ) { PRINTF( option, "[Err] MAC00h[7]:Packets transmitted to Ethernet lost         \n" ); }
1152783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_DMABufNum               ) { PRINTF( option, "[Err] DMA Buffer is not enough                               \n" ); }
1153783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_IOMargin                ) { PRINTF( option, "[Err] IO timing margin is not enough                         \n" ); }
11545c8f9400Sryan_chen 
1155783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_MHCLK_Ratio             ) {
11565c8f9400Sryan_chen 				PRINTF( option, "[Err] Error setting of MAC AHB bus clock (SCU08[18:16])      \n" );
11575c8f9400Sryan_chen 				if ( eng->env.at_least_1g_valid )
11585c8f9400Sryan_chen 					{ PRINTF( option, "      SCU08[18:16] == 0x%01x is not the suggestion value 2.\n", eng->env.MHCLK_Ratio ); }
11595c8f9400Sryan_chen 				else
11605c8f9400Sryan_chen 					{ PRINTF( option, "      SCU08[18:16] == 0x%01x is not the suggestion value 4.\n", eng->env.MHCLK_Ratio ); }
1161783c0c9bSDylan Hung 			} // End if ( eng->flg.error & Err_Flag_MHCLK_Ratio             )
11625c8f9400Sryan_chen 
1163783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_IOMarginOUF ) {
11645c8f9400Sryan_chen 				PRINTF( option, "[Err] IO timing testing range out of boundary\n");
11655c8f9400Sryan_chen 				if (0 == eng->run.is_rgmii) {
11665c8f9400Sryan_chen 					PRINTF( option, "      (reg:%d,%d) %dx1(%d~%d,%d)\n", eng->io.Dly_in_reg_idx,
11675c8f9400Sryan_chen 											      eng->io.Dly_out_reg_idx,
11685c8f9400Sryan_chen 											      eng->run.delay_margin,
11695c8f9400Sryan_chen 											      eng->io.Dly_in_min,
11705c8f9400Sryan_chen 											      eng->io.Dly_in_max,
11715c8f9400Sryan_chen 											      eng->io.Dly_out_min );
11725c8f9400Sryan_chen 				}
11735c8f9400Sryan_chen 				else {
11745c8f9400Sryan_chen 					PRINTF( option, "      (reg:%d,%d) %dx%d(%d~%d,%d~%d)\n", eng->io.Dly_in_reg_idx,
11755c8f9400Sryan_chen 												  eng->io.Dly_out_reg_idx,
11765c8f9400Sryan_chen 												  eng->run.delay_margin,
11775c8f9400Sryan_chen 												  eng->run.delay_margin,
11785c8f9400Sryan_chen 												  eng->io.Dly_in_min,
11795c8f9400Sryan_chen 												  eng->io.Dly_in_max,
11805c8f9400Sryan_chen 												  eng->io.Dly_out_min,
11815c8f9400Sryan_chen 												  eng->io.Dly_out_max );
11825c8f9400Sryan_chen 				}
1183783c0c9bSDylan Hung 			} // End if ( eng->flg.error & Err_Flag_IOMarginOUF )
11845c8f9400Sryan_chen 
1185783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_Check_Des ) {
11865c8f9400Sryan_chen 				PRINTF( option, "[Err] Descriptor error\n");
1187783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_TxOwnTimeOut ) { PRINTF( option, "[Des] Time out of checking Tx owner bit\n" ); }
1188783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_RxOwnTimeOut ) { PRINTF( option, "[Des] Time out of checking Rx owner bit\n" ); }
1189783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_FrameLen     ) { PRINTF( option, "[Des] Frame length mismatch            \n" ); }
1190783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_RxErr        ) { PRINTF( option, "[Des] Input signal RxErr               \n" ); }
1191783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_CRC          ) { PRINTF( option, "[Des] CRC error of frame               \n" ); }
1192783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_FTL          ) { PRINTF( option, "[Des] Frame too long                   \n" ); }
1193783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_Runt         ) { PRINTF( option, "[Des] Runt packet                      \n" ); }
1194783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_OddNibble    ) { PRINTF( option, "[Des] Nibble bit happen                \n" ); }
1195783c0c9bSDylan Hung 				if ( eng->flg.desc & Des_Flag_RxFIFOFull   ) { PRINTF( option, "[Des] Rx FIFO full                     \n" ); }
1196783c0c9bSDylan Hung 			} // End if ( eng->flg.error & Err_Flag_Check_Des )
11975c8f9400Sryan_chen 
1198783c0c9bSDylan Hung 			if ( eng->flg.error & Err_Flag_MACMode ) {
11995c8f9400Sryan_chen 				PRINTF( option, "[Err] MAC interface mode mismatch\n" );
12005c8f9400Sryan_chen 				for (int i = 0; i < 4; i++) {
12015c8f9400Sryan_chen 					if (eng->env.is_1g_valid[i]) {
12025c8f9400Sryan_chen 						PRINTF(option,
12035c8f9400Sryan_chen 						       "[MAC%d] is RGMII\n", i);
12045c8f9400Sryan_chen 					} else {
12055c8f9400Sryan_chen 						PRINTF(option,
12065c8f9400Sryan_chen 						       "[MAC%d] RMII\n", i);
12075c8f9400Sryan_chen 					}
12085c8f9400Sryan_chen 				}
1209783c0c9bSDylan Hung 			} // End if ( eng->flg.error & Err_Flag_MACMode )
12105c8f9400Sryan_chen 
12115c8f9400Sryan_chen 			if ( eng->arg.run_mode == MODE_NCSI ) {
1212783c0c9bSDylan Hung 				if ( eng->flg.error & ERR_FLAG_NCSI_LINKFAIL ) {
12135c8f9400Sryan_chen 					PRINTF( option, "[Err] NCSI packet retry number over flows when find channel\n" );
12145c8f9400Sryan_chen 
1215783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Get_Version_ID                  ) { PRINTF( option, "[NCSI] Time out when Get Version ID                  \n" ); }
1216783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Get_Capabilities                ) { PRINTF( option, "[NCSI] Time out when Get Capabilities                \n" ); }
1217783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Select_Active_Package           ) { PRINTF( option, "[NCSI] Time out when Select Active Package           \n" ); }
1218783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Enable_Set_MAC_Address          ) { PRINTF( option, "[NCSI] Time out when Enable Set MAC Address          \n" ); }
1219783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Enable_Broadcast_Filter         ) { PRINTF( option, "[NCSI] Time out when Enable Broadcast Filter         \n" ); }
1220783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Enable_Network_TX               ) { PRINTF( option, "[NCSI] Time out when Enable Network TX               \n" ); }
1221783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Enable_Channel                  ) { PRINTF( option, "[NCSI] Time out when Enable Channel                  \n" ); }
1222783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Disable_Network_TX              ) { PRINTF( option, "[NCSI] Time out when Disable Network TX              \n" ); }
1223783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Disable_Channel                 ) { PRINTF( option, "[NCSI] Time out when Disable Channel                 \n" ); }
1224783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Select_Package                  ) { PRINTF( option, "[NCSI] Time out when Select Package                  \n" ); }
1225783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Deselect_Package                ) { PRINTF( option, "[NCSI] Time out when Deselect Package                \n" ); }
1226783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Set_Link                        ) { PRINTF( option, "[NCSI] Time out when Set Link                        \n" ); }
1227783c0c9bSDylan Hung 					if ( eng->flg.ncsi & NCSI_Flag_Get_Controller_Packet_Statistics) { PRINTF( option, "[NCSI] Time out when Get Controller Packet Statistics\n" ); }
12285c8f9400Sryan_chen 				}
12295c8f9400Sryan_chen 
1230783c0c9bSDylan Hung 				if ( eng->flg.error & Err_Flag_NCSI_Channel_Num ) { PRINTF( option, "[NCSI] Channel number expected: %d, real: %d\n", eng->arg.GChannelTolNum, eng->dat.number_chl ); }
1231783c0c9bSDylan Hung 				if ( eng->flg.error & Err_Flag_NCSI_Package_Num ) { PRINTF( option, "[NCSI] Peckage number expected: %d, real: %d\n", eng->arg.GPackageTolNum, eng->dat.number_pak ); }
12325c8f9400Sryan_chen 			} // End if ( eng->arg.run_mode == MODE_NCSI )
1233783c0c9bSDylan Hung 		} // End if ( eng->flg.error )
12345c8f9400Sryan_chen 	} // End if ( eng->flg.print_en )
12355c8f9400Sryan_chen } // End void FPri_ErrFlag (MAC_ENGINE *eng, uint8_t option)
12365c8f9400Sryan_chen 
12375c8f9400Sryan_chen //------------------------------------------------------------
12385c8f9400Sryan_chen 
12395c8f9400Sryan_chen //------------------------------------------------------------
FindErr(MAC_ENGINE * p_eng,int value)12405c8f9400Sryan_chen int FindErr (MAC_ENGINE *p_eng, int value)
12415c8f9400Sryan_chen {
1242783c0c9bSDylan Hung 	p_eng->flg.error = p_eng->flg.error | value;
12435c8f9400Sryan_chen 
1244783c0c9bSDylan Hung 	if (DBG_PRINT_ERR_FLAG)
1245783c0c9bSDylan Hung 		printf("flags: error = %08x\n", p_eng->flg.error);
12465c8f9400Sryan_chen 
12475c8f9400Sryan_chen 	return (1);
12485c8f9400Sryan_chen }
12495c8f9400Sryan_chen 
12505c8f9400Sryan_chen //------------------------------------------------------------
FindErr_Des(MAC_ENGINE * p_eng,int value)12515c8f9400Sryan_chen int FindErr_Des (MAC_ENGINE *p_eng, int value)
12525c8f9400Sryan_chen {
1253783c0c9bSDylan Hung 	p_eng->flg.error = p_eng->flg.error | Err_Flag_Check_Des;
1254783c0c9bSDylan Hung 	p_eng->flg.desc = p_eng->flg.desc | value;
1255783c0c9bSDylan Hung 	if (DBG_PRINT_ERR_FLAG)
1256783c0c9bSDylan Hung 		printf("flags: error = %08x, desc = %08x\n", p_eng->flg.error, p_eng->flg.desc);
12575c8f9400Sryan_chen 
12585c8f9400Sryan_chen 	return (1);
12595c8f9400Sryan_chen }
12605c8f9400Sryan_chen 
12615c8f9400Sryan_chen //------------------------------------------------------------
12625c8f9400Sryan_chen // Get and Check status of Interrupt
12635c8f9400Sryan_chen //------------------------------------------------------------
check_int(MAC_ENGINE * eng,char * type)12645c8f9400Sryan_chen int check_int (MAC_ENGINE *eng, char *type )
12655c8f9400Sryan_chen {
12665c8f9400Sryan_chen 	nt_log_func_name();
12675c8f9400Sryan_chen 
12685c8f9400Sryan_chen 	uint32_t mac_00;
12695c8f9400Sryan_chen 
12705c8f9400Sryan_chen 	mac_00 = mac_reg_read(eng, 0x00);
12715c8f9400Sryan_chen #ifdef CheckRxbufUNAVA
12725c8f9400Sryan_chen 	if (mac_00 & BIT(2)) {
12735c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sIntStatus] Receiving buffer unavailable               : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt );
12745c8f9400Sryan_chen 		FindErr( eng, Err_Flag_RXBUF_UNAVA );
12755c8f9400Sryan_chen 	}
12765c8f9400Sryan_chen #endif
12775c8f9400Sryan_chen 
12785c8f9400Sryan_chen #ifdef CheckRPktLost
12795c8f9400Sryan_chen 	if (mac_00 & BIT(3)) {
12805c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sIntStatus] Received packet lost due to RX FIFO full   : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt );
12815c8f9400Sryan_chen 		FindErr( eng, Err_Flag_RPKT_LOST );
12825c8f9400Sryan_chen 	}
12835c8f9400Sryan_chen #endif
12845c8f9400Sryan_chen 
12855c8f9400Sryan_chen #ifdef CheckNPTxbufUNAVA
12865c8f9400Sryan_chen 	if (mac_00 & BIT(6) ) {
12875c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sIntStatus] Normal priority transmit buffer unavailable: %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt );
12885c8f9400Sryan_chen 		FindErr( eng, Err_Flag_NPTXBUF_UNAVA );
12895c8f9400Sryan_chen 	}
12905c8f9400Sryan_chen #endif
12915c8f9400Sryan_chen 
12925c8f9400Sryan_chen #ifdef CheckTPktLost
12935c8f9400Sryan_chen 	if (mac_00 & BIT(7)) {
12945c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sIntStatus] Packets transmitted to Ethernet lost       : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt );
12955c8f9400Sryan_chen 		FindErr( eng, Err_Flag_TPKT_LOST );
12965c8f9400Sryan_chen 	}
12975c8f9400Sryan_chen #endif
12985c8f9400Sryan_chen 
1299783c0c9bSDylan Hung 	if ( eng->flg.error )
13005c8f9400Sryan_chen 		return(1);
13015c8f9400Sryan_chen 	else
13025c8f9400Sryan_chen 		return(0);
13035c8f9400Sryan_chen } // End int check_int (MAC_ENGINE *eng, char *type)
13045c8f9400Sryan_chen 
13055c8f9400Sryan_chen 
13065c8f9400Sryan_chen //------------------------------------------------------------
13075c8f9400Sryan_chen // Buffer
13085c8f9400Sryan_chen //------------------------------------------------------------
setup_framesize(MAC_ENGINE * eng)13095c8f9400Sryan_chen void setup_framesize (MAC_ENGINE *eng)
13105c8f9400Sryan_chen {
13115c8f9400Sryan_chen 	int32_t       des_num;
13125c8f9400Sryan_chen 
13135c8f9400Sryan_chen 	nt_log_func_name();
13145c8f9400Sryan_chen 
13155c8f9400Sryan_chen 	//------------------------------
13165c8f9400Sryan_chen 	// Fill Frame Size out descriptor area
13175c8f9400Sryan_chen 	//------------------------------
13185c8f9400Sryan_chen 	if (0) {
13195c8f9400Sryan_chen 		for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) {
13205c8f9400Sryan_chen 			if ( RAND_SIZE_SIMPLE )
13215c8f9400Sryan_chen 				switch( rand() % 5 ) {
13225c8f9400Sryan_chen 					case 0 : eng->dat.FRAME_LEN[ des_num ] = 0x4e ; break;
13235c8f9400Sryan_chen 					case 1 : eng->dat.FRAME_LEN[ des_num ] = 0x4ba; break;
13245c8f9400Sryan_chen 					default: eng->dat.FRAME_LEN[ des_num ] = 0x5ea; break;
13255c8f9400Sryan_chen 				}
13265c8f9400Sryan_chen 			else
13275c8f9400Sryan_chen //				eng->dat.FRAME_LEN[ des_num ] = ( rand() + RAND_SIZE_MIN ) % ( RAND_SIZE_MAX + 1 );
13285c8f9400Sryan_chen 				eng->dat.FRAME_LEN[ des_num ] = RAND_SIZE_MIN + ( rand() % ( RAND_SIZE_MAX - RAND_SIZE_MIN + 1 ) );
13295c8f9400Sryan_chen 
13305c8f9400Sryan_chen 			if ( DbgPrn_FRAME_LEN )
13315c8f9400Sryan_chen 				PRINTF( FP_LOG, "[setup_framesize] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN[ des_num ], des_num, eng->run.loop_of_cnt, eng->run.loop_cnt );
13325c8f9400Sryan_chen 		}
13335c8f9400Sryan_chen 	}
13345c8f9400Sryan_chen 	else {
13355c8f9400Sryan_chen 		for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) {
13365c8f9400Sryan_chen #ifdef SelectSimpleLength
13375c8f9400Sryan_chen 			if ( des_num % FRAME_SELH_PERD )
13385c8f9400Sryan_chen 				eng->dat.FRAME_LEN[ des_num ] = FRAME_LENH;
13395c8f9400Sryan_chen 			else
13405c8f9400Sryan_chen 				eng->dat.FRAME_LEN[ des_num ] = FRAME_LENL;
13415c8f9400Sryan_chen #else
13425c8f9400Sryan_chen 			if ( eng->run.tm_tx_only ) {
13435c8f9400Sryan_chen 				if ( eng->run.TM_IEEE )
13445c8f9400Sryan_chen 					eng->dat.FRAME_LEN[ des_num ] = 1514;
13455c8f9400Sryan_chen 				else
13465c8f9400Sryan_chen 					eng->dat.FRAME_LEN[ des_num ] = 60;
13475c8f9400Sryan_chen 			}
13485c8f9400Sryan_chen 			else {
13495c8f9400Sryan_chen   #ifdef SelectLengthInc
13505c8f9400Sryan_chen 				eng->dat.FRAME_LEN[ des_num ] = 1514 - ( des_num % 1455 );
13515c8f9400Sryan_chen   #else
13525c8f9400Sryan_chen 				if ( des_num % FRAME_SELH_PERD )
13535c8f9400Sryan_chen 					eng->dat.FRAME_LEN[ des_num ] = FRAME_LENH;
13545c8f9400Sryan_chen 				else
13555c8f9400Sryan_chen 					eng->dat.FRAME_LEN[ des_num ] = FRAME_LENL;
13565c8f9400Sryan_chen   #endif
13575c8f9400Sryan_chen 			} // End if ( eng->run.tm_tx_only )
13585c8f9400Sryan_chen #endif
13595c8f9400Sryan_chen 			if ( DbgPrn_FRAME_LEN )
13605c8f9400Sryan_chen 				PRINTF( FP_LOG, "[setup_framesize] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN[ des_num ], des_num, eng->run.loop_of_cnt, eng->run.loop_cnt );
13615c8f9400Sryan_chen 
13625c8f9400Sryan_chen 		} // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++)
13635c8f9400Sryan_chen 	} // End if ( ENABLE_RAND_SIZE )
13645c8f9400Sryan_chen 
13655c8f9400Sryan_chen 	// Calculate average of frame size
13665c8f9400Sryan_chen #ifdef Enable_ShowBW
13675c8f9400Sryan_chen 	eng->dat.Total_frame_len = 0;
13685c8f9400Sryan_chen 
13695c8f9400Sryan_chen 	for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ )
13705c8f9400Sryan_chen 		eng->dat.Total_frame_len += eng->dat.FRAME_LEN[ des_num ];
13715c8f9400Sryan_chen #endif
13725c8f9400Sryan_chen 
13735c8f9400Sryan_chen 	//------------------------------
13745c8f9400Sryan_chen 	// Write Plane
13755c8f9400Sryan_chen 	//------------------------------
13765c8f9400Sryan_chen 	switch( ZeroCopy_OFFSET & 0x3 ) {
13775c8f9400Sryan_chen 		case 0: eng->dat.wp_fir = 0xffffffff; break;
13785c8f9400Sryan_chen 		case 1: eng->dat.wp_fir = 0xffffff00; break;
13795c8f9400Sryan_chen 		case 2: eng->dat.wp_fir = 0xffff0000; break;
13805c8f9400Sryan_chen 		case 3: eng->dat.wp_fir = 0xff000000; break;
13815c8f9400Sryan_chen 	}
13825c8f9400Sryan_chen 
13835c8f9400Sryan_chen 	for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ )
13845c8f9400Sryan_chen 		switch( ( ZeroCopy_OFFSET + eng->dat.FRAME_LEN[ des_num ] - 1 ) & 0x3 ) {
13855c8f9400Sryan_chen 			case 0: eng->dat.wp_lst[ des_num ] = 0x000000ff; break;
13865c8f9400Sryan_chen 			case 1: eng->dat.wp_lst[ des_num ] = 0x0000ffff; break;
13875c8f9400Sryan_chen 			case 2: eng->dat.wp_lst[ des_num ] = 0x00ffffff; break;
13885c8f9400Sryan_chen 			case 3: eng->dat.wp_lst[ des_num ] = 0xffffffff; break;
13895c8f9400Sryan_chen 		}
13905c8f9400Sryan_chen } // End void setup_framesize (void)
13915c8f9400Sryan_chen 
13925c8f9400Sryan_chen //------------------------------------------------------------
setup_arp(MAC_ENGINE * eng)13935c8f9400Sryan_chen void setup_arp(MAC_ENGINE *eng)
13945c8f9400Sryan_chen {
13955c8f9400Sryan_chen 
13965c8f9400Sryan_chen 	nt_log_func_name();
13975c8f9400Sryan_chen 
1398dde36621SDylan Hung 	memcpy(eng->dat.ARP_data, ARP_org_data, sizeof(ARP_org_data));
13995c8f9400Sryan_chen 
1400dde36621SDylan Hung 	eng->dat.ARP_data[1] &= ~GENMASK(31, 16);
1401dde36621SDylan Hung 	eng->dat.ARP_data[1] |= (eng->inf.SA[1] << 24) | (eng->inf.SA[0] << 16);
1402dde36621SDylan Hung 	eng->dat.ARP_data[2] = (eng->inf.SA[5] << 24) | (eng->inf.SA[4] << 16) |
1403dde36621SDylan Hung 			       (eng->inf.SA[3] << 8) | (eng->inf.SA[2]);
1404dde36621SDylan Hung 	eng->dat.ARP_data[5] &= ~GENMASK(31, 16);
1405dde36621SDylan Hung 	eng->dat.ARP_data[5] |= (eng->inf.SA[1] << 24) | (eng->inf.SA[0] << 16);
1406dde36621SDylan Hung 	eng->dat.ARP_data[6] = (eng->inf.SA[5] << 24) | (eng->inf.SA[4] << 16) |
1407dde36621SDylan Hung 			       (eng->inf.SA[3] << 8) | (eng->inf.SA[2]);
1408dde36621SDylan Hung }
14095c8f9400Sryan_chen 
14105c8f9400Sryan_chen //------------------------------------------------------------
setup_buf(MAC_ENGINE * eng)14115c8f9400Sryan_chen void setup_buf (MAC_ENGINE *eng)
14125c8f9400Sryan_chen {
14135c8f9400Sryan_chen 	int32_t des_num_max;
14145c8f9400Sryan_chen 	int32_t des_num;
14155c8f9400Sryan_chen 	int i;
14165c8f9400Sryan_chen 	uint32_t adr;
14175c8f9400Sryan_chen 	uint32_t adr_srt;
14185c8f9400Sryan_chen 	uint32_t adr_end;
14195c8f9400Sryan_chen 	uint32_t Current_framelen;
14205c8f9400Sryan_chen 	uint32_t gdata = 0;
14215c8f9400Sryan_chen #ifdef SelectSimpleDA
14225c8f9400Sryan_chen 	int cnt;
14235c8f9400Sryan_chen 	uint32_t len;
14245c8f9400Sryan_chen #endif
14255c8f9400Sryan_chen 
14265c8f9400Sryan_chen 	nt_log_func_name();
14275c8f9400Sryan_chen 
14285c8f9400Sryan_chen 	// It need be multiple of 4
14295c8f9400Sryan_chen 	eng->dat.DMA_Base_Setup = DMA_BASE & 0xfffffffc;
14305c8f9400Sryan_chen 	adr_srt = eng->dat.DMA_Base_Setup;
14315c8f9400Sryan_chen 
14325c8f9400Sryan_chen 	if (eng->run.tm_tx_only) {
14335c8f9400Sryan_chen 		if (eng->run.TM_IEEE) {
14345c8f9400Sryan_chen 			for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) {
14355c8f9400Sryan_chen 				if ( DbgPrn_BufAdr )
14365c8f9400Sryan_chen 					printf("[loop[%d]:%4d][des:%4d][setup_buf  ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt);
14375c8f9400Sryan_chen 				Write_Mem_Dat_DD(adr_srt, 0xffffffff);
1438dde36621SDylan Hung 				Write_Mem_Dat_DD(adr_srt + 4,
1439dde36621SDylan Hung 						 eng->dat.ARP_data[1]);
1440dde36621SDylan Hung 				Write_Mem_Dat_DD(adr_srt + 8,
1441dde36621SDylan Hung 						 eng->dat.ARP_data[2]);
14425c8f9400Sryan_chen 
1443dde36621SDylan Hung 				for (adr = (adr_srt + 12);
1444dde36621SDylan Hung 				     adr < (adr_srt + DMA_PakSize); adr += 4) {
14455c8f9400Sryan_chen 					switch (eng->arg.test_mode) {
14465c8f9400Sryan_chen 					case 4:
14475c8f9400Sryan_chen 						gdata = rand() | (rand() << 16);
14485c8f9400Sryan_chen 						break;
14495c8f9400Sryan_chen 					case 5:
14505c8f9400Sryan_chen 						gdata = eng->arg.user_def_val;
14515c8f9400Sryan_chen 						break;
14525c8f9400Sryan_chen 					}
14535c8f9400Sryan_chen 					Write_Mem_Dat_DD(adr, gdata);
14545c8f9400Sryan_chen 				}
1455dde36621SDylan Hung 				adr_srt += DMA_PakSize;
1456dde36621SDylan Hung 			}
1457dde36621SDylan Hung 		} else {
14585c8f9400Sryan_chen 			printf("----->[ARP] 60 bytes\n");
14595c8f9400Sryan_chen 			for (i = 0; i < 16; i++)
14605c8f9400Sryan_chen 				printf("      [Tx%02d] %08x %08x\n", i, eng->dat.ARP_data[i], SWAP_4B( eng->dat.ARP_data[i] ) );
14615c8f9400Sryan_chen 
14625c8f9400Sryan_chen 			for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) {
14635c8f9400Sryan_chen 				if ( DbgPrn_BufAdr )
14645c8f9400Sryan_chen 					printf("[loop[%d]:%4d][des:%4d][setup_buf  ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt);
14655c8f9400Sryan_chen 
14665c8f9400Sryan_chen 				for (i = 0; i < 16; i++)
14675c8f9400Sryan_chen 					Write_Mem_Dat_DD( adr_srt + ( i << 2 ), eng->dat.ARP_data[i] );
14685c8f9400Sryan_chen 
14695c8f9400Sryan_chen 
14705c8f9400Sryan_chen 				adr_srt += DMA_PakSize;
14715c8f9400Sryan_chen 			} // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++)
14725c8f9400Sryan_chen 		} // End if ( eng->run.TM_IEEE )
14735c8f9400Sryan_chen 	} else {
14745c8f9400Sryan_chen 		if ( eng->arg.ctrl.b.single_packet )
14755c8f9400Sryan_chen 			des_num_max = 1;
14765c8f9400Sryan_chen 		else
14775c8f9400Sryan_chen 			des_num_max = eng->dat.Des_Num;
14785c8f9400Sryan_chen 
14795c8f9400Sryan_chen 		for (des_num = 0; des_num < des_num_max; des_num++) {
14805c8f9400Sryan_chen 			if (DbgPrn_BufAdr)
14815c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][setup_buf  ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt);
14825c8f9400Sryan_chen   #ifdef SelectSimpleData
14835c8f9400Sryan_chen     #ifdef SimpleData_Fix
14845c8f9400Sryan_chen 			switch( des_num % SimpleData_FixNum ) {
14855c8f9400Sryan_chen 				case  0 : gdata = SimpleData_FixVal00; break;
14865c8f9400Sryan_chen 				case  1 : gdata = SimpleData_FixVal01; break;
14875c8f9400Sryan_chen 				case  2 : gdata = SimpleData_FixVal02; break;
14885c8f9400Sryan_chen 				case  3 : gdata = SimpleData_FixVal03; break;
14895c8f9400Sryan_chen 				case  4 : gdata = SimpleData_FixVal04; break;
14905c8f9400Sryan_chen 				case  5 : gdata = SimpleData_FixVal05; break;
14915c8f9400Sryan_chen 				case  6 : gdata = SimpleData_FixVal06; break;
14925c8f9400Sryan_chen 				case  7 : gdata = SimpleData_FixVal07; break;
14935c8f9400Sryan_chen 				case  8 : gdata = SimpleData_FixVal08; break;
14945c8f9400Sryan_chen 				case  9 : gdata = SimpleData_FixVal09; break;
14955c8f9400Sryan_chen 				case 10 : gdata = SimpleData_FixVal10; break;
14965c8f9400Sryan_chen 				default : gdata = SimpleData_FixVal11; break;
14975c8f9400Sryan_chen 			}
14985c8f9400Sryan_chen     #else
14995c8f9400Sryan_chen 			gdata   = 0x11111111 * ((des_num + SEED_START) % 256);
15005c8f9400Sryan_chen     #endif
15015c8f9400Sryan_chen   #else
15025c8f9400Sryan_chen 			gdata   = DATA_SEED( des_num + SEED_START );
15035c8f9400Sryan_chen   #endif
15045c8f9400Sryan_chen 			Current_framelen = eng->dat.FRAME_LEN[ des_num ];
15055c8f9400Sryan_chen 
15065c8f9400Sryan_chen 			if ( DbgPrn_FRAME_LEN )
15075c8f9400Sryan_chen 				PRINTF( FP_LOG, "[setup_buf      ] Current_framelen:%08x[Des:%d][loop[%d]:%d]\n", Current_framelen, des_num, eng->run.loop_of_cnt, eng->run.loop_cnt );
15085c8f9400Sryan_chen #ifdef SelectSimpleDA
15095c8f9400Sryan_chen 			cnt     = 0;
15105c8f9400Sryan_chen 			len     = ( ( ( Current_framelen - 14 ) & 0xff ) << 8) |
15115c8f9400Sryan_chen 			            ( ( Current_framelen - 14 ) >> 8 );
15125c8f9400Sryan_chen #endif
15135c8f9400Sryan_chen 			adr_end = adr_srt + DMA_PakSize;
15145c8f9400Sryan_chen 			for ( adr = adr_srt; adr < adr_end; adr += 4 ) {
15155c8f9400Sryan_chen   #ifdef SelectSimpleDA
15165c8f9400Sryan_chen 				cnt++;
15175c8f9400Sryan_chen 				if      ( cnt == 1 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat0 );
15185c8f9400Sryan_chen 				else if ( cnt == 2 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat1 );
15195c8f9400Sryan_chen 				else if ( cnt == 3 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat2 );
15205c8f9400Sryan_chen 				else if ( cnt == 4 ) Write_Mem_Dat_DD( adr, len | (len << 16)   );
15215c8f9400Sryan_chen 				else
15225c8f9400Sryan_chen   #endif
15235c8f9400Sryan_chen 				                     Write_Mem_Dat_DD( adr, gdata );
15245c8f9400Sryan_chen   #ifdef SelectSimpleData
15255c8f9400Sryan_chen 				gdata = gdata ^ SimpleData_XORVal;
15265c8f9400Sryan_chen   #else
15275c8f9400Sryan_chen 				gdata += DATA_IncVal;
15285c8f9400Sryan_chen   #endif
15295c8f9400Sryan_chen 			}
15305c8f9400Sryan_chen 			adr_srt += DMA_PakSize;
15315c8f9400Sryan_chen 		} // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++)
15325c8f9400Sryan_chen 	} // End if ( eng->run.tm_tx_only )
15335c8f9400Sryan_chen } // End void setup_buf (MAC_ENGINE *eng)
15345c8f9400Sryan_chen 
15355c8f9400Sryan_chen //------------------------------------------------------------
15365c8f9400Sryan_chen // Check data of one packet
15375c8f9400Sryan_chen //------------------------------------------------------------
check_Data(MAC_ENGINE * eng,uint32_t datbase,int32_t number)15385c8f9400Sryan_chen char check_Data (MAC_ENGINE *eng, uint32_t datbase, int32_t number)
15395c8f9400Sryan_chen {
15405c8f9400Sryan_chen 	int32_t       number_dat;
15415c8f9400Sryan_chen 	int        index;
15425c8f9400Sryan_chen 	uint32_t      rdata;
15435c8f9400Sryan_chen 	uint32_t      wp_lst_cur;
15445c8f9400Sryan_chen 	uint32_t      adr_las;
15455c8f9400Sryan_chen 	uint32_t      adr;
15465c8f9400Sryan_chen 	uint32_t      adr_srt;
15475c8f9400Sryan_chen 	uint32_t      adr_end;
15485c8f9400Sryan_chen #ifdef SelectSimpleDA
15495c8f9400Sryan_chen 	int        cnt;
15505c8f9400Sryan_chen 	uint32_t      len;
15515c8f9400Sryan_chen 	uint32_t      gdata_bak;
15525c8f9400Sryan_chen #endif
15535c8f9400Sryan_chen 	uint32_t      gdata;
15545c8f9400Sryan_chen 
15555c8f9400Sryan_chen 	uint32_t      wp;
15565c8f9400Sryan_chen 
15575c8f9400Sryan_chen 	nt_log_func_name();
15585c8f9400Sryan_chen 
15595c8f9400Sryan_chen 	if (eng->arg.ctrl.b.single_packet)
15605c8f9400Sryan_chen 		number_dat = 0;
15615c8f9400Sryan_chen 	else
15625c8f9400Sryan_chen 		number_dat = number;
15635c8f9400Sryan_chen 
15645c8f9400Sryan_chen 	wp_lst_cur             = eng->dat.wp_lst[ number ];
15655c8f9400Sryan_chen 	eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[ number_dat ];
15665c8f9400Sryan_chen 
15675c8f9400Sryan_chen 	if ( DbgPrn_FRAME_LEN )
15685c8f9400Sryan_chen 		PRINTF( FP_LOG, "[check_Data     ] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN_Cur, number, eng->run.loop_of_cnt, eng->run.loop_cnt );
15695c8f9400Sryan_chen 
15705c8f9400Sryan_chen 	adr_srt = datbase;
15715c8f9400Sryan_chen 	adr_end = adr_srt + PktByteSize;
15725c8f9400Sryan_chen 
15735c8f9400Sryan_chen #if defined(SelectSimpleData)
15745c8f9400Sryan_chen     #ifdef SimpleData_Fix
15755c8f9400Sryan_chen 	switch( number_dat % SimpleData_FixNum ) {
15765c8f9400Sryan_chen 		case  0 : gdata = SimpleData_FixVal00; break;
15775c8f9400Sryan_chen 		case  1 : gdata = SimpleData_FixVal01; break;
15785c8f9400Sryan_chen 		case  2 : gdata = SimpleData_FixVal02; break;
15795c8f9400Sryan_chen 		case  3 : gdata = SimpleData_FixVal03; break;
15805c8f9400Sryan_chen 		case  4 : gdata = SimpleData_FixVal04; break;
15815c8f9400Sryan_chen 		case  5 : gdata = SimpleData_FixVal05; break;
15825c8f9400Sryan_chen 		case  6 : gdata = SimpleData_FixVal06; break;
15835c8f9400Sryan_chen 		case  7 : gdata = SimpleData_FixVal07; break;
15845c8f9400Sryan_chen 		case  8 : gdata = SimpleData_FixVal08; break;
15855c8f9400Sryan_chen 		case  9 : gdata = SimpleData_FixVal09; break;
15865c8f9400Sryan_chen 		case 10 : gdata = SimpleData_FixVal10; break;
15875c8f9400Sryan_chen 		default : gdata = SimpleData_FixVal11; break;
15885c8f9400Sryan_chen 	}
15895c8f9400Sryan_chen     #else
15905c8f9400Sryan_chen 	gdata   = 0x11111111 * (( number_dat + SEED_START ) % 256 );
15915c8f9400Sryan_chen     #endif
15925c8f9400Sryan_chen #else
15935c8f9400Sryan_chen 	gdata   = DATA_SEED( number_dat + SEED_START );
15945c8f9400Sryan_chen #endif
15955c8f9400Sryan_chen 
15965c8f9400Sryan_chen //printf("check_buf: %08x - %08x [%08x]\n", adr_srt, adr_end, datbase);
15975c8f9400Sryan_chen 	wp      = eng->dat.wp_fir;
15985c8f9400Sryan_chen 	adr_las = adr_end - 4;
15995c8f9400Sryan_chen #ifdef SelectSimpleDA
16005c8f9400Sryan_chen 	cnt     = 0;
16015c8f9400Sryan_chen 	len     = ((( eng->dat.FRAME_LEN_Cur-14 ) & 0xff ) << 8 ) |
16025c8f9400Sryan_chen 	          ( ( eng->dat.FRAME_LEN_Cur-14 )          >> 8 );
16035c8f9400Sryan_chen #endif
16045c8f9400Sryan_chen 
16055c8f9400Sryan_chen 	if ( DbgPrn_Bufdat )
16065c8f9400Sryan_chen 		PRINTF( FP_LOG, " Inf:%08x ~ %08x(%08x) %08x [Des:%d][loop[%d]:%d]\n", adr_srt, adr_end, adr_las, gdata, number, eng->run.loop_of_cnt, eng->run.loop_cnt );
16075c8f9400Sryan_chen 
16085c8f9400Sryan_chen 	for ( adr = adr_srt; adr < adr_end; adr+=4 ) {
16095c8f9400Sryan_chen #ifdef SelectSimpleDA
16105c8f9400Sryan_chen 		cnt++;
16115c8f9400Sryan_chen 		if      ( cnt == 1 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat0; }
16125c8f9400Sryan_chen 		else if ( cnt == 2 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat1; }
16135c8f9400Sryan_chen 		else if ( cnt == 3 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat2; }
16145c8f9400Sryan_chen 		else if ( cnt == 4 ) { gdata_bak = gdata; gdata = len | (len << 16);   }
16155c8f9400Sryan_chen #endif
16165c8f9400Sryan_chen 		rdata = Read_Mem_Dat_DD( adr );
16175c8f9400Sryan_chen 		if ( adr == adr_las )
16185c8f9400Sryan_chen 			wp = wp & wp_lst_cur;
16195c8f9400Sryan_chen 
16205c8f9400Sryan_chen 		if ( ( rdata & wp ) != ( gdata & wp ) ) {
16215c8f9400Sryan_chen 			PRINTF( FP_LOG, "\nError: Adr:%08x[%3d] (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, ( adr - adr_srt ) / 4, rdata, gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt );
16225c8f9400Sryan_chen 			for ( index = 0; index < 6; index++ )
16235c8f9400Sryan_chen 				PRINTF( FP_LOG, "Rep  : Adr:%08x      (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, Read_Mem_Dat_DD( adr ), gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt );
16245c8f9400Sryan_chen 
16255c8f9400Sryan_chen 			if (DbgPrn_DumpMACCnt)
16265c8f9400Sryan_chen 				dump_mac_ROreg(eng);
16275c8f9400Sryan_chen 
16285c8f9400Sryan_chen 			return( FindErr( eng, Err_Flag_Check_Buf_Data ) );
16295c8f9400Sryan_chen 		} // End if ( (rdata & wp) != (gdata & wp) )
16305c8f9400Sryan_chen 		if ( DbgPrn_BufdatDetail )
16315c8f9400Sryan_chen 			PRINTF( FP_LOG, " Adr:%08x[%3d] (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, ( adr - adr_srt ) / 4, rdata, gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt );
16325c8f9400Sryan_chen 
16335c8f9400Sryan_chen #ifdef SelectSimpleDA
16345c8f9400Sryan_chen 		if ( cnt <= 4 )
16355c8f9400Sryan_chen 			gdata = gdata_bak;
16365c8f9400Sryan_chen #endif
16375c8f9400Sryan_chen 
16385c8f9400Sryan_chen #if defined(SelectSimpleData)
16395c8f9400Sryan_chen 		gdata = gdata ^ SimpleData_XORVal;
16405c8f9400Sryan_chen #else
16415c8f9400Sryan_chen 		gdata += DATA_IncVal;
16425c8f9400Sryan_chen #endif
16435c8f9400Sryan_chen 
16445c8f9400Sryan_chen 		wp     = 0xffffffff;
16455c8f9400Sryan_chen 	}
16465c8f9400Sryan_chen 	return(0);
16475c8f9400Sryan_chen } // End char check_Data (MAC_ENGINE *eng, uint32_t datbase, int32_t number)
16485c8f9400Sryan_chen 
16495c8f9400Sryan_chen //------------------------------------------------------------
check_buf(MAC_ENGINE * eng,int loopcnt)16505c8f9400Sryan_chen char check_buf (MAC_ENGINE *eng, int loopcnt)
16515c8f9400Sryan_chen {
16525c8f9400Sryan_chen 	int32_t des_num;
16535c8f9400Sryan_chen 	uint32_t desadr;
16544fad5549SDylan Hung #ifdef CHECK_RX_DATA
16555c8f9400Sryan_chen 	uint32_t datbase;
16564fad5549SDylan Hung #endif
16575c8f9400Sryan_chen 	nt_log_func_name();
16585c8f9400Sryan_chen 
16595c8f9400Sryan_chen 	desadr = eng->run.rdes_base + (16 * eng->dat.Des_Num) - 4;
16605c8f9400Sryan_chen 	for (des_num = eng->dat.Des_Num - 1; des_num >= 0; des_num--) {
16615c8f9400Sryan_chen #ifdef CHECK_RX_DATA
16625c8f9400Sryan_chen 		datbase = AT_BUF_MEMRW(Read_Mem_Des_DD(desadr) & 0xfffffffc);
16635c8f9400Sryan_chen 		if (check_Data(eng, datbase, des_num)) {
16645c8f9400Sryan_chen 			check_int(eng, "");
16655c8f9400Sryan_chen 			return (1);
16665c8f9400Sryan_chen 		}
16675c8f9400Sryan_chen 		if (check_int(eng, ""))
16685c8f9400Sryan_chen 			return 1;
16695c8f9400Sryan_chen #endif
16705c8f9400Sryan_chen 		desadr -= 16;
16715c8f9400Sryan_chen 	}
16725c8f9400Sryan_chen 	if (check_int(eng, ""))
16735c8f9400Sryan_chen 		return (1);
16745c8f9400Sryan_chen 
16755c8f9400Sryan_chen #if defined(Delay_CheckData_LoopNum) && defined(Delay_CheckData)
16765c8f9400Sryan_chen 	if ((loopcnt % Delay_CheckData_LoopNum) == 0)
16775c8f9400Sryan_chen 		DELAY(Delay_CheckData);
16785c8f9400Sryan_chen #endif
16795c8f9400Sryan_chen 	return (0);
16805c8f9400Sryan_chen } // End char check_buf (MAC_ENGINE *eng, int loopcnt)
16815c8f9400Sryan_chen 
16825c8f9400Sryan_chen //------------------------------------------------------------
16835c8f9400Sryan_chen // Descriptor
16845c8f9400Sryan_chen //------------------------------------------------------------
setup_txdes(MAC_ENGINE * eng,uint32_t desadr,uint32_t bufbase)16855c8f9400Sryan_chen void setup_txdes (MAC_ENGINE *eng, uint32_t desadr, uint32_t bufbase)
16865c8f9400Sryan_chen {
16875c8f9400Sryan_chen 	uint32_t bufadr;
16885c8f9400Sryan_chen 	uint32_t bufadrgap;
16895c8f9400Sryan_chen 	uint32_t desval = 0;
16905c8f9400Sryan_chen 	int32_t des_num;
16915c8f9400Sryan_chen 
16925c8f9400Sryan_chen 	nt_log_func_name();
16935c8f9400Sryan_chen 
16945c8f9400Sryan_chen 	bufadr = bufbase;
16955c8f9400Sryan_chen 	if (eng->arg.ctrl.b.single_packet)
16965c8f9400Sryan_chen 		bufadrgap = 0;
16975c8f9400Sryan_chen 	else
16985c8f9400Sryan_chen 		bufadrgap = DMA_PakSize;
16995c8f9400Sryan_chen 
17005c8f9400Sryan_chen 	if (eng->run.TM_TxDataEn) {
17015c8f9400Sryan_chen 		for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) {
17025c8f9400Sryan_chen 			eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num];
17035c8f9400Sryan_chen 			desval = TDES_IniVal;
17045c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x04, 0);
17055c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x08, 0);
17065c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x0C, bufadr);
17075c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr, desval);
17085c8f9400Sryan_chen 
17095c8f9400Sryan_chen 			if (DbgPrn_FRAME_LEN)
17105c8f9400Sryan_chen 				PRINTF(
17115c8f9400Sryan_chen 				    FP_LOG,
17125c8f9400Sryan_chen 				    "[setup_txdes    ] "
17135c8f9400Sryan_chen 				    "FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n",
17145c8f9400Sryan_chen 				    eng->dat.FRAME_LEN_Cur, des_num,
17155c8f9400Sryan_chen 				    eng->run.loop_of_cnt, eng->run.loop_cnt);
17165c8f9400Sryan_chen 
17175c8f9400Sryan_chen 			if (DbgPrn_BufAdr)
17185c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][setup_txdes] "
17195c8f9400Sryan_chen 				       "%08x [%08x]\n",
17205c8f9400Sryan_chen 				       eng->run.loop_of_cnt, eng->run.loop_cnt,
17215c8f9400Sryan_chen 				       des_num, desadr, bufadr);
17225c8f9400Sryan_chen 
17235c8f9400Sryan_chen 			desadr += 16;
17245c8f9400Sryan_chen 			bufadr += bufadrgap;
17255c8f9400Sryan_chen 		}
17265c8f9400Sryan_chen 		barrier();
17275c8f9400Sryan_chen 		Write_Mem_Des_DD(desadr - 0x10, desval | EOR_IniVal);
17285c8f9400Sryan_chen 	} else {
17295c8f9400Sryan_chen 		Write_Mem_Des_DD(desadr, 0);
17305c8f9400Sryan_chen 	}
17315c8f9400Sryan_chen }
17325c8f9400Sryan_chen 
17335c8f9400Sryan_chen //------------------------------------------------------------
setup_rxdes(MAC_ENGINE * eng,uint32_t desadr,uint32_t bufbase)17345c8f9400Sryan_chen void setup_rxdes (MAC_ENGINE *eng, uint32_t desadr, uint32_t bufbase)
17355c8f9400Sryan_chen {
17365c8f9400Sryan_chen 	uint32_t      bufadr;
17375c8f9400Sryan_chen 	uint32_t      desval;
17385c8f9400Sryan_chen 	int32_t       des_num;
17395c8f9400Sryan_chen 
17405c8f9400Sryan_chen 	nt_log_func_name();
17415c8f9400Sryan_chen 
17425c8f9400Sryan_chen 	bufadr = bufbase;
17435c8f9400Sryan_chen 	desval = RDES_IniVal;
17445c8f9400Sryan_chen 	if ( eng->run.TM_RxDataEn ) {
17455c8f9400Sryan_chen 		for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) {
17465c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x04, 0     );
17475c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x08, 0     );
17485c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x0C, bufadr);
17495c8f9400Sryan_chen 			Write_Mem_Des_DD(desadr + 0x00, desval);
17505c8f9400Sryan_chen 
17515c8f9400Sryan_chen 			if ( DbgPrn_BufAdr )
17525c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][setup_rxdes] %08x [%08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, desadr, bufadr);
17535c8f9400Sryan_chen 
17545c8f9400Sryan_chen 			desadr += 16;
17555c8f9400Sryan_chen 			bufadr += DMA_PakSize;
17565c8f9400Sryan_chen 		}
17575c8f9400Sryan_chen 		barrier();
17585c8f9400Sryan_chen 		Write_Mem_Des_DD( desadr - 0x10, desval | EOR_IniVal );
17595c8f9400Sryan_chen 	}
17605c8f9400Sryan_chen 	else {
17615c8f9400Sryan_chen 		Write_Mem_Des_DD( desadr, 0x80000000 );
17625c8f9400Sryan_chen 	} // End if ( eng->run.TM_RxDataEn )
17635c8f9400Sryan_chen } // End void setup_rxdes (uint32_t desadr, uint32_t bufbase)
17645c8f9400Sryan_chen 
17655c8f9400Sryan_chen //------------------------------------------------------------
17665c8f9400Sryan_chen // First setting TX and RX information
17675c8f9400Sryan_chen //------------------------------------------------------------
setup_des(MAC_ENGINE * eng,uint32_t bufnum)17685c8f9400Sryan_chen void setup_des (MAC_ENGINE *eng, uint32_t bufnum)
17695c8f9400Sryan_chen {
17705c8f9400Sryan_chen 	if (DbgPrn_BufAdr) {
17715c8f9400Sryan_chen 		printf("setup_des: %d\n", bufnum);
17725c8f9400Sryan_chen 		debug_pause();
17735c8f9400Sryan_chen 	}
17745c8f9400Sryan_chen 
17755c8f9400Sryan_chen 	eng->dat.DMA_Base_Tx =
17765c8f9400Sryan_chen 	    ZeroCopy_OFFSET + eng->dat.DMA_Base_Setup;
17775c8f9400Sryan_chen 	eng->dat.DMA_Base_Rx = ZeroCopy_OFFSET + GET_DMA_BASE(eng, 0);
17785c8f9400Sryan_chen 
17795c8f9400Sryan_chen 	setup_txdes(eng, eng->run.tdes_base,
17805c8f9400Sryan_chen 		    AT_MEMRW_BUF(eng->dat.DMA_Base_Tx));
17815c8f9400Sryan_chen 	setup_rxdes(eng, eng->run.rdes_base,
17825c8f9400Sryan_chen 		    AT_MEMRW_BUF(eng->dat.DMA_Base_Rx));
17835c8f9400Sryan_chen } // End void setup_des (uint32_t bufnum)
17845c8f9400Sryan_chen 
17855c8f9400Sryan_chen //------------------------------------------------------------
17865c8f9400Sryan_chen // Move buffer point of TX and RX descriptor to next DMA buffer
17875c8f9400Sryan_chen //------------------------------------------------------------
setup_des_loop(MAC_ENGINE * eng,uint32_t bufnum)17885c8f9400Sryan_chen void setup_des_loop (MAC_ENGINE *eng, uint32_t bufnum)
17895c8f9400Sryan_chen {
17905c8f9400Sryan_chen 	int32_t des_num;
17915c8f9400Sryan_chen 	uint32_t H_rx_desadr;
17925c8f9400Sryan_chen 	uint32_t H_tx_desadr;
17935c8f9400Sryan_chen 	uint32_t H_tx_bufadr;
17945c8f9400Sryan_chen 	uint32_t H_rx_bufadr;
17955c8f9400Sryan_chen 
17965c8f9400Sryan_chen 	nt_log_func_name();
17975c8f9400Sryan_chen 
17985c8f9400Sryan_chen 	if (eng->run.TM_RxDataEn) {
17995c8f9400Sryan_chen 		H_rx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Rx);
18005c8f9400Sryan_chen 		H_rx_desadr = eng->run.rdes_base;
18015c8f9400Sryan_chen 		for (des_num = 0; des_num < eng->dat.Des_Num - 1; des_num++) {
18025c8f9400Sryan_chen 			Write_Mem_Des_DD(H_rx_desadr + 0x0C, H_rx_bufadr);
18035c8f9400Sryan_chen 			Write_Mem_Des_DD(H_rx_desadr, RDES_IniVal);
18045c8f9400Sryan_chen 			if (DbgPrn_BufAdr)
18055c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][setup_rxdes] "
18065c8f9400Sryan_chen 				       "%08x [%08x]\n",
18075c8f9400Sryan_chen 				       eng->run.loop_of_cnt, eng->run.loop_cnt,
18085c8f9400Sryan_chen 				       des_num, H_rx_desadr, H_rx_bufadr);
18095c8f9400Sryan_chen 
18105c8f9400Sryan_chen 			H_rx_bufadr += DMA_PakSize;
18115c8f9400Sryan_chen 			H_rx_desadr += 16;
18125c8f9400Sryan_chen 		}
18135c8f9400Sryan_chen 		Write_Mem_Des_DD(H_rx_desadr + 0x0C, H_rx_bufadr);
18145c8f9400Sryan_chen 		Write_Mem_Des_DD(H_rx_desadr, RDES_IniVal | EOR_IniVal);
18155c8f9400Sryan_chen 		if (DbgPrn_BufAdr)
18165c8f9400Sryan_chen 			printf("[loop[%d]:%4d][des:%4d][setup_rxdes] %08x "
18175c8f9400Sryan_chen 			       "[%08x]\n",
18185c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt, des_num,
18195c8f9400Sryan_chen 			       H_rx_desadr, H_rx_bufadr);
18205c8f9400Sryan_chen 	}
18215c8f9400Sryan_chen 
18225c8f9400Sryan_chen 	if (eng->run.TM_TxDataEn) {
18235c8f9400Sryan_chen 		H_tx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Tx);
18245c8f9400Sryan_chen 		H_tx_desadr = eng->run.tdes_base;
18255c8f9400Sryan_chen 		for (des_num = 0; des_num < eng->dat.Des_Num - 1; des_num++) {
18265c8f9400Sryan_chen 			eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num];
18275c8f9400Sryan_chen 			Write_Mem_Des_DD(H_tx_desadr + 0x0C, H_tx_bufadr);
18285c8f9400Sryan_chen 			Write_Mem_Des_DD(H_tx_desadr, TDES_IniVal);
18295c8f9400Sryan_chen 			if (DbgPrn_BufAdr)
18305c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][setup_txdes] "
18315c8f9400Sryan_chen 				       "%08x [%08x]\n",
18325c8f9400Sryan_chen 				       eng->run.loop_of_cnt, eng->run.loop_cnt,
18335c8f9400Sryan_chen 				       des_num, H_tx_desadr, H_tx_bufadr);
18345c8f9400Sryan_chen 
18355c8f9400Sryan_chen 			H_tx_bufadr += DMA_PakSize;
18365c8f9400Sryan_chen 			H_tx_desadr += 16;
18375c8f9400Sryan_chen 		}
18385c8f9400Sryan_chen 		eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num];
18395c8f9400Sryan_chen 		Write_Mem_Des_DD(H_tx_desadr + 0x0C, H_tx_bufadr);
18405c8f9400Sryan_chen 		Write_Mem_Des_DD(H_tx_desadr, TDES_IniVal | EOR_IniVal);
18415c8f9400Sryan_chen 		if (DbgPrn_BufAdr)
18425c8f9400Sryan_chen 			printf("[loop[%d]:%4d][des:%4d][setup_txdes] %08x "
18435c8f9400Sryan_chen 			       "[%08x]\n",
18445c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt, des_num,
18455c8f9400Sryan_chen 			       H_tx_desadr, H_tx_bufadr);
18465c8f9400Sryan_chen 	}
18475c8f9400Sryan_chen } // End void setup_des_loop (uint32_t bufnum)
18485c8f9400Sryan_chen 
18495c8f9400Sryan_chen //------------------------------------------------------------
check_des_header_Tx(MAC_ENGINE * eng,char * type,uint32_t adr,int32_t desnum)18505c8f9400Sryan_chen char check_des_header_Tx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum)
18515c8f9400Sryan_chen {
18525c8f9400Sryan_chen 	int timeout = 0;
18535c8f9400Sryan_chen 
18545c8f9400Sryan_chen 	eng->dat.TxDes0DW = Read_Mem_Des_DD(adr);
18555c8f9400Sryan_chen 
18565c8f9400Sryan_chen 	while (HWOwnTx(eng->dat.TxDes0DW)) {
18575c8f9400Sryan_chen 		// we will run again, if transfer has not been completed.
18585c8f9400Sryan_chen 		if ((eng->run.tm_tx_only || eng->run.TM_RxDataEn) &&
18595c8f9400Sryan_chen 		    (++timeout > eng->run.timeout_th)) {
18605c8f9400Sryan_chen 			PRINTF(FP_LOG,
18615c8f9400Sryan_chen 			       "[%sTxDesOwn] Address %08x = %08x "
18625c8f9400Sryan_chen 			       "[Des:%d][loop[%d]:%d]\n",
18635c8f9400Sryan_chen 			       type, adr, eng->dat.TxDes0DW, desnum,
18645c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt);
18655c8f9400Sryan_chen 			return (FindErr_Des(eng, Des_Flag_TxOwnTimeOut));
18665c8f9400Sryan_chen 		}
18675c8f9400Sryan_chen 
18685c8f9400Sryan_chen #ifdef Delay_ChkTxOwn
18695c8f9400Sryan_chen 		DELAY(Delay_ChkTxOwn);
18705c8f9400Sryan_chen #endif
18715c8f9400Sryan_chen 		eng->dat.TxDes0DW = Read_Mem_Des_DD(adr);
18725c8f9400Sryan_chen 	}
18735c8f9400Sryan_chen 
18745c8f9400Sryan_chen 	return(0);
18755c8f9400Sryan_chen } // End char check_des_header_Tx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum)
18765c8f9400Sryan_chen 
18775c8f9400Sryan_chen //------------------------------------------------------------
check_des_header_Rx(MAC_ENGINE * eng,char * type,uint32_t adr,int32_t desnum)18785c8f9400Sryan_chen char check_des_header_Rx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum)
18795c8f9400Sryan_chen {
18805c8f9400Sryan_chen #ifdef CheckRxOwn
18815c8f9400Sryan_chen 	int timeout = 0;
18825c8f9400Sryan_chen 
18835c8f9400Sryan_chen 	eng->dat.RxDes0DW = Read_Mem_Des_DD(adr);
18845c8f9400Sryan_chen 
18855c8f9400Sryan_chen 	while (HWOwnRx(eng->dat.RxDes0DW)) {
18865c8f9400Sryan_chen 		// we will run again, if transfer has not been completed.
18875c8f9400Sryan_chen 		if (eng->run.TM_TxDataEn && (++timeout > eng->run.timeout_th)) {
18885c8f9400Sryan_chen #if 0
18895c8f9400Sryan_chen 			printf("[%sRxDesOwn] Address %08x = %08x "
18905c8f9400Sryan_chen 			       "[Des:%d][loop[%d]:%d]\n",
18915c8f9400Sryan_chen 			       type, adr, eng->dat.RxDes0DW, desnum,
18925c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt);
18935c8f9400Sryan_chen #endif
18945c8f9400Sryan_chen 			FindErr_Des(eng, Des_Flag_RxOwnTimeOut);
18955c8f9400Sryan_chen 			return (2);
18965c8f9400Sryan_chen 		}
18975c8f9400Sryan_chen 
18985c8f9400Sryan_chen   #ifdef Delay_ChkRxOwn
18995c8f9400Sryan_chen 		DELAY(Delay_ChkRxOwn);
19005c8f9400Sryan_chen   #endif
19015c8f9400Sryan_chen 		eng->dat.RxDes0DW = Read_Mem_Des_DD(adr);
19025c8f9400Sryan_chen 	};
19035c8f9400Sryan_chen 
19045c8f9400Sryan_chen   #ifdef CheckRxLen
19055c8f9400Sryan_chen 	if ( DbgPrn_FRAME_LEN )
19065c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sRxDes          ] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", type, ( eng->dat.FRAME_LEN_Cur + 4 ), desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19075c8f9400Sryan_chen 
19085c8f9400Sryan_chen 	if ( ( eng->dat.RxDes0DW & 0x3fff ) != ( eng->dat.FRAME_LEN_Cur + 4 ) ) {
19095c8f9400Sryan_chen 		eng->dat.RxDes3DW = Read_Mem_Des_DD( adr + 12 );
19105c8f9400Sryan_chen 		PRINTF( FP_LOG, "[%sRxDes] Error Frame Length %08x:%08x %08x(%4d/%4d) [Des:%d][loop[%d]:%d]\n",   type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, ( eng->dat.RxDes0DW & 0x3fff ), ( eng->dat.FRAME_LEN_Cur + 4 ), desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19115c8f9400Sryan_chen 		FindErr_Des( eng, Des_Flag_FrameLen );
19125c8f9400Sryan_chen 	}
19135c8f9400Sryan_chen   #endif // End CheckRxLen
19145c8f9400Sryan_chen 
19155c8f9400Sryan_chen 	if ( eng->dat.RxDes0DW & RXDES_EM_ALL ) {
19165c8f9400Sryan_chen 		eng->dat.RxDes3DW = Read_Mem_Des_DD( adr + 12 );
19175c8f9400Sryan_chen   #ifdef CheckRxErr
19185c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_RXERR ) {
19195c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Error RxErr        %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19205c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_RxErr );
19215c8f9400Sryan_chen 		}
19225c8f9400Sryan_chen   #endif // End CheckRxErr
19235c8f9400Sryan_chen 
19245c8f9400Sryan_chen   #ifdef CheckCRC
19255c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_CRC ) {
19265c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Error CRC          %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19275c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_CRC );
19285c8f9400Sryan_chen 		}
19295c8f9400Sryan_chen   #endif // End CheckCRC
19305c8f9400Sryan_chen 
19315c8f9400Sryan_chen   #ifdef CheckFTL
19325c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_FTL ) {
19335c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Error FTL          %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19345c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_FTL );
19355c8f9400Sryan_chen 		}
19365c8f9400Sryan_chen   #endif // End CheckFTL
19375c8f9400Sryan_chen 
19385c8f9400Sryan_chen   #ifdef CheckRunt
19395c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_RUNT) {
19405c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Error Runt         %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19415c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_Runt );
19425c8f9400Sryan_chen 		}
19435c8f9400Sryan_chen   #endif // End CheckRunt
19445c8f9400Sryan_chen 
19455c8f9400Sryan_chen   #ifdef CheckOddNibble
19465c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_ODD_NB ) {
19475c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Odd Nibble         %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19485c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_OddNibble );
19495c8f9400Sryan_chen 		}
19505c8f9400Sryan_chen   #endif // End CheckOddNibble
19515c8f9400Sryan_chen 
19525c8f9400Sryan_chen   #ifdef CheckRxFIFOFull
19535c8f9400Sryan_chen 		if ( eng->dat.RxDes0DW & RXDES_EM_FIFO_FULL ) {
19545c8f9400Sryan_chen 			PRINTF( FP_LOG, "[%sRxDes] Error Rx FIFO Full %08x:%08x %08x            [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt );
19555c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_RxFIFOFull );
19565c8f9400Sryan_chen 		}
19575c8f9400Sryan_chen   #endif // End CheckRxFIFOFull
19585c8f9400Sryan_chen 	}
19595c8f9400Sryan_chen 
19605c8f9400Sryan_chen #endif // End CheckRxOwn
19615c8f9400Sryan_chen 
1962783c0c9bSDylan Hung 	if ( eng->flg.error )
19635c8f9400Sryan_chen 		return(1);
19645c8f9400Sryan_chen 	else
19655c8f9400Sryan_chen 		return(0);
19665c8f9400Sryan_chen } // End char check_des_header_Rx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum)
19675c8f9400Sryan_chen 
19685c8f9400Sryan_chen //------------------------------------------------------------
check_des(MAC_ENGINE * eng,uint32_t bufnum,int checkpoint)19695c8f9400Sryan_chen char check_des (MAC_ENGINE *eng, uint32_t bufnum, int checkpoint)
19705c8f9400Sryan_chen {
19715c8f9400Sryan_chen 	int32_t       desnum;
19725c8f9400Sryan_chen 	int8_t       desnum_last;
19735c8f9400Sryan_chen 	uint32_t      H_rx_desadr;
19745c8f9400Sryan_chen 	uint32_t      H_tx_desadr;
19755c8f9400Sryan_chen 	uint32_t      H_tx_bufadr;
19765c8f9400Sryan_chen 	uint32_t      H_rx_bufadr;
19775c8f9400Sryan_chen #ifdef Delay_DesGap
19785c8f9400Sryan_chen 	uint32_t      dly_cnt = 0;
19795c8f9400Sryan_chen 	uint32_t      dly_max = Delay_CntMaxIncVal;
19805c8f9400Sryan_chen #endif
19815c8f9400Sryan_chen 	int ret;
19825c8f9400Sryan_chen 
19835c8f9400Sryan_chen 	nt_log_func_name();
19845c8f9400Sryan_chen 
19855c8f9400Sryan_chen 	/* Fire the engine to send and recvice */
19865c8f9400Sryan_chen 	mac_reg_write(eng, 0x1c, 0x00000001); // Rx Poll
19875c8f9400Sryan_chen 	mac_reg_write(eng, 0x18, 0x00000001); // Tx Poll
19885c8f9400Sryan_chen 
19895c8f9400Sryan_chen #ifndef SelectSimpleDes
19905c8f9400Sryan_chen 	/* base of the descriptors */
19915c8f9400Sryan_chen 	H_tx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Tx);
19925c8f9400Sryan_chen 	H_rx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Rx);
19935c8f9400Sryan_chen #endif
19945c8f9400Sryan_chen 	H_rx_desadr = eng->run.rdes_base;
19955c8f9400Sryan_chen 	H_tx_desadr = eng->run.tdes_base;
19965c8f9400Sryan_chen 
19975c8f9400Sryan_chen #ifdef Delay_DES
19985c8f9400Sryan_chen 	DELAY(Delay_DES);
19995c8f9400Sryan_chen #endif
20005c8f9400Sryan_chen 
20015c8f9400Sryan_chen 	for (desnum = 0; desnum < eng->dat.Des_Num; desnum++) {
20025c8f9400Sryan_chen 		desnum_last = (desnum == (eng->dat.Des_Num - 1)) ? 1 : 0;
20035c8f9400Sryan_chen 		if ( DbgPrn_BufAdr ) {
20045c8f9400Sryan_chen 			if ( checkpoint )
20055c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][check_des  ] %08x %08x [%08x %08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, desnum, ( H_tx_desadr ), ( H_rx_desadr ), Read_Mem_Des_DD( H_tx_desadr + 12 ), Read_Mem_Des_DD( H_rx_desadr + 12 ) );
20065c8f9400Sryan_chen 			else
20075c8f9400Sryan_chen 				printf("[loop[%d]:%4d][des:%4d][check_des  ] %08x %08x [%08x %08x]->[%08x %08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, desnum, ( H_tx_desadr ), ( H_rx_desadr ), Read_Mem_Des_DD( H_tx_desadr + 12 ), Read_Mem_Des_DD( H_rx_desadr + 12 ), H_tx_bufadr, H_rx_bufadr );
20085c8f9400Sryan_chen 		}
20095c8f9400Sryan_chen 
20105c8f9400Sryan_chen 		//[Delay]--------------------
20115c8f9400Sryan_chen #ifdef Delay_DesGap
20125c8f9400Sryan_chen //		if ( dly_cnt++ > 3 ) {
20135c8f9400Sryan_chen 		if ( dly_cnt > Delay_CntMax ) {
20145c8f9400Sryan_chen //			switch ( rand() % 12 ) {
20155c8f9400Sryan_chen //				case 1 : dly_max = 00000; break;
20165c8f9400Sryan_chen //				case 3 : dly_max = 20000; break;
20175c8f9400Sryan_chen //				case 5 : dly_max = 40000; break;
20185c8f9400Sryan_chen //				case 7 : dly_max = 60000; break;
20195c8f9400Sryan_chen //				defaule: dly_max = 70000; break;
20205c8f9400Sryan_chen //			}
20215c8f9400Sryan_chen //
20225c8f9400Sryan_chen //			dly_max += ( rand() % 4 ) * 14321;
20235c8f9400Sryan_chen //
20245c8f9400Sryan_chen //			while (dly_cnt < dly_max) {
20255c8f9400Sryan_chen //				dly_cnt++;
20265c8f9400Sryan_chen //			}
20275c8f9400Sryan_chen 			DELAY( Delay_DesGap );
20285c8f9400Sryan_chen 			dly_cnt = 0;
20295c8f9400Sryan_chen 		}
20305c8f9400Sryan_chen 		else {
20315c8f9400Sryan_chen 			dly_cnt++;
20325c8f9400Sryan_chen //			timeout = 0;
20335c8f9400Sryan_chen //			while (timeout < 50000) {timeout++;};
20345c8f9400Sryan_chen 		}
20355c8f9400Sryan_chen #endif // End Delay_DesGap
20365c8f9400Sryan_chen 
20375c8f9400Sryan_chen 		//[Check Owner Bit]--------------------
20385c8f9400Sryan_chen 		eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[desnum];
20395c8f9400Sryan_chen 		if (DbgPrn_FRAME_LEN)
20405c8f9400Sryan_chen 			PRINTF(FP_LOG,
20415c8f9400Sryan_chen 			       "[check_des      ] "
20425c8f9400Sryan_chen 			       "FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]%d\n",
20435c8f9400Sryan_chen 			       eng->dat.FRAME_LEN_Cur, desnum,
20445c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt,
20455c8f9400Sryan_chen 			       checkpoint);
20465c8f9400Sryan_chen 
20475c8f9400Sryan_chen 		// Check the description of Tx and Rx
20485c8f9400Sryan_chen 		if (eng->run.TM_TxDataEn) {
20495c8f9400Sryan_chen 			ret = check_des_header_Tx(eng, "", H_tx_desadr, desnum);
20505c8f9400Sryan_chen 			if (ret) {
2051783c0c9bSDylan Hung 				eng->flg.n_desc_fail = desnum;
20525c8f9400Sryan_chen 				return ret;
20535c8f9400Sryan_chen 			}
20545c8f9400Sryan_chen 		}
20555c8f9400Sryan_chen 		if (eng->run.TM_RxDataEn) {
20565c8f9400Sryan_chen 			ret = check_des_header_Rx(eng, "", H_rx_desadr, desnum);
20575c8f9400Sryan_chen 			if (ret) {
2058783c0c9bSDylan Hung 				eng->flg.n_desc_fail = desnum;
20595c8f9400Sryan_chen 				return ret;
20605c8f9400Sryan_chen 
20615c8f9400Sryan_chen 			}
20625c8f9400Sryan_chen 		}
20635c8f9400Sryan_chen 
20645c8f9400Sryan_chen #ifndef SelectSimpleDes
20655c8f9400Sryan_chen 		if (!checkpoint) {
20665c8f9400Sryan_chen 			// Setting buffer address to description of Tx and Rx on next stage
20675c8f9400Sryan_chen 			if ( eng->run.TM_RxDataEn ) {
20685c8f9400Sryan_chen 				Write_Mem_Des_DD( H_rx_desadr + 0x0C, H_rx_bufadr );
20695c8f9400Sryan_chen 				if ( desnum_last )
20705c8f9400Sryan_chen 					Write_Mem_Des_DD( H_rx_desadr, RDES_IniVal | EOR_IniVal );
20715c8f9400Sryan_chen 				else
20725c8f9400Sryan_chen 					Write_Mem_Des_DD( H_rx_desadr, RDES_IniVal );
20735c8f9400Sryan_chen 
20745c8f9400Sryan_chen 				readl(H_rx_desadr);
20755c8f9400Sryan_chen 				mac_reg_write(eng, 0x1c, 0x00000000); //Rx Poll
20765c8f9400Sryan_chen 				H_rx_bufadr += DMA_PakSize;
20775c8f9400Sryan_chen 			}
20785c8f9400Sryan_chen 			if ( eng->run.TM_TxDataEn ) {
20795c8f9400Sryan_chen 				Write_Mem_Des_DD( H_tx_desadr + 0x0C, H_tx_bufadr );
20805c8f9400Sryan_chen 				if ( desnum_last )
20815c8f9400Sryan_chen 					Write_Mem_Des_DD( H_tx_desadr, TDES_IniVal | EOR_IniVal );
20825c8f9400Sryan_chen 				else
20835c8f9400Sryan_chen 					Write_Mem_Des_DD( H_tx_desadr, TDES_IniVal );
20845c8f9400Sryan_chen 
20855c8f9400Sryan_chen 				readl(H_tx_desadr);
20865c8f9400Sryan_chen 				mac_reg_write(eng, 0x18, 0x00000000); //Tx Poll
20875c8f9400Sryan_chen 				H_tx_bufadr += DMA_PakSize;
20885c8f9400Sryan_chen 			}
20895c8f9400Sryan_chen 		}
20905c8f9400Sryan_chen #endif // End SelectSimpleDes
20915c8f9400Sryan_chen 
20925c8f9400Sryan_chen 		H_rx_desadr += 16;
20935c8f9400Sryan_chen 		H_tx_desadr += 16;
20945c8f9400Sryan_chen 	} // End for (desnum = 0; desnum < eng->dat.Des_Num; desnum++)
20955c8f9400Sryan_chen 
20965c8f9400Sryan_chen 	return(0);
20975c8f9400Sryan_chen } // End char check_des (MAC_ENGINE *eng, uint32_t bufnum, int checkpoint)
20985c8f9400Sryan_chen //#endif
20995c8f9400Sryan_chen 
21005c8f9400Sryan_chen //------------------------------------------------------------
21015c8f9400Sryan_chen // Print
21025c8f9400Sryan_chen //-----------------------------------------------------------
PrintIO_Header(MAC_ENGINE * eng,uint8_t option)21035c8f9400Sryan_chen void PrintIO_Header (MAC_ENGINE *eng, uint8_t option)
21045c8f9400Sryan_chen {
21055c8f9400Sryan_chen 	int32_t rx_d, step, tmp;
21065c8f9400Sryan_chen 
21075c8f9400Sryan_chen 	if (eng->run.TM_IOStrength) {
21085c8f9400Sryan_chen 		if (eng->io.drv_upper_bond > 1) {
21095c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
21105c8f9400Sryan_chen 			PRINTF(option, "<IO Strength register: [%08x] 0x%08x>",
21115c8f9400Sryan_chen 			       eng->io.mac34_drv_reg.addr,
21125c8f9400Sryan_chen 			       eng->io.mac34_drv_reg.value.w);
21135c8f9400Sryan_chen #else
21145c8f9400Sryan_chen 			PRINTF(option, "<IO Strength register: [%08x] 0x%08x>",
21155c8f9400Sryan_chen 			       eng->io.mac12_drv_reg.addr,
21165c8f9400Sryan_chen 			       eng->io.mac12_drv_reg.value.w);
21175c8f9400Sryan_chen #endif
21185c8f9400Sryan_chen 		}
21195c8f9400Sryan_chen 	}
21205c8f9400Sryan_chen 
21215c8f9400Sryan_chen 	if      ( eng->run.speed_sel[ 0 ] ) { PRINTF( option, "\n[1G  ]========================================>\n" ); }
21225c8f9400Sryan_chen 	else if ( eng->run.speed_sel[ 1 ] ) { PRINTF( option, "\n[100M]========================================>\n" ); }
21235c8f9400Sryan_chen 	else                                { PRINTF( option, "\n[10M ]========================================>\n" ); }
21245c8f9400Sryan_chen 
21255c8f9400Sryan_chen 	if ( !(option == FP_LOG) ) {
21265c8f9400Sryan_chen 		step = eng->io.rx_delay_scan.step;
21275c8f9400Sryan_chen 
21285c8f9400Sryan_chen 		PRINTF(option, "\n    ");
21295c8f9400Sryan_chen 		for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) {
21305c8f9400Sryan_chen 
21315c8f9400Sryan_chen 			if (rx_d < 0) {
21325c8f9400Sryan_chen 				PRINTF(option, "-" );
21335c8f9400Sryan_chen 			} else {
21345c8f9400Sryan_chen 				PRINTF(option, "+" );
21355c8f9400Sryan_chen 			}
21365c8f9400Sryan_chen 		}
21375c8f9400Sryan_chen 
21385c8f9400Sryan_chen 		PRINTF(option, "\n    ");
21395c8f9400Sryan_chen 		for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) {
21405c8f9400Sryan_chen 			tmp = (abs(rx_d) >> 4) & 0xf;
21415c8f9400Sryan_chen 			if (tmp == 0) {
21425c8f9400Sryan_chen 				PRINTF(option, "0" );
21435c8f9400Sryan_chen 			} else {
21445c8f9400Sryan_chen 				PRINTF(option, "%1x", tmp);
21455c8f9400Sryan_chen 			}
21465c8f9400Sryan_chen 		}
21475c8f9400Sryan_chen 
21485c8f9400Sryan_chen 		PRINTF(option, "\n    ");
21495c8f9400Sryan_chen 		for (rx_d = eng->io.rx_delay_scan.begin;
21505c8f9400Sryan_chen 		     rx_d <= eng->io.rx_delay_scan.end; rx_d += step) {
21515c8f9400Sryan_chen 			PRINTF(option, "%1x", (uint32_t)abs(rx_d) & 0xf);
21525c8f9400Sryan_chen 		}
21535c8f9400Sryan_chen 
21545c8f9400Sryan_chen 		PRINTF(option, "\n    ");
21555c8f9400Sryan_chen 		for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) {
21565c8f9400Sryan_chen 			if (eng->io.rx_delay_scan.orig == rx_d) {
21575c8f9400Sryan_chen 				PRINTF(option, "|" );
21585c8f9400Sryan_chen 			} else {
21595c8f9400Sryan_chen 				PRINTF(option, " " );
21605c8f9400Sryan_chen 			}
21615c8f9400Sryan_chen 		}
21625c8f9400Sryan_chen 		PRINTF( option, "\n");
21635c8f9400Sryan_chen 	}
21645c8f9400Sryan_chen }
21655c8f9400Sryan_chen 
21665c8f9400Sryan_chen //------------------------------------------------------------
PrintIO_LineS(MAC_ENGINE * p_eng,uint8_t option)21675c8f9400Sryan_chen void PrintIO_LineS(MAC_ENGINE *p_eng, uint8_t option)
21685c8f9400Sryan_chen {
21695c8f9400Sryan_chen 	if (p_eng->io.tx_delay_scan.orig == p_eng->io.Dly_out_selval) {
21705c8f9400Sryan_chen 		PRINTF( option, "%02x:-", p_eng->io.Dly_out_selval);
21715c8f9400Sryan_chen 	} else {
21725c8f9400Sryan_chen 		PRINTF( option, "%02x: ", p_eng->io.Dly_out_selval);
21735c8f9400Sryan_chen 	}
21745c8f9400Sryan_chen } // End void PrintIO_LineS (MAC_ENGINE *eng, uint8_t option)
21755c8f9400Sryan_chen 
21765c8f9400Sryan_chen //------------------------------------------------------------
PrintIO_Line(MAC_ENGINE * p_eng,uint8_t option)21775c8f9400Sryan_chen void PrintIO_Line(MAC_ENGINE *p_eng, uint8_t option)
21785c8f9400Sryan_chen {
21795c8f9400Sryan_chen 	if ((p_eng->io.Dly_in_selval == p_eng->io.rx_delay_scan.orig) &&
21805c8f9400Sryan_chen 	    (p_eng->io.Dly_out_selval == p_eng->io.tx_delay_scan.orig)) {
21815c8f9400Sryan_chen 		if (1 == p_eng->io.result) {
21825c8f9400Sryan_chen 			PRINTF(option, "X");
21835c8f9400Sryan_chen 		} else if (2 == p_eng->io.result) {
21845c8f9400Sryan_chen 			PRINTF(option, "*");
21855c8f9400Sryan_chen 		} else {
21865c8f9400Sryan_chen 			PRINTF(option, "O");
21875c8f9400Sryan_chen 		}
21885c8f9400Sryan_chen 	} else {
21895c8f9400Sryan_chen 		if (1 == p_eng->io.result) {
21905c8f9400Sryan_chen 			PRINTF(option, "x");
21915c8f9400Sryan_chen 		} else if (2 == p_eng->io.result) {
21925c8f9400Sryan_chen 			PRINTF(option, ".");
21935c8f9400Sryan_chen 		} else {
21945c8f9400Sryan_chen 			PRINTF(option, "o");
21955c8f9400Sryan_chen 		}
21965c8f9400Sryan_chen 	}
21975c8f9400Sryan_chen }
21985c8f9400Sryan_chen 
21995c8f9400Sryan_chen //------------------------------------------------------------
22005c8f9400Sryan_chen // main
22015c8f9400Sryan_chen //------------------------------------------------------------
22025c8f9400Sryan_chen 
22035c8f9400Sryan_chen //------------------------------------------------------------
TestingSetup(MAC_ENGINE * eng)22045c8f9400Sryan_chen void TestingSetup (MAC_ENGINE *eng)
22055c8f9400Sryan_chen {
22065c8f9400Sryan_chen 	nt_log_func_name();
22075c8f9400Sryan_chen 
22085c8f9400Sryan_chen 	//[Setup]--------------------
22095c8f9400Sryan_chen 	setup_framesize( eng );
22105c8f9400Sryan_chen 	setup_buf( eng );
22115c8f9400Sryan_chen }
22125c8f9400Sryan_chen 
22135c8f9400Sryan_chen //------------------------------------------------------------
22145c8f9400Sryan_chen // Return 1 ==> fail
22155c8f9400Sryan_chen // Return 0 ==> PASS
22165c8f9400Sryan_chen //------------------------------------------------------------
TestingLoop(MAC_ENGINE * eng,uint32_t loop_checknum)22175c8f9400Sryan_chen char TestingLoop (MAC_ENGINE *eng, uint32_t loop_checknum)
22185c8f9400Sryan_chen {
22195c8f9400Sryan_chen 	char       checkprd;
22205c8f9400Sryan_chen 	char       looplast;
22215c8f9400Sryan_chen 	char       checken;
22225c8f9400Sryan_chen 	int ret;
22235c8f9400Sryan_chen 
22245c8f9400Sryan_chen 	nt_log_func_name();
22255c8f9400Sryan_chen 
22265c8f9400Sryan_chen 	if (DbgPrn_DumpMACCnt)
22275c8f9400Sryan_chen 		dump_mac_ROreg(eng);
22285c8f9400Sryan_chen 
22295c8f9400Sryan_chen 	//[Setup]--------------------
22305c8f9400Sryan_chen 	eng->run.loop_cnt = 0;
22315c8f9400Sryan_chen 	checkprd = 0;
22325c8f9400Sryan_chen 	checken  = 0;
22335c8f9400Sryan_chen 	looplast = 0;
22345c8f9400Sryan_chen 
22355c8f9400Sryan_chen 
22365c8f9400Sryan_chen 	setup_des(eng, 0);
22375c8f9400Sryan_chen 
22385c8f9400Sryan_chen 	if ( eng->run.TM_WaitStart ) {
22395c8f9400Sryan_chen 		printf("Press any key to start...\n");
22405c8f9400Sryan_chen 		GET_CAHR();
22415c8f9400Sryan_chen 	}
22425c8f9400Sryan_chen 
22435c8f9400Sryan_chen 
22445c8f9400Sryan_chen 	while ( ( eng->run.loop_cnt < eng->run.loop_max ) || eng->arg.loop_inf ) {
22455c8f9400Sryan_chen 		looplast = !eng->arg.loop_inf && ( eng->run.loop_cnt == eng->run.loop_max - 1 );
22465c8f9400Sryan_chen 
22475c8f9400Sryan_chen #ifdef CheckRxBuf
22485c8f9400Sryan_chen 		if (!eng->run.tm_tx_only)
22495c8f9400Sryan_chen 			checkprd = ((eng->run.loop_cnt % loop_checknum) == (loop_checknum - 1));
22505c8f9400Sryan_chen 		checken = looplast | checkprd;
22515c8f9400Sryan_chen #endif
22525c8f9400Sryan_chen 
22535c8f9400Sryan_chen 		if (DbgPrn_BufAdr) {
22545c8f9400Sryan_chen 			printf("for start ======> [%d]%d/%d(%d) looplast:%d "
22555c8f9400Sryan_chen 			       "checkprd:%d checken:%d\n",
22565c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt,
22575c8f9400Sryan_chen 			       eng->run.loop_max, eng->arg.loop_inf,
22585c8f9400Sryan_chen 			       looplast, checkprd, checken);
22595c8f9400Sryan_chen 			debug_pause();
22605c8f9400Sryan_chen 		}
22615c8f9400Sryan_chen 
22625c8f9400Sryan_chen 
22635c8f9400Sryan_chen 		if (eng->run.TM_RxDataEn)
22645c8f9400Sryan_chen 			eng->dat.DMA_Base_Tx = eng->dat.DMA_Base_Rx;
22655c8f9400Sryan_chen 
22665c8f9400Sryan_chen 		eng->dat.DMA_Base_Rx =
22675c8f9400Sryan_chen 		    ZeroCopy_OFFSET + GET_DMA_BASE(eng, eng->run.loop_cnt + 1);
22685c8f9400Sryan_chen 		//[Check DES]--------------------
22694fad5549SDylan Hung 		ret = check_des(eng, eng->run.loop_cnt, checken);
22704fad5549SDylan Hung 		if (ret) {
22715c8f9400Sryan_chen 			//descriptor error
2272783c0c9bSDylan Hung 			eng->dat.Des_Num = eng->flg.n_desc_fail + 1;
22735c8f9400Sryan_chen #ifdef CheckRxBuf
22745c8f9400Sryan_chen 			if (checkprd)
22755c8f9400Sryan_chen 				check_buf(eng, loop_checknum);
22765c8f9400Sryan_chen 			else
22775c8f9400Sryan_chen 				check_buf(eng, (eng->run.loop_max % loop_checknum));
22785c8f9400Sryan_chen 			eng->dat.Des_Num = eng->dat.Des_Num_Org;
22795c8f9400Sryan_chen #endif
22805c8f9400Sryan_chen 
22815c8f9400Sryan_chen 			if (DbgPrn_DumpMACCnt)
22825c8f9400Sryan_chen 				dump_mac_ROreg(eng);
22835c8f9400Sryan_chen 
22845c8f9400Sryan_chen 			return ret;
22855c8f9400Sryan_chen 		}
22865c8f9400Sryan_chen 
22875c8f9400Sryan_chen 		//[Check Buf]--------------------
22885c8f9400Sryan_chen 		if (eng->run.TM_RxDataEn && checken) {
22895c8f9400Sryan_chen 			if (checkprd) {
22905c8f9400Sryan_chen #ifdef Enable_ShowBW
22915c8f9400Sryan_chen 				printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused);
22925c8f9400Sryan_chen 				PRINTF( FP_LOG, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused );
22935c8f9400Sryan_chen #endif
22945c8f9400Sryan_chen 
22955c8f9400Sryan_chen #ifdef CheckRxBuf
22965c8f9400Sryan_chen 				if (check_buf(eng, loop_checknum))
22975c8f9400Sryan_chen 					return(1);
22985c8f9400Sryan_chen #endif
22995c8f9400Sryan_chen 			} else {
23005c8f9400Sryan_chen #ifdef Enable_ShowBW
23015c8f9400Sryan_chen 				printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (eng->run.loop_max % loop_checknum), ((double)(eng->run.loop_max % loop_checknum) * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused);
23025c8f9400Sryan_chen 				PRINTF( FP_LOG, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (eng->run.loop_max % loop_checknum), ((double)(eng->run.loop_max % loop_checknum) * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused );
23035c8f9400Sryan_chen #endif
23045c8f9400Sryan_chen 
23055c8f9400Sryan_chen #ifdef CheckRxBuf
23065c8f9400Sryan_chen 				if (check_buf(eng, (eng->run.loop_max % loop_checknum)))
23075c8f9400Sryan_chen 					return(1);
23085c8f9400Sryan_chen #endif
23095c8f9400Sryan_chen 			} // End if ( checkprd )
23105c8f9400Sryan_chen 
23115c8f9400Sryan_chen #ifndef SelectSimpleDes
23125c8f9400Sryan_chen 			if (!looplast)
23135c8f9400Sryan_chen 				setup_des_loop(eng, eng->run.loop_cnt);
23145c8f9400Sryan_chen #endif
23155c8f9400Sryan_chen 
23165c8f9400Sryan_chen #ifdef Enable_ShowBW
23175c8f9400Sryan_chen 			timeold = clock();
23185c8f9400Sryan_chen #endif
23195c8f9400Sryan_chen 		} // End if ( eng->run.TM_RxDataEn && checken )
23205c8f9400Sryan_chen 
23215c8f9400Sryan_chen #ifdef SelectSimpleDes
23225c8f9400Sryan_chen 		if (!looplast)
23235c8f9400Sryan_chen 			setup_des_loop(eng, eng->run.loop_cnt);
23245c8f9400Sryan_chen #endif
23255c8f9400Sryan_chen 
23265c8f9400Sryan_chen 		if ( eng->arg.loop_inf )
23275c8f9400Sryan_chen 			printf("===============> Loop[%d]: %d  \r", eng->run.loop_of_cnt, eng->run.loop_cnt);
23285c8f9400Sryan_chen 		else if ( eng->arg.test_mode == 0 ) {
23295c8f9400Sryan_chen 			if ( !( DbgPrn_BufAdr || eng->run.delay_margin ) )
23305c8f9400Sryan_chen 				printf(" [%d]%d                        \r", eng->run.loop_of_cnt, eng->run.loop_cnt);
23315c8f9400Sryan_chen 		}
23325c8f9400Sryan_chen 
23335c8f9400Sryan_chen 		if (DbgPrn_BufAdr) {
23345c8f9400Sryan_chen 			printf("for end   ======> [%d]%d/%d(%d)\n",
23355c8f9400Sryan_chen 			       eng->run.loop_of_cnt, eng->run.loop_cnt,
23365c8f9400Sryan_chen 			       eng->run.loop_max, eng->arg.loop_inf);
23375c8f9400Sryan_chen 			debug_pause();
23385c8f9400Sryan_chen 		}
23395c8f9400Sryan_chen 
23405c8f9400Sryan_chen 		if (eng->run.loop_cnt >= 0x7fffffff) {
23415c8f9400Sryan_chen 			debug("loop counter wrapped around\n");
23425c8f9400Sryan_chen 			eng->run.loop_cnt = 0;
23435c8f9400Sryan_chen 			eng->run.loop_of_cnt++;
23445c8f9400Sryan_chen 		} else
23455c8f9400Sryan_chen 			eng->run.loop_cnt++;
23465c8f9400Sryan_chen 	} // End while ( ( eng->run.loop_cnt < eng->run.loop_max ) || eng->arg.loop_inf )
23475c8f9400Sryan_chen 
23485c8f9400Sryan_chen 	eng->flg.all_fail = 0;
23495c8f9400Sryan_chen 	return(0);
23505c8f9400Sryan_chen } // End char TestingLoop (MAC_ENGINE *eng, uint32_t loop_checknum)
2351