xref: /rk3399_rockchip-uboot/test/dm/eth.c (revision bc0571fc1067ff8a8fd16990ae65c1a2826ea90c)
1bfacad7dSJoe Hershberger /*
2bfacad7dSJoe Hershberger  * Copyright (c) 2015 National Instruments
3bfacad7dSJoe Hershberger  *
4bfacad7dSJoe Hershberger  * (C) Copyright 2015
5bfacad7dSJoe Hershberger  * Joe Hershberger <joe.hershberger@ni.com>
6bfacad7dSJoe Hershberger  *
7bfacad7dSJoe Hershberger  * SPDX-License-Identifier:	GPL-2.0
8bfacad7dSJoe Hershberger  */
9bfacad7dSJoe Hershberger 
10bfacad7dSJoe Hershberger #include <common.h>
11bfacad7dSJoe Hershberger #include <dm.h>
12bfacad7dSJoe Hershberger #include <dm/test.h>
13bfacad7dSJoe Hershberger #include <dm/ut.h>
14bfacad7dSJoe Hershberger #include <fdtdec.h>
15bfacad7dSJoe Hershberger #include <malloc.h>
16bfacad7dSJoe Hershberger #include <net.h>
177ece1c61SJoe Hershberger #include <asm/eth.h>
18bfacad7dSJoe Hershberger 
19bfacad7dSJoe Hershberger DECLARE_GLOBAL_DATA_PTR;
20bfacad7dSJoe Hershberger 
21bfacad7dSJoe Hershberger static int dm_test_eth(struct dm_test_state *dms)
22bfacad7dSJoe Hershberger {
23049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
24bfacad7dSJoe Hershberger 
25bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10002000");
26*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
27bfacad7dSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
28bfacad7dSJoe Hershberger 
29bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10003000");
30*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
31bfacad7dSJoe Hershberger 	ut_asserteq_str("eth@10003000", getenv("ethact"));
32bfacad7dSJoe Hershberger 
33bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10004000");
34*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
35bfacad7dSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
36bfacad7dSJoe Hershberger 
37bfacad7dSJoe Hershberger 	return 0;
38bfacad7dSJoe Hershberger }
39bfacad7dSJoe Hershberger DM_TEST(dm_test_eth, DM_TESTF_SCAN_FDT);
40e58780dcSJoe Hershberger 
41e58780dcSJoe Hershberger static int dm_test_eth_alias(struct dm_test_state *dms)
42e58780dcSJoe Hershberger {
43049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
44e58780dcSJoe Hershberger 	setenv("ethact", "eth0");
45*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
46e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
47e58780dcSJoe Hershberger 
48e58780dcSJoe Hershberger 	setenv("ethact", "eth1");
49*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
50e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
51e58780dcSJoe Hershberger 
52e58780dcSJoe Hershberger 	/* Expected to fail since eth2 is not defined in the device tree */
53e58780dcSJoe Hershberger 	setenv("ethact", "eth2");
54*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
55e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
56e58780dcSJoe Hershberger 
57e58780dcSJoe Hershberger 	setenv("ethact", "eth5");
58*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
59e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10003000", getenv("ethact"));
60e58780dcSJoe Hershberger 
61e58780dcSJoe Hershberger 	return 0;
62e58780dcSJoe Hershberger }
63e58780dcSJoe Hershberger DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT);
646536b9bbSJoe Hershberger 
656536b9bbSJoe Hershberger static int dm_test_eth_prime(struct dm_test_state *dms)
666536b9bbSJoe Hershberger {
67049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
686536b9bbSJoe Hershberger 
696536b9bbSJoe Hershberger 	/* Expected to be "eth@10003000" because of ethprime variable */
706536b9bbSJoe Hershberger 	setenv("ethact", NULL);
716536b9bbSJoe Hershberger 	setenv("ethprime", "eth5");
72*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
736536b9bbSJoe Hershberger 	ut_asserteq_str("eth@10003000", getenv("ethact"));
746536b9bbSJoe Hershberger 
756536b9bbSJoe Hershberger 	/* Expected to be "eth@10002000" because it is first */
766536b9bbSJoe Hershberger 	setenv("ethact", NULL);
776536b9bbSJoe Hershberger 	setenv("ethprime", NULL);
78*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
796536b9bbSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
806536b9bbSJoe Hershberger 
816536b9bbSJoe Hershberger 	return 0;
826536b9bbSJoe Hershberger }
836536b9bbSJoe Hershberger DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);
847d104eabSJoe Hershberger 
857d104eabSJoe Hershberger static int dm_test_eth_rotate(struct dm_test_state *dms)
867d104eabSJoe Hershberger {
877d104eabSJoe Hershberger 	char ethaddr[18];
887d104eabSJoe Hershberger 
897d104eabSJoe Hershberger 	/* Invalidate eth1's MAC address */
90049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
917d104eabSJoe Hershberger 	strcpy(ethaddr, getenv("eth1addr"));
927d104eabSJoe Hershberger 	setenv("eth1addr", NULL);
937d104eabSJoe Hershberger 
947d104eabSJoe Hershberger 	/* Make sure that the default is to rotate to the next interface */
957d104eabSJoe Hershberger 	setenv("ethact", "eth@10004000");
96*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
977d104eabSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
987d104eabSJoe Hershberger 
997d104eabSJoe Hershberger 	/* If ethrotate is no, then we should fail on a bad MAC */
1007d104eabSJoe Hershberger 	setenv("ethact", "eth@10004000");
1017d104eabSJoe Hershberger 	setenv("ethrotate", "no");
102*bc0571fcSJoe Hershberger 	ut_asserteq(-EINVAL, net_loop(PING));
1037d104eabSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
1047d104eabSJoe Hershberger 
1057d104eabSJoe Hershberger 	/* Restore the env */
1067d104eabSJoe Hershberger 	setenv("eth1addr", ethaddr);
1077d104eabSJoe Hershberger 	setenv("ethrotate", NULL);
1087d104eabSJoe Hershberger 
1097d104eabSJoe Hershberger 	/* Invalidate eth0's MAC address */
1107d104eabSJoe Hershberger 	strcpy(ethaddr, getenv("ethaddr"));
1117d104eabSJoe Hershberger 	setenv(".flags", "ethaddr");
1127d104eabSJoe Hershberger 	setenv("ethaddr", NULL);
1137d104eabSJoe Hershberger 
1147d104eabSJoe Hershberger 	/* Make sure we can skip invalid devices */
1157d104eabSJoe Hershberger 	setenv("ethact", "eth@10004000");
116*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
1177d104eabSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
1187d104eabSJoe Hershberger 
1197d104eabSJoe Hershberger 	/* Restore the env */
1207d104eabSJoe Hershberger 	setenv("ethaddr", ethaddr);
1217d104eabSJoe Hershberger 	setenv(".flags", NULL);
1227d104eabSJoe Hershberger 
1237d104eabSJoe Hershberger 	return 0;
1247d104eabSJoe Hershberger }
1257d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
1267ece1c61SJoe Hershberger 
1277ece1c61SJoe Hershberger static int dm_test_net_retry(struct dm_test_state *dms)
1287ece1c61SJoe Hershberger {
129049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
1307ece1c61SJoe Hershberger 
1317ece1c61SJoe Hershberger 	/*
1327ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is yes, so the ping should succeed and
1337ece1c61SJoe Hershberger 	 * the active device should be eth0
1347ece1c61SJoe Hershberger 	 */
1357ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, true);
1367ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1377ece1c61SJoe Hershberger 	setenv("netretry", "yes");
138*bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
1397ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
1407ece1c61SJoe Hershberger 
1417ece1c61SJoe Hershberger 	/*
1427ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is no, so the ping should fail and the
1437ece1c61SJoe Hershberger 	 * active device should be eth1
1447ece1c61SJoe Hershberger 	 */
1457ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1467ece1c61SJoe Hershberger 	setenv("netretry", "no");
147*bc0571fcSJoe Hershberger 	ut_asserteq(-ETIMEDOUT, net_loop(PING));
1487ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
1497ece1c61SJoe Hershberger 
1507ece1c61SJoe Hershberger 	/* Restore the env */
1517ece1c61SJoe Hershberger 	setenv("netretry", NULL);
1527ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, false);
1537ece1c61SJoe Hershberger 
1547ece1c61SJoe Hershberger 	return 0;
1557ece1c61SJoe Hershberger }
1567ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);
157