summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2015-03-23 01:09:17 +0300
committerSimon Glass <sjg@chromium.org>2015-04-18 20:11:13 +0300
commit6536b9bb769fe764f4793a1b37a2619391bb2482 (patch)
treec37a0e61c47ef3be23ba0d6f9dadec73f6d21816
parente58780dcb7b8656ebc2dd6ba6d0da728bc65bf40 (diff)
downloadu-boot-6536b9bb769fe764f4793a1b37a2619391bb2482.tar.xz
dm: eth: Add support for ethprime env var
The ethprime env var is used to indicate the starting device if none is specified in ethact. Also support aliases specified in the ethprime var. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--net/eth.c29
-rw-r--r--test/dm/eth.c20
2 files changed, 48 insertions, 1 deletions
diff --git a/net/eth.c b/net/eth.c
index a2e6f34535..b6c2af3de6 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -360,6 +360,18 @@ int eth_initialize(void)
printf("No ethernet found.\n");
bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
} else {
+ char *ethprime = getenv("ethprime");
+ struct udevice *prime_dev = NULL;
+
+ if (ethprime)
+ prime_dev = eth_get_dev_by_name(ethprime);
+ if (prime_dev) {
+ eth_set_dev(prime_dev);
+ eth_current_changed();
+ } else {
+ eth_set_dev(NULL);
+ }
+
bootstage_mark(BOOTSTAGE_ID_NET_ETH_INIT);
do {
if (num_devices)
@@ -367,6 +379,9 @@ int eth_initialize(void)
printf("eth%d: %s", dev->seq, dev->name);
+ if (ethprime && dev == prime_dev)
+ printf(" [PRIME]");
+
eth_write_hwaddr(dev);
uclass_next_device(&dev);
@@ -915,8 +930,20 @@ void eth_set_current(void)
act = getenv("ethact");
env_changed_id = env_id;
}
- if (act != NULL)
+
+ if (act == NULL) {
+ char *ethprime = getenv("ethprime");
+ void *dev = NULL;
+
+ if (ethprime)
+ dev = eth_get_dev_by_name(ethprime);
+ if (dev)
+ eth_set_dev(dev);
+ else
+ eth_set_dev(NULL);
+ } else {
eth_set_dev(eth_get_dev_by_name(act));
+ }
eth_current_changed();
}
diff --git a/test/dm/eth.c b/test/dm/eth.c
index 5688b71de0..96e3c46ea6 100644
--- a/test/dm/eth.c
+++ b/test/dm/eth.c
@@ -60,3 +60,23 @@ static int dm_test_eth_alias(struct dm_test_state *dms)
return 0;
}
DM_TEST(dm_test_eth_alias, DM_TESTF_SCAN_FDT);
+
+static int dm_test_eth_prime(struct dm_test_state *dms)
+{
+ NetPingIP = string_to_ip("1.1.2.2");
+
+ /* Expected to be "eth@10003000" because of ethprime variable */
+ setenv("ethact", NULL);
+ setenv("ethprime", "eth5");
+ ut_assertok(NetLoop(PING));
+ ut_asserteq_str("eth@10003000", getenv("ethact"));
+
+ /* Expected to be "eth@10002000" because it is first */
+ setenv("ethact", NULL);
+ setenv("ethprime", NULL);
+ ut_assertok(NetLoop(PING));
+ ut_asserteq_str("eth@10002000", getenv("ethact"));
+
+ return 0;
+}
+DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);