xref: /rk3399_rockchip-uboot/test/dm/eth.c (revision 7d104eab7dfb632dd96d027b7bfb233f1ae41ba7)
1 /*
2  * Copyright (c) 2015 National Instruments
3  *
4  * (C) Copyright 2015
5  * Joe Hershberger <joe.hershberger@ni.com>
6  *
7  * SPDX-License-Identifier:	GPL-2.0
8  */
9 
10 #include <common.h>
11 #include <dm.h>
12 #include <dm/test.h>
13 #include <dm/ut.h>
14 #include <fdtdec.h>
15 #include <malloc.h>
16 #include <net.h>
17 
18 DECLARE_GLOBAL_DATA_PTR;
19 
20 static int dm_test_eth(struct dm_test_state *dms)
21 {
22 	NetPingIP = string_to_ip("1.1.2.2");
23 
24 	setenv("ethact", "eth@10002000");
25 	ut_assertok(NetLoop(PING));
26 	ut_asserteq_str("eth@10002000", getenv("ethact"));
27 
28 	setenv("ethact", "eth@10003000");
29 	ut_assertok(NetLoop(PING));
30 	ut_asserteq_str("eth@10003000", getenv("ethact"));
31 
32 	setenv("ethact", "eth@10004000");
33 	ut_assertok(NetLoop(PING));
34 	ut_asserteq_str("eth@10004000", getenv("ethact"));
35 
36 	return 0;
37 }
38 DM_TEST(dm_test_eth, DM_TESTF_SCAN_FDT);
39 
40 static int dm_test_eth_alias(struct dm_test_state *dms)
41 {
42 	NetPingIP = string_to_ip("1.1.2.2");
43 	setenv("ethact", "eth0");
44 	ut_assertok(NetLoop(PING));
45 	ut_asserteq_str("eth@10002000", getenv("ethact"));
46 
47 	setenv("ethact", "eth1");
48 	ut_assertok(NetLoop(PING));
49 	ut_asserteq_str("eth@10004000", getenv("ethact"));
50 
51 	/* Expected to fail since eth2 is not defined in the device tree */
52 	setenv("ethact", "eth2");
53 	ut_assertok(NetLoop(PING));
54 	ut_asserteq_str("eth@10002000", getenv("ethact"));
55 
56 	setenv("ethact", "eth5");
57 	ut_assertok(NetLoop(PING));
58 	ut_asserteq_str("eth@10003000", getenv("ethact"));
59 
60 	return 0;
61 }
62 DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT);
63 
64 static int dm_test_eth_prime(struct dm_test_state *dms)
65 {
66 	NetPingIP = string_to_ip("1.1.2.2");
67 
68 	/* Expected to be "eth@10003000" because of ethprime variable */
69 	setenv("ethact", NULL);
70 	setenv("ethprime", "eth5");
71 	ut_assertok(NetLoop(PING));
72 	ut_asserteq_str("eth@10003000", getenv("ethact"));
73 
74 	/* Expected to be "eth@10002000" because it is first */
75 	setenv("ethact", NULL);
76 	setenv("ethprime", NULL);
77 	ut_assertok(NetLoop(PING));
78 	ut_asserteq_str("eth@10002000", getenv("ethact"));
79 
80 	return 0;
81 }
82 DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);
83 
84 static int dm_test_eth_rotate(struct dm_test_state *dms)
85 {
86 	char ethaddr[18];
87 
88 	/* Invalidate eth1's MAC address */
89 	NetPingIP = string_to_ip("1.1.2.2");
90 	strcpy(ethaddr, getenv("eth1addr"));
91 	setenv("eth1addr", NULL);
92 
93 	/* Make sure that the default is to rotate to the next interface */
94 	setenv("ethact", "eth@10004000");
95 	ut_assertok(NetLoop(PING));
96 	ut_asserteq_str("eth@10002000", getenv("ethact"));
97 
98 	/* If ethrotate is no, then we should fail on a bad MAC */
99 	setenv("ethact", "eth@10004000");
100 	setenv("ethrotate", "no");
101 	ut_asserteq(-1, NetLoop(PING));
102 	ut_asserteq_str("eth@10004000", getenv("ethact"));
103 
104 	/* Restore the env */
105 	setenv("eth1addr", ethaddr);
106 	setenv("ethrotate", NULL);
107 
108 	/* Invalidate eth0's MAC address */
109 	strcpy(ethaddr, getenv("ethaddr"));
110 	setenv(".flags", "ethaddr");
111 	setenv("ethaddr", NULL);
112 
113 	/* Make sure we can skip invalid devices */
114 	setenv("ethact", "eth@10004000");
115 	ut_assertok(NetLoop(PING));
116 	ut_asserteq_str("eth@10004000", getenv("ethact"));
117 
118 	/* Restore the env */
119 	setenv("ethaddr", ethaddr);
120 	setenv(".flags", NULL);
121 
122 	return 0;
123 }
124 DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
125