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