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.cord...@canonical.com>
---

(no changes since v1)

 include/efi_loader.h             |  4 ++--
 lib/efi_loader/efi_device_path.c | 20 ++++++++++++--------
 lib/efi_loader/efi_net.c         |  5 +++--
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index c2fb3e66eb9..47c043460eb 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -925,8 +925,8 @@ struct efi_device_path *efi_dp_from_part(struct blk_desc 
*desc, int part);
 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 c0633a736b6..64183d40340 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -954,20 +954,20 @@ struct efi_device_path *efi_dp_from_uart(void)
        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 @@ struct efi_device_path __maybe_unused 
*efi_dp_from_eth(void)
  * @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 @@ static struct efi_device_path *efi_dp_from_ipv4(struct 
efi_ipv4_address *ip,
        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 @@ static struct efi_device_path *efi_dp_from_ipv4(struct 
efi_ipv4_address *ip,
  * 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 @@ struct efi_device_path *efi_dp_from_http(const char 
*server)
 
        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 68051852dd8..ebb7f4afd3c 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -951,6 +951,7 @@ efi_status_t efi_net_register(void)
                             &netobj->net);
        if (r != EFI_SUCCESS)
                goto failure_to_add_protocol;
+
        if (!net_dp)
                efi_net_set_dp("Net", NULL);
        r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
@@ -1078,9 +1079,9 @@ efi_status_t efi_net_set_dp(const char *dev, const char 
*server)
 
        net_dp = NULL;
        if (!strcmp(dev, "Net"))
-               net_dp = efi_dp_from_eth();
+               net_dp = efi_dp_from_eth(eth_get_dev());
        else if (!strcmp(dev, "Http"))
-               net_dp = efi_dp_from_http(server);
+               net_dp = efi_dp_from_http(server, eth_get_dev());
 
        if (!net_dp)
                return EFI_OUT_OF_RESOURCES;
-- 
2.48.1

Reply via email to