get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 137657,
    "url": "http://patches.dpdk.org/api/patches/137657/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240301084244.190484-4-chaoyong.he@corigine.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": "<20240301084244.190484-4-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240301084244.190484-4-chaoyong.he@corigine.com",
    "date": "2024-03-01T08:42:44",
    "name": "[v2,3/3] net/nfp: add force reload firmware option",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "84c23709cb05aaa0f1aadad9cea741ac466873b9",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.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/20240301084244.190484-4-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31323,
            "url": "http://patches.dpdk.org/api/series/31323/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31323",
            "date": "2024-03-01T08:42:41",
            "name": "reload the firmware as needed",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/31323/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/137657/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/137657/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id A596543BC0;\n\tFri,  1 Mar 2024 09:43:30 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DD02B4332C;\n\tFri,  1 Mar 2024 09:43:12 +0100 (CET)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2130.outbound.protection.outlook.com [40.107.220.130])\n by mails.dpdk.org (Postfix) with ESMTP id 6AF7643328\n for <dev@dpdk.org>; Fri,  1 Mar 2024 09:43:10 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MW3PR13MB4153.namprd13.prod.outlook.com (2603:10b6:303:5c::8) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.41; Fri, 1 Mar\n 2024 08:43:09 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e%4]) with mapi id 15.20.7316.039; Fri, 1 Mar 2024\n 08:43:09 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=RsYhO/fQgYV1yBjcMBX/VwELDlUIWgdHr5WLOlBCbnPlM9EzF3hCEPts05e1FqQ760q1kU7CyN8gWabb/Ok+MJ3lxu1cRlYIxH1hQiowc2qzBD7bJL+dIwZN2hahYY1s3/+K46Aj5oiEFIzqqJVt/cXsWczeisVSeEH1BWLHK2L3Flf4B1evhAL05IeHoiUXeBviunD1FR8PL7Uu62Ovjrb+NDElr0Kmdd2bJM3oeXKER0MiTKPKHlxOJqXjGlORkCM9wCSVFgb2FGYmKVkl3PiIOzvSlynyazQM4yRRv/moLg6L5diqqNq7GVHNX9Ac90egn6CKM1ZO78mhr0Q30A==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=b2kolChHTBsf4U1zm3edH90iNFG/BPSyVquKUTPqF38=;\n b=mYo7Vmu/RctLs15Hj+m8bVNBaYABUOaqTDxV+W/dPgttWWjM3ygVEjXLPTDwRdj7IQX3rCYbrGQ9I0KHNGZ6qq53LeKsJQYpPxoy1FHKHbxiM73L7821HiwFmEfp1dz5iouaBHH9F9VPEExjECVJiaGTtqFXVS5RmPNw4hQTsGlnD8YQesSmL0PMfE1+mN8ZCVOvMytoV3ey6WJLO7WeJy1+RrsbFRbLn6vQqGUzeDv+LXudnjKIFnkBNQNkmm3VEKZk5cNAjIMV6g4GQbNurjhZ+qNIg5ZEE5GCwKOLC/m97YebYTXq0RKG+V7/I7ZXZOsVimst/0lU/Xm9Xf5N9g==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=b2kolChHTBsf4U1zm3edH90iNFG/BPSyVquKUTPqF38=;\n b=exad/rAekMfwqU6Ns7J76dILkIuip4m6RHMpck1dzD4WInkArS2rc6gg4QZ014Em+wgLI+K7n/CRz2+fVIQz+eBnkHsW/XBIEnn2IgspSZugIK50aeAerlJKM5ZaFYr+eRhVwIpaJGxHBexmYaC6Qa5RJ47OB+Y93gOu0Aagtwg=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Peng Zhang <peng.zhang@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v2 3/3] net/nfp: add force reload firmware option",
        "Date": "Fri,  1 Mar 2024 16:42:44 +0800",
        "Message-Id": "<20240301084244.190484-4-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20240301084244.190484-1-chaoyong.he@corigine.com>",
        "References": "<20240227111551.3773862-1-chaoyong.he@corigine.com>\n <20240301084244.190484-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SJ0PR03CA0206.namprd03.prod.outlook.com\n (2603:10b6:a03:2ef::31) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|MW3PR13MB4153:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "7797c06e-917a-48ae-0fec-08dc39cb9ef9",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n aVYDMrrQKtmRqQr2vomfZgH7RGCLcm1zN5PWmYIQqotJTuRdLbn1c9uSd1YMd8sdeSV8tXfCZo457g1mjgMatP8Zw2jCqYZs0Q9C8P13DRBiBdOENV5PPD0NxLP9H/kfJzdJ42fhDmvo2rxNvyjD0o5SfMuGXFb+B9hUlRZpc3xbBLpUdyLPhO60TAm9m2RJjzWKQyXNOTYxy3L87irHd/J3hE8obiAek2LLNoOnWY/wdtGhb6xlkigvrbbheG0Y82Up4GSbLb6Cy8kKWDhAvBW9jdDaW9HR44Uu57nFKgh2G4xJvVXEK9UCr79jMkMb5+g+POTnm3xlx9IHX0ei7f8T+ewyvpfZMig+goCNTCIEBhAJ7hZAyOLa07i6I5pS0TI4CsRDhp9KIifhcA3Q9QWCU2sEXJvBwAcnBtLHYqP2BByOQZfanO4k9Uj7zqR8lz+lobSZKzXS4uAqcBFrvDzvo/0Wi6zfwE1ZkDf4qZEC/y/hMULiBoTJ3UPE6h+v+ICvrqndUw2BFNcTPt3Y5YUpaa82NBS3ShtCRp7srvfMfkR0lslQWR8LUWtkEG17oK/uheYakJWy83dDysbjS6LTkJbObRlrWwOc4PcEt2vKmw4xsksh2Kz+o+qOze/wyYnFh85ZHaGFmjJ4TM9qMDek7jbtILH8MmzUjsl+FbXfGQBh3+2JEoL/55U0SN2E77+6KCNXKN2D0CaMPJgjRw==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(38350700005); DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n TGKbnaHU9F3ScR8Y+rwr2hh2YDIPs7X4Tf5sAQ16vClvadePFlpHUiS06Oer7+Ssgj5PTAnNDFBk7yYLBamfcAqcUM7foTiKsrjz6ac36kpW/J7E4bBpt9sel2xN1XiZthYFw8lFhAZPlfvnnGLf1QPt5UjmQqvTQEBRkyguu7aVeCKkS2OUiOeosvpMM3tHA4ppD5wlozHicvsG4sujM5efgI5MGQuzDK+CXBEtrTlzAcmIXIEdKOUGarLP20GrFdxCzVV1aCkH7OR1oVNkURfvRErmlf73UyToJjrcMeNdCz7PqEHLAKglQGfOkPcYwsxrjOu/F6umIgM2F9uKZtJrUZzdVB8ZSxeKQDjnbfWHD6+PGoC8fBRsQF1b0s6Nq441Tzxhn6wnwr8qRSPAhmW2C7htpmmu8mH9TNJlMb44W9siJyvNOxOiZNWC4TkQ3wClP+H89LVV+IKtyclGmMQzKYkFlBubysRyjK7T527cYc2ZEiqPvQ67RQzc6Zhg/uuLqg44PWomaI4bGcX0F6QLx4uxSmw02UfIbm2NZ5CxChVGJmfx8a18cCZxxxXdELD2NBawcohvHCglz6OBNczjrJEdAtk16h8fZRofO3ysFTBitCxNZb+w78obl0NfgnTxL0pDCDEJvj8Ij6yolT/eNw2WPl+uxyAUVBLDDo2IEs1kbZeOSiTM71LvkOdrrqjrOTm4ToF2PVwDAbrfbkmWztVt1m8zWC9eJWXItpQBfw0Ba9W2mZmuVGxrBe4MRC+3YQ+JpfIXN401sMo6+PLYtWoE9yujbXeWCrqZ+TCLPSU6/MRYbG4IEnHB8aNQECuDPh3K0oYwzImSWHceaMLbYAM9R1bMxA16cONJWT1Y8xmX7ijRj5XAQBIt7vSFKKmNO6XU+Q8bXDWEZVj5VX0TGsCC+P7scWYLtk9ZrQHd5EGwx5V8ITvc98OD5QF0ofPRcKrLWqaqqStL2r5amSF1dK7FPF9cmCUa6Y/3EdMMmnpQ7oSdaIlQAID/LFPS3KY5+eK8xBtg9fbq69QbU3yXBs4gY06QhwCuGOHovaSbftaXAd6NASe/3CL/VCRssAVzS2w22gy9G7dxo41w8hHShImBGLdQu39gxehI35FV1NucWdlwtgb46YVaPOxdfzI41UfMDSYZ/1Pcdd9WqeNEuvdWkoFFYyacyI3csj3+qfxwvW9cMmpHjmRFGDH9XlHgR64vPIIlHbbAFdY82382ryDTwFJa7iE30XBmfFPoATWKNzj7YpK1yRXKYwPGrkWPaava4vXFbE+AJiEXhsG5O3rq0YEdK+y70jf5Vy/wXugBE64odddkDJ/oMuYDeF0sbRwU1+6nvc+9U2i3nfNZS3+OvBN7+UNToCIt3sBPgBDyy9us9V8eyaVIK5uvvP3dMP5fh8D7Blywil0ZB4eJfpMQdLfj67f54EsWw/lLHwBZip6hqej/r6GzUsTka0oLjnxVsY3YoOF3R3aG+0rnTAWVp0rIiwD43Wm5sOQZsCaJWPqoehgDvpXEQhUzlpCkGSMn2F1SQl3GCPBGKzWUmQJViTW0c3oTpRXmVhQLyP6YyYsaEIXEE6uDLyZWAbzUDpbyjEFJvxvOptvx/w==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 7797c06e-917a-48ae-0fec-08dc39cb9ef9",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Mar 2024 08:43:09.0758 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n oaXOIE184cOUFzErsVEoLZeTMY8zwU/0kFRDlelraJT0r3pQxp6ectgR1OzWRe1QNZIJczoZ5Qq+/wfGANkoIfoqwZbyQ4oJa6F6hYSHVAY=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MW3PR13MB4153",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <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 <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "From: Peng Zhang <peng.zhang@corigine.com>\n\nAdd an option to force reload the firmware.\n\nThis option can be ignored in some case, for example:\nWhen using a 2 port NFP card and both with this reload firmware option,\nonly the first one will cause the firmware reload and the second one\nwill be ignored.\n\nSigned-off-by: Peng Zhang <peng.zhang@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\n---\n doc/guides/nics/nfp.rst          |  21 +++++++\n drivers/net/nfp/nfp_ethdev.c     | 104 +++++++++++++++++++++++++++----\n drivers/net/nfp/nfp_net_common.h |   8 +++\n 3 files changed, 121 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst\nindex fee1860f4a..4f2be0856c 100644\n--- a/doc/guides/nics/nfp.rst\n+++ b/doc/guides/nics/nfp.rst\n@@ -225,6 +225,27 @@ The ctrl vNIC service handles various control messages, for example, the\n creation and configuration of representor port, the pattern and action of flow\n rules, the statistics of flow rules, etc.\n \n+NFP devargs\n+-----------\n+\n+- ``force_reload_fw`` (default **0**)\n+\n+   The NFP PF PMD supports force reload the firmware and ignore the firmware\n+   version. For example, user can force a PF with PCI ID 0000:af:00.0 reload\n+   firmware by:\n+\n+   .. code-block:: console\n+\n+      -a af:00.0,force_reload_fw=1 -- -i\n+\n+   .. Note::\n+\n+      This parameter can be ignored in some case.\n+\n+      For example: when using a 2 port NFP card and both with this reload\n+      firmware option, only the first one will cause the firmware reload and\n+      the second one will be ignored.\n+\n Metadata Format\n ---------------\n \ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 902a62a86b..8c38b4e134 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -9,6 +9,7 @@\n \n #include <eal_firmware.h>\n #include <rte_alarm.h>\n+#include <rte_kvargs.h>\n \n #include \"flower/nfp_flower.h\"\n #include \"nfd3/nfp_nfd3.h\"\n@@ -31,6 +32,71 @@\n #define NFP_NET_APP_CAP_SP_INDIFF       RTE_BIT64(0) /* Indifferent to port speed */\n \n #define NFP_PF_DRIVER_NAME net_nfp_pf\n+#define NFP_PF_FORCE_RELOAD_FW   \"force_reload_fw\"\n+\n+static int\n+nfp_devarg_handle_int(const char *key,\n+\t\tconst char *value,\n+\t\tvoid *extra_args)\n+{\n+\tchar *end_ptr;\n+\tuint64_t *num = extra_args;\n+\n+\tif (value == NULL)\n+\t\treturn -EPERM;\n+\n+\t*num = strtoul(value, &end_ptr, 10);\n+\tif (*num == ULONG_MAX) {\n+\t\tPMD_DRV_LOG(ERR, \"%s: '%s' is not a valid param\", key, value);\n+\t\treturn -ERANGE;\n+\t} else if (value == end_ptr) {\n+\t\treturn -EPERM;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+nfp_devarg_parse_force_reload_fw(struct rte_kvargs *kvlist,\n+\t\tbool *force_reload_fw)\n+{\n+\tint ret;\n+\tuint64_t value;\n+\n+\n+\tif (rte_kvargs_count(kvlist, NFP_PF_FORCE_RELOAD_FW) != 1)\n+\t\treturn;\n+\n+\tret = rte_kvargs_process(kvlist, NFP_PF_FORCE_RELOAD_FW, &nfp_devarg_handle_int, &value);\n+\tif (ret != 0)\n+\t\treturn;\n+\n+\tif (value == 1)\n+\t\t*force_reload_fw = true;\n+\telse if (value == 0)\n+\t\t*force_reload_fw = false;\n+\telse\n+\t\tPMD_DRV_LOG(ERR, \"The param does not work, the format is %s=0/1\",\n+\t\t\t\tNFP_PF_FORCE_RELOAD_FW);\n+}\n+\n+static void\n+nfp_devargs_parse(struct nfp_devargs *nfp_devargs_param,\n+\t\tconst struct rte_devargs *devargs)\n+{\n+\tstruct rte_kvargs *kvlist;\n+\n+\tif (devargs == NULL)\n+\t\treturn;\n+\n+\tkvlist = rte_kvargs_parse(devargs->args, NULL);\n+\tif (kvlist == NULL)\n+\t\treturn;\n+\n+\tnfp_devarg_parse_force_reload_fw(kvlist, &nfp_devargs_param->force_reload_fw);\n+\n+\trte_kvargs_free(kvlist);\n+}\n \n static void\n nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic,\n@@ -1116,7 +1182,8 @@ nfp_fw_reload(struct nfp_nsp *nsp,\n \n static bool\n nfp_fw_skip_load(const struct nfp_dev_info *dev_info,\n-\t\tstruct nfp_multi_pf *multi_pf)\n+\t\tstruct nfp_multi_pf *multi_pf,\n+\t\tbool *reload_fw)\n {\n \tuint8_t i;\n \tuint64_t tmp_beat;\n@@ -1150,6 +1217,11 @@ nfp_fw_skip_load(const struct nfp_dev_info *dev_info,\n \t\t\t\tin_use++;\n \t\t\t\tabnormal--;\n \t\t\t\tbeat[port_num] = 0;\n+\t\t\t\tif (*reload_fw) {\n+\t\t\t\t\t*reload_fw = false;\n+\t\t\t\t\tPMD_DRV_LOG(ERR, \"The param %s does not work\",\n+\t\t\t\t\t\t\tNFP_PF_FORCE_RELOAD_FW);\n+\t\t\t\t}\n \t\t\t}\n \t\t}\n \n@@ -1168,12 +1240,13 @@ nfp_fw_skip_load(const struct nfp_dev_info *dev_info,\n static int\n nfp_fw_reload_for_single_pf(struct nfp_nsp *nsp,\n \t\tchar *fw_name,\n-\t\tstruct nfp_cpp *cpp)\n+\t\tstruct nfp_cpp *cpp,\n+\t\tbool force_reload_fw)\n {\n \tint ret;\n \tbool fw_changed = true;\n \n-\tif (nfp_nsp_fw_loaded(nsp)) {\n+\tif (nfp_nsp_fw_loaded(nsp) && !force_reload_fw) {\n \t\tret = nfp_fw_check_change(cpp, fw_name, &fw_changed);\n \t\tif (ret != 0)\n \t\t\treturn ret;\n@@ -1194,11 +1267,13 @@ nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,\n \t\tchar *fw_name,\n \t\tstruct nfp_cpp *cpp,\n \t\tconst struct nfp_dev_info *dev_info,\n-\t\tstruct nfp_multi_pf *multi_pf)\n+\t\tstruct nfp_multi_pf *multi_pf,\n+\t\tbool force_reload_fw)\n {\n \tint err;\n \tbool fw_changed = true;\n \tbool skip_load_fw = false;\n+\tbool reload_fw = force_reload_fw;\n \n \terr = nfp_net_keepalive_init(cpp, multi_pf);\n \tif (err != 0) {\n@@ -1212,16 +1287,16 @@ nfp_fw_reload_for_multi_pf(struct nfp_nsp *nsp,\n \t\tgoto keepalive_uninit;\n \t}\n \n-\tif (nfp_nsp_fw_loaded(nsp)) {\n+\tif (nfp_nsp_fw_loaded(nsp) && !reload_fw) {\n \t\terr = nfp_fw_check_change(cpp, fw_name, &fw_changed);\n \t\tif (err != 0)\n \t\t\tgoto keepalive_stop;\n \t}\n \n-\tif (!fw_changed)\n-\t\tskip_load_fw = nfp_fw_skip_load(dev_info, multi_pf);\n+\tif (!fw_changed || reload_fw)\n+\t\tskip_load_fw = nfp_fw_skip_load(dev_info, multi_pf, &reload_fw);\n \n-\tif (skip_load_fw)\n+\tif (skip_load_fw && !reload_fw)\n \t\treturn 0;\n \n \terr = nfp_fw_reload(nsp, fw_name);\n@@ -1246,7 +1321,8 @@ nfp_fw_setup(struct rte_pci_device *dev,\n \t\tstruct nfp_eth_table *nfp_eth_table,\n \t\tstruct nfp_hwinfo *hwinfo,\n \t\tconst struct nfp_dev_info *dev_info,\n-\t\tstruct nfp_multi_pf *multi_pf)\n+\t\tstruct nfp_multi_pf *multi_pf,\n+\t\tbool force_reload_fw)\n {\n \tint err;\n \tchar fw_name[125];\n@@ -1294,9 +1370,10 @@ nfp_fw_setup(struct rte_pci_device *dev,\n \t}\n \n \tif (multi_pf->enabled)\n-\t\terr = nfp_fw_reload_for_multi_pf(nsp, fw_name, cpp, dev_info, multi_pf);\n+\t\terr = nfp_fw_reload_for_multi_pf(nsp, fw_name, cpp, dev_info, multi_pf,\n+\t\t\t\tforce_reload_fw);\n \telse\n-\t\terr = nfp_fw_reload_for_single_pf(nsp, fw_name, cpp);\n+\t\terr = nfp_fw_reload_for_single_pf(nsp, fw_name, cpp, force_reload_fw);\n \n \tnfp_nsp_close(nsp);\n \treturn err;\n@@ -1769,8 +1846,10 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t\tnfp_eth_set_configured(cpp, index, 0);\n \t}\n \n+\tnfp_devargs_parse(&pf_dev->devargs, pci_dev->device.devargs);\n+\n \tif (nfp_fw_setup(pci_dev, cpp, nfp_eth_table, hwinfo,\n-\t\t\tdev_info, &pf_dev->multi_pf) != 0) {\n+\t\t\tdev_info, &pf_dev->multi_pf, pf_dev->devargs.force_reload_fw) != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Error when uploading firmware\");\n \t\tret = -EIO;\n \t\tgoto eth_table_cleanup;\n@@ -2151,3 +2230,4 @@ static struct rte_pci_driver rte_nfp_net_pf_pmd = {\n RTE_PMD_REGISTER_PCI(NFP_PF_DRIVER_NAME, rte_nfp_net_pf_pmd);\n RTE_PMD_REGISTER_PCI_TABLE(NFP_PF_DRIVER_NAME, pci_id_nfp_pf_net_map);\n RTE_PMD_REGISTER_KMOD_DEP(NFP_PF_DRIVER_NAME, \"* igb_uio | uio_pci_generic | vfio\");\n+RTE_PMD_REGISTER_PARAM_STRING(NFP_PF_DRIVER_NAME, NFP_PF_FORCE_RELOAD_FW \"=<0|1>\");\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 9c46bfd4f6..628c0d3491 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -94,6 +94,11 @@ struct nfp_process_share {\n \tstruct nfp_flower_service *fl_service;\n };\n \n+struct nfp_devargs {\n+\t/** Force reload firmware */\n+\tbool force_reload_fw;\n+};\n+\n struct nfp_pf_dev {\n \t/** Backpointer to associated pci device */\n \tstruct rte_pci_device *pci_dev;\n@@ -129,6 +134,9 @@ struct nfp_pf_dev {\n \t/** Synchronized info */\n \tstruct nfp_sync *sync;\n \tstruct nfp_process_share process_share;\n+\n+\t/** NFP devarg param */\n+\tstruct nfp_devargs devargs;\n };\n \n #define NFP_NET_FLOW_LIMIT    1024\n",
    "prefixes": [
        "v2",
        "3/3"
    ]
}