efi_loader: efi_device_path: Pass net udevice as argument

In preparation to support multiple EFI net objects, support
constructing device paths using an ethernet device different
than the default. Add a udevice argument to the device path
generation, and keep the callsites with eth_get_dev() to
preserve existing functionality.

Signed-off-by: Adriano Cordova <adriano.cordova@canonical.com>
diff --git a/include/efi_loader.h b/include/efi_loader.h
index c2fb3e6..47c0434 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -925,8 +925,8 @@
 struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part);
 struct efi_device_path *efi_dp_from_file(const struct efi_device_path *dp,
 					 const char *path);
-struct efi_device_path *efi_dp_from_eth(void);
-struct efi_device_path *efi_dp_from_http(const char *server);
+struct efi_device_path *efi_dp_from_eth(struct udevice *dev);
+struct efi_device_path *efi_dp_from_http(const char *server, struct udevice *dev);
 struct efi_device_path *efi_dp_from_mem(uint32_t mem_type,
 					uint64_t start_address,
 					size_t size);
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
index c0633a7..64183d4 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -954,20 +954,20 @@
 	return buf;
 }
 
-struct efi_device_path __maybe_unused *efi_dp_from_eth(void)
+struct efi_device_path __maybe_unused *efi_dp_from_eth(struct udevice *dev)
 {
 	void *buf, *start;
 	unsigned dpsize = 0;
 
-	assert(eth_get_dev());
+	assert(dev);
 
-	dpsize += dp_size(eth_get_dev());
+	dpsize += dp_size(dev);
 
 	start = buf = efi_alloc(dpsize + sizeof(END));
 	if (!buf)
 		return NULL;
 
-	buf = dp_fill(buf, eth_get_dev());
+	buf = dp_fill(buf, dev);
 
 	*((struct efi_device_path *)buf) = END;
 
@@ -984,11 +984,13 @@
  * @ip:		IPv4 local address
  * @mask:	network mask
  * @srv:	IPv4 remote/server address
+ * @dev:	net udevice
  * Return:	pointer to device path, NULL on error
  */
 static struct efi_device_path *efi_dp_from_ipv4(struct efi_ipv4_address *ip,
 					 struct efi_ipv4_address *mask,
-					 struct efi_ipv4_address *srv)
+					 struct efi_ipv4_address *srv,
+					 struct udevice *dev)
 {
 	struct efi_device_path *dp1, *dp2, *pos;
 	struct {
@@ -1010,7 +1012,7 @@
 	pos = &dp.end;
 	memcpy(pos, &END, sizeof(END));
 
-	dp1 = efi_dp_from_eth();
+	dp1 = efi_dp_from_eth(dev);
 	if (!dp1)
 		return NULL;
 
@@ -1029,9 +1031,10 @@
  * and an END node.
  *
  * @server:	URI of remote server
+ * @dev:	net udevice
  * Return:	pointer to HTTP device path, NULL on error
  */
-struct efi_device_path *efi_dp_from_http(const char *server)
+struct efi_device_path *efi_dp_from_http(const char *server, struct udevice *dev)
 {
 	struct efi_device_path *dp1, *dp2;
 	struct efi_device_path_uri *uridp;
@@ -1047,10 +1050,11 @@
 
 	efi_net_get_addr(&ip, &mask, NULL);
 
-	dp1 = efi_dp_from_ipv4(&ip, &mask, NULL);
+	dp1 = efi_dp_from_ipv4(&ip, &mask, NULL, dev);
 	if (!dp1)
 		return NULL;
 
+
 	strcpy(tmp, "http://");
 
 	if (server) {
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 27fc401..ebb7f4a 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -952,14 +952,12 @@
 	if (r != EFI_SUCCESS)
 		goto failure_to_add_protocol;
 
-	if (net_dp)
-		r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
-			       net_dp);
-	else
-		r = efi_net_set_dp("Net", NULL);
+	if (!net_dp)
+		efi_net_set_dp("Net", NULL);
+	r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
+			     net_dp);
 	if (r != EFI_SUCCESS)
 		goto failure_to_add_protocol;
-
 	r = efi_add_protocol(&netobj->header, &efi_pxe_base_code_protocol_guid,
 			     &netobj->pxe);
 	if (r != EFI_SUCCESS)
@@ -1077,58 +1075,18 @@
  */
 efi_status_t efi_net_set_dp(const char *dev, const char *server)
 {
-	efi_status_t ret = EFI_SUCCESS;
-	struct efi_handler *phandler;
-	struct efi_device_path *old_net_dp, *new_net_dp;
+	efi_free_pool(net_dp);
 
-	old_net_dp = net_dp;
-	new_net_dp = NULL;
+	net_dp = NULL;
 	if (!strcmp(dev, "Net"))
-		new_net_dp = efi_dp_from_eth();
+		net_dp = efi_dp_from_eth(eth_get_dev());
 	else if (!strcmp(dev, "Http"))
-		new_net_dp = efi_dp_from_http(server);
+		net_dp = efi_dp_from_http(server, eth_get_dev());
 
-	if (!new_net_dp) {
+	if (!net_dp)
 		return EFI_OUT_OF_RESOURCES;
-	}
-
-	// If netobj is not started yet, end here.
-	if (!netobj) {
-		goto exit;
-	}
-
-	phandler = NULL;
-	efi_search_protocol(&netobj->header, &efi_guid_device_path, &phandler);
-
-	// If the device path protocol is not yet installed, install it
-	if (!phandler)
-		goto add;
-
-	// If it is already installed, try to update it
-	ret = efi_reinstall_protocol_interface(&netobj->header, &efi_guid_device_path,
-					       old_net_dp, new_net_dp);
-	if (ret != EFI_SUCCESS)
-		goto error;
-
-	net_dp = new_net_dp;
-	efi_free_pool(old_net_dp);
 
 	return EFI_SUCCESS;
-add:
-	ret = efi_add_protocol(&netobj->header, &efi_guid_device_path,
-			       new_net_dp);
-	if (ret != EFI_SUCCESS)
-		goto error;
-exit:
-	net_dp = new_net_dp;
-	efi_free_pool(old_net_dp);
-
-	return ret;
-error:
-	// Failed, restore
-	efi_free_pool(new_net_dp);
-
-	return ret;
 }
 
 /**