get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2173733/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}