1d82a9689SDylan Hung // SPDX-License-Identifier: GPL-2.0+
25c8f9400Sryan_chen /*
3d82a9689SDylan Hung * Copyright (C) ASPEED Technology Inc.
45c8f9400Sryan_chen */
55c8f9400Sryan_chen
65c8f9400Sryan_chen #define MACTEST_C
75c8f9400Sryan_chen
85c8f9400Sryan_chen #include "swfunc.h"
95c8f9400Sryan_chen #include "comminf.h"
105c8f9400Sryan_chen #include <command.h>
115c8f9400Sryan_chen #include <common.h>
125c8f9400Sryan_chen #include <malloc.h>
135c8f9400Sryan_chen #include <net.h>
145c8f9400Sryan_chen #include <post.h>
155c8f9400Sryan_chen #include "mem_io.h"
165c8f9400Sryan_chen
175c8f9400Sryan_chen #include "phy_api.h"
185c8f9400Sryan_chen #include "mac_api.h"
195c8f9400Sryan_chen
205c8f9400Sryan_chen #define ARGV_MAC_IDX 1
215c8f9400Sryan_chen #define ARGV_MDIO_IDX 2
225c8f9400Sryan_chen #define ARGV_SPEED 3
235c8f9400Sryan_chen #define ARGV_CTRL 4
245c8f9400Sryan_chen #define ARGV_LOOP 5
255c8f9400Sryan_chen #define ARGV_TEST_MODE 6
265c8f9400Sryan_chen #define ARGV_PHY_ADDR 7
275c8f9400Sryan_chen #define ARGV_TIMING_MARGIN 8
285c8f9400Sryan_chen
295c8f9400Sryan_chen
305c8f9400Sryan_chen uint8_t __attribute__ ((aligned (1024*1024))) tdes_buf[TDES_SIZE];
315c8f9400Sryan_chen uint8_t __attribute__ ((aligned (1024*1024))) rdes_buf[RDES_SIZE];
325c8f9400Sryan_chen uint8_t __attribute__ ((aligned (1024*1024))) dma_buf[DMA_BUF_SIZE];
335c8f9400Sryan_chen
345c8f9400Sryan_chen struct mac_ctrl_desc {
355c8f9400Sryan_chen uint32_t base_reset_assert;
365c8f9400Sryan_chen uint32_t bit_reset_assert;
375c8f9400Sryan_chen uint32_t base_reset_deassert;
385c8f9400Sryan_chen uint32_t bit_reset_deassert;
395c8f9400Sryan_chen
405c8f9400Sryan_chen uint32_t base_clk_stop;
415c8f9400Sryan_chen uint32_t bit_clk_stop;
425c8f9400Sryan_chen uint32_t base_clk_start;
435c8f9400Sryan_chen uint32_t bit_clk_start;
445c8f9400Sryan_chen };
455c8f9400Sryan_chen
465c8f9400Sryan_chen static const uint32_t timeout_th_tbl[3] = {
475c8f9400Sryan_chen TIME_OUT_Des_1G, TIME_OUT_Des_100M, TIME_OUT_Des_10M};
485c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
495c8f9400Sryan_chen const uint32_t mac_base_lookup_tbl[4] = {MAC1_BASE, MAC2_BASE, MAC3_BASE,
505c8f9400Sryan_chen MAC4_BASE};
515c8f9400Sryan_chen const uint32_t mdio_base_lookup_tbl[4] = {MDIO0_BASE, MDIO1_BASE, MDIO2_BASE,
525c8f9400Sryan_chen MDIO3_BASE};
535c8f9400Sryan_chen const struct mac_ctrl_desc mac_ctrl_lookup_tbl[4] = {
545c8f9400Sryan_chen {
555c8f9400Sryan_chen .base_reset_assert = 0x40, .bit_reset_assert = BIT(11),
565c8f9400Sryan_chen .base_reset_deassert = 0x44,.bit_reset_deassert = BIT(11),
575c8f9400Sryan_chen .base_clk_stop = 0x80, .bit_clk_stop = BIT(20),
585c8f9400Sryan_chen .base_clk_start = 0x84, .bit_clk_start = BIT(20),
595c8f9400Sryan_chen },
605c8f9400Sryan_chen {
615c8f9400Sryan_chen .base_reset_assert = 0x40, .bit_reset_assert = BIT(12),
625c8f9400Sryan_chen .base_reset_deassert = 0x44,.bit_reset_deassert = BIT(12),
635c8f9400Sryan_chen .base_clk_stop = 0x80, .bit_clk_stop = BIT(21),
645c8f9400Sryan_chen .base_clk_start = 0x84,.bit_clk_start = BIT(21),
655c8f9400Sryan_chen },
665c8f9400Sryan_chen {
675c8f9400Sryan_chen .base_reset_assert = 0x50, .bit_reset_assert = BIT(20),
685c8f9400Sryan_chen .base_reset_deassert = 0x54,.bit_reset_deassert = BIT(20),
695c8f9400Sryan_chen .base_clk_stop = 0x90, .bit_clk_stop = BIT(20),
705c8f9400Sryan_chen .base_clk_start = 0x94, .bit_clk_start = BIT(20),
715c8f9400Sryan_chen },
725c8f9400Sryan_chen {
735c8f9400Sryan_chen .base_reset_assert = 0x50, .bit_reset_assert = BIT(21),
745c8f9400Sryan_chen .base_reset_deassert = 0x54,.bit_reset_deassert = BIT(21),
755c8f9400Sryan_chen .base_clk_stop = 0x90, .bit_clk_stop = BIT(21),
765c8f9400Sryan_chen .base_clk_start = 0x94,.bit_clk_start = BIT(21),
775c8f9400Sryan_chen }
785c8f9400Sryan_chen };
795c8f9400Sryan_chen #else
805c8f9400Sryan_chen const uint32_t mac_base_lookup_tbl[2] = {MAC1_BASE, MAC2_BASE};
815c8f9400Sryan_chen const uint32_t mdio_base_lookup_tbl[2] = {MDIO0_BASE, MDIO1_BASE};
825c8f9400Sryan_chen const struct mac_ctrl_desc mac_ctrl_lookup_tbl[2] = {
835c8f9400Sryan_chen {
846c473e55SDylan Hung .base_reset_assert = 0x04, .bit_reset_assert = BIT(11),
856c473e55SDylan Hung .base_reset_deassert = 0x04, .bit_reset_deassert = BIT(11),
866c473e55SDylan Hung .base_clk_stop = 0x0c, .bit_clk_stop = BIT(20),
876c473e55SDylan Hung .base_clk_start = 0x0c, .bit_clk_start = BIT(20),
885c8f9400Sryan_chen },
895c8f9400Sryan_chen {
906c473e55SDylan Hung .base_reset_assert = 0x04, .bit_reset_assert = BIT(12),
916c473e55SDylan Hung .base_reset_deassert = 0x04, .bit_reset_deassert = BIT(12),
926c473e55SDylan Hung .base_clk_stop = 0x0c, .bit_clk_stop = BIT(21),
936c473e55SDylan Hung .base_clk_start = 0x0c, .bit_clk_start = BIT(21),
945c8f9400Sryan_chen }
955c8f9400Sryan_chen };
965c8f9400Sryan_chen #endif
975c8f9400Sryan_chen
Print_Header(MAC_ENGINE * p_eng,uint8_t option)985c8f9400Sryan_chen void Print_Header(MAC_ENGINE *p_eng, uint8_t option)
995c8f9400Sryan_chen {
1005c8f9400Sryan_chen if (p_eng->run.speed_sel[0]) {
1015c8f9400Sryan_chen PRINTF(option, " 1G ");
1025c8f9400Sryan_chen } else if (p_eng->run.speed_sel[1]) {
1035c8f9400Sryan_chen PRINTF(option, " 100M ");
1045c8f9400Sryan_chen } else {
1055c8f9400Sryan_chen PRINTF(option, " 10M ");
1065c8f9400Sryan_chen }
1075c8f9400Sryan_chen
1085c8f9400Sryan_chen switch (p_eng->arg.test_mode) {
1095c8f9400Sryan_chen case 0:
1105c8f9400Sryan_chen PRINTF(option, "TX/RX delay margin check\n");
1115c8f9400Sryan_chen break;
1125c8f9400Sryan_chen case 1:
1135c8f9400Sryan_chen PRINTF(option, "TX/RX delay scan\n");
1145c8f9400Sryan_chen break;
1155c8f9400Sryan_chen case 2:
1165c8f9400Sryan_chen PRINTF(option, "TX/RX delay and IO driving scan\n");
1175c8f9400Sryan_chen break;
1185c8f9400Sryan_chen case 3:
1195c8f9400Sryan_chen PRINTF(option, "TX frame - ARP\n");
1205c8f9400Sryan_chen break;
1215c8f9400Sryan_chen case 4:
1225c8f9400Sryan_chen PRINTF(option, "TX frame - random\n");
1235c8f9400Sryan_chen break;
1245c8f9400Sryan_chen case 5:
1255c8f9400Sryan_chen PRINTF(option, "TX frame - 0x%08x\n", p_eng->arg.user_def_val);
1265c8f9400Sryan_chen break;
1275c8f9400Sryan_chen }
1285c8f9400Sryan_chen }
1295c8f9400Sryan_chen
print_arg_test_mode(MAC_ENGINE * p_eng)1305c8f9400Sryan_chen static void print_arg_test_mode(MAC_ENGINE *p_eng)
1315c8f9400Sryan_chen {
1325c8f9400Sryan_chen uint8_t item[32] = "test_mode[dec]";
1335c8f9400Sryan_chen
1345c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_NCSI) {
1355c8f9400Sryan_chen printf("%20s| 0: NCSI configuration with "
1365c8f9400Sryan_chen "Disable_Channel request\n", item);
1375c8f9400Sryan_chen printf("%20s| (default:%3d)\n", "", DEF_GTESTMODE);
1385c8f9400Sryan_chen printf("%20s| 1: TX/RX delay scan\n", "");
1395c8f9400Sryan_chen printf("%20s| 2: TX/RX delay and IO driving scan\n", "");
1405c8f9400Sryan_chen printf("%20s| 3: NCSI configuration without "
1415c8f9400Sryan_chen "Disable_Channel request\n", "");
1425c8f9400Sryan_chen } else {
1435c8f9400Sryan_chen printf("%20s| (default:%3d)\n", item, DEF_GTESTMODE);
1445c8f9400Sryan_chen printf("%20s| 0: TX/RX delay margin check\n", "");
1455c8f9400Sryan_chen printf("%20s| 1: TX/RX delay scan\n", "");
1465c8f9400Sryan_chen printf("%20s| 2: TX/RX delay and IO driving scan\n", "");
1475c8f9400Sryan_chen printf("%20s| 3: TX frame - ARP\n", "");
1485c8f9400Sryan_chen printf("%20s| 4: TX frame - random\n", "");
1495c8f9400Sryan_chen printf("%20s| 5: TX frame - user defined (default:0x%8x)\n", "",
1505c8f9400Sryan_chen DEF_GUSER_DEF_PACKET_VAL);
1515c8f9400Sryan_chen }
1525c8f9400Sryan_chen }
1535c8f9400Sryan_chen
print_arg_phy_addr(MAC_ENGINE * p_eng)1545c8f9400Sryan_chen static void print_arg_phy_addr(MAC_ENGINE *p_eng)
1555c8f9400Sryan_chen {
1565c8f9400Sryan_chen uint8_t item[32] = "phy_addr[dec]";
1575c8f9400Sryan_chen
1585c8f9400Sryan_chen printf("%20s| 0~31: PHY Address (default:%d)\n", item, DEF_GPHY_ADR);
1595c8f9400Sryan_chen }
1605c8f9400Sryan_chen
print_arg_ieee_select(MAC_ENGINE * p_eng)1615c8f9400Sryan_chen static void print_arg_ieee_select(MAC_ENGINE *p_eng)
1625c8f9400Sryan_chen {
1635c8f9400Sryan_chen uint8_t item[32] = "IEEE packet select";
1645c8f9400Sryan_chen
1655c8f9400Sryan_chen printf("%20s| 0/1/2 (default:0) only for test_mode 3,4,5)\n", item);
1665c8f9400Sryan_chen }
1675c8f9400Sryan_chen
print_arg_delay_scan_range(MAC_ENGINE * p_eng)1685c8f9400Sryan_chen static void print_arg_delay_scan_range(MAC_ENGINE *p_eng)
1695c8f9400Sryan_chen {
1705c8f9400Sryan_chen uint8_t item[32] = "TX/RX delay margin";
1715c8f9400Sryan_chen
1725c8f9400Sryan_chen printf("%20s| 1/2/3/... (default:%d) only for test_mode 0\n", item,
1735c8f9400Sryan_chen DEF_GIOTIMINGBUND);
1745c8f9400Sryan_chen printf("%20s| check range = (orig - margin) ~ (orig + margin)\n", "");
1755c8f9400Sryan_chen }
1765c8f9400Sryan_chen
print_arg_channel_num(MAC_ENGINE * p_eng)1775c8f9400Sryan_chen static void print_arg_channel_num(MAC_ENGINE *p_eng)
1785c8f9400Sryan_chen {
1795c8f9400Sryan_chen uint8_t item[32] = "channel_num[dec]";
1805c8f9400Sryan_chen
1815c8f9400Sryan_chen printf("%20s| 1~32: Total Number of NCSI Channel (default:%d)\n", item,
1825c8f9400Sryan_chen DEF_GCHANNEL2NUM);
1835c8f9400Sryan_chen }
1845c8f9400Sryan_chen
print_arg_package_num(MAC_ENGINE * p_eng)1855c8f9400Sryan_chen static void print_arg_package_num(MAC_ENGINE *p_eng)
1865c8f9400Sryan_chen {
1875c8f9400Sryan_chen uint8_t item[32] = "package_num[dec]";
1885c8f9400Sryan_chen
1895c8f9400Sryan_chen printf("%20s| 1~ 8: Total Number of NCSI Package (default:%d)\n", item,
1905c8f9400Sryan_chen DEF_GPACKAGE2NUM);
1915c8f9400Sryan_chen }
1925c8f9400Sryan_chen
print_arg_loop(MAC_ENGINE * p_eng)1935c8f9400Sryan_chen static void print_arg_loop(MAC_ENGINE *p_eng)
1945c8f9400Sryan_chen {
1955c8f9400Sryan_chen uint8_t item[32] = "loop_max[dec]";
1965c8f9400Sryan_chen
1975c8f9400Sryan_chen printf("%20s| 1G : (default:%3d)\n", item, DEF_GLOOP_MAX * 20);
1985c8f9400Sryan_chen printf("%20s| 100M: (default:%3d)\n", "", DEF_GLOOP_MAX * 2);
1995c8f9400Sryan_chen printf("%20s| 10M : (default:%3d)\n", "", DEF_GLOOP_MAX);
2005c8f9400Sryan_chen }
2015c8f9400Sryan_chen
print_arg_ctrl(MAC_ENGINE * p_eng)2025c8f9400Sryan_chen static void print_arg_ctrl(MAC_ENGINE *p_eng)
2035c8f9400Sryan_chen {
2045c8f9400Sryan_chen uint8_t item[32] = "ctrl[hex]";
2055c8f9400Sryan_chen
2065c8f9400Sryan_chen printf("%20s| default : 0x%03x\n", item, DEF_GCTRL);
2075c8f9400Sryan_chen printf("%20s| bit0 : skip PHY init/deinit\n", "");
2085c8f9400Sryan_chen printf("%20s| bit1 : skip PHY deinit\n", "");
2095c8f9400Sryan_chen printf("%20s| bit2 : skip PHY ID check\n", "");
2105c8f9400Sryan_chen printf("%20s| bit3 : reserved\n", "");
2115c8f9400Sryan_chen printf("%20s| bit4 : PHY internal loopback\n", "");
2125c8f9400Sryan_chen printf("%20s| bit5 : MAC internal loopback\n", "");
2130fe84b0bSDylan Hung printf("%20s| bit6 : Enable PHY RX delay\n", "");
2140fe84b0bSDylan Hung printf("%20s| bit7 : Enable PHY TX delay\n", "");
2155c8f9400Sryan_chen printf("%20s| bit8 : RMII 50MHz Output enable\n", "");
2165c8f9400Sryan_chen printf("%20s| bit9 : RMII REFCLK pin input enable\n", "");
2175c8f9400Sryan_chen printf("%20s| bit10 : inverse RGMII RXCLK\n", "");
2185c8f9400Sryan_chen printf("%20s| bit11 : reserved\n", "");
2195c8f9400Sryan_chen printf("%20s| bit12 : TX single packet for each test point\n", "");
2205c8f9400Sryan_chen printf("%20s| bit13 : full range scan\n", "");
2215c8f9400Sryan_chen printf("%20s| bit15~14 : reserved\n", "");
2225c8f9400Sryan_chen printf("%20s| bit16 : NCSI verbose log\n", "");
2235c8f9400Sryan_chen printf("%20s| bit17 : NCSI skip RX error\n", "");
2245c8f9400Sryan_chen printf("%20s| bit31~18 : reserved\n", "");
2255c8f9400Sryan_chen }
2265c8f9400Sryan_chen
print_arg_speed(MAC_ENGINE * p_eng)2275c8f9400Sryan_chen static void print_arg_speed(MAC_ENGINE *p_eng)
2285c8f9400Sryan_chen {
2295c8f9400Sryan_chen uint8_t item[32] = "speed[hex]";
2305c8f9400Sryan_chen
2315c8f9400Sryan_chen printf("%20s| bit[0]->1G bit[1]->100M bit[2]->10M "
2325c8f9400Sryan_chen "(default:0x%02lx)\n",
2335c8f9400Sryan_chen item, DEF_GSPEED);
2345c8f9400Sryan_chen }
2355c8f9400Sryan_chen
print_arg_mdio_idx(MAC_ENGINE * p_eng)2365c8f9400Sryan_chen static void print_arg_mdio_idx(MAC_ENGINE *p_eng)
2375c8f9400Sryan_chen {
2385c8f9400Sryan_chen uint8_t item[32] = "mdio_idx[dec]";
2395c8f9400Sryan_chen
2405c8f9400Sryan_chen printf("%20s| 0->MDIO1 1->MDIO2", item);
2415c8f9400Sryan_chen
2425c8f9400Sryan_chen if (p_eng->env.mac_num > 2) {
2435c8f9400Sryan_chen printf(" 2->MDIO3 3->MDIO4");
2445c8f9400Sryan_chen }
2455c8f9400Sryan_chen printf("\n");
2465c8f9400Sryan_chen }
2475c8f9400Sryan_chen
print_arg_mac_idx(MAC_ENGINE * p_eng)2485c8f9400Sryan_chen static void print_arg_mac_idx(MAC_ENGINE *p_eng)
2495c8f9400Sryan_chen {
2505c8f9400Sryan_chen uint8_t item[32] = "mac_idx[dec]";
2515c8f9400Sryan_chen
2525c8f9400Sryan_chen printf("%20s| 0->MAC1 1->MAC2", item);
2535c8f9400Sryan_chen
2545c8f9400Sryan_chen if (p_eng->env.mac_num > 2) {
2555c8f9400Sryan_chen printf(" 2->MAC3 3->MAC4");
2565c8f9400Sryan_chen }
2575c8f9400Sryan_chen printf("\n");
2585c8f9400Sryan_chen }
print_legend(void)2595c8f9400Sryan_chen static void print_legend(void)
2605c8f9400Sryan_chen {
2615c8f9400Sryan_chen printf("Legend:\n");
2625c8f9400Sryan_chen printf(" o : OK\n");
2635c8f9400Sryan_chen printf(" x : CRC error\n");
2645c8f9400Sryan_chen printf(" . : packet not found\n");
2655c8f9400Sryan_chen printf(" System default setting\n");
2665c8f9400Sryan_chen printf(" O : OK\n");
2675c8f9400Sryan_chen printf(" X : CRC error\n");
2685c8f9400Sryan_chen printf(" * : packet not found\n");
2695c8f9400Sryan_chen }
print_usage(MAC_ENGINE * p_eng)2705c8f9400Sryan_chen static void print_usage(MAC_ENGINE *p_eng)
2715c8f9400Sryan_chen {
2725c8f9400Sryan_chen if (MODE_DEDICATED == p_eng->arg.run_mode) {
2735c8f9400Sryan_chen printf("mactest <mac_idx> <mdio_idx> <speed> <ctrl> <loop_max> <test "
2745c8f9400Sryan_chen "mode> <phy addr> <margin / IEEE select> <user data>\n");
2755c8f9400Sryan_chen print_arg_mac_idx(p_eng);
2765c8f9400Sryan_chen print_arg_mdio_idx(p_eng);
2775c8f9400Sryan_chen print_arg_speed(p_eng);
2785c8f9400Sryan_chen print_arg_ctrl(p_eng);
2795c8f9400Sryan_chen print_arg_loop(p_eng);
2805c8f9400Sryan_chen print_arg_test_mode(p_eng);
2815c8f9400Sryan_chen print_arg_phy_addr(p_eng);
2825c8f9400Sryan_chen print_arg_delay_scan_range(p_eng);
283bf147da9SDylan Hung print_arg_ieee_select(p_eng);
2845c8f9400Sryan_chen } else if (MODE_NCSI == p_eng->arg.run_mode) {
2855c8f9400Sryan_chen printf("ncsitest <idx> <packet num> <channel num> <test mode> "
286bf147da9SDylan Hung "<margin> <ctrl>\n");
2875c8f9400Sryan_chen print_arg_mac_idx(p_eng);
2885c8f9400Sryan_chen print_arg_package_num(p_eng);
2895c8f9400Sryan_chen print_arg_channel_num(p_eng);
2905c8f9400Sryan_chen print_arg_test_mode(p_eng);
2915c8f9400Sryan_chen print_arg_delay_scan_range(p_eng);
2925c8f9400Sryan_chen print_arg_ctrl(p_eng);
2935c8f9400Sryan_chen } else {
2945c8f9400Sryan_chen printf("unknown run mode\n");
2955c8f9400Sryan_chen }
2965c8f9400Sryan_chen }
2975c8f9400Sryan_chen
push_reg(MAC_ENGINE * p_eng)2985c8f9400Sryan_chen static void push_reg(MAC_ENGINE *p_eng)
2995c8f9400Sryan_chen {
3005c8f9400Sryan_chen /* SCU delay settings */
3015c8f9400Sryan_chen p_eng->io.mac12_1g_delay.value.w = readl(p_eng->io.mac12_1g_delay.addr);
3025c8f9400Sryan_chen p_eng->io.mac12_100m_delay.value.w = readl(p_eng->io.mac12_100m_delay.addr);
3035c8f9400Sryan_chen p_eng->io.mac12_10m_delay.value.w = readl(p_eng->io.mac12_10m_delay.addr);
3045c8f9400Sryan_chen
3055c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
3065c8f9400Sryan_chen p_eng->io.mac34_1g_delay.value.w = readl(p_eng->io.mac34_1g_delay.addr);
3075c8f9400Sryan_chen p_eng->io.mac34_100m_delay.value.w = readl(p_eng->io.mac34_100m_delay.addr);
3085c8f9400Sryan_chen p_eng->io.mac34_10m_delay.value.w = readl(p_eng->io.mac34_10m_delay.addr);
3095c8f9400Sryan_chen
3105c8f9400Sryan_chen p_eng->io.mac34_drv_reg.value.w = readl(p_eng->io.mac34_drv_reg.addr);
3115c8f9400Sryan_chen #else
3125c8f9400Sryan_chen p_eng->io.mac12_drv_reg.value.w = readl(p_eng->io.mac12_drv_reg.addr);
3135c8f9400Sryan_chen #endif
3145c8f9400Sryan_chen
3155c8f9400Sryan_chen /* MAC registers */
3165c8f9400Sryan_chen p_eng->reg.maccr.w = mac_reg_read(p_eng, 0x50);
3175c8f9400Sryan_chen
3185c8f9400Sryan_chen p_eng->reg.mac_madr = mac_reg_read(p_eng, 0x08);
3195c8f9400Sryan_chen p_eng->reg.mac_ladr = mac_reg_read(p_eng, 0x0c);
3205c8f9400Sryan_chen p_eng->reg.mac_fear = mac_reg_read(p_eng, 0x40);
3215c8f9400Sryan_chen }
3225c8f9400Sryan_chen
pop_reg(MAC_ENGINE * p_eng)3235c8f9400Sryan_chen static void pop_reg(MAC_ENGINE *p_eng)
3245c8f9400Sryan_chen {
3255c8f9400Sryan_chen /* SCU delay settings */
3265c8f9400Sryan_chen writel(p_eng->io.mac12_1g_delay.value.w, p_eng->io.mac12_1g_delay.addr);
3275c8f9400Sryan_chen writel(p_eng->io.mac12_100m_delay.value.w, p_eng->io.mac12_100m_delay.addr);
3285c8f9400Sryan_chen writel(p_eng->io.mac12_10m_delay.value.w, p_eng->io.mac12_10m_delay.addr);
3295c8f9400Sryan_chen
3305c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
3315c8f9400Sryan_chen writel(p_eng->io.mac34_1g_delay.value.w, p_eng->io.mac34_1g_delay.addr);
3325c8f9400Sryan_chen writel(p_eng->io.mac34_100m_delay.value.w, p_eng->io.mac34_100m_delay.addr);
3335c8f9400Sryan_chen writel(p_eng->io.mac34_10m_delay.value.w, p_eng->io.mac34_10m_delay.addr);
3345c8f9400Sryan_chen
3355c8f9400Sryan_chen writel(p_eng->io.mac34_drv_reg.value.w, p_eng->io.mac34_drv_reg.addr);
3365c8f9400Sryan_chen #else
3375c8f9400Sryan_chen writel(p_eng->io.mac12_drv_reg.value.w, p_eng->io.mac12_drv_reg.addr);
3385c8f9400Sryan_chen #endif
3395c8f9400Sryan_chen
3405c8f9400Sryan_chen /* MAC registers */
3415c8f9400Sryan_chen mac_reg_write(p_eng, 0x50, p_eng->reg.maccr.w);
3425c8f9400Sryan_chen mac_reg_write(p_eng, 0x08, p_eng->reg.mac_madr);
3435c8f9400Sryan_chen mac_reg_write(p_eng, 0x0c, p_eng->reg.mac_ladr);
3445c8f9400Sryan_chen mac_reg_write(p_eng, 0x40, p_eng->reg.mac_fear);
3455c8f9400Sryan_chen }
3465c8f9400Sryan_chen
finish_close(MAC_ENGINE * p_eng)3475c8f9400Sryan_chen static void finish_close(MAC_ENGINE *p_eng)
3485c8f9400Sryan_chen {
3495c8f9400Sryan_chen nt_log_func_name();
3505c8f9400Sryan_chen pop_reg(p_eng);
3515c8f9400Sryan_chen }
3525c8f9400Sryan_chen
finish_check(MAC_ENGINE * p_eng,int value)3535c8f9400Sryan_chen char finish_check(MAC_ENGINE *p_eng, int value)
3545c8f9400Sryan_chen {
3555c8f9400Sryan_chen nt_log_func_name();
3565c8f9400Sryan_chen
3575c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
3585c8f9400Sryan_chen if (p_eng->dat.FRAME_LEN)
3595c8f9400Sryan_chen free(p_eng->dat.FRAME_LEN);
3605c8f9400Sryan_chen
3615c8f9400Sryan_chen if (p_eng->dat.wp_lst)
3625c8f9400Sryan_chen free(p_eng->dat.wp_lst);
3635c8f9400Sryan_chen }
3645c8f9400Sryan_chen
365783c0c9bSDylan Hung p_eng->flg.error = p_eng->flg.error | value;
3665c8f9400Sryan_chen
367783c0c9bSDylan Hung if (DBG_PRINT_ERR_FLAG)
368783c0c9bSDylan Hung printf("flags: error = %08x\n", p_eng->flg.error);
3695c8f9400Sryan_chen
3705c8f9400Sryan_chen if (!p_eng->run.tm_tx_only)
3715c8f9400Sryan_chen FPri_ErrFlag(p_eng, FP_LOG);
3725c8f9400Sryan_chen
3735c8f9400Sryan_chen if (p_eng->run.TM_IOTiming)
3745c8f9400Sryan_chen FPri_ErrFlag(p_eng, FP_IO);
3755c8f9400Sryan_chen
3765c8f9400Sryan_chen FPri_ErrFlag(p_eng, STD_OUT);
3775c8f9400Sryan_chen
3785c8f9400Sryan_chen if (!p_eng->run.tm_tx_only)
3795c8f9400Sryan_chen FPri_End(p_eng, FP_LOG);
3805c8f9400Sryan_chen
3815c8f9400Sryan_chen if (p_eng->run.TM_IOTiming)
3825c8f9400Sryan_chen FPri_End(p_eng, FP_IO);
3835c8f9400Sryan_chen
3845c8f9400Sryan_chen FPri_End(p_eng, STD_OUT);
3855c8f9400Sryan_chen
3865c8f9400Sryan_chen if (!p_eng->run.tm_tx_only)
3875c8f9400Sryan_chen FPri_RegValue(p_eng, FP_LOG);
3885c8f9400Sryan_chen if (p_eng->run.TM_IOTiming)
3895c8f9400Sryan_chen FPri_RegValue(p_eng, FP_IO);
3905c8f9400Sryan_chen
3915c8f9400Sryan_chen finish_close(p_eng);
3925c8f9400Sryan_chen
393783c0c9bSDylan Hung if (p_eng->flg.error) {
3945c8f9400Sryan_chen return (1);
3955c8f9400Sryan_chen } else {
3965c8f9400Sryan_chen return (0);
3975c8f9400Sryan_chen }
3985c8f9400Sryan_chen }
3995c8f9400Sryan_chen
check_test_mode(MAC_ENGINE * p_eng)4005c8f9400Sryan_chen static uint32_t check_test_mode(MAC_ENGINE *p_eng)
4015c8f9400Sryan_chen {
4025c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_NCSI ) {
4035c8f9400Sryan_chen switch (p_eng->arg.test_mode) {
4045c8f9400Sryan_chen case 0:
4055c8f9400Sryan_chen break;
4065c8f9400Sryan_chen case 1:
4075c8f9400Sryan_chen p_eng->run.TM_IOTiming = 1;
4085c8f9400Sryan_chen break;
4095c8f9400Sryan_chen case 2:
4105c8f9400Sryan_chen p_eng->run.TM_IOTiming = 1;
4115c8f9400Sryan_chen p_eng->run.TM_IOStrength = 1;
4125c8f9400Sryan_chen break;
4135c8f9400Sryan_chen case 3:
4145c8f9400Sryan_chen p_eng->run.TM_NCSI_DiSChannel = 0;
4155c8f9400Sryan_chen break;
4165c8f9400Sryan_chen default:
4175c8f9400Sryan_chen printf("Error test_mode!!!\n");
4185c8f9400Sryan_chen print_arg_test_mode(p_eng);
4195c8f9400Sryan_chen return (1);
4205c8f9400Sryan_chen }
4215c8f9400Sryan_chen } else {
4225c8f9400Sryan_chen switch (p_eng->arg.test_mode) {
4235c8f9400Sryan_chen case 0:
4245c8f9400Sryan_chen break;
4255c8f9400Sryan_chen case 1:
4265c8f9400Sryan_chen p_eng->run.TM_IOTiming = 1;
4275c8f9400Sryan_chen break;
4285c8f9400Sryan_chen case 2:
4295c8f9400Sryan_chen p_eng->run.TM_IOTiming = 1;
4305c8f9400Sryan_chen p_eng->run.TM_IOStrength = 1;
4315c8f9400Sryan_chen break;
4325c8f9400Sryan_chen case 3:
4335c8f9400Sryan_chen /* TX ARP frame */
4345c8f9400Sryan_chen p_eng->run.TM_RxDataEn = 0;
4355c8f9400Sryan_chen p_eng->run.tm_tx_only = 1;
4365c8f9400Sryan_chen p_eng->run.TM_IEEE = 0;
4375c8f9400Sryan_chen break;
4385c8f9400Sryan_chen case 4:
4395c8f9400Sryan_chen case 5:
4405c8f9400Sryan_chen p_eng->run.TM_RxDataEn = 0;
4415c8f9400Sryan_chen p_eng->run.tm_tx_only = 1;
4425c8f9400Sryan_chen p_eng->run.TM_IEEE = 1;
4435c8f9400Sryan_chen break;
4445c8f9400Sryan_chen default:
4455c8f9400Sryan_chen printf("Error test_mode!!!\n");
4465c8f9400Sryan_chen print_arg_test_mode(p_eng);
4475c8f9400Sryan_chen return (1);
4485c8f9400Sryan_chen }
4495c8f9400Sryan_chen }
4505c8f9400Sryan_chen
4515c8f9400Sryan_chen if (0 == p_eng->run.TM_IOStrength) {
4525c8f9400Sryan_chen p_eng->io.drv_upper_bond = 0;
4535c8f9400Sryan_chen }
4545c8f9400Sryan_chen return 0;
4555c8f9400Sryan_chen }
4565c8f9400Sryan_chen
4575c8f9400Sryan_chen /**
4585c8f9400Sryan_chen * @brief enable/disable MAC
4595c8f9400Sryan_chen * @param[in] p_eng - MAC_ENGINE
4605c8f9400Sryan_chen *
4615c8f9400Sryan_chen * AST2600 uses synchronous reset scheme, so the bits for reset assert and
4625c8f9400Sryan_chen * deassert are the same
4635c8f9400Sryan_chen * e.g. MAC#1: SCU04[11] = 1 --> MAC#1 reset assert
4645c8f9400Sryan_chen * = 0 --> MAC#1 reset de-assert
4655c8f9400Sryan_chen *
4665c8f9400Sryan_chen * AST2600 uses asynchronous reset scheme, so the bits for reset assert and
4675c8f9400Sryan_chen * deassert are different
4685c8f9400Sryan_chen * e.g. MAC#1: SCU40[11] = 1 --> MAC#1 reset assert
4695c8f9400Sryan_chen * SCU44[11] = 1 --> MAC#1 reset de-assert
4705c8f9400Sryan_chen *
4715c8f9400Sryan_chen * The same design concept is also adopted on clock stop/start.
4725c8f9400Sryan_chen */
scu_disable_mac(MAC_ENGINE * p_eng)4735c8f9400Sryan_chen void scu_disable_mac(MAC_ENGINE *p_eng)
4745c8f9400Sryan_chen {
4755c8f9400Sryan_chen uint32_t mac_idx = p_eng->run.mac_idx;
4765c8f9400Sryan_chen const struct mac_ctrl_desc *p_mac = &mac_ctrl_lookup_tbl[mac_idx];
4775c8f9400Sryan_chen uint32_t reg;
4785c8f9400Sryan_chen
4795c8f9400Sryan_chen debug("MAC%d:reset assert=0x%02x[%08x] deassert=0x%02x[%08x]\n",
4805c8f9400Sryan_chen mac_idx, p_mac->base_reset_assert, p_mac->bit_reset_assert,
4815c8f9400Sryan_chen p_mac->base_reset_deassert, p_mac->bit_reset_deassert);
4825c8f9400Sryan_chen debug("MAC%d:clock stop=0x%02x[%08x] start=0x%02x[%08x]\n", mac_idx,
4835c8f9400Sryan_chen p_mac->base_clk_stop, p_mac->bit_clk_stop, p_mac->base_clk_start,
4845c8f9400Sryan_chen p_mac->bit_clk_start);
4855c8f9400Sryan_chen
4865c8f9400Sryan_chen reg = SCU_RD(p_mac->base_reset_assert);
4875c8f9400Sryan_chen debug("reset reg: 0x%08x\n", reg);
4885c8f9400Sryan_chen reg |= p_mac->bit_reset_assert;
4895c8f9400Sryan_chen debug("reset reg: 0x%08x\n", reg);
4905c8f9400Sryan_chen SCU_WR(reg, p_mac->base_reset_assert);
4915c8f9400Sryan_chen /* issue a dummy read to ensure command is in order */
4925c8f9400Sryan_chen reg = SCU_RD(p_mac->base_reset_assert);
4935c8f9400Sryan_chen
4945c8f9400Sryan_chen reg = SCU_RD(p_mac->base_clk_stop);
4955c8f9400Sryan_chen debug("clock reg: 0x%08x\n", reg);
4965c8f9400Sryan_chen reg |= p_mac->bit_clk_stop;
4975c8f9400Sryan_chen debug("clock reg: 0x%08x\n", reg);
4985c8f9400Sryan_chen SCU_WR(reg, p_mac->base_clk_stop);
4995c8f9400Sryan_chen /* issue a dummy read to ensure command is in order */
5005c8f9400Sryan_chen reg = SCU_RD(p_mac->base_clk_stop);
5015c8f9400Sryan_chen }
5025c8f9400Sryan_chen
scu_enable_mac(MAC_ENGINE * p_eng)5035c8f9400Sryan_chen void scu_enable_mac(MAC_ENGINE *p_eng)
5045c8f9400Sryan_chen {
5055c8f9400Sryan_chen uint32_t mac_idx = p_eng->run.mac_idx;
5065c8f9400Sryan_chen const struct mac_ctrl_desc *p_mac = &mac_ctrl_lookup_tbl[mac_idx];
5075c8f9400Sryan_chen uint32_t reg;
5085c8f9400Sryan_chen
5095c8f9400Sryan_chen debug("MAC%d:reset assert=0x%02x[%08x] deassert=0x%02x[%08x]\n",
5105c8f9400Sryan_chen mac_idx, p_mac->base_reset_assert, p_mac->bit_reset_assert,
5115c8f9400Sryan_chen p_mac->base_reset_deassert, p_mac->bit_reset_deassert);
5125c8f9400Sryan_chen debug("MAC%d:clock stop=0x%02x[%08x] start=0x%02x[%08x]\n", mac_idx,
5135c8f9400Sryan_chen p_mac->base_clk_stop, p_mac->bit_clk_stop, p_mac->base_clk_start,
5145c8f9400Sryan_chen p_mac->bit_clk_start);
5155c8f9400Sryan_chen
5165c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
5175c8f9400Sryan_chen reg = SCU_RD(p_mac->base_reset_deassert);
5185c8f9400Sryan_chen debug("reset reg: 0x%08x\n", reg);
5195c8f9400Sryan_chen reg |= p_mac->bit_reset_deassert;
5205c8f9400Sryan_chen debug("reset reg: 0x%08x\n", reg);
5215c8f9400Sryan_chen SCU_WR(reg, p_mac->base_reset_deassert);
5225c8f9400Sryan_chen /* issue a dummy read to ensure command is in order */
5235c8f9400Sryan_chen reg = SCU_RD(p_mac->base_reset_deassert);
5245c8f9400Sryan_chen
5255c8f9400Sryan_chen reg = SCU_RD(p_mac->base_clk_start);
5265c8f9400Sryan_chen debug("clock reg: 0x%08x\n", reg);
5275c8f9400Sryan_chen reg |= p_mac->bit_clk_start;
5285c8f9400Sryan_chen debug("clock reg: 0x%08x\n", reg);
5295c8f9400Sryan_chen SCU_WR(reg, p_mac->base_clk_start);
5305c8f9400Sryan_chen /* issue a dummy read to ensure command is in order */
5315c8f9400Sryan_chen reg = SCU_RD(p_mac->base_clk_start);
5327f778921SDylan Hung
5337f778921SDylan Hung /* deassert MDIO reset */
5347f778921SDylan Hung SCU_WR(BIT(3), 0x54);
5355c8f9400Sryan_chen #else
5366c473e55SDylan Hung reg = SCU_RD(p_mac->base_reset_assert);
5376c473e55SDylan Hung debug("reset reg: 0x%08x\n", reg);
5386c473e55SDylan Hung reg &= ~p_mac->bit_reset_assert;
5396c473e55SDylan Hung debug("reset reg: 0x%08x\n", reg);
5406c473e55SDylan Hung SCU_WR(reg, p_mac->base_reset_assert);
5415c8f9400Sryan_chen
5426c473e55SDylan Hung reg = SCU_RD(p_mac->base_clk_stop);
5436c473e55SDylan Hung debug("clock reg: 0x%08x\n", reg);
5446c473e55SDylan Hung reg &= ~p_mac->bit_clk_stop;
5456c473e55SDylan Hung debug("clock reg: 0x%08x\n", reg);
5466c473e55SDylan Hung SCU_WR(reg, p_mac->base_clk_stop);
5475c8f9400Sryan_chen #endif
5485c8f9400Sryan_chen }
5495c8f9400Sryan_chen
5505c8f9400Sryan_chen /**
5515c8f9400Sryan_chen * @brief setup mdc/mdio pinmix
5525c8f9400Sryan_chen * @todo push/pop pinmux registers
5535c8f9400Sryan_chen */
scu_set_pinmux(MAC_ENGINE * p_eng)5545c8f9400Sryan_chen void scu_set_pinmux(MAC_ENGINE *p_eng)
5555c8f9400Sryan_chen {
5565c8f9400Sryan_chen uint32_t reg;
5575c8f9400Sryan_chen nt_log_func_name();
5585c8f9400Sryan_chen
5595c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
5605c8f9400Sryan_chen /* MDC/MDIO pinmux */
5615c8f9400Sryan_chen switch (p_eng->run.mdio_idx) {
5625c8f9400Sryan_chen case 0:
5635c8f9400Sryan_chen reg = SCU_RD(0x430) | GENMASK(17, 16);
5645c8f9400Sryan_chen SCU_WR(reg, 0x430);
5655c8f9400Sryan_chen break;
5665c8f9400Sryan_chen case 1:
5675c8f9400Sryan_chen reg = SCU_RD(0x470) & ~GENMASK(13, 12);
5685c8f9400Sryan_chen SCU_WR(reg, 0x470);
5695c8f9400Sryan_chen reg = SCU_RD(0x410) | GENMASK(13, 12);
5705c8f9400Sryan_chen SCU_WR(reg, 0x410);
5715c8f9400Sryan_chen break;
5725c8f9400Sryan_chen case 2:
5735c8f9400Sryan_chen reg = SCU_RD(0x470) & ~GENMASK(1, 0);
5745c8f9400Sryan_chen SCU_WR(reg, 0x470);
5755c8f9400Sryan_chen reg = SCU_RD(0x410) | GENMASK(1, 0);
5765c8f9400Sryan_chen SCU_WR(reg, 0x410);
5775c8f9400Sryan_chen break;
5785c8f9400Sryan_chen case 3:
5795c8f9400Sryan_chen reg = SCU_RD(0x470) & ~GENMASK(3, 2);
5805c8f9400Sryan_chen SCU_WR(reg, 0x470);
5815c8f9400Sryan_chen reg = SCU_RD(0x410) | GENMASK(3, 2);
5825c8f9400Sryan_chen SCU_WR(reg, 0x410);
5835c8f9400Sryan_chen break;
5845c8f9400Sryan_chen default:
5855c8f9400Sryan_chen printf("%s:undefined MDIO idx %d\n", __func__,
5865c8f9400Sryan_chen p_eng->run.mdio_idx);
5875c8f9400Sryan_chen }
5885c8f9400Sryan_chen
5895c8f9400Sryan_chen switch (p_eng->run.mac_idx) {
5905c8f9400Sryan_chen case 0:
5915c8f9400Sryan_chen #ifdef CONFIG_FPGA_ASPEED
5925c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, BIT(4));
5935c8f9400Sryan_chen #else
5945c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x400, GENMASK(11, 0));
5955c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, BIT(4));
5965c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x470, BIT(4));
5975c8f9400Sryan_chen #endif
5985c8f9400Sryan_chen break;
5995c8f9400Sryan_chen case 1:
6005c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x400, GENMASK(23, 12));
6015c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, BIT(5));
6025c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x470, BIT(5));
6035c8f9400Sryan_chen break;
6045c8f9400Sryan_chen case 2:
6055c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, GENMASK(27, 16));
6065c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, BIT(6));
6075c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x470, BIT(6));
6085c8f9400Sryan_chen break;
6095c8f9400Sryan_chen case 3:
6105c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x410, GENMASK(31, 28));
6115c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x4b0, GENMASK(31, 28));
6125c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x474, GENMASK(7, 0));
6135c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x414, GENMASK(7, 0));
6145c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x4b4, GENMASK(7, 0));
6155c8f9400Sryan_chen setbits_le32(SCU_BASE + 0x410, BIT(7));
6165c8f9400Sryan_chen clrbits_le32(SCU_BASE + 0x470, BIT(7));
6175c8f9400Sryan_chen break;
6185c8f9400Sryan_chen
6195c8f9400Sryan_chen }
6205c8f9400Sryan_chen
6215c8f9400Sryan_chen debug("SCU410: %08x %08x %08x %08x\n", SCU_RD(0x410), SCU_RD(0x414), SCU_RD(0x418), SCU_RD(0x41c));
6225c8f9400Sryan_chen debug("SCU430: %08x %08x %08x %08x\n", SCU_RD(0x430), SCU_RD(0x434), SCU_RD(0x438), SCU_RD(0x43c));
6235c8f9400Sryan_chen debug("SCU470: %08x %08x %08x %08x\n", SCU_RD(0x470), SCU_RD(0x474), SCU_RD(0x478), SCU_RD(0x47c));
6245c8f9400Sryan_chen debug("SCU4b0: %08x %08x %08x %08x\n", SCU_RD(0x4b0), SCU_RD(0x4b4), SCU_RD(0x4b8), SCU_RD(0x4bc));
6255c8f9400Sryan_chen #else
6265c8f9400Sryan_chen /* MDC/MDIO pinmux */
6275c8f9400Sryan_chen if (p_eng->run.mdio_idx == 0) {
6285c8f9400Sryan_chen setbits_le32(SCU_BASE + 88, GENMASK(31, 30));
6295c8f9400Sryan_chen } else {
6305c8f9400Sryan_chen clrsetbits_le32(SCU_BASE + 90, BIT(6), BIT(2));
6315c8f9400Sryan_chen }
6325c8f9400Sryan_chen
6335c8f9400Sryan_chen /* enable MAC#nLINK pin */
6345c8f9400Sryan_chen setbits_le32(SCU_BASE + 80, BIT(p_eng->run.mac_idx));
6355c8f9400Sryan_chen #endif
6365c8f9400Sryan_chen }
6375c8f9400Sryan_chen
check_mac_idx(MAC_ENGINE * p_eng)6385c8f9400Sryan_chen static uint32_t check_mac_idx(MAC_ENGINE *p_eng)
6395c8f9400Sryan_chen {
6405c8f9400Sryan_chen /* check if legal run_idx */
6415c8f9400Sryan_chen if (p_eng->arg.mac_idx > p_eng->env.mac_num - 1) {
6425c8f9400Sryan_chen printf("invalid run_idx = %d\n", p_eng->arg.mac_idx);
6435c8f9400Sryan_chen return 1;
6445c8f9400Sryan_chen }
6455c8f9400Sryan_chen
6465c8f9400Sryan_chen return 0;
6475c8f9400Sryan_chen }
6485c8f9400Sryan_chen
calc_loop_check_num(MAC_ENGINE * p_eng)6495c8f9400Sryan_chen static void calc_loop_check_num(MAC_ENGINE *p_eng)
6505c8f9400Sryan_chen {
6515c8f9400Sryan_chen nt_log_func_name();
6525c8f9400Sryan_chen
6535c8f9400Sryan_chen if (p_eng->run.IO_MrgChk ||
6545c8f9400Sryan_chen (p_eng->arg.run_speed == SET_1G_100M_10MBPS) ||
6555c8f9400Sryan_chen (p_eng->arg.run_speed == SET_100M_10MBPS)) {
6565c8f9400Sryan_chen p_eng->run.LOOP_CheckNum = p_eng->run.loop_max;
6575c8f9400Sryan_chen } else {
6585c8f9400Sryan_chen switch (p_eng->arg.run_speed) {
6595c8f9400Sryan_chen case SET_1GBPS:
6605c8f9400Sryan_chen p_eng->run.CheckBuf_MBSize = MOVE_DATA_MB_SEC;
6615c8f9400Sryan_chen break;
6625c8f9400Sryan_chen case SET_100MBPS:
6635c8f9400Sryan_chen p_eng->run.CheckBuf_MBSize = (MOVE_DATA_MB_SEC >> 3);
6645c8f9400Sryan_chen break;
6655c8f9400Sryan_chen case SET_10MBPS:
6665c8f9400Sryan_chen p_eng->run.CheckBuf_MBSize = (MOVE_DATA_MB_SEC >> 6);
6675c8f9400Sryan_chen break;
6685c8f9400Sryan_chen }
6695c8f9400Sryan_chen p_eng->run.LOOP_CheckNum =
6705c8f9400Sryan_chen (p_eng->run.CheckBuf_MBSize /
6715c8f9400Sryan_chen (((p_eng->dat.Des_Num * DMA_PakSize) >> 20) + 1));
6725c8f9400Sryan_chen }
6735c8f9400Sryan_chen }
67454566526SDylan Hung static uint32_t setup_interface(MAC_ENGINE *p_eng);
setup_running(MAC_ENGINE * p_eng)6755c8f9400Sryan_chen static uint32_t setup_running(MAC_ENGINE *p_eng)
6765c8f9400Sryan_chen {
6775c8f9400Sryan_chen uint32_t n_desp_min;
67878b8f029SDylan Hung int i;
6795c8f9400Sryan_chen
6805c8f9400Sryan_chen if (0 != check_mac_idx(p_eng)) {
6815c8f9400Sryan_chen return 1;
6825c8f9400Sryan_chen }
6835c8f9400Sryan_chen p_eng->run.mac_idx = p_eng->arg.mac_idx;
6845c8f9400Sryan_chen p_eng->run.mac_base = mac_base_lookup_tbl[p_eng->run.mac_idx];
6855c8f9400Sryan_chen
6865c8f9400Sryan_chen p_eng->run.mdio_idx = p_eng->arg.mdio_idx;
6875c8f9400Sryan_chen p_eng->run.mdio_base = mdio_base_lookup_tbl[p_eng->run.mdio_idx];
6885c8f9400Sryan_chen
6895c8f9400Sryan_chen p_eng->run.is_rgmii = p_eng->env.is_1g_valid[p_eng->run.mac_idx];
6905c8f9400Sryan_chen
69154566526SDylan Hung if (p_eng->arg.run_mode == MODE_NCSI) {
69254566526SDylan Hung #ifdef CONFIG_ASPEED_AST2600
69354566526SDylan Hung /**
69454566526SDylan Hung * NCSI needs for 3.3V IO voltage but MAC#1 & MAC#2 only
69554566526SDylan Hung * support 1.8V. So NCSI can only runs on MAC#3 or MAC#4
69654566526SDylan Hung */
69754566526SDylan Hung if (p_eng->run.mac_idx < 2) {
69854566526SDylan Hung printf("\nNCSI must runs on MAC#3 or MAC#4\n");
69954566526SDylan Hung return 1;
70054566526SDylan Hung }
70154566526SDylan Hung
70254566526SDylan Hung if (p_eng->run.is_rgmii) {
70354566526SDylan Hung hw_strap2_t strap2;
70454566526SDylan Hung
70554566526SDylan Hung printf("\nNCSI must be RMII interface, force the strap value:\n");
70654566526SDylan Hung printf("\nbefore: SCU510=%08x\n", SCU_RD(0x510));
70754566526SDylan Hung strap2.w = 0;
70854566526SDylan Hung if (p_eng->run.mac_idx == 2) {
70954566526SDylan Hung strap2.b.mac3_interface = 1;
71054566526SDylan Hung } else if (p_eng->run.mac_idx == 3) {
71154566526SDylan Hung strap2.b.mac4_interface = 1;
71254566526SDylan Hung }
71354566526SDylan Hung SCU_WR(strap2.w, 0x514);
71454566526SDylan Hung while (SCU_RD(0x510) & strap2.w);
71554566526SDylan Hung printf("\nafter: SCU510=%08x\n", SCU_RD(0x510));
71654566526SDylan Hung /* update interface setting */
71754566526SDylan Hung setup_interface(p_eng);
71854566526SDylan Hung p_eng->run.is_rgmii = p_eng->env.is_1g_valid[p_eng->run.mac_idx];
71954566526SDylan Hung }
72054566526SDylan Hung #else
72154566526SDylan Hung if (p_eng->run.is_rgmii) {
72254566526SDylan Hung printf("\nNCSI must be RMII interface\n");
72354566526SDylan Hung return 1;
72454566526SDylan Hung }
72554566526SDylan Hung #endif
72654566526SDylan Hung }
72754566526SDylan Hung
728eecb289eSDylan Hung for (i = 0; i < 3; i++) {
729eecb289eSDylan Hung if (p_eng->arg.run_speed & (1 << i))
730eecb289eSDylan Hung p_eng->run.speed_cfg[i] = 1;
7315c8f9400Sryan_chen }
7325c8f9400Sryan_chen
7335c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_NCSI) {
7345c8f9400Sryan_chen /*
7355c8f9400Sryan_chen * [Arg]check GPackageTolNum
7365c8f9400Sryan_chen * [Arg]check GChannelTolNum
7375c8f9400Sryan_chen */
7385c8f9400Sryan_chen if ((p_eng->arg.GPackageTolNum < 1) ||
7395c8f9400Sryan_chen (p_eng->arg.GPackageTolNum > 8)) {
7405c8f9400Sryan_chen print_arg_package_num(p_eng);
7415c8f9400Sryan_chen return (1);
7425c8f9400Sryan_chen }
7435c8f9400Sryan_chen if ((p_eng->arg.GChannelTolNum < 1) ||
7445c8f9400Sryan_chen (p_eng->arg.GChannelTolNum > 32)) {
7455c8f9400Sryan_chen print_arg_channel_num(p_eng);
7465c8f9400Sryan_chen return (1);
7475c8f9400Sryan_chen }
7485c8f9400Sryan_chen } else {
7495c8f9400Sryan_chen /* [Arg]check ctrl */
7505c8f9400Sryan_chen if (p_eng->arg.ctrl.w & 0xfffc0000) {
7515c8f9400Sryan_chen print_arg_ctrl(p_eng);
7525c8f9400Sryan_chen return (1);
7535c8f9400Sryan_chen }
7545c8f9400Sryan_chen
7555c8f9400Sryan_chen if (p_eng->arg.phy_addr > 31) {
7565c8f9400Sryan_chen printf("Error phy_adr!!!\n");
7575c8f9400Sryan_chen print_arg_phy_addr(p_eng);
7585c8f9400Sryan_chen return (1);
7595c8f9400Sryan_chen }
7605c8f9400Sryan_chen
7615c8f9400Sryan_chen if (0 == p_eng->arg.loop_max) {
7625c8f9400Sryan_chen switch (p_eng->arg.run_speed) {
7635c8f9400Sryan_chen case SET_1GBPS:
7645c8f9400Sryan_chen p_eng->arg.loop_max = DEF_GLOOP_MAX * 20;
7655c8f9400Sryan_chen break;
7665c8f9400Sryan_chen case SET_100MBPS:
7675c8f9400Sryan_chen p_eng->arg.loop_max = DEF_GLOOP_MAX * 2;
7685c8f9400Sryan_chen break;
7695c8f9400Sryan_chen case SET_10MBPS:
7705c8f9400Sryan_chen p_eng->arg.loop_max = DEF_GLOOP_MAX;
7715c8f9400Sryan_chen break;
7725c8f9400Sryan_chen case SET_1G_100M_10MBPS:
7735c8f9400Sryan_chen p_eng->arg.loop_max = DEF_GLOOP_MAX * 20;
7745c8f9400Sryan_chen break;
7755c8f9400Sryan_chen case SET_100M_10MBPS:
7765c8f9400Sryan_chen p_eng->arg.loop_max = DEF_GLOOP_MAX * 2;
7775c8f9400Sryan_chen break;
7785c8f9400Sryan_chen }
7795c8f9400Sryan_chen }
7805c8f9400Sryan_chen }
7815c8f9400Sryan_chen
7825c8f9400Sryan_chen if (0 != check_test_mode(p_eng)) {
7835c8f9400Sryan_chen return 1;
7845c8f9400Sryan_chen }
7855c8f9400Sryan_chen
7865c8f9400Sryan_chen if (p_eng->run.tm_tx_only) {
7875c8f9400Sryan_chen p_eng->run.ieee_sel = p_eng->arg.ieee_sel;
7885c8f9400Sryan_chen p_eng->run.delay_margin = 0;
7895c8f9400Sryan_chen } else {
7905c8f9400Sryan_chen p_eng->run.ieee_sel = 0;
7915c8f9400Sryan_chen p_eng->run.delay_margin = p_eng->arg.delay_scan_range;
7925c8f9400Sryan_chen #if 0
7935c8f9400Sryan_chen if (p_eng->run.delay_margin == 0) {
7945c8f9400Sryan_chen printf("Error IO margin!!!\n");
7955c8f9400Sryan_chen print_arg_delay_scan_range(p_eng);
7965c8f9400Sryan_chen return(1);
7975c8f9400Sryan_chen }
7985c8f9400Sryan_chen #endif
7995c8f9400Sryan_chen }
8005c8f9400Sryan_chen
8015c8f9400Sryan_chen if (!p_eng->env.is_1g_valid[p_eng->run.mac_idx])
8025c8f9400Sryan_chen p_eng->run.speed_cfg[ 0 ] = 0;
8035c8f9400Sryan_chen
8045c8f9400Sryan_chen p_eng->run.tdes_base = (uint32_t)(&tdes_buf[0]);
8055c8f9400Sryan_chen p_eng->run.rdes_base = (uint32_t)(&rdes_buf[0]);
8065c8f9400Sryan_chen
8075c8f9400Sryan_chen if (p_eng->run.TM_IOTiming || p_eng->run.delay_margin)
8085c8f9400Sryan_chen p_eng->run.IO_MrgChk = 1;
8095c8f9400Sryan_chen else
8105c8f9400Sryan_chen p_eng->run.IO_MrgChk = 0;
8115c8f9400Sryan_chen
8125c8f9400Sryan_chen p_eng->phy.Adr = p_eng->arg.phy_addr;
8135c8f9400Sryan_chen p_eng->phy.loopback = p_eng->arg.ctrl.b.phy_int_loopback;
8145c8f9400Sryan_chen p_eng->phy.default_phy = p_eng->run.TM_DefaultPHY;
8155c8f9400Sryan_chen
8165c8f9400Sryan_chen p_eng->run.loop_max = p_eng->arg.loop_max;
8175c8f9400Sryan_chen calc_loop_check_num(p_eng);
8185c8f9400Sryan_chen
8195c8f9400Sryan_chen //------------------------------------------------------------
8205c8f9400Sryan_chen // Descriptor Number
8215c8f9400Sryan_chen //------------------------------------------------------------
8225c8f9400Sryan_chen //------------------------------
8235c8f9400Sryan_chen // [Dat]setup Des_Num
8245c8f9400Sryan_chen // [Dat]setup DMABuf_Size
8255c8f9400Sryan_chen // [Dat]setup DMABuf_Num
8265c8f9400Sryan_chen //------------------------------
8275c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
8285c8f9400Sryan_chen n_desp_min = p_eng->run.TM_IOTiming;
8295c8f9400Sryan_chen
830337226aaSDylan Hung if (p_eng->arg.ctrl.b.skip_phy_id_check &&
8315c8f9400Sryan_chen (p_eng->arg.test_mode == 0))
8325c8f9400Sryan_chen /* for SMSC's LAN9303 issue */
8335c8f9400Sryan_chen p_eng->dat.Des_Num = 114;
8345c8f9400Sryan_chen else {
8355c8f9400Sryan_chen switch (p_eng->arg.run_speed) {
8365c8f9400Sryan_chen case SET_1GBPS:
8375c8f9400Sryan_chen p_eng->dat.Des_Num =
8385c8f9400Sryan_chen p_eng->run.delay_margin
8395c8f9400Sryan_chen ? 100
8405c8f9400Sryan_chen : (n_desp_min) ? 512 : 4096;
8415c8f9400Sryan_chen break;
8425c8f9400Sryan_chen case SET_100MBPS:
8435c8f9400Sryan_chen p_eng->dat.Des_Num =
8445c8f9400Sryan_chen p_eng->run.delay_margin
8455c8f9400Sryan_chen ? 100
8465c8f9400Sryan_chen : (n_desp_min) ? 512 : 4096;
8475c8f9400Sryan_chen break;
8485c8f9400Sryan_chen case SET_10MBPS:
8495c8f9400Sryan_chen p_eng->dat.Des_Num =
8505c8f9400Sryan_chen p_eng->run.delay_margin
8515c8f9400Sryan_chen ? 100
8525c8f9400Sryan_chen : (n_desp_min) ? 100 : 830;
8535c8f9400Sryan_chen break;
8545c8f9400Sryan_chen case SET_1G_100M_10MBPS:
8555c8f9400Sryan_chen p_eng->dat.Des_Num =
8565c8f9400Sryan_chen p_eng->run.delay_margin
8575c8f9400Sryan_chen ? 100
8585c8f9400Sryan_chen : (n_desp_min) ? 100 : 830;
8595c8f9400Sryan_chen break;
8605c8f9400Sryan_chen case SET_100M_10MBPS:
8615c8f9400Sryan_chen p_eng->dat.Des_Num =
8625c8f9400Sryan_chen p_eng->run.delay_margin
8635c8f9400Sryan_chen ? 100
8645c8f9400Sryan_chen : (n_desp_min) ? 100 : 830;
8655c8f9400Sryan_chen break;
8665c8f9400Sryan_chen }
8675c8f9400Sryan_chen }
868acdea883SDylan Hung
869acdea883SDylan Hung if (p_eng->arg.ctrl.b.single_packet)
870acdea883SDylan Hung p_eng->dat.Des_Num = 1;
871acdea883SDylan Hung
8725c8f9400Sryan_chen /* keep in order: Des_Num -> DMABuf_Size -> DMABuf_Num */
8735c8f9400Sryan_chen p_eng->dat.Des_Num_Org = p_eng->dat.Des_Num;
8745c8f9400Sryan_chen p_eng->dat.DMABuf_Size = DMA_BufSize;
8755c8f9400Sryan_chen p_eng->dat.DMABuf_Num = DMA_BufNum;
8765c8f9400Sryan_chen
8775c8f9400Sryan_chen if (DbgPrn_Info) {
8785c8f9400Sryan_chen printf("CheckBuf_MBSize : %d\n",
8795c8f9400Sryan_chen p_eng->run.CheckBuf_MBSize);
8805c8f9400Sryan_chen printf("LOOP_CheckNum : %d\n",
8815c8f9400Sryan_chen p_eng->run.LOOP_CheckNum);
8825c8f9400Sryan_chen printf("Des_Num : %d\n", p_eng->dat.Des_Num);
8835c8f9400Sryan_chen printf("DMA_BufSize : %d bytes\n",
8845c8f9400Sryan_chen p_eng->dat.DMABuf_Size);
8855c8f9400Sryan_chen printf("DMA_BufNum : %d\n", p_eng->dat.DMABuf_Num);
8865c8f9400Sryan_chen printf("DMA_PakSize : %d\n", DMA_PakSize);
8875c8f9400Sryan_chen printf("\n");
8885c8f9400Sryan_chen }
8895c8f9400Sryan_chen if (2 > p_eng->dat.DMABuf_Num)
8905c8f9400Sryan_chen return (finish_check(p_eng, Err_Flag_DMABufNum));
8915c8f9400Sryan_chen }
8925c8f9400Sryan_chen
8935c8f9400Sryan_chen return 0;
8945c8f9400Sryan_chen }
8955c8f9400Sryan_chen
8965c8f9400Sryan_chen /**
8975c8f9400Sryan_chen * @brief setup environment according to HW strap registers
8985c8f9400Sryan_chen */
setup_interface(MAC_ENGINE * p_eng)8995c8f9400Sryan_chen static uint32_t setup_interface(MAC_ENGINE *p_eng)
9005c8f9400Sryan_chen {
9015c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
9025c8f9400Sryan_chen hw_strap1_t strap1;
9035c8f9400Sryan_chen hw_strap2_t strap2;
9045c8f9400Sryan_chen
9055c8f9400Sryan_chen strap1.w = SCU_RD(0x500);
9065c8f9400Sryan_chen strap2.w = SCU_RD(0x510);
9075c8f9400Sryan_chen
9085c8f9400Sryan_chen p_eng->env.is_1g_valid[0] = strap1.b.mac1_interface;
9095c8f9400Sryan_chen p_eng->env.is_1g_valid[1] = strap1.b.mac2_interface;
9105c8f9400Sryan_chen p_eng->env.is_1g_valid[2] = strap2.b.mac3_interface;
9115c8f9400Sryan_chen p_eng->env.is_1g_valid[3] = strap2.b.mac4_interface;
9125c8f9400Sryan_chen
9135c8f9400Sryan_chen p_eng->env.at_least_1g_valid =
9145c8f9400Sryan_chen p_eng->env.is_1g_valid[0] | p_eng->env.is_1g_valid[1] |
9155c8f9400Sryan_chen p_eng->env.is_1g_valid[2] | p_eng->env.is_1g_valid[3];
9165c8f9400Sryan_chen #else
9175c8f9400Sryan_chen hw_strap1_t strap1;
9185c8f9400Sryan_chen strap1.w = SCU_RD(0x70);
9195c8f9400Sryan_chen p_eng->env.is_1g_valid[0] = strap1.b.mac1_interface;
9205c8f9400Sryan_chen p_eng->env.is_1g_valid[1] = strap1.b.mac2_interface;
9215c8f9400Sryan_chen
9225c8f9400Sryan_chen p_eng->env.at_least_1g_valid =
9235c8f9400Sryan_chen p_eng->env.is_1g_valid[0] | p_eng->env.is_1g_valid[1];
9245c8f9400Sryan_chen #endif
9255c8f9400Sryan_chen return 0;
9265c8f9400Sryan_chen }
9275c8f9400Sryan_chen
9285c8f9400Sryan_chen /**
9295c8f9400Sryan_chen * @brief setup chip compatibility accoriding to the chip ID register
9305c8f9400Sryan_chen */
setup_chip_compatibility(MAC_ENGINE * p_eng)9315c8f9400Sryan_chen static uint32_t setup_chip_compatibility(MAC_ENGINE *p_eng)
9325c8f9400Sryan_chen {
9335c8f9400Sryan_chen uint32_t reg_addr;
9345c8f9400Sryan_chen uint32_t id, version;
9355c8f9400Sryan_chen uint32_t is_valid;
9365c8f9400Sryan_chen
9375c8f9400Sryan_chen p_eng->env.ast2600 = 0;
9385c8f9400Sryan_chen p_eng->env.ast2500 = 0;
9395c8f9400Sryan_chen
9405c8f9400Sryan_chen #if defined(CONFIG_ASPEED_AST2600)
9415c8f9400Sryan_chen reg_addr = 0x04;
9425c8f9400Sryan_chen #else
9435c8f9400Sryan_chen reg_addr = 0x7c;
9445c8f9400Sryan_chen #endif
9455c8f9400Sryan_chen is_valid = 0;
9465c8f9400Sryan_chen id = (SCU_RD(reg_addr) & GENMASK(31, 24)) >> 24;
9475c8f9400Sryan_chen version = (SCU_RD(reg_addr) & GENMASK(23, 16)) >> 16;
9485c8f9400Sryan_chen
9495c8f9400Sryan_chen #if defined(CONFIG_FPGA_ASPEED) && defined(CONFIG_ASPEED_AST2600)
9505c8f9400Sryan_chen id = 0x5;
9515c8f9400Sryan_chen #endif
9525c8f9400Sryan_chen if (id == 0x5) {
9535c8f9400Sryan_chen printf("chip: AST2600 A%d\n", version);
9545c8f9400Sryan_chen p_eng->env.ast2600 = 1;
9555c8f9400Sryan_chen p_eng->env.ast2500 = 1;
9565c8f9400Sryan_chen p_eng->env.mac_num = 4;
9575c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[0] = 1;
9585c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[1] = 1;
9595c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[2] = 1;
9605c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[3] = 1;
9615c8f9400Sryan_chen is_valid = 1;
9625c8f9400Sryan_chen } else if (id == 0x4) {
9635c8f9400Sryan_chen printf("chip: AST2500 A%d\n", version);
9645c8f9400Sryan_chen p_eng->env.ast2500 = 1;
9655c8f9400Sryan_chen p_eng->env.mac_num = 2;
9665c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[0] = MAC1_RD(0x40) >> 31;
9675c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[1] = MAC2_RD(0x40) >> 31;
9685c8f9400Sryan_chen is_valid = 1;
9695c8f9400Sryan_chen }
9705c8f9400Sryan_chen
9715c8f9400Sryan_chen if (0 == is_valid) {
9725c8f9400Sryan_chen printf("unknown chip\n");
9735c8f9400Sryan_chen return 1;
9745c8f9400Sryan_chen }
9755c8f9400Sryan_chen
9765c8f9400Sryan_chen return 0;
9775c8f9400Sryan_chen }
9785c8f9400Sryan_chen
9795c8f9400Sryan_chen /**
9805c8f9400Sryan_chen * @brief setup environment accoriding to the HW strap and chip ID
9815c8f9400Sryan_chen */
setup_env(MAC_ENGINE * p_eng)9825c8f9400Sryan_chen static uint32_t setup_env(MAC_ENGINE *p_eng)
9835c8f9400Sryan_chen {
9845c8f9400Sryan_chen if (0 != setup_chip_compatibility(p_eng)) {
9855c8f9400Sryan_chen return 1;
9865c8f9400Sryan_chen }
9875c8f9400Sryan_chen
9885c8f9400Sryan_chen setup_interface(p_eng);
9895c8f9400Sryan_chen return 0;
9905c8f9400Sryan_chen }
9915c8f9400Sryan_chen
init_mac_engine(MAC_ENGINE * p_eng,uint32_t mode)9925c8f9400Sryan_chen static uint32_t init_mac_engine(MAC_ENGINE *p_eng, uint32_t mode)
9935c8f9400Sryan_chen {
9945c8f9400Sryan_chen memset(p_eng, 0, sizeof(MAC_ENGINE));
9955c8f9400Sryan_chen
9965c8f9400Sryan_chen if (0 != setup_env(p_eng)) {
9975c8f9400Sryan_chen return 1;
9985c8f9400Sryan_chen }
9995c8f9400Sryan_chen
10005c8f9400Sryan_chen p_eng->arg.run_mode = mode;
10015c8f9400Sryan_chen p_eng->arg.delay_scan_range = DEF_GIOTIMINGBUND;
10025c8f9400Sryan_chen p_eng->arg.test_mode = DEF_GTESTMODE;
10035c8f9400Sryan_chen
10045c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_NCSI ) {
10055c8f9400Sryan_chen p_eng->arg.GARPNumCnt = DEF_GARPNUMCNT;
10065c8f9400Sryan_chen p_eng->arg.GChannelTolNum = DEF_GCHANNEL2NUM;
10075c8f9400Sryan_chen p_eng->arg.GPackageTolNum = DEF_GPACKAGE2NUM;
10085c8f9400Sryan_chen p_eng->arg.ctrl.w = 0;
10095c8f9400Sryan_chen p_eng->arg.run_speed = SET_100MBPS; // In NCSI mode, we set to 100M bps
10105c8f9400Sryan_chen } else {
10115c8f9400Sryan_chen p_eng->arg.user_def_val = DEF_GUSER_DEF_PACKET_VAL;
10125c8f9400Sryan_chen p_eng->arg.phy_addr = DEF_GPHY_ADR;
10135c8f9400Sryan_chen p_eng->arg.loop_inf = 0;
10145c8f9400Sryan_chen p_eng->arg.loop_max = 0;
10155c8f9400Sryan_chen p_eng->arg.ctrl.w = DEF_GCTRL;
10165c8f9400Sryan_chen p_eng->arg.run_speed = DEF_GSPEED;
10175c8f9400Sryan_chen }
10185c8f9400Sryan_chen
10195c8f9400Sryan_chen p_eng->flg.print_en = 1;
10205c8f9400Sryan_chen
10215c8f9400Sryan_chen p_eng->run.TM_TxDataEn = 1;
10225c8f9400Sryan_chen p_eng->run.TM_RxDataEn = 1;
10235c8f9400Sryan_chen p_eng->run.TM_NCSI_DiSChannel = 1;
10245c8f9400Sryan_chen
10255c8f9400Sryan_chen /* setup
10265c8f9400Sryan_chen * 1. delay control register
10275c8f9400Sryan_chen * 2. driving strength control register and upper/lower bond
10285c8f9400Sryan_chen * 3. MAC control register
10295c8f9400Sryan_chen */
10305c8f9400Sryan_chen #ifdef CONFIG_ASPEED_AST2600
10315c8f9400Sryan_chen p_eng->io.mac12_1g_delay.addr = SCU_BASE + 0x340;
10325c8f9400Sryan_chen p_eng->io.mac12_1g_delay.tx_min = 0;
10335c8f9400Sryan_chen p_eng->io.mac12_1g_delay.tx_max = 63;
10345c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rx_min = -63;
10355c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rx_max = 63;
10365c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_tx_min = 0;
10375c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_tx_max = 1;
10385c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_rx_min = 0;
10395c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_rx_max = 63;
10405c8f9400Sryan_chen
10415c8f9400Sryan_chen p_eng->io.mac12_100m_delay.addr = SCU_BASE + 0x348;
10425c8f9400Sryan_chen p_eng->io.mac12_100m_delay.tx_min = 0;
10435c8f9400Sryan_chen p_eng->io.mac12_100m_delay.tx_max = 63;
10445c8f9400Sryan_chen p_eng->io.mac12_100m_delay.rx_min = -63;
10455c8f9400Sryan_chen p_eng->io.mac12_100m_delay.rx_max = 63;
10465c8f9400Sryan_chen p_eng->io.mac12_10m_delay.addr = SCU_BASE + 0x34c;
10475c8f9400Sryan_chen p_eng->io.mac12_10m_delay.tx_min = 0;
10485c8f9400Sryan_chen p_eng->io.mac12_10m_delay.tx_max = 63;
10495c8f9400Sryan_chen p_eng->io.mac12_10m_delay.rx_min = -63;
10505c8f9400Sryan_chen p_eng->io.mac12_10m_delay.rx_max = 63;
10515c8f9400Sryan_chen
10525c8f9400Sryan_chen p_eng->io.mac34_1g_delay.addr = SCU_BASE + 0x350;
10535c8f9400Sryan_chen p_eng->io.mac34_1g_delay.tx_min = 0;
10545c8f9400Sryan_chen p_eng->io.mac34_1g_delay.tx_max = 63;
10555c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rx_min = -63;
10565c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rx_max = 63;
10575c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rmii_tx_min = 0;
10585c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rmii_tx_max = 1;
10595c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rmii_rx_min = 0;
10605c8f9400Sryan_chen p_eng->io.mac34_1g_delay.rmii_rx_max = 63;
10615c8f9400Sryan_chen p_eng->io.mac34_100m_delay.addr = SCU_BASE + 0x358;
10625c8f9400Sryan_chen p_eng->io.mac34_100m_delay.tx_min = 0;
10635c8f9400Sryan_chen p_eng->io.mac34_100m_delay.tx_max = 63;
10645c8f9400Sryan_chen p_eng->io.mac34_100m_delay.rx_min = -63;
10655c8f9400Sryan_chen p_eng->io.mac34_100m_delay.rx_max = 63;
10665c8f9400Sryan_chen p_eng->io.mac34_10m_delay.addr = SCU_BASE + 0x35c;
10675c8f9400Sryan_chen p_eng->io.mac34_10m_delay.tx_min = 0;
10685c8f9400Sryan_chen p_eng->io.mac34_10m_delay.tx_max = 63;
10695c8f9400Sryan_chen p_eng->io.mac34_10m_delay.rx_min = -63;
10705c8f9400Sryan_chen p_eng->io.mac34_10m_delay.rx_max = 63;
10715c8f9400Sryan_chen
10725c8f9400Sryan_chen p_eng->io.mac34_drv_reg.addr = SCU_BASE + 0x458;
10735c8f9400Sryan_chen p_eng->io.mac34_drv_reg.drv_max = 0x3;
10745c8f9400Sryan_chen p_eng->io.drv_upper_bond = 0x3;
10755c8f9400Sryan_chen p_eng->io.drv_lower_bond = 0;
10765c8f9400Sryan_chen #else
10775c8f9400Sryan_chen p_eng->io.mac12_1g_delay.addr = SCU_BASE + 0x48;
10785c8f9400Sryan_chen p_eng->io.mac12_1g_delay.tx_min = 0;
10795c8f9400Sryan_chen p_eng->io.mac12_1g_delay.tx_max = 63;
10805c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rx_min = 0;
10815c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rx_max = 63;
10825c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_tx_min = 0;
10835c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_tx_max = 1;
10845c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_rx_min = 0;
10855c8f9400Sryan_chen p_eng->io.mac12_1g_delay.rmii_rx_max = 63;
10865c8f9400Sryan_chen p_eng->io.mac12_100m_delay.addr = SCU_BASE + 0xb8;
10875c8f9400Sryan_chen p_eng->io.mac12_100m_delay.tx_min = 0;
10885c8f9400Sryan_chen p_eng->io.mac12_100m_delay.tx_max = 63;
10895c8f9400Sryan_chen p_eng->io.mac12_100m_delay.rx_min = 0;
10905c8f9400Sryan_chen p_eng->io.mac12_100m_delay.rx_max = 63;
10915c8f9400Sryan_chen p_eng->io.mac12_10m_delay.addr = SCU_BASE + 0xbc;
10925c8f9400Sryan_chen p_eng->io.mac12_10m_delay.tx_min = 0;
10935c8f9400Sryan_chen p_eng->io.mac12_10m_delay.tx_max = 63;
10945c8f9400Sryan_chen p_eng->io.mac12_10m_delay.rx_min = 0;
10955c8f9400Sryan_chen p_eng->io.mac12_10m_delay.rx_max = 63;
10965c8f9400Sryan_chen
10975c8f9400Sryan_chen p_eng->io.mac34_1g_delay.addr = 0;
10985c8f9400Sryan_chen p_eng->io.mac34_100m_delay.addr = 0;
10995c8f9400Sryan_chen p_eng->io.mac34_10m_delay.addr = 0;
11005c8f9400Sryan_chen
11015c8f9400Sryan_chen p_eng->io.mac12_drv_reg.addr = SCU_BASE + 0x90;
11025c8f9400Sryan_chen p_eng->io.mac12_drv_reg.drv_max = 0x1;
11035c8f9400Sryan_chen p_eng->io.drv_upper_bond = 0x1;
11045c8f9400Sryan_chen p_eng->io.drv_lower_bond = 0;
11055c8f9400Sryan_chen #endif
11065c8f9400Sryan_chen return 0;
11075c8f9400Sryan_chen }
11085c8f9400Sryan_chen
parse_arg_dedicated(int argc,char * const argv[],MAC_ENGINE * p_eng)11095c8f9400Sryan_chen static uint32_t parse_arg_dedicated(int argc, char *const argv[],
11105c8f9400Sryan_chen MAC_ENGINE *p_eng)
11115c8f9400Sryan_chen {
11125c8f9400Sryan_chen switch (argc) {
11135c8f9400Sryan_chen case 10:
11145c8f9400Sryan_chen p_eng->arg.user_def_val = simple_strtol(argv[9], NULL, 16);
11155c8f9400Sryan_chen case 9:
11165c8f9400Sryan_chen p_eng->arg.delay_scan_range = simple_strtol(argv[8], NULL, 10);
11175c8f9400Sryan_chen p_eng->arg.ieee_sel = p_eng->arg.delay_scan_range;
11185c8f9400Sryan_chen case 8:
11195c8f9400Sryan_chen p_eng->arg.phy_addr = simple_strtol(argv[7], NULL, 10);
11205c8f9400Sryan_chen case 7:
11215c8f9400Sryan_chen p_eng->arg.test_mode = simple_strtol(argv[6], NULL, 16);
11225c8f9400Sryan_chen printf("test mode = %d\n", p_eng->arg.test_mode);
11235c8f9400Sryan_chen case 6:
11245c8f9400Sryan_chen p_eng->arg.loop_max = simple_strtol(argv[5], NULL, 10);
11255c8f9400Sryan_chen if (p_eng->arg.loop_max == -1) {
11265c8f9400Sryan_chen p_eng->arg.loop_inf = 1;
11275c8f9400Sryan_chen }
11285c8f9400Sryan_chen printf("loop max=%d, loop_inf=%d\n", p_eng->arg.loop_max, p_eng->arg.loop_inf);
11295c8f9400Sryan_chen case 5:
11305c8f9400Sryan_chen p_eng->arg.ctrl.w = simple_strtol(argv[4], NULL, 16);
11315c8f9400Sryan_chen printf("ctrl=0x%05x\n", p_eng->arg.ctrl.w);
11325c8f9400Sryan_chen case 4:
11335c8f9400Sryan_chen p_eng->arg.run_speed = simple_strtol(argv[3], NULL, 16);
11345c8f9400Sryan_chen printf("speed=0x%1x\n", p_eng->arg.run_speed);
11355c8f9400Sryan_chen case 3:
11365c8f9400Sryan_chen p_eng->arg.mdio_idx = simple_strtol(argv[2], NULL, 10);
11375c8f9400Sryan_chen printf("mdio_idx=%d\n", p_eng->arg.mdio_idx);
11385c8f9400Sryan_chen }
11395c8f9400Sryan_chen
11405c8f9400Sryan_chen return 0;
11415c8f9400Sryan_chen }
11425c8f9400Sryan_chen
parse_arg_ncsi(int argc,char * const argv[],MAC_ENGINE * p_eng)11435c8f9400Sryan_chen static uint32_t parse_arg_ncsi(int argc, char *const argv[], MAC_ENGINE *p_eng)
11445c8f9400Sryan_chen {
11455c8f9400Sryan_chen switch (argc) {
11465c8f9400Sryan_chen case 8:
11475c8f9400Sryan_chen p_eng->arg.GARPNumCnt = simple_strtol(argv[7], NULL, 10);
11485c8f9400Sryan_chen case 7:
11495c8f9400Sryan_chen p_eng->arg.ctrl.w = simple_strtol(argv[6], NULL, 16);
11505c8f9400Sryan_chen case 6:
11515c8f9400Sryan_chen p_eng->arg.delay_scan_range = simple_strtol(argv[5], NULL, 10);
11525c8f9400Sryan_chen case 5:
11535c8f9400Sryan_chen p_eng->arg.test_mode = simple_strtol(argv[4], NULL, 16);
11545c8f9400Sryan_chen case 4:
11555c8f9400Sryan_chen p_eng->arg.GChannelTolNum = simple_strtol(argv[3], NULL, 10);
11565c8f9400Sryan_chen case 3:
11575c8f9400Sryan_chen p_eng->arg.GPackageTolNum = simple_strtol(argv[2], NULL, 10);
11585c8f9400Sryan_chen }
11595c8f9400Sryan_chen return 0;
11605c8f9400Sryan_chen }
11615c8f9400Sryan_chen
11625c8f9400Sryan_chen
disable_wdt(MAC_ENGINE * p_eng)11635c8f9400Sryan_chen static void disable_wdt(MAC_ENGINE *p_eng)
11645c8f9400Sryan_chen {
1165*7de3deeaSDylan Hung #ifdef CONFIG_ASPEED_AST2600
1166*7de3deeaSDylan Hung writel(0, 0x1e620064);
1167*7de3deeaSDylan Hung #else
1168*7de3deeaSDylan Hung writel(0, 0x1e78502c);
1169*7de3deeaSDylan Hung #endif
11705c8f9400Sryan_chen return;
11715c8f9400Sryan_chen }
11725c8f9400Sryan_chen
setup_data(MAC_ENGINE * p_eng)11735c8f9400Sryan_chen static uint32_t setup_data(MAC_ENGINE *p_eng)
11745c8f9400Sryan_chen {
11755c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
11765c8f9400Sryan_chen if (p_eng->run.tm_tx_only)
11775c8f9400Sryan_chen setup_arp(p_eng);
11785c8f9400Sryan_chen
11795c8f9400Sryan_chen p_eng->dat.FRAME_LEN =
11805c8f9400Sryan_chen (uint32_t *)malloc(p_eng->dat.Des_Num * sizeof(uint32_t));
11815c8f9400Sryan_chen p_eng->dat.wp_lst =
11825c8f9400Sryan_chen (uint32_t *)malloc(p_eng->dat.Des_Num * sizeof(uint32_t));
11835c8f9400Sryan_chen
11845c8f9400Sryan_chen if (!p_eng->dat.FRAME_LEN)
11855c8f9400Sryan_chen return (finish_check(p_eng, Err_Flag_MALLOC_FrmSize));
11865c8f9400Sryan_chen if (!p_eng->dat.wp_lst)
11875c8f9400Sryan_chen return (finish_check(p_eng, Err_Flag_MALLOC_LastWP));
11885c8f9400Sryan_chen
11895c8f9400Sryan_chen TestingSetup(p_eng);
11905c8f9400Sryan_chen } else {
11915c8f9400Sryan_chen if (p_eng->arg.GARPNumCnt != 0)
11925c8f9400Sryan_chen setup_arp(p_eng);
11935c8f9400Sryan_chen }
11945c8f9400Sryan_chen
11955c8f9400Sryan_chen p_eng->run.speed_idx = 0;
11965c8f9400Sryan_chen p_eng->io.drv_curr = mac_get_driving_strength(p_eng);
11975c8f9400Sryan_chen if (mac_set_scan_boundary(p_eng))
11985c8f9400Sryan_chen return (finish_check(p_eng, 0));
11995c8f9400Sryan_chen
12005c8f9400Sryan_chen return 0;
12015c8f9400Sryan_chen }
12025c8f9400Sryan_chen
get_time_out_th(MAC_ENGINE * p_eng)12035c8f9400Sryan_chen static uint32_t get_time_out_th(MAC_ENGINE *p_eng)
12045c8f9400Sryan_chen {
12055c8f9400Sryan_chen uint32_t time_out;
12065c8f9400Sryan_chen
12075c8f9400Sryan_chen time_out = timeout_th_tbl[p_eng->run.speed_idx];
12085c8f9400Sryan_chen if (p_eng->run.TM_WaitStart)
12095c8f9400Sryan_chen time_out = time_out * 10000;
12105c8f9400Sryan_chen
12115c8f9400Sryan_chen return time_out;
12125c8f9400Sryan_chen }
test_start(MAC_ENGINE * p_eng,PHY_ENGINE * p_phy_eng)12135c8f9400Sryan_chen uint32_t test_start(MAC_ENGINE *p_eng, PHY_ENGINE *p_phy_eng)
12145c8f9400Sryan_chen {
12155c8f9400Sryan_chen uint32_t drv, speed;
12165c8f9400Sryan_chen int td, rd, tbegin, rbegin, tend, rend;
12175c8f9400Sryan_chen int tstep, rstep;
12185c8f9400Sryan_chen
12195c8f9400Sryan_chen uint32_t wrn_flag_allspeed = 0;
12205c8f9400Sryan_chen uint32_t err_flag_allspeed = 0;
12215c8f9400Sryan_chen uint32_t des_flag_allspeed = 0;
12225c8f9400Sryan_chen uint32_t ncsi_flag_allspeed = 0;
12235c8f9400Sryan_chen
12245c8f9400Sryan_chen memset(&p_eng->io.result_history[0][0], 0,
12255c8f9400Sryan_chen sizeof(p_eng->io.result_history));
12265c8f9400Sryan_chen
12275c8f9400Sryan_chen for (speed = 0; speed < 3; speed++) {
12285c8f9400Sryan_chen p_eng->flg.print_en = 1;
12295c8f9400Sryan_chen p_eng->run.speed_idx = speed;
12305c8f9400Sryan_chen mac_set_scan_boundary(p_eng);
12315c8f9400Sryan_chen if (0 == p_eng->run.speed_sel[speed]) {
12325c8f9400Sryan_chen continue;
12335c8f9400Sryan_chen }
12345c8f9400Sryan_chen
12355c8f9400Sryan_chen p_eng->run.timeout_th = get_time_out_th(p_eng);
12365c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
12375c8f9400Sryan_chen if ((p_eng->arg.run_speed == SET_1G_100M_10MBPS) ||
12385c8f9400Sryan_chen (p_eng->arg.run_speed == SET_100M_10MBPS)) {
12395c8f9400Sryan_chen if (p_eng->run.speed_sel[0])
12405c8f9400Sryan_chen p_eng->run.loop_max =
12415c8f9400Sryan_chen p_eng->arg.loop_max;
12425c8f9400Sryan_chen else if (p_eng->run.speed_sel[1])
12435c8f9400Sryan_chen p_eng->run.loop_max =
12445c8f9400Sryan_chen p_eng->arg.loop_max / 100;
12455c8f9400Sryan_chen else
12465c8f9400Sryan_chen p_eng->run.loop_max =
12475c8f9400Sryan_chen p_eng->arg.loop_max / 1000;
12485c8f9400Sryan_chen
12495c8f9400Sryan_chen if (0 == p_eng->run.loop_max)
12505c8f9400Sryan_chen p_eng->run.loop_max = 1;
12515c8f9400Sryan_chen
12525c8f9400Sryan_chen calc_loop_check_num(p_eng);
12535c8f9400Sryan_chen }
12545c8f9400Sryan_chen //------------------------------
12555c8f9400Sryan_chen // PHY Initial
12565c8f9400Sryan_chen //------------------------------
12575c8f9400Sryan_chen if (p_phy_eng->fp_set) {
12585c8f9400Sryan_chen init_phy(p_eng, p_phy_eng);
12595c8f9400Sryan_chen }
12605c8f9400Sryan_chen
1261783c0c9bSDylan Hung if (p_eng->flg.error)
12625c8f9400Sryan_chen return (finish_check(p_eng, 0));
12635c8f9400Sryan_chen }
12645c8f9400Sryan_chen
12655c8f9400Sryan_chen //------------------------------
12665c8f9400Sryan_chen // [Start] The loop of different IO strength
12675c8f9400Sryan_chen //------------------------------
12685c8f9400Sryan_chen debug("drirving scan range: %d ~ %d\n",
12695c8f9400Sryan_chen p_eng->io.drv_lower_bond, p_eng->io.drv_upper_bond);
12705c8f9400Sryan_chen for (drv = p_eng->io.drv_lower_bond;
12715c8f9400Sryan_chen drv <= p_eng->io.drv_upper_bond; drv++) {
12725c8f9400Sryan_chen if (p_eng->run.IO_MrgChk) {
12735c8f9400Sryan_chen if (p_eng->run.TM_IOStrength) {
12745c8f9400Sryan_chen mac_set_driving_strength(p_eng, drv);
12755c8f9400Sryan_chen p_eng->io.drv_curr = mac_get_driving_strength(p_eng);
12765c8f9400Sryan_chen }
12775c8f9400Sryan_chen
12785c8f9400Sryan_chen if (p_eng->run.delay_margin)
12795c8f9400Sryan_chen PrintIO_Header(p_eng, FP_LOG);
12805c8f9400Sryan_chen if (p_eng->run.TM_IOTiming)
12815c8f9400Sryan_chen PrintIO_Header(p_eng, FP_IO);
12825c8f9400Sryan_chen PrintIO_Header(p_eng, STD_OUT);
12835c8f9400Sryan_chen } else {
12845c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
12855c8f9400Sryan_chen Print_Header(p_eng, STD_OUT);
12865c8f9400Sryan_chen }
12875c8f9400Sryan_chen } // End if (p_eng->run.IO_MrgChk)
12885c8f9400Sryan_chen
12895c8f9400Sryan_chen //------------------------------
12905c8f9400Sryan_chen // [Start] The loop of different IO out delay
12915c8f9400Sryan_chen //------------------------------
12925c8f9400Sryan_chen tbegin = p_eng->io.tx_delay_scan.begin;
12935c8f9400Sryan_chen tend = p_eng->io.tx_delay_scan.end;
12945c8f9400Sryan_chen tstep = p_eng->io.tx_delay_scan.step;
12955c8f9400Sryan_chen
12965c8f9400Sryan_chen rbegin = p_eng->io.rx_delay_scan.begin;
12975c8f9400Sryan_chen rend = p_eng->io.rx_delay_scan.end;
12985c8f9400Sryan_chen rstep = p_eng->io.rx_delay_scan.step;
12995c8f9400Sryan_chen
13005c8f9400Sryan_chen for (td = tbegin; td <= tend; td += tstep) {
13015c8f9400Sryan_chen p_eng->io.Dly_out = td;
13025c8f9400Sryan_chen p_eng->io.Dly_out_selval = td;
13035c8f9400Sryan_chen if (p_eng->run.IO_MrgChk) {
13045c8f9400Sryan_chen PrintIO_LineS(p_eng, STD_OUT);
13055c8f9400Sryan_chen } // End if (p_eng->run.IO_MrgChk)
13065c8f9400Sryan_chen
13075c8f9400Sryan_chen //------------------------------
13085c8f9400Sryan_chen // [Start] The loop of different IO in
13095c8f9400Sryan_chen // delay
13105c8f9400Sryan_chen //------------------------------
13115c8f9400Sryan_chen for (rd = rbegin; rd <= rend; rd += rstep) {
13125c8f9400Sryan_chen p_eng->io.Dly_in = rd;
13135c8f9400Sryan_chen if (p_eng->run.IO_MrgChk) {
13145c8f9400Sryan_chen p_eng->io.Dly_in_selval = rd;
13155c8f9400Sryan_chen scu_disable_mac(p_eng);
13165c8f9400Sryan_chen mac_set_delay(p_eng, rd, td);
13175c8f9400Sryan_chen scu_enable_mac(p_eng);
13185c8f9400Sryan_chen }
13195c8f9400Sryan_chen //------------------------------
13205c8f9400Sryan_chen // MAC Initial
13215c8f9400Sryan_chen //------------------------------
13225c8f9400Sryan_chen init_mac(p_eng);
1323783c0c9bSDylan Hung if (p_eng->flg.error)
13245c8f9400Sryan_chen return (finish_check(p_eng, 0));
13255c8f9400Sryan_chen
13265c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_NCSI) {
13275c8f9400Sryan_chen p_eng->io.result =
13285c8f9400Sryan_chen phy_ncsi(p_eng);
13295c8f9400Sryan_chen } else {
13305c8f9400Sryan_chen p_eng->io.result = TestingLoop(
13315c8f9400Sryan_chen p_eng,
13325c8f9400Sryan_chen p_eng->run.LOOP_CheckNum);
13335c8f9400Sryan_chen }
13345c8f9400Sryan_chen
13355c8f9400Sryan_chen p_eng->io.result_history[rd + 64][td] |=
13365c8f9400Sryan_chen p_eng->io.result;
13375c8f9400Sryan_chen
13385c8f9400Sryan_chen /* Display to Log file and monitor */
13395c8f9400Sryan_chen if (p_eng->run.IO_MrgChk) {
13405c8f9400Sryan_chen PrintIO_Line(p_eng, STD_OUT);
13415c8f9400Sryan_chen
13425c8f9400Sryan_chen FPri_ErrFlag(p_eng, FP_LOG);
13435c8f9400Sryan_chen
1344783c0c9bSDylan Hung p_eng->flg.warn = 0;
1345783c0c9bSDylan Hung p_eng->flg.error = 0;
1346783c0c9bSDylan Hung p_eng->flg.desc = 0;
1347783c0c9bSDylan Hung p_eng->flg.ncsi = 0;
13485c8f9400Sryan_chen }
13495c8f9400Sryan_chen }
13505c8f9400Sryan_chen
13515c8f9400Sryan_chen if (p_eng->run.IO_MrgChk) {
13525c8f9400Sryan_chen if (p_eng->run.TM_IOTiming) {
13535c8f9400Sryan_chen PRINTF(FP_IO, "\n");
13545c8f9400Sryan_chen }
13555c8f9400Sryan_chen printf("\n");
13565c8f9400Sryan_chen }
13575c8f9400Sryan_chen }
13585c8f9400Sryan_chen
13595c8f9400Sryan_chen if (!p_eng->run.tm_tx_only)
13605c8f9400Sryan_chen FPri_ErrFlag(p_eng, FP_LOG);
13615c8f9400Sryan_chen if (p_eng->run.TM_IOTiming)
13625c8f9400Sryan_chen FPri_ErrFlag(p_eng, FP_IO);
13635c8f9400Sryan_chen
13645c8f9400Sryan_chen FPri_ErrFlag(p_eng, STD_OUT);
13655c8f9400Sryan_chen
1366783c0c9bSDylan Hung wrn_flag_allspeed |= p_eng->flg.warn;
1367783c0c9bSDylan Hung err_flag_allspeed |= p_eng->flg.error;
1368783c0c9bSDylan Hung des_flag_allspeed |= p_eng->flg.error;
1369783c0c9bSDylan Hung ncsi_flag_allspeed |= p_eng->flg.error;
1370783c0c9bSDylan Hung p_eng->flg.warn = 0;
1371783c0c9bSDylan Hung p_eng->flg.error = 0;
1372783c0c9bSDylan Hung p_eng->flg.desc = 0;
1373783c0c9bSDylan Hung p_eng->flg.ncsi = 0;
13745c8f9400Sryan_chen }
13755c8f9400Sryan_chen
13765c8f9400Sryan_chen if (p_eng->arg.run_mode == MODE_DEDICATED) {
13775c8f9400Sryan_chen if (p_phy_eng->fp_clr != 0)
13785c8f9400Sryan_chen recov_phy(p_eng, p_phy_eng);
13795c8f9400Sryan_chen }
13805c8f9400Sryan_chen
13815c8f9400Sryan_chen p_eng->run.speed_sel[speed] = 0;
13825c8f9400Sryan_chen p_eng->flg.print_en = 0;
13835c8f9400Sryan_chen } // End for (speed = 0; speed < 3; speed++)
13845c8f9400Sryan_chen
1385783c0c9bSDylan Hung p_eng->flg.warn = wrn_flag_allspeed;
1386783c0c9bSDylan Hung p_eng->flg.error = err_flag_allspeed;
1387783c0c9bSDylan Hung p_eng->flg.desc = des_flag_allspeed;
1388783c0c9bSDylan Hung p_eng->flg.ncsi = ncsi_flag_allspeed;
13895c8f9400Sryan_chen
13905c8f9400Sryan_chen return (finish_check(p_eng, 0));
13915c8f9400Sryan_chen }
ring_clk(uint32_t reg_offset,uint32_t clk_sel)1392029f01b7SDylan Hung static uint32_t ring_clk(uint32_t reg_offset, uint32_t clk_sel)
1393f0f464c8SDylan Hung {
1394f0f464c8SDylan Hung uint32_t freq;
1395f0f464c8SDylan Hung
1396f0f464c8SDylan Hung SCU_WR(0, reg_offset);
1397f0f464c8SDylan Hung SCU_WR((0xf << 2) | BIT(0), reg_offset);
1398f0f464c8SDylan Hung udelay(1000);
1399f0f464c8SDylan Hung SCU_WR((clk_sel << 2) | BIT(1) | BIT(0), reg_offset);
1400f0f464c8SDylan Hung while ((SCU_RD(reg_offset) & BIT(6)) == 0);
1401f0f464c8SDylan Hung
1402f0f464c8SDylan Hung freq = (SCU_RD(reg_offset) & GENMASK(29, 16)) >> 16;
1403f0f464c8SDylan Hung SCU_WR(0, reg_offset);
1404f0f464c8SDylan Hung return ((freq + 1) * 48828);
1405f0f464c8SDylan Hung }
14065c8f9400Sryan_chen
dump_setting(MAC_ENGINE * p_eng)14075c8f9400Sryan_chen void dump_setting(MAC_ENGINE *p_eng)
14085c8f9400Sryan_chen {
14095c8f9400Sryan_chen /* dump env */
14105c8f9400Sryan_chen printf("===================\n");
14115c8f9400Sryan_chen printf("ast2600 compatible = %d\n", p_eng->env.ast2600);
14125c8f9400Sryan_chen printf("ast2500 compatible = %d\n", p_eng->env.ast2500);
14135c8f9400Sryan_chen printf("valid MAC number = %d\n", p_eng->env.mac_num);
14145c8f9400Sryan_chen printf("use new MDIO register = %d %d %d %d\n",
14155c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[0],
14165c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[1],
14175c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[2],
14185c8f9400Sryan_chen p_eng->env.is_new_mdio_reg[3]);
14195c8f9400Sryan_chen printf("1G compatible = %d %d %d %d\n",
14205c8f9400Sryan_chen p_eng->env.is_1g_valid[0],
14215c8f9400Sryan_chen p_eng->env.is_1g_valid[1],
14225c8f9400Sryan_chen p_eng->env.is_1g_valid[2],
14235c8f9400Sryan_chen p_eng->env.is_1g_valid[3]);
14245c8f9400Sryan_chen printf("===================\n");
14255c8f9400Sryan_chen
14265c8f9400Sryan_chen
14276c473e55SDylan Hung #if defined(CONFIG_ASPEED_AST2600)
1428029f01b7SDylan Hung printf("RGMIICK of MAC1/2 = %d Hz\n", ring_clk(0x320, 0xf));
1429029f01b7SDylan Hung printf("RGMIICK of MAC3/4 = %d Hz\n", ring_clk(0x330, 0x9));
1430029f01b7SDylan Hung printf("EPLL = %d Hz\n", ring_clk(0x320, 0x5) * 4);
1431029f01b7SDylan Hung printf("HCLK = %d Hz\n", ring_clk(0x330, 0x1));
14326c473e55SDylan Hung #endif
1433f0f464c8SDylan Hung
14345c8f9400Sryan_chen }
14355c8f9400Sryan_chen /**
14365c8f9400Sryan_chen * @brief nettest main function
14375c8f9400Sryan_chen */
mac_test(int argc,char * const argv[],uint32_t mode)14385c8f9400Sryan_chen int mac_test(int argc, char * const argv[], uint32_t mode)
14395c8f9400Sryan_chen {
14405c8f9400Sryan_chen MAC_ENGINE mac_eng;
14415c8f9400Sryan_chen PHY_ENGINE phy_eng;
1442dde36621SDylan Hung uint32_t ret;
14435c8f9400Sryan_chen
1444dde36621SDylan Hung ret = init_mac_engine(&mac_eng, mode);
1445dde36621SDylan Hung if (ret) {
14465c8f9400Sryan_chen printf("init MAC engine fail\n");
1447dde36621SDylan Hung return ret;
14485c8f9400Sryan_chen }
14495c8f9400Sryan_chen
14505c8f9400Sryan_chen if (argc <= 1) {
14515c8f9400Sryan_chen print_usage(&mac_eng);
14525c8f9400Sryan_chen return 1;
14535c8f9400Sryan_chen }
14545c8f9400Sryan_chen
14555c8f9400Sryan_chen mac_eng.arg.mac_idx = simple_strtol(argv[1], NULL, 16);
14565c8f9400Sryan_chen
14575c8f9400Sryan_chen /* default mdio_idx = mac_idx */
14585c8f9400Sryan_chen mac_eng.arg.mdio_idx = mac_eng.arg.mac_idx;
14595c8f9400Sryan_chen if (MODE_DEDICATED == mode)
14605c8f9400Sryan_chen parse_arg_dedicated(argc, argv, &mac_eng);
14615c8f9400Sryan_chen else
14625c8f9400Sryan_chen parse_arg_ncsi(argc, argv, &mac_eng);
14635c8f9400Sryan_chen
1464dde36621SDylan Hung ret = setup_running(&mac_eng);
1465dde36621SDylan Hung if (ret)
1466dde36621SDylan Hung return 1;
14675c8f9400Sryan_chen
14685c8f9400Sryan_chen dump_setting(&mac_eng);
14695c8f9400Sryan_chen
14705c8f9400Sryan_chen /* init PHY engine */
14715c8f9400Sryan_chen phy_eng.fp_set = NULL;
14725c8f9400Sryan_chen phy_eng.fp_clr = NULL;
14735c8f9400Sryan_chen
14745c8f9400Sryan_chen if (mac_eng.arg.ctrl.b.rmii_50m_out && 0 == mac_eng.run.is_rgmii) {
14755c8f9400Sryan_chen mac_set_rmii_50m_output_enable(&mac_eng);
14765c8f9400Sryan_chen }
14775c8f9400Sryan_chen
14785c8f9400Sryan_chen push_reg(&mac_eng);
14795c8f9400Sryan_chen disable_wdt(&mac_eng);
14805c8f9400Sryan_chen
14815c8f9400Sryan_chen mac_set_addr(&mac_eng);
14825c8f9400Sryan_chen if (mac_eng.arg.ctrl.b.mac_int_loopback)
14835c8f9400Sryan_chen mac_set_interal_loopback(&mac_eng);
14845c8f9400Sryan_chen
14855c8f9400Sryan_chen scu_set_pinmux(&mac_eng);
14865c8f9400Sryan_chen
14875c8f9400Sryan_chen scu_disable_mac(&mac_eng);
14885c8f9400Sryan_chen scu_enable_mac(&mac_eng);
14895c8f9400Sryan_chen if (mac_eng.arg.run_mode == MODE_DEDICATED) {
14905c8f9400Sryan_chen if (1 == phy_find_addr(&mac_eng)) {
1491daba96f3SDylan Hung phy_select(&mac_eng, &phy_eng);
14925c8f9400Sryan_chen }
14935c8f9400Sryan_chen }
14945c8f9400Sryan_chen
14955c8f9400Sryan_chen /* Data Initial */
14965c8f9400Sryan_chen setup_data(&mac_eng);
14975c8f9400Sryan_chen
14985c8f9400Sryan_chen mac_eng.flg.all_fail = 1;
14995c8f9400Sryan_chen mac_eng.io.init_done = 1;
15005c8f9400Sryan_chen for(int i = 0; i < 3; i++)
15015c8f9400Sryan_chen mac_eng.run.speed_sel[i] = mac_eng.run.speed_cfg[i];
15025c8f9400Sryan_chen
15035c8f9400Sryan_chen //------------------------------
15045c8f9400Sryan_chen // [Start] The loop of different speed
15055c8f9400Sryan_chen //------------------------------
15065c8f9400Sryan_chen print_legend();
15075c8f9400Sryan_chen test_start(&mac_eng, &phy_eng);
15085c8f9400Sryan_chen
15095c8f9400Sryan_chen return 0;
15105c8f9400Sryan_chen }
1511