get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 54591,
    "url": "http://patches.dpdk.org/api/patches/54591/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1560152324-20538-15-git-send-email-arybchenko@solarflare.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1560152324-20538-15-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1560152324-20538-15-git-send-email-arybchenko@solarflare.com",
    "date": "2019-06-10T07:38:29",
    "name": "[14/29] net/sfc/base: add background mode firmware updating",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "06bc7dfd1b1fd167c95946656840d4db42578e43",
    "submitter": {
        "id": 607,
        "url": "http://patches.dpdk.org/api/people/607/?format=api",
        "name": "Andrew Rybchenko",
        "email": "arybchenko@solarflare.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1560152324-20538-15-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [
        {
            "id": 4965,
            "url": "http://patches.dpdk.org/api/series/4965/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4965",
            "date": "2019-06-10T07:38:19",
            "name": "net/sfc/base: update base driver",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/4965/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/54591/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/54591/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 83AD61BEC7;\n\tMon, 10 Jun 2019 09:39:11 +0200 (CEST)",
            "from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com\n\t[67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 8A6451BE8C\n\tfor <dev@dpdk.org>; Mon, 10 Jun 2019 09:38:55 +0200 (CEST)",
            "from webmail.solarflare.com (webmail.solarflare.com\n\t[12.187.104.26])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby mx1-us5.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id\n\t90E084C005C\n\tfor <dev@dpdk.org>; Mon, 10 Jun 2019 07:38:54 +0000 (UTC)",
            "from ocex03.SolarFlarecom.com (10.20.40.36) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id 15.0.1395.4; Mon, 10 Jun 2019 00:38:51 -0700",
            "from opal.uk.solarflarecom.com (10.17.10.1) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id\n\t15.0.1395.4 via Frontend Transport; Mon, 10 Jun 2019 00:38:50 -0700",
            "from ukv-loginhost.uk.solarflarecom.com\n\t(ukv-loginhost.uk.solarflarecom.com [10.17.10.39])\n\tby opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tx5A7cnjb008806; Mon, 10 Jun 2019 08:38:49 +0100",
            "from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1])\n\tby ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id\n\tA38481616E0; Mon, 10 Jun 2019 08:38:49 +0100 (BST)"
        ],
        "X-Virus-Scanned": "Proofpoint Essentials engine",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "<dev@dpdk.org>",
        "CC": "Richard Houldsworth <rhouldsworth@solarflare.com>",
        "Date": "Mon, 10 Jun 2019 08:38:29 +0100",
        "Message-ID": "<1560152324-20538-15-git-send-email-arybchenko@solarflare.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1560152324-20538-1-git-send-email-arybchenko@solarflare.com>",
        "References": "<1560152324-20538-1-git-send-email-arybchenko@solarflare.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-TM-AS-Product-Ver": "SMEX-12.5.0.1300-8.5.1010-24664.003",
        "X-TM-AS-Result": "No-15.471200-4.000000-10",
        "X-TMASE-MatchedRID": "UeLhfUocf5u5UpxrNQf5nR/R5SKe31ARy733NwuklsLg91xayX4L83J4\n\tYYfr3pskJntVNHapMCsD6grIvl1lOkASN/wlEVscuwdUMMznEA+XP9dn/qaMz1OitEi5p2m0cij\n\tMZrr2iZ2t2gtuWr1LmnvLDtlx1Xxa42nbKJncaZSnRPnrtF/XIQRryDXHx6oXVWQnHKxp38iRZu\n\twKslcgBU1SWuwykreXqlMM2MiEo9aDbvXKFJb+1B2atUdrgMZMovA/6ONsv0qtyIlQ9jhSMS93G\n\t1kmDedMnGIq66JZ5o7Fw+98ljZmfn/so8z8CegQJP29N7gUd1CC7C2rJeUToXU98taw1P0pcjAQ\n\tJWA5qeJIFVQy1Tw7a7hGuSgz3a9tEHQGT9GzE46fG8+bi+/3vFxo0H+7nJCrFL5/d3sGIoLxMS4\n\tfSSByxvTWkT7dqxIUhwbJr5e+6PKtiF+p+9BY6TCMW7zNwFaIurOlC+PL0QBefydTdBeegaPFjJ\n\tEFr+olwXCBO/GKkVqOhzOa6g8KrZRMZUCEHkRt",
        "X-TM-AS-User-Approved-Sender": "No",
        "X-TM-AS-User-Blocked-Sender": "No",
        "X-TMASE-Result": "10--15.471200-4.000000",
        "X-TMASE-Version": "SMEX-12.5.0.1300-8.5.1010-24664.003",
        "X-MDID": "1560152335-Jk3Octes1WUA",
        "Subject": "[dpdk-dev] [PATCH 14/29] net/sfc/base: add background mode firmware\n\tupdating",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Richard Houldsworth <rhouldsworth@solarflare.com>\n\nRequest firmware updates be performed in background mode.\nIn this mode MCDI to the function processing the update\nremains accessible and the client polls for completion.\nThis is supported for lengthy partition updates such as\nMCFW and bundles. The MC ignores the flags used for this\nmode for other partition updates.\n\nSigned-off-by: Richard Houldsworth <rhouldsworth@solarflare.com>\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/sfc/base/ef10_nic.c    |  5 ++++\n drivers/net/sfc/base/ef10_nvram.c  | 55 ++++++++++++++++++++++++++++++++++----\n drivers/net/sfc/base/efx.h         |  2 ++\n drivers/net/sfc/base/efx_impl.h    |  4 +++\n drivers/net/sfc/base/efx_nvram.c   | 30 +++++++++++++++------\n drivers/net/sfc/base/siena_nvram.c |  4 ++-\n 6 files changed, 86 insertions(+), 14 deletions(-)",
    "diff": "diff --git a/drivers/net/sfc/base/ef10_nic.c b/drivers/net/sfc/base/ef10_nic.c\nindex 27508e1..4c90e10 100644\n--- a/drivers/net/sfc/base/ef10_nic.c\n+++ b/drivers/net/sfc/base/ef10_nic.c\n@@ -1216,6 +1216,11 @@\n \telse\n \t\tencp->enc_nvram_update_verify_result_supported = B_FALSE;\n \n+\tif (CAP_FLAGS2(req, NVRAM_UPDATE_POLL_VERIFY_RESULT))\n+\t\tencp->enc_nvram_update_poll_verify_result_supported = B_TRUE;\n+\telse\n+\t\tencp->enc_nvram_update_poll_verify_result_supported = B_FALSE;\n+\n \t/*\n \t * Check if firmware update via the BUNDLE partition is supported\n \t */\ndiff --git a/drivers/net/sfc/base/ef10_nvram.c b/drivers/net/sfc/base/ef10_nvram.c\nindex 1fb7185..ed88e83 100644\n--- a/drivers/net/sfc/base/ef10_nvram.c\n+++ b/drivers/net/sfc/base/ef10_nvram.c\n@@ -2177,6 +2177,10 @@ static uint32_t checksum_tlv_partition(\n \treturn (rc);\n }\n \n+#define\tEF10_NVRAM_INITIAL_POLL_DELAY_US 10000\n+#define\tEF10_NVRAM_MAX_POLL_DELAY_US     1000000\n+#define\tEF10_NVRAM_POLL_RETRIES          100\n+\n \t__checkReturn\t\tefx_rc_t\n ef10_nvram_partn_unlock(\n \t__in\t\t\tefx_nic_t *enp,\n@@ -2184,17 +2188,58 @@ static uint32_t checksum_tlv_partition(\n \t__out_opt\t\tuint32_t *verify_resultp)\n {\n \tboolean_t reboot = B_FALSE;\n+\tuint32_t poll_delay_us = EF10_NVRAM_INITIAL_POLL_DELAY_US;\n+\tuint32_t poll_retry = 0;\n+\tuint32_t verify_result = MC_CMD_NVRAM_VERIFY_RC_UNKNOWN;\n \tefx_rc_t rc;\n \n-\tif (verify_resultp != NULL)\n-\t\t*verify_resultp = MC_CMD_NVRAM_VERIFY_RC_UNKNOWN;\n+\trc = efx_mcdi_nvram_update_finish(enp, partn, reboot,\n+\t    EFX_NVRAM_UPDATE_FLAGS_BACKGROUND, &verify_result);\n \n-\trc = efx_mcdi_nvram_update_finish(enp, partn, reboot, verify_resultp);\n-\tif (rc != 0)\n-\t\tgoto fail1;\n+\t/*\n+\t * NVRAM updates can take a long time (e.g. up to 1 minute for bundle\n+\t * images). Polling for NVRAM update completion ensures that other MCDI\n+\t * commands can be issued before the background NVRAM update completes.\n+\t *\n+\t * Without polling, other MCDI commands can only be issued before the\n+\t * NVRAM update completes if the MCDI transport and the firmware\n+\t * support the Asynchronous MCDI protocol extensions in SF-116575-PS.\n+\t *\n+\t * The initial call either completes the update synchronously, or\n+\t * returns RC_PENDING to indicate processing is continuing. In the\n+\t * latter case, we poll for at least 1 minute, at increasing intervals\n+\t * (10ms, 100ms, 1s).\n+\t */\n+\twhile (verify_result == MC_CMD_NVRAM_VERIFY_RC_PENDING) {\n+\n+\t\tif (poll_retry > EF10_NVRAM_POLL_RETRIES) {\n+\t\t\trc = ETIMEDOUT;\n+\t\t\tgoto fail1;\n+\t\t}\n+\t\tpoll_retry++;\n+\n+\t\tEFSYS_SLEEP(poll_delay_us);\n+\t\tif (poll_delay_us < EF10_NVRAM_MAX_POLL_DELAY_US)\n+\t\t\tpoll_delay_us *= 10;\n+\n+\t\t/* Poll for completion of background NVRAM update. */\n+\t\tverify_result = MC_CMD_NVRAM_VERIFY_RC_UNKNOWN;\n+\n+\t\trc = efx_mcdi_nvram_update_finish(enp, partn, reboot,\n+\t\t    EFX_NVRAM_UPDATE_FLAGS_POLL, &verify_result);\n+\t\tif (rc != 0) {\n+\t\t\t/* Poll failed, so assume NVRAM update failed. */\n+\t\t\tgoto fail2;\n+\t\t}\n+\t}\n+\n+\tif (verify_resultp != NULL)\n+\t\t*verify_resultp = verify_result;\n \n \treturn (0);\n \n+fail2:\n+\tEFSYS_PROBE(fail2);\n fail1:\n \tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n \ndiff --git a/drivers/net/sfc/base/efx.h b/drivers/net/sfc/base/efx.h\nindex d46e650..4385379 100644\n--- a/drivers/net/sfc/base/efx.h\n+++ b/drivers/net/sfc/base/efx.h\n@@ -1395,6 +1395,8 @@ enum {\n \tuint32_t\t\tenc_max_pcie_link_gen;\n \t/* Firmware verifies integrity of NVRAM updates */\n \tboolean_t\t\tenc_nvram_update_verify_result_supported;\n+\t/* Firmware supports polled NVRAM updates on select partitions */\n+\tboolean_t\t\tenc_nvram_update_poll_verify_result_supported;\n \t/* Firmware accepts updates via the BUNDLE partition */\n \tboolean_t\t\tenc_nvram_bundle_update_supported;\n \t/* Firmware support for extended MAC_STATS buffer */\ndiff --git a/drivers/net/sfc/base/efx_impl.h b/drivers/net/sfc/base/efx_impl.h\nindex d8cadda..067cec3 100644\n--- a/drivers/net/sfc/base/efx_impl.h\n+++ b/drivers/net/sfc/base/efx_impl.h\n@@ -594,11 +594,15 @@\n \t__in_bcount(size)\tcaddr_t data,\n \t__in\t\t\tsize_t size);\n \n+#define\tEFX_NVRAM_UPDATE_FLAGS_BACKGROUND\t0x00000001\n+#define\tEFX_NVRAM_UPDATE_FLAGS_POLL\t\t0x00000002\n+\n \t__checkReturn\t\tefx_rc_t\n efx_mcdi_nvram_update_finish(\n \t__in\t\t\tefx_nic_t *enp,\n \t__in\t\t\tuint32_t partn,\n \t__in\t\t\tboolean_t reboot,\n+\t__in\t\t\tuint32_t flags,\n \t__out_opt\t\tuint32_t *verify_resultp);\n \n #if EFSYS_OPT_DIAG\ndiff --git a/drivers/net/sfc/base/efx_nvram.c b/drivers/net/sfc/base/efx_nvram.c\nindex 74dac41..5e7236c 100644\n--- a/drivers/net/sfc/base/efx_nvram.c\n+++ b/drivers/net/sfc/base/efx_nvram.c\n@@ -965,6 +965,7 @@\n \t__in\t\t\tefx_nic_t *enp,\n \t__in\t\t\tuint32_t partn,\n \t__in\t\t\tboolean_t reboot,\n+\t__in\t\t\tuint32_t flags,\n \t__out_opt\t\tuint32_t *verify_resultp)\n {\n \tconst efx_nic_cfg_t *encp = &enp->en_nic_cfg;\n@@ -972,7 +973,7 @@\n \tEFX_MCDI_DECLARE_BUF(payload, MC_CMD_NVRAM_UPDATE_FINISH_V2_IN_LEN,\n \t\tMC_CMD_NVRAM_UPDATE_FINISH_V2_OUT_LEN);\n \tuint32_t verify_result = MC_CMD_NVRAM_VERIFY_RC_UNKNOWN;\n-\tefx_rc_t rc;\n+\tefx_rc_t rc = 0;\n \n \treq.emr_cmd = MC_CMD_NVRAM_UPDATE_FINISH;\n \treq.emr_in_buf = payload;\n@@ -983,8 +984,19 @@\n \tMCDI_IN_SET_DWORD(req, NVRAM_UPDATE_FINISH_V2_IN_TYPE, partn);\n \tMCDI_IN_SET_DWORD(req, NVRAM_UPDATE_FINISH_V2_IN_REBOOT, reboot);\n \n-\tMCDI_IN_POPULATE_DWORD_1(req, NVRAM_UPDATE_FINISH_V2_IN_FLAGS,\n-\t    NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT, 1);\n+\tif (!encp->enc_nvram_update_poll_verify_result_supported) {\n+\t\tflags &= ~EFX_NVRAM_UPDATE_FLAGS_BACKGROUND;\n+\t\tflags &= ~EFX_NVRAM_UPDATE_FLAGS_POLL;\n+\t}\n+\n+\tMCDI_IN_POPULATE_DWORD_3(req, NVRAM_UPDATE_FINISH_V2_IN_FLAGS,\n+\t    NVRAM_UPDATE_FINISH_V2_IN_FLAG_REPORT_VERIFY_RESULT,\n+\t    1,\n+\t    NVRAM_UPDATE_FINISH_V2_IN_FLAG_RUN_IN_BACKGROUND,\n+\t    (flags & EFX_NVRAM_UPDATE_FLAGS_BACKGROUND) ? 1 : 0,\n+\t    NVRAM_UPDATE_FINISH_V2_IN_FLAG_POLL_VERIFY_RESULT,\n+\t    (flags & EFX_NVRAM_UPDATE_FLAGS_POLL) ? 1 : 0\n+\t    );\n \n \tefx_mcdi_execute(enp, &req);\n \n@@ -1005,11 +1017,13 @@\n \t\t    MCDI_OUT_DWORD(req, NVRAM_UPDATE_FINISH_V2_OUT_RESULT_CODE);\n \t}\n \n-\tif ((encp->enc_nvram_update_verify_result_supported) &&\n-\t    (verify_result != MC_CMD_NVRAM_VERIFY_RC_SUCCESS)) {\n-\t\t/* Update verification failed */\n-\t\trc = EINVAL;\n-\t\tgoto fail3;\n+\tif (encp->enc_nvram_update_verify_result_supported) {\n+\t\tif ((verify_result != MC_CMD_NVRAM_VERIFY_RC_SUCCESS) &&\n+\t\t    (verify_result != MC_CMD_NVRAM_VERIFY_RC_PENDING)) {\n+\t\t\t/* Update verification failed */\n+\t\t\trc = EINVAL;\n+\t\t\tgoto fail3;\n+\t\t}\n \t}\n \n \tif (verify_resultp != NULL)\ndiff --git a/drivers/net/sfc/base/siena_nvram.c b/drivers/net/sfc/base/siena_nvram.c\nindex 47a8ca2..51e601e 100644\n--- a/drivers/net/sfc/base/siena_nvram.c\n+++ b/drivers/net/sfc/base/siena_nvram.c\n@@ -174,6 +174,7 @@\n \t__out_opt\t\tuint32_t *verify_resultp)\n {\n \tboolean_t reboot;\n+\tuint32_t flags = 0;\n \tefx_rc_t rc;\n \n \t/*\n@@ -184,7 +185,8 @@\n \t\t    partn == MC_CMD_NVRAM_TYPE_PHY_PORT1 ||\n \t\t    partn == MC_CMD_NVRAM_TYPE_DISABLED_CALLISTO);\n \n-\trc = efx_mcdi_nvram_update_finish(enp, partn, reboot, verify_resultp);\n+\trc = efx_mcdi_nvram_update_finish(enp, partn, reboot, flags,\n+\t\t    verify_resultp);\n \tif (rc != 0)\n \t\tgoto fail1;\n \n",
    "prefixes": [
        "14/29"
    ]
}