xref: /rk3399_rockchip-uboot/test/dm/eth.c (revision 71d7971facdba763c220ca2cfdbd181e907eae89)
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 
8509129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */
8609129becSJoe 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 
9909129becSJoe Hershberger 	return 0;
10009129becSJoe Hershberger }
10109129becSJoe Hershberger 
10209129becSJoe Hershberger static int _dm_test_eth_rotate2(struct unit_test_state *uts)
10309129becSJoe Hershberger {
10409129becSJoe Hershberger 	/* Make sure we can skip invalid devices */
10509129becSJoe Hershberger 	setenv("ethact", "eth@10004000");
10609129becSJoe Hershberger 	ut_assertok(net_loop(PING));
10709129becSJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
10809129becSJoe Hershberger 
109*71d7971fSBin Meng 	/* Make sure we can handle device name which is not eth# */
110*71d7971fSBin Meng 	setenv("ethact", "sbe5");
111*71d7971fSBin Meng 	ut_assertok(net_loop(PING));
112*71d7971fSBin Meng 	ut_asserteq_str("sbe5", getenv("ethact"));
113*71d7971fSBin Meng 
11409129becSJoe Hershberger 	return 0;
11509129becSJoe Hershberger }
11609129becSJoe Hershberger 
11709129becSJoe Hershberger static int dm_test_eth_rotate(struct unit_test_state *uts)
11809129becSJoe Hershberger {
11909129becSJoe Hershberger 	char ethaddr[18];
12009129becSJoe Hershberger 	int retval;
12109129becSJoe Hershberger 
12209129becSJoe Hershberger 	/* Set target IP to mock ping */
12309129becSJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
12409129becSJoe Hershberger 
12509129becSJoe Hershberger 	/* Invalidate eth1's MAC address */
12609129becSJoe Hershberger 	strcpy(ethaddr, getenv("eth1addr"));
12709129becSJoe Hershberger 	/* Must disable access protection for eth1addr before clearing */
12809129becSJoe Hershberger 	setenv(".flags", "eth1addr");
12909129becSJoe Hershberger 	setenv("eth1addr", NULL);
13009129becSJoe Hershberger 
13109129becSJoe Hershberger 	retval = _dm_test_eth_rotate1(uts);
13209129becSJoe Hershberger 
1337d104eabSJoe Hershberger 	/* Restore the env */
1347d104eabSJoe Hershberger 	setenv("eth1addr", ethaddr);
1357d104eabSJoe Hershberger 	setenv("ethrotate", NULL);
1367d104eabSJoe Hershberger 
13709129becSJoe Hershberger 	if (!retval) {
1387d104eabSJoe Hershberger 		/* Invalidate eth0's MAC address */
1397d104eabSJoe Hershberger 		strcpy(ethaddr, getenv("ethaddr"));
14073c2bbeeSJoe Hershberger 		/* Must disable access protection for ethaddr before clearing */
1417d104eabSJoe Hershberger 		setenv(".flags", "ethaddr");
1427d104eabSJoe Hershberger 		setenv("ethaddr", NULL);
1437d104eabSJoe Hershberger 
14409129becSJoe Hershberger 		retval = _dm_test_eth_rotate2(uts);
1457d104eabSJoe Hershberger 
1467d104eabSJoe Hershberger 		/* Restore the env */
1477d104eabSJoe Hershberger 		setenv("ethaddr", ethaddr);
14809129becSJoe Hershberger 	}
14909129becSJoe Hershberger 	/* Restore the env */
1507d104eabSJoe Hershberger 	setenv(".flags", NULL);
1517d104eabSJoe Hershberger 
15209129becSJoe Hershberger 	return retval;
1537d104eabSJoe Hershberger }
1547d104eabSJoe Hershberger DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
1557ece1c61SJoe Hershberger 
15609129becSJoe Hershberger /* The asserts include a return on fail; cleanup in the caller */
15709129becSJoe Hershberger static int _dm_test_net_retry(struct unit_test_state *uts)
1587ece1c61SJoe Hershberger {
1597ece1c61SJoe Hershberger 	/*
1607ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is yes, so the ping should succeed and
1617ece1c61SJoe Hershberger 	 * the active device should be eth0
1627ece1c61SJoe Hershberger 	 */
1637ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, true);
1647ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1657ece1c61SJoe Hershberger 	setenv("netretry", "yes");
166172a31bfSJoe Hershberger 	sandbox_eth_skip_timeout();
167bc0571fcSJoe Hershberger 	ut_assertok(net_loop(PING));
1687ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10002000", getenv("ethact"));
1697ece1c61SJoe Hershberger 
1707ece1c61SJoe Hershberger 	/*
1717ece1c61SJoe Hershberger 	 * eth1 is disabled and netretry is no, so the ping should fail and the
1727ece1c61SJoe Hershberger 	 * active device should be eth1
1737ece1c61SJoe Hershberger 	 */
1747ece1c61SJoe Hershberger 	setenv("ethact", "eth@10004000");
1757ece1c61SJoe Hershberger 	setenv("netretry", "no");
176172a31bfSJoe Hershberger 	sandbox_eth_skip_timeout();
177bc0571fcSJoe Hershberger 	ut_asserteq(-ETIMEDOUT, net_loop(PING));
1787ece1c61SJoe Hershberger 	ut_asserteq_str("eth@10004000", getenv("ethact"));
1797ece1c61SJoe Hershberger 
18009129becSJoe Hershberger 	return 0;
18109129becSJoe Hershberger }
18209129becSJoe Hershberger 
18309129becSJoe Hershberger static int dm_test_net_retry(struct unit_test_state *uts)
18409129becSJoe Hershberger {
18509129becSJoe Hershberger 	int retval;
18609129becSJoe Hershberger 
18709129becSJoe Hershberger 	net_ping_ip = string_to_ip("1.1.2.2");
18809129becSJoe Hershberger 
18909129becSJoe Hershberger 	retval = _dm_test_net_retry(uts);
19009129becSJoe Hershberger 
1917ece1c61SJoe Hershberger 	/* Restore the env */
1927ece1c61SJoe Hershberger 	setenv("netretry", NULL);
1937ece1c61SJoe Hershberger 	sandbox_eth_disable_response(1, false);
1947ece1c61SJoe Hershberger 
19509129becSJoe Hershberger 	return retval;
1967ece1c61SJoe Hershberger }
1977ece1c61SJoe Hershberger DM_TEST(dm_test_net_retry, DM_TESTF_SCAN_FDT);
198