Move the core code for starting an netboot operation into a separate
function, so that we can (with additional work) move towards calling it
from outside the file.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 cmd/net.c | 62 +++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 46 insertions(+), 16 deletions(-)

diff --git a/cmd/net.c b/cmd/net.c
index 8bb8604faf6..f1b520143df 100644
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -380,11 +380,50 @@ static int parse_args(enum proto_t proto, int argc, char 
*const argv[],
        return 0;
 }
 
+static int netboot_run_(enum proto_t proto, ulong addr, const char *fname,
+                       ulong size, bool fname_explicit, bool ipv6)
+{
+       int ret;
+
+       bootstage_mark(BOOTSTAGE_ID_NET_START);
+
+       /*
+        * For now we use the global variables as that is the only way to
+        * control the network stack. At some point, perhaps, the state could be
+        * in a struct
+        */
+       if (IS_ENABLED(CONFIG_CMD_TFTPPUT) && proto == TFTPPUT)
+               image_save_addr = addr;
+       else
+               image_load_addr = addr;
+
+       net_boot_file_name_explicit = fname_explicit;
+       copy_filename(net_boot_file_name, fname, sizeof(net_boot_file_name));
+       if (IS_ENABLED(CONFIG_IPV6))
+               use_ip6 = ipv6;
+       if (IS_ENABLED(CONFIG_CMD_TFTPPUT) && proto == TFTPPUT) {
+               image_save_addr = addr;
+               image_save_size = size;
+       } else {
+               image_load_addr = addr;
+       }
+
+       ret = net_loop(proto);
+       if (ret < 0) {
+               bootstage_error(BOOTSTAGE_ID_NET_NETLOOP_OK);
+               return ret;
+       }
+       bootstage_mark(BOOTSTAGE_ID_NET_NETLOOP_OK);
+
+       return 0;
+}
+
 static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
                          char *const argv[])
 {
+       ulong addr, save_size;
+       bool fname_explicit;
        const char *fname;
-       ulong addr;
        char *s;
        int   rcode = 0;
        int   size;
@@ -408,22 +447,17 @@ static int netboot_common(enum proto_t proto, struct 
cmd_tbl *cmdtp, int argc,
                }
        }
 
-       if (parse_args(proto, argc, argv, &fname, &addr, &image_save_size)) {
+       if (parse_args(proto, argc, argv, &fname, &addr, &save_size)) {
                bootstage_error(BOOTSTAGE_ID_NET_START);
                return CMD_RET_USAGE;
        }
-       if (IS_ENABLED(CONFIG_CMD_TFTPPUT) && proto == TFTPPUT)
-               image_save_addr = addr;
-       else
-               image_load_addr = addr;
 
        if (fname) {
-               net_boot_file_name_explicit = true;
+               fname_explicit = true;
        } else {
-               net_boot_file_name_explicit = false;
+               fname_explicit = false;
                fname = env_get("bootfile");
        }
-       copy_filename(net_boot_file_name, fname, sizeof(net_boot_file_name));
 
        if (IS_ENABLED(CONFIG_IPV6) && !use_ip6) {
                char *s, *e;
@@ -438,14 +472,10 @@ static int netboot_common(enum proto_t proto, struct 
cmd_tbl *cmdtp, int argc,
                }
        }
 
-       bootstage_mark(BOOTSTAGE_ID_NET_START);
-
-       size = net_loop(proto);
-       if (size < 0) {
-               bootstage_error(BOOTSTAGE_ID_NET_NETLOOP_OK);
+       size = netboot_run_(proto, addr, fname, save_size, fname_explicit,
+                           use_ip6);
+       if (size < 0)
                return CMD_RET_FAILURE;
-       }
-       bootstage_mark(BOOTSTAGE_ID_NET_NETLOOP_OK);
 
        /* net_loop ok, update environment */
        netboot_update_env();
-- 
2.34.1

Reply via email to