summaryrefslogtreecommitdiff
path: root/cmd/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/net.c')
-rw-r--r--cmd/net.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/cmd/net.c b/cmd/net.c
index dd50930a362..4227321871c 100644
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -4,6 +4,8 @@
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*/
+#define LOG_CATEGORY UCLASS_ETH
+
/*
* Boot support
*/
@@ -13,6 +15,7 @@
#include <dm.h>
#include <env.h>
#include <image.h>
+#include <log.h>
#include <net.h>
#include <net6.h>
#include <net/udp.h>
@@ -120,6 +123,38 @@ U_BOOT_CMD(
"boot image via network using DHCP/TFTP protocol",
"[loadAddress] [[hostIPaddr:]bootfilename]"
);
+
+int dhcp_run(ulong addr, const char *fname, bool autoload)
+{
+ char *dhcp_argv[] = {"dhcp", NULL, (char *)fname, NULL};
+ struct cmd_tbl cmdtp = {}; /* dummy */
+ char file_addr[17];
+ int old_autoload;
+ int ret, result;
+
+ log_debug("addr=%lx, fname=%s, autoload=%d\n", addr, fname, autoload);
+ old_autoload = env_get_yesno("autoload");
+ ret = env_set("autoload", autoload ? "y" : "n");
+ if (ret)
+ return log_msg_ret("en1", -EINVAL);
+
+ if (autoload) {
+ sprintf(file_addr, "%lx", addr);
+ dhcp_argv[1] = file_addr;
+ }
+
+ result = do_dhcp(&cmdtp, 0, !autoload ? 1 : fname ? 3 : 2, dhcp_argv);
+
+ ret = env_set("autoload", old_autoload == -1 ? NULL :
+ old_autoload ? "y" : "n");
+ if (ret)
+ return log_msg_ret("en2", -EINVAL);
+
+ if (result)
+ return log_msg_ret("res", -ENOENT);
+
+ return 0;
+}
#endif
#if defined(CONFIG_CMD_NFS)