Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2173733/?format=api
{ "id": 2173733, "url": "http://patchwork.ozlabs.org/api/patches/2173733/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20251212-lwip_nfs-v2-5-9cb5a60520d8@linaro.org/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20251212-lwip_nfs-v2-5-9cb5a60520d8@linaro.org>", "list_archive_url": null, "date": "2025-12-12T11:32:28", "name": "[v2,5/6] net: lwip: nfs: Port the NFS code to work with lwIP", "commit_ref": "230cf3bc277622081b27e33469f5f1f59fc48180", "pull_url": null, "state": "accepted", "archived": false, "hash": "7aef46957c55fab974fb01b8bf86097b91fc88a8", "submitter": { "id": 88793, "url": "http://patchwork.ozlabs.org/api/people/88793/?format=api", "name": "Andrew Goodbody", "email": "andrew.goodbody@linaro.org" }, "delegate": { "id": 157425, "url": "http://patchwork.ozlabs.org/api/users/157425/?format=api", "username": "jforissier", "first_name": "Jerome", "last_name": "Forissier", "email": "jerome.forissier@linaro.org" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20251212-lwip_nfs-v2-5-9cb5a60520d8@linaro.org/mbox/", "series": [ { "id": 485199, "url": "http://patchwork.ozlabs.org/api/series/485199/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=485199", "date": "2025-12-12T11:32:23", "name": "net: Port NFS to lwIP", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/485199/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2173733/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2173733/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=cOPDuquP;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=linaro.org", "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de", "phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.b=\"cOPDuquP\";\n\tdkim-atps=neutral", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=linaro.org", "phobos.denx.de;\n spf=pass smtp.mailfrom=andrew.goodbody@linaro.org" ], "Received": [ "from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dSS4l0zyNz1xsK\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 12 Dec 2025 22:33:11 +1100 (AEDT)", "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 2904B839E4;\n\tFri, 12 Dec 2025 12:32:39 +0100 (CET)", "by phobos.denx.de (Postfix, from userid 109)\n id C6AF6837F2; Fri, 12 Dec 2025 12:32:34 +0100 (CET)", "from mail-wm1-x335.google.com (mail-wm1-x335.google.com\n [IPv6:2a00:1450:4864:20::335])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 9693083837\n for <u-boot@lists.denx.de>; Fri, 12 Dec 2025 12:32:32 +0100 (CET)", "by mail-wm1-x335.google.com with SMTP id\n 5b1f17b1804b1-4779cb0a33fso14336945e9.0\n for <u-boot@lists.denx.de>; Fri, 12 Dec 2025 03:32:32 -0800 (PST)", "from artemis2.elfringham.co.uk\n ([2a0a:ef40:fed:3801:9287:1e8a:f239:8d00])\n by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-47a8f8f39c6sm26277235e9.14.2025.12.12.03.32.30\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 12 Dec 2025 03:32:31 -0800 (PST)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1765539152; x=1766143952; darn=lists.denx.de;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=vdb//3W5RRAx2fLQOaxISTkEEk04x7eaCwcX4roCQ0w=;\n b=cOPDuquPtRoCjywNO9tGy3de/zzx4buLI9kSHqe/aTbpvqRC+Iklab9YaPS3u74xuf\n 76vQnCrtoaXyXouXMvO/YcTBHsMcclcTKyPTfKcutGQSuXU7gf8PIfK4t4DhjImMmEtv\n El8YI681mdpl8rJgUOrAZ0jhMeRlWpA7v8Jc4MFBZkLUNRf6vbGSRy4bIJMW9eD0xBS9\n aXcvLn4Dva6xvVfiEp8H0qGRGC2uqa/6kS2P4VeqX/lz5mraofMrLSYtOevUNUa12Pb7\n Shf3e7ngSfPi62O6WC/MEWAYDjBjg7cbNF+iz9JGtA4fvuZaOXvfZis4iGyC6oUmR+NL\n lrmg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1765539152; x=1766143952;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=vdb//3W5RRAx2fLQOaxISTkEEk04x7eaCwcX4roCQ0w=;\n b=IWnViSqHjquDUTgSZiDNK2qKVx5wvJFqEQrH8pGAeVccHFmx+BtUAqfM6yOS4zSD7m\n sdtKPvDvttaadUPm8SBih8YRJ36GUX5mtP05cHP8D5reyG48G5CFlFypeUisJyeJ1cPJ\n 3FeAJKsRz9wy4VJ91D1NMp7KGRRGYh99rhF50ONeXA7Ok9LRpBntqfA1SS1x+3bnkH66\n iEGNESBJ8FrRPzhebKPJ/9v73qjeIYY2MXLXk7IXTD8tmCqVBUHRebOe6gQyqGEbwtId\n Ldl/p9KyYC0EYenb2uOsPIDXu10moIGT30o3nbN7eIXG6kdLrxqraCqOvRFev7RZA4Rs\n CTVg==", "X-Gm-Message-State": "AOJu0YwlLpxVwbFzbV46JmU3lfBwlI0Jl0tOmgL3f2UILYaO54WbJmM0\n Uilc6LtCEE8WNciMRJOVvnfwGcKwh8Ia5qcwcL4ozKhhA09QthA+5XvYeDhysqhz36c=", "X-Gm-Gg": "AY/fxX6hLqvFg5pvlcmAntaVuyLXWoUW78xZN3zZN/aldy0TvBqBV9rIXGpDZmRNRNa\n Fp3r2/Wdjo5bIQxTZzQbKrBv8hSa53zvH/sJzzo4LIBfPuQrKauuhaxPu4VESbqlIhOzX7gFs6T\n CfxEA6mrTh+FdzpgD0S9ivZ1SwMAM66ZnSc5YHNjouXBfzt/HM3WHQwztwryYWo+FEKNrI9soHf\n gpCYIXTSvnVxGFvlGRe1JuFTqBMAu07wE6U4INYlOXJ745knrDnOUTLhaWk1qoSA6J2i2+j+P/T\n 3rnnoAVk3BasTVGaDa1ol778223MkDYIei+gPhuL57ilRrwwy5jNcMVqYK+S+y1YiNLXFJ5hQ/p\n TmPfj1+IFRbQpQLlzWBgHNYzPwYlQmbSh9TMgi0dCd0xII5poNXJsfFpj2w9LQfr88P2ZUKzQ0t\n EJxQD3MUzSMVrMKj4eugdayvTKhPqCnXd7yZiZSZQ=", "X-Google-Smtp-Source": "\n AGHT+IGzKfvJ7pOKjBqHOmOimeGQ72Qo1ofs3ZStTNdQ24hgJBLDV7jDVjR3tRgPwmHhALDANmQalA==", "X-Received": "by 2002:a05:600c:c16f:b0:477:93f7:bbc5 with SMTP id\n 5b1f17b1804b1-47a8f8c051bmr21869665e9.10.1765539151913;\n Fri, 12 Dec 2025 03:32:31 -0800 (PST)", "From": "Andrew Goodbody <andrew.goodbody@linaro.org>", "Date": "Fri, 12 Dec 2025 11:32:28 +0000", "Subject": "[PATCH v2 5/6] net: lwip: nfs: Port the NFS code to work with lwIP", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "Message-Id": "<20251212-lwip_nfs-v2-5-9cb5a60520d8@linaro.org>", "References": "<20251212-lwip_nfs-v2-0-9cb5a60520d8@linaro.org>", "In-Reply-To": "<20251212-lwip_nfs-v2-0-9cb5a60520d8@linaro.org>", "To": "u-boot@lists.denx.de", "Cc": "Tom Rini <trini@konsulko.com>, Joe Hershberger <joe.hershberger@ni.com>,\n Ramon Fried <rfried.dev@gmail.com>,\n Jerome Forissier <jerome.forissier@linaro.org>,\n Simon Glass <sjg@chromium.org>, Benjamin Hahn <B.Hahn@phytec.de>,\n Heinrich Schuchardt <xypron.glpk@gmx.de>,\n Adriano Cordova <adrianox@gmail.com>,\n Max Merchel <Max.Merchel@ew.tq-group.com>,\n Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>,\n Andre Przywara <andre.przywara@arm.com>, Tim Harvey <tharvey@gateworks.com>,\n Ilias Apalodimas <ilias.apalodimas@linaro.org>,\n Michal Simek <michal.simek@amd.com>,\n Michael Trimarchi <michael@amarulasolutions.com>,\n Ibai Erkiaga <ibai.erkiaga-elorza@amd.com>,\n Wolfgang Wallner <wolfgang.wallner@br-automation.com>,\n \"Kory Maincent (TI.com)\" <kory.maincent@bootlin.com>,\n Martyn Welch <martyn.welch@collabora.com>,\n Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>,\n Andrew Goodbody <andrew.goodbody@linaro.org>", "X-Mailer": "b4 0.14.2", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.39", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>", "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de", "X-Virus-Status": "Clean" }, "content": "After the preparatory patches moved most of the NFS code into common\nfiles we now add the code to enable NFS support with lwIP.\n\nSigned-off-by: Andrew Goodbody <andrew.goodbody@linaro.org>\n---\n cmd/Kconfig | 28 +++---\n cmd/lwip/Makefile | 1 +\n cmd/lwip/nfs.c | 11 +++\n include/net-lwip.h | 1 +\n net/lwip/Makefile | 1 +\n net/lwip/nfs.c | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++\n net/nfs-common.c | 4 +-\n 7 files changed, 317 insertions(+), 15 deletions(-)", "diff": "diff --git a/cmd/Kconfig b/cmd/Kconfig\nindex 8e3efff2bee69e4be80fe8e87eb7815dd3ff8ca9..de180fd7fab62329f8b63dfed780b32e0e908e91 100644\n--- a/cmd/Kconfig\n+++ b/cmd/Kconfig\n@@ -2110,20 +2110,6 @@ config CMD_RARP\n \thelp\n \t Boot image via network using RARP/TFTP protocol\n \n-config CMD_NFS\n-\tbool \"nfs\"\n-\thelp\n-\t Boot image via network using NFS protocol.\n-\n-config NFS_TIMEOUT\n-\tint \"Timeout in milliseconds for NFS mounts\"\n-\tdepends on CMD_NFS\n-\tdefault 2000\n-\thelp\n-\t Timeout in milliseconds used in NFS protocol. If you encounter\n-\t \"ERROR: Cannot umount\" in nfs command, try longer timeout such as\n-\t 10000.\n-\n config SYS_DISABLE_AUTOLOAD\n \tbool \"Disable automatically loading files over the network\"\n \tdepends on CMD_BOOTP || CMD_DHCP || CMD_NFS || CMD_RARP\n@@ -2218,6 +2204,20 @@ config CMD_MDIO\n \t The MDIO interface is orthogonal to the MII interface and extends\n \t it by adding access to more registers through indirect addressing.\n \n+config CMD_NFS\n+\tbool \"nfs\"\n+\thelp\n+\t Boot image via network using NFS protocol.\n+\n+config NFS_TIMEOUT\n+\tint \"Timeout in milliseconds for NFS mounts\"\n+\tdepends on CMD_NFS\n+\tdefault 2000\n+\thelp\n+\t Timeout in milliseconds used in NFS protocol. If you encounter\n+\t \"ERROR: Cannot umount\" in nfs command, try longer timeout such as\n+\t 10000.\n+\n config CMD_PING\n \tbool \"ping\"\n \tselect PROT_RAW_LWIP if NET_LWIP\ndiff --git a/cmd/lwip/Makefile b/cmd/lwip/Makefile\nindex a7f8976af3fb7cb2d41344f9f22a5d820c5ebc7e..90df1f5511cce4496abb16a495720df4e8cea822 100644\n--- a/cmd/lwip/Makefile\n+++ b/cmd/lwip/Makefile\n@@ -1,5 +1,6 @@\n obj-$(CONFIG_CMD_DHCP) += dhcp.o\n obj-$(CONFIG_CMD_DNS) += dns.o\n+obj-$(CONFIG_CMD_NFS) += nfs.o\n obj-$(CONFIG_CMD_PING) += ping.o\n obj-$(CONFIG_CMD_SNTP) += sntp.o\n obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o\ndiff --git a/cmd/lwip/nfs.c b/cmd/lwip/nfs.c\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..f22db582fdb9ff7c978da41d35046bf834aaf54e\n--- /dev/null\n+++ b/cmd/lwip/nfs.c\n@@ -0,0 +1,11 @@\n+// SPDX-License-Identifier: GPL-2.0+\n+/* Copyright (C) 2025 Linaro Ltd. */\n+\n+#include <command.h>\n+#include <net.h>\n+\n+U_BOOT_CMD(nfs,\t3,\t1,\tdo_nfs,\n+\t \"boot image via network using NFS protocol\",\n+\t \"[loadAddress] [[hostIPaddr:]bootfilename]\"\n+\t );\n+\ndiff --git a/include/net-lwip.h b/include/net-lwip.h\nindex c910def5719ea49c1796c11354e1a3d63e01e023..20cb0992cce1f9dbca7eaa114b4939028158d9b5 100644\n--- a/include/net-lwip.h\n+++ b/include/net-lwip.h\n@@ -51,6 +51,7 @@ int net_lwip_dns_resolve(char *name_or_ip, ip_addr_t *ip);\n bool wget_validate_uri(char *uri);\n \n int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);\n+int do_nfs(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);\n int do_wget(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);\n \n #endif /* __NET_LWIP_H__ */\ndiff --git a/net/lwip/Makefile b/net/lwip/Makefile\nindex 1b48ae4d50885863e82989f77416e5c35545502a..5291cbb2a1c31a970c44c6e182dc6d3a90d489cf 100644\n--- a/net/lwip/Makefile\n+++ b/net/lwip/Makefile\n@@ -4,6 +4,7 @@ obj-$(CONFIG_$(PHASE_)DM_ETH) += net-lwip.o\n obj-$(CONFIG_CMD_DHCP) += dhcp.o\n obj-$(CONFIG_DNS) += dns.o\n obj-$(CONFIG_LWIP_ICMP_SHOW_UNREACH) += icmp_unreach.o\n+obj-$(CONFIG_CMD_NFS) += nfs.o\n obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o\n obj-$(CONFIG_WGET) += wget.o\n \ndiff --git a/net/lwip/nfs.c b/net/lwip/nfs.c\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..27579af8f1fe3569bb308e312aa9edfcc1043136\n--- /dev/null\n+++ b/net/lwip/nfs.c\n@@ -0,0 +1,286 @@\n+// SPDX-License-Identifier: GPL-2.0+\n+/* Copyright (C) 2025 Linaro Ltd. */\n+\n+#include <console.h>\n+#include <display_options.h>\n+#include <env.h>\n+#include <image.h>\n+#include <linux/kconfig.h>\n+#include <lwip/timeouts.h>\n+#include <lwip/udp.h>\n+#include <net.h>\n+#include \"../nfs-common.h\"\n+#include <time.h>\n+\n+static ulong timer_start;\n+\n+static struct nfs_ctx {\n+\tip_addr_t nfs_server;\n+\tstruct udp_pcb *pcb;\n+} sess_ctx;\n+\n+/**************************************************************************\n+ * RPC_LOOKUP - Lookup RPC Port numbers\n+ **************************************************************************\n+ */\n+void rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen)\n+{\n+\tstruct pbuf *pb;\n+\tint pktlen;\n+\tint sport;\n+\terr_t err;\n+\n+\tpb = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct rpc_t), PBUF_RAM);\n+\tif (!pb) {\n+\t\tdebug(\"Failed to allocate pbuf to build RPC packet\\n\");\n+\t\treturn;\n+\t}\n+\n+\trpc_req_common(rpc_prog, rpc_proc, data, datalen,\n+\t\t pb->payload, &pktlen, &sport);\n+\n+\tpbuf_realloc(pb, (u16_t)pktlen);\n+\n+\terr = udp_sendto(sess_ctx.pcb, pb, &sess_ctx.nfs_server, sport);\n+\tdebug_cond((err != ERR_OK), \"Failed to send UDP packet err = %d\\n\", err);\n+\tpbuf_free(pb);\n+}\n+\n+void nfs_refresh_timeout(void)\n+{\n+\ttimer_start = get_timer(0);\n+}\n+\n+static void nfs_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,\n+\t\t const ip_addr_t *addr, u16_t port)\n+{\n+\tstruct nfs_ctx *ctx = arg;\n+\tint plen;\n+\tstruct rpc_t rpc_pkt;\n+\n+\tif (addr->addr != ctx->nfs_server.addr)\n+\t\tgoto exitfree;\n+\n+\tif (p->tot_len > sizeof(struct rpc_t))\n+\t\tgoto exitfree;\n+\n+\tplen = pbuf_copy_partial(p, &rpc_pkt.u.data[0], sizeof(rpc_pkt), 0);\n+\tnfs_pkt_recv(&rpc_pkt.u.data[0], plen);\n+\n+exitfree:\n+\tpbuf_free(p);\n+}\n+\n+static int nfs_udp_init(struct nfs_ctx *ctx)\n+{\n+\tctx->pcb = udp_new();\n+\tif (!ctx->pcb)\n+\t\treturn -ENOMEM;\n+\n+\tctx->pcb->local_port = nfs_our_port;\n+\tudp_recv(ctx->pcb, nfs_recv, ctx);\n+\n+\treturn 0;\n+}\n+\n+static int nfs_timeout_check(void)\n+{\n+\tif (get_timer(timer_start) < nfs_timeout)\n+\t\treturn 0;\n+\tif (++nfs_timeout_count < NFS_RETRY_COUNT) {\n+\t\tputs(\"T \");\n+\t\ttimer_start = get_timer(0);\n+\t\tnfs_send();\n+\t\treturn 0;\n+\t}\n+\n+\treturn 1;\n+}\n+\n+static int nfs_loop(struct udevice *udev, ulong addr, char *fname,\n+\t\t ip_addr_t srvip)\n+{\n+\tstruct netif *netif;\n+\tint ret;\n+\n+\tnfs_download_state = NETLOOP_FAIL;\n+\tnet_set_state(NETLOOP_FAIL);\n+\n+\tif (!fname || addr == 0)\n+\t\treturn -1;\n+\n+\tnetif = net_lwip_new_netif(udev);\n+\tif (!netif)\n+\t\treturn -1;\n+\n+\tnfs_filename = nfs_basename(fname);\n+\tnfs_path = nfs_dirname(fname);\n+\n+\tprintf(\"Using %s device\\n\", eth_get_name());\n+\n+\tprintf(\"File transfer via NFS from server %s; our IP address is %s\\n\",\n+\t ip4addr_ntoa(&srvip), env_get(\"ipaddr\"));\n+\n+\tprintf(\"\\nFilename '%s/%s'.\", nfs_path, nfs_filename);\n+\n+\tif (net_boot_file_expected_size_in_blocks) {\n+\t\tprintf(\" Size is 0x%x Bytes = \",\n+\t\t net_boot_file_expected_size_in_blocks << 9);\n+\t\tprint_size(net_boot_file_expected_size_in_blocks << 9, \"\");\n+\t}\n+\tprintf(\"\\nLoad address: 0x%lx\\nLoading: *\\b\", addr);\n+\timage_load_addr = addr;\n+\n+\tnfs_timeout_count = 0;\n+\tnfs_state = STATE_PRCLOOKUP_PROG_MOUNT_REQ;\n+\n+\tret = nfs_udp_init(&sess_ctx);\n+\tif (ret < 0) {\n+\t\tnet_lwip_remove_netif(netif);\n+\t\tdebug(\"Failed to init network interface, aborting for error = %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tnet_set_state(NETLOOP_CONTINUE);\n+\n+\tsess_ctx.nfs_server.addr = srvip.addr;\n+\n+\tnfs_send();\n+\n+\ttimer_start = get_timer(0);\n+\tdo {\n+\t\tnet_lwip_rx(udev, netif);\n+\t\tif (net_state != NETLOOP_CONTINUE)\n+\t\t\tbreak;\n+\t\tif (ctrlc()) {\n+\t\t\tprintf(\"\\nAbort\\n\");\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tif (nfs_timeout_check())\n+\t\t\tbreak;\n+\t} while (true);\n+\tdebug(\"%s: Loop exit at %lu\\n\", __func__, get_timer(0));\n+\n+\tnet_lwip_remove_netif(netif);\n+\n+\tif (net_state == NETLOOP_SUCCESS) {\n+\t\tret = 0;\n+\t\tif (net_boot_file_size > 0) {\n+\t\t\tprintf(\"Bytes transferred = %u (%x hex)\\n\",\n+\t\t\t net_boot_file_size, net_boot_file_size);\n+\t\t\tenv_set_hex(\"filesize\", net_boot_file_size);\n+\t\t\tenv_set_hex(\"fileaddr\", image_load_addr);\n+\t\t}\n+\n+\t} else {\n+\t\tdebug(\"%s: NFS loop failed\\n\", __func__);\n+\t\tret = -1;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+int do_nfs(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])\n+{\n+\tint ret = CMD_RET_SUCCESS;\n+\tchar *arg = NULL;\n+\tchar *words[2] = { };\n+\tchar *fname = NULL;\n+\tchar *server_ip = NULL;\n+\tchar *end;\n+\tip_addr_t srvip;\n+\tulong laddr;\n+\tulong addr;\n+\tint i;\n+\n+\tladdr = env_get_ulong(\"loadaddr\", 16, image_load_addr);\n+\n+\tswitch (argc) {\n+\tcase 1:\n+\t\tfname = env_get(\"bootfile\");\n+\t\tbreak;\n+\tcase 2:\n+\t\t/*\n+\t\t * Only one arg - accept two forms:\n+\t\t * Just load address, or just boot file name. The latter\n+\t\t * form must be written in a format which can not be\n+\t\t * mis-interpreted as a valid number.\n+\t\t */\n+\t\taddr = hextoul(argv[1], &end);\n+\t\tif (end == (argv[1] + strlen(argv[1]))) {\n+\t\t\tladdr = addr;\n+\t\t\tfname = env_get(\"bootfile\");\n+\t\t} else {\n+\t\t\targ = strdup(argv[1]);\n+\t\t}\n+\t\tbreak;\n+\tcase 3:\n+\t\tladdr = hextoul(argv[1], NULL);\n+\t\targ = strdup(argv[2]);\n+\t\tbreak;\n+\tdefault:\n+\t\tret = CMD_RET_USAGE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (!arg)\n+\t\targ = net_boot_file_name;\n+\n+\tif (*arg) {\n+\t\t/* Parse [ip:]fname */\n+\t\ti = 0;\n+\t\twhile ((*(words + i) = strsep(&arg, \":\")))\n+\t\t\ti++;\n+\n+\t\tswitch (i) {\n+\t\tcase 2:\n+\t\t\tserver_ip = words[0];\n+\t\t\tfname = words[1];\n+\t\t\tbreak;\n+\t\tcase 1:\n+\t\t\tfname = words[0];\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (!server_ip)\n+\t\tserver_ip = env_get(\"serverip\");\n+\tif (!server_ip) {\n+\t\tlog_err(\"*** ERROR: 'serverip' not set\\n\");\n+\t\tret = CMD_RET_FAILURE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (!ipaddr_aton(server_ip, &srvip)) {\n+\t\tlog_err(\"error: ipaddr_aton\\n\");\n+\t\tret = CMD_RET_FAILURE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (!fname) {\n+\t\tlog_err(\"error: no file name\\n\");\n+\t\tret = CMD_RET_FAILURE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (!laddr) {\n+\t\tlog_err(\"error: no load address\\n\");\n+\t\tret = CMD_RET_FAILURE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (net_lwip_eth_start() < 0) {\n+\t\tret = CMD_RET_FAILURE;\n+\t\tgoto out;\n+\t}\n+\n+\tif (nfs_loop(eth_get_dev(), laddr, fname, srvip) < 0)\n+\t\tret = CMD_RET_FAILURE;\n+out:\n+\tif (arg != net_boot_file_name)\n+\t\tfree(arg);\n+\treturn ret;\n+}\ndiff --git a/net/nfs-common.c b/net/nfs-common.c\nindex a6a70677bd2d8350819dd7bce336d35cc3ae7bf8..4fbde67a760f4eb2825749a051dd444bac486253 100644\n--- a/net/nfs-common.c\n+++ b/net/nfs-common.c\n@@ -286,9 +286,11 @@ static void nfs_umountall_req(void)\n \tu32 *p;\n \tint len;\n \n-\tif ((nfs_server_mount_port == -1) || !fs_mounted)\n+\tif ((nfs_server_mount_port == -1) || !fs_mounted) {\n \t\t/* Nothing mounted, nothing to umount */\n+\t\tnet_set_state(NETLOOP_FAIL);\n \t\treturn;\n+\t}\n \n \tp = &data[0];\n \tp = rpc_add_credentials(p);\n", "prefixes": [ "v2", "5/6" ] }