xref: /rk3399_rockchip-uboot/test/dm/eth.c (revision 09129bec8e1f2cd89d48b3ae98dcd83707d5e606)
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 <fdtdec.h>
13bfacad7dSJoe Hershberger #include <malloc.h>
14bfacad7dSJoe Hershberger #include <net.h>
15e721b882SJoe Hershberger #include <dm/test.h>
167ece1c61SJoe Hershberger #include <asm/eth.h>
17e721b882SJoe Hershberger #include <test/ut.h>
18bfacad7dSJoe Hershberger 
19bfacad7dSJoe Hershberger DECLARE_GLOBAL_DATA_PTR;
20bfacad7dSJoe Hershberger 
21e721b882SJoe Hershberger static int dm_test_eth(struct unit_test_state *uts)
22bfacad7dSJoe Hershberger {
23049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
24bfacad7dSJoe Hershberger 
25bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10002000");
26bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
27bfacad7dSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
28bfacad7dSJoe Hershberger 
29bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10003000");
30bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
31bfacad7dSJoe Hershberger 	ut_asserteq_str("eth@10003000", getenv("ethact"));
32bfacad7dSJoe Hershberger 
33bfacad7dSJoe Hershberger 	setenv("ethact", "eth@10004000");
34bc0571fcSJoe 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 
41e721b882SJoe Hershberger static int dm_test_eth_alias(struct unit_test_state *uts)
42e58780dcSJoe Hershberger {
43049a95a7SJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
44e58780dcSJoe Hershberger 	setenv("ethact", "eth0");
45bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
46e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
47e58780dcSJoe Hershberger 
48e58780dcSJoe Hershberger 	setenv("ethact", "eth1");
49bc0571fcSJoe 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");
54bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
55e58780dcSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
56e58780dcSJoe Hershberger 
57e58780dcSJoe Hershberger 	setenv("ethact", "eth5");
58bc0571fcSJoe 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 
65e721b882SJoe Hershberger static int dm_test_eth_prime(struct unit_test_state *uts)
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");
72bc0571fcSJoe 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);
78bc0571fcSJoe 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 
85*09129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */
86*09129becSJoe Hershberger static int _dm_test_eth_rotate1(struct unit_test_state *uts)
877d104eabSJoe Hershberger {
887d104eabSJoe Hershberger 	/* Make sure that the default is to rotate to the next interface */
897d104eabSJoe Hershberger 	setenv("ethact", "eth@10004000");
90bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
917d104eabSJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
927d104eabSJoe Hershberger 
937d104eabSJoe Hershberger 	/* If ethrotate is no, then we should fail on a bad MAC */
947d104eabSJoe Hershberger 	setenv("ethact", "eth@10004000");
957d104eabSJoe Hershberger 	setenv("ethrotate", "no");
96bc0571fcSJoe Hershberger 	ut_asserteq(-EINVAL, net_loop(PING));
977d104eabSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
987d104eabSJoe Hershberger 
99*09129becSJoe Hershberger 	return 0;
100*09129becSJoe Hershberger }
101*09129becSJoe Hershberger 
102*09129becSJoe Hershberger static int _dm_test_eth_rotate2(struct unit_test_state *uts)
103*09129becSJoe Hershberger {
104*09129becSJoe Hershberger 	/* Make sure we can skip invalid devices */
105*09129becSJoe Hershberger 	setenv("ethact", "eth@10004000");
106*09129becSJoe Hershberger 	ut_assertok(net_loop(PING));
107*09129becSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
108*09129becSJoe Hershberger 
109*09129becSJoe Hershberger 	return 0;
110*09129becSJoe Hershberger }
111*09129becSJoe Hershberger 
112*09129becSJoe Hershberger static int dm_test_eth_rotate(struct unit_test_state *uts)
113*09129becSJoe Hershberger {
114*09129becSJoe Hershberger 	char ethaddr[18];
115*09129becSJoe Hershberger 	int retval;
116*09129becSJoe Hershberger 
117*09129becSJoe Hershberger 	/* Set target IP to mock ping */
118*09129becSJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
119*09129becSJoe Hershberger 
120*09129becSJoe Hershberger 	/* Invalidate eth1's MAC address */
121*09129becSJoe Hershberger 	strcpy(ethaddr, getenv("eth1addr"));
122*09129becSJoe Hershberger 	/* Must disable access protection for eth1addr before clearing */
123*09129becSJoe Hershberger 	setenv(".flags", "eth1addr");
124*09129becSJoe Hershberger 	setenv("eth1addr", NULL);
125*09129becSJoe Hershberger 
126*09129becSJoe Hershberger 	retval = _dm_test_eth_rotate1(uts);
127*09129becSJoe Hershberger 
1287d104eabSJoe Hershberger 	/* Restore the env */
1297d104eabSJoe Hershberger 	setenv("eth1addr", ethaddr);
1307d104eabSJoe Hershberger 	setenv("ethrotate", NULL);
1317d104eabSJoe Hershberger 
132*09129becSJoe Hershberger 	if (!retval) {
1337d104eabSJoe Hershberger 		/* Invalidate eth0's MAC address */
1347d104eabSJoe Hershberger 		strcpy(ethaddr, getenv("ethaddr"));
13573c2bbeeSJoe Hershberger 		/* Must disable access protection for ethaddr before clearing */
1367d104eabSJoe Hershberger 		setenv(".flags", "ethaddr");
1377d104eabSJoe Hershberger 		setenv("ethaddr", NULL);
1387d104eabSJoe Hershberger 
139*09129becSJoe Hershberger 		retval = _dm_test_eth_rotate2(uts);
1407d104eabSJoe Hershberger 
1417d104eabSJoe Hershberger 		/* Restore the env */
1427d104eabSJoe Hershberger 		setenv("ethaddr", ethaddr);
143*09129becSJoe Hershberger 	}
144*09129becSJoe Hershberger 	/* Restore the env */
1457d104eabSJoe Hershberger 	setenv(".flags", NULL);
1467d104eabSJoe Hershberger 
147*09129becSJoe Hershberger 	return retval;
1487d104eabSJoe Hershberger }
1497d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
1507ece1c61SJoe Hershberger 
151*09129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */
152*09129becSJoe Hershberger static int _dm_test_net_retry(struct unit_test_state *uts)
1537ece1c61SJoe Hershberger {
1547ece1c61SJoe Hershberger 	/*
1557ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is yes, so the ping should succeed and
1567ece1c61SJoe Hershberger 	 * the active device should be eth0
1577ece1c61SJoe Hershberger 	 */
1587ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, true);
1597ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1607ece1c61SJoe Hershberger 	setenv("netretry", "yes");
161172a31bfSJoe Hershberger 	sandbox_eth_skip_timeout();
162bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
1637ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
1647ece1c61SJoe Hershberger 
1657ece1c61SJoe Hershberger 	/*
1667ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is no, so the ping should fail and the
1677ece1c61SJoe Hershberger 	 * active device should be eth1
1687ece1c61SJoe Hershberger 	 */
1697ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1707ece1c61SJoe Hershberger 	setenv("netretry", "no");
171172a31bfSJoe Hershberger 	sandbox_eth_skip_timeout();
172bc0571fcSJoe Hershberger 	ut_asserteq(-ETIMEDOUT, net_loop(PING));
1737ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
1747ece1c61SJoe Hershberger 
175*09129becSJoe Hershberger 	return 0;
176*09129becSJoe Hershberger }
177*09129becSJoe Hershberger 
178*09129becSJoe Hershberger static int dm_test_net_retry(struct unit_test_state *uts)
179*09129becSJoe Hershberger {
180*09129becSJoe Hershberger 	int retval;
181*09129becSJoe Hershberger 
182*09129becSJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
183*09129becSJoe Hershberger 
184*09129becSJoe Hershberger 	retval = _dm_test_net_retry(uts);
185*09129becSJoe Hershberger 
1867ece1c61SJoe Hershberger 	/* Restore the env */
1877ece1c61SJoe Hershberger 	setenv("netretry", NULL);
1887ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, false);
1897ece1c61SJoe Hershberger 
190*09129becSJoe Hershberger 	return retval;
1917ece1c61SJoe Hershberger }
1927ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);
193