diff options
| author | Joe Hershberger <[email protected]> | 2015-03-22 17:09:17 -0500 |
|---|---|---|
| committer | Simon Glass <[email protected]> | 2015-04-18 11:11:13 -0600 |
| commit | 6536b9bb769fe764f4793a1b37a2619391bb2482 (patch) | |
| tree | c37a0e61c47ef3be23ba0d6f9dadec73f6d21816 | |
| parent | e58780dcb7b8656ebc2dd6ba6d0da728bc65bf40 (diff) | |
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 <[email protected]>
Reviewed-by: Simon Glass <[email protected]>
| -rw-r--r-- | net/eth.c | 29 | ||||
| -rw-r--r-- | test/dm/eth.c | 20 |
2 files changed, 48 insertions, 1 deletions
diff --git a/net/eth.c b/net/eth.c index a2e6f34535e..b6c2af3de6a 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 5688b71de07..96e3c46ea69 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); |
