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>
diff --git a/net/eth.c b/net/eth.c
index a2e6f34..b6c2af3 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -360,6 +360,18 @@
 		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 @@
 
 			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 @@
 		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 5688b71..96e3c46 100644
--- a/test/dm/eth.c
+++ b/test/dm/eth.c
@@ -60,3 +60,23 @@
 	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);