get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 129888,
    "url": "http://patchwork.dpdk.org/api/patches/129888/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230803075233.3485076-8-caowenbo@mucse.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20230803075233.3485076-8-caowenbo@mucse.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230803075233.3485076-8-caowenbo@mucse.com",
    "date": "2023-08-03T07:52:32",
    "name": "[v3,7/8] net/rnp add devargs runtime parsing functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "2ec40a3f963fc9f1399604af9e7b5720ad32ac81",
    "submitter": {
        "id": 2142,
        "url": "http://patchwork.dpdk.org/api/people/2142/?format=api",
        "name": "11",
        "email": "caowenbo@mucse.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230803075233.3485076-8-caowenbo@mucse.com/mbox/",
    "series": [
        {
            "id": 29102,
            "url": "http://patchwork.dpdk.org/api/series/29102/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29102",
            "date": "2023-08-03T07:52:25",
            "name": "drivers/net Add Support mucse N10 Pmd Driver",
            "version": 3,
            "mbox": "http://patchwork.dpdk.org/series/29102/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/129888/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/129888/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 17CCB42FC1;\n\tThu,  3 Aug 2023 09:53:45 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D1B9443274;\n\tThu,  3 Aug 2023 09:53:41 +0200 (CEST)",
            "from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206])\n by mails.dpdk.org (Postfix) with ESMTP id E3B8B43274\n for <dev@dpdk.org>; Thu,  3 Aug 2023 09:53:38 +0200 (CEST)",
            "from steven.localdomain ( [183.81.182.182])\n by bizesmtp.qq.com (ESMTP) with\n id ; Thu, 03 Aug 2023 15:53:25 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp70t1691049208tjesvk4y",
        "X-QQ-SSF": "01400000000000D0F000000A0000000",
        "X-QQ-FEAT": "O/PHvn+k0TKo5EH4vU9P8BrYVFvjSV4sTPXU+BAz6b9WcTs8sMQkPQwyWhiVU\n G4Qjzg6yfN8d92d/sXdDMG3+2vpuSlq2CONxOVEJB3g5oOjTbnEHShLZVIIArSevYBJw+ej\n kTeyXRo5h/DK5bFwPgLGNYQysJByTfdHpvr0idHalB8mVS8cjXEvh1E2o1GF5y42905HhGf\n lnudVaPlESc/C23ygfyuxhiFYoIbi4kMFY24iyLRf4lGlTbPlVs/vgIFIiO1EVhOuUrw8Jp\n 0rxa5Cf+5mq5SchPH72g2lAOUN9zQds81NhBRROvSKVsfIlNRnt6jCqq1v7atfefmWxheTw\n Ez1jZnrnBIg1UEAVSXMOq0YygJ2W5qrNX35hVrVXwPvsXC2p+glLjIv3BDAbSI5EuyI09EU\n U7EjAklI6Yg=",
        "X-QQ-GoodBg": "2",
        "X-BIZMAIL-ID": "14960300569443778393",
        "From": "Wenbo Cao <caowenbo@mucse.com>",
        "To": "stephen@networkplumber.org,\n\tWenbo Cao <caowenbo@mucse.com>",
        "Cc": "dev@dpdk.org, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru,\n yaojun@mucse.com",
        "Subject": "[PATCH v3 7/8] net/rnp add devargs runtime parsing functions",
        "Date": "Thu,  3 Aug 2023 07:52:32 +0000",
        "Message-Id": "<20230803075233.3485076-8-caowenbo@mucse.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20230803075233.3485076-1-caowenbo@mucse.com>",
        "References": "<20230803075233.3485076-1-caowenbo@mucse.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "bizesmtp:mucse.com:qybglogicsvrgz:qybglogicsvrgz5a-0",
        "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": "add various runtime devargs command line options\nsupported by this driver.\n\nSigned-off-by: Wenbo Cao <caowenbo@mucse.com>\n---\n drivers/net/rnp/rnp.h        |  22 +++++\n drivers/net/rnp/rnp_ethdev.c | 166 +++++++++++++++++++++++++++++++++++\n drivers/net/rnp/rnp_mbx_fw.c | 164 ++++++++++++++++++++++++++++++++++\n drivers/net/rnp/rnp_mbx_fw.h |  69 +++++++++++++++\n 4 files changed, 421 insertions(+)",
    "diff": "diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h\nindex 6f216cc5ca..933cdc6007 100644\n--- a/drivers/net/rnp/rnp.h\n+++ b/drivers/net/rnp/rnp.h\n@@ -107,6 +107,8 @@ struct rnp_eth_port {\n \tstruct rnp_eth_adapter *adapt;\n \tuint8_t mac_addr[RTE_ETHER_ADDR_LEN];\n \tstruct rnp_hw *hw;\n+\tuint8_t rx_func_sec; /* force set io rx_func */\n+\tuint8_t tx_func_sec; /* force set io tx func */\n \tstruct rte_eth_dev *eth_dev;\n \tstruct rnp_port_attr attr;\n \t/* Recvice Mac Address Record Table */\n@@ -122,6 +124,13 @@ struct rnp_share_ops {\n \tconst struct rnp_mac_api *mac_api;\n } __rte_cache_aligned;\n \n+enum {\n+\tRNP_IO_FUNC_USE_NONE = 0,\n+\tRNP_IO_FUNC_USE_VEC,\n+\tRNP_IO_FUNC_USE_SIMPLE,\n+\tRNP_IO_FUNC_USE_COMMON,\n+};\n+\n struct rnp_eth_adapter {\n \tenum rnp_work_mode mode;\n \tenum rnp_resource_share_m s_mode; /* Port Resource Share Policy */\n@@ -135,6 +144,19 @@ struct rnp_eth_adapter {\n \tint max_link_speed;\n \tuint8_t num_ports; /* Cur Pf Has physical Port Num */\n \tuint8_t lane_mask;\n+\n+\tuint8_t rx_func_sec; /* force set io rx_func */\n+\tuint8_t tx_func_sec; /* force set io tx func*/\n+\t/*fw-update*/\n+\tbool  do_fw_update;\n+\tchar *fw_path;\n+\n+\tbool loopback_en;\n+\tbool fw_sfp_10g_1g_auto_det;\n+\tint fw_force_speed_1g;\n+#define FOCE_SPEED_1G_NOT_SET\t(-1)\n+#define FOCE_SPEED_1G_DISABLED\t(0)\n+#define FOCE_SPEED_1G_ENABLED\t(1)\n } __rte_cache_aligned;\n \n #define RNP_DEV_TO_PORT(eth_dev) \\\ndiff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c\nindex ad99f99d4a..5313dae5a2 100644\n--- a/drivers/net/rnp/rnp_ethdev.c\n+++ b/drivers/net/rnp/rnp_ethdev.c\n@@ -6,6 +6,7 @@\n #include <rte_io.h>\n #include <rte_malloc.h>\n #include <ethdev_driver.h>\n+#include <rte_kvargs.h>\n \n #include \"rnp.h\"\n #include \"rnp_api.h\"\n@@ -14,6 +15,13 @@\n #include \"rnp_rxtx.h\"\n #include \"rnp_logs.h\"\n \n+#define RNP_HW_MAC_LOOPBACK_ARG      \"hw_loopback\"\n+#define RNP_FW_UPDATE                \"fw_update\"\n+#define RNP_RX_FUNC_SELECT           \"rx_func_sec\"\n+#define RNP_TX_FUNC_SELECT           \"tx_func_sec\"\n+#define RNP_FW_4X10G_10G_1G_DET      \"fw_4x10g_10g_1g_auto_det\"\n+#define RNP_FW_FORCE_SPEED_1G        \"fw_force_1g_speed\"\n+\n static int\n rnp_mac_rx_disable(struct rte_eth_dev *dev)\n {\n@@ -108,6 +116,8 @@ rnp_init_port_resource(struct rnp_eth_adapter *adapter,\n \tstruct rnp_hw *hw = &adapter->hw;\n \n \tport->adapt = adapter;\n+\tport->rx_func_sec = adapter->rx_func_sec;\n+\tport->tx_func_sec = adapter->tx_func_sec;\n \tport->s_mode = adapter->s_mode;\n \tport->port_stopped = 1;\n \tport->hw = hw;\n@@ -443,6 +453,154 @@ rnp_special_ops_init(struct rte_eth_dev *eth_dev)\n \treturn 0;\n }\n \n+static const char *const rnp_valid_arguments[] = {\n+\tRNP_HW_MAC_LOOPBACK_ARG,\n+\tRNP_FW_UPDATE,\n+\tRNP_RX_FUNC_SELECT,\n+\tRNP_TX_FUNC_SELECT,\n+\tRNP_FW_4X10G_10G_1G_DET,\n+\tRNP_FW_FORCE_SPEED_1G,\n+\tNULL\n+};\n+\n+static int\n+rnp_parse_handle_devarg(const char *key, const char *value,\n+\t\t\tvoid *extra_args)\n+{\n+\tstruct rnp_eth_adapter *adapter = NULL;\n+\n+\tif (value == NULL || extra_args == NULL)\n+\t\treturn -EINVAL;\n+\n+\tif (strcmp(key, RNP_HW_MAC_LOOPBACK_ARG) == 0) {\n+\t\tuint64_t *n = extra_args;\n+\t\t*n = (uint16_t)strtoul(value, NULL, 10);\n+\t\tif (*n > UINT16_MAX && errno == ERANGE) {\n+\t\t\tRNP_PMD_DRV_LOG(ERR, \"invalid extra param value\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t} else if (strcmp(key, RNP_FW_UPDATE) == 0) {\n+\t\tadapter = (struct rnp_eth_adapter *)extra_args;\n+\t\tadapter->do_fw_update = true;\n+\t\tadapter->fw_path = strdup(value);\n+\t} else if (strcmp(key, RNP_FW_4X10G_10G_1G_DET) == 0) {\n+\t\tadapter = (struct rnp_eth_adapter *)extra_args;\n+\t\tif (adapter->num_ports == 2 && adapter->hw.speed == 10 * 1000) {\n+\t\t\tadapter->fw_sfp_10g_1g_auto_det =\n+\t\t\t\t(strcmp(value, \"on\") == 0) ? true : false;\n+\t\t} else {\n+\t\t\tadapter->fw_sfp_10g_1g_auto_det = false;\n+\t\t}\n+\t} else if (strcmp(key, RNP_FW_FORCE_SPEED_1G) == 0) {\n+\t\tadapter = (struct rnp_eth_adapter *)extra_args;\n+\t\tif (adapter->num_ports == 2) {\n+\t\t\tif (strcmp(value, \"on\") == 0)\n+\t\t\t\tadapter->fw_force_speed_1g = FOCE_SPEED_1G_ENABLED;\n+\t\t\telse if (strcmp(value, \"off\") == 0)\n+\t\t\t\tadapter->fw_force_speed_1g = FOCE_SPEED_1G_DISABLED;\n+\t\t}\n+\t} else {\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+rnp_parse_io_select_func(const char *key, const char *value, void *extra_args)\n+{\n+\tuint8_t select = RNP_IO_FUNC_USE_NONE;\n+\n+\tRTE_SET_USED(key);\n+\n+\tif (strcmp(value, \"vec\") == 0)\n+\t\tselect = RNP_IO_FUNC_USE_VEC;\n+\telse if (strcmp(value, \"simple\") == 0)\n+\t\tselect = RNP_IO_FUNC_USE_SIMPLE;\n+\telse if (strcmp(value, \"common\") == 0)\n+\t\tselect = RNP_IO_FUNC_USE_COMMON;\n+\n+\t*(uint8_t *)extra_args = select;\n+\n+\treturn 0;\n+}\n+\n+static int\n+rnp_parse_devargs(struct rnp_eth_adapter *adapter,\n+\t\t  struct rte_devargs *devargs)\n+{\n+\tuint8_t rx_io_func = RNP_IO_FUNC_USE_NONE;\n+\tuint8_t tx_io_func = RNP_IO_FUNC_USE_NONE;\n+\tstruct rte_kvargs *kvlist;\n+\tbool loopback_en = false;\n+\tint ret = 0;\n+\n+\tadapter->do_fw_update = false;\n+\tadapter->fw_sfp_10g_1g_auto_det = false;\n+\tadapter->fw_force_speed_1g = FOCE_SPEED_1G_NOT_SET;\n+\n+\tif (!devargs)\n+\t\tgoto def;\n+\n+\tkvlist = rte_kvargs_parse(devargs->args, rnp_valid_arguments);\n+\tif (kvlist == NULL)\n+\t\tgoto def;\n+\n+\tif (rte_kvargs_count(kvlist, RNP_HW_MAC_LOOPBACK_ARG) == 1)\n+\t\tret = rte_kvargs_process(kvlist, RNP_HW_MAC_LOOPBACK_ARG,\n+\t\t\t\t&rnp_parse_handle_devarg, &loopback_en);\n+\n+\tif (rte_kvargs_count(kvlist, RNP_FW_4X10G_10G_1G_DET) == 1)\n+\t\tret = rte_kvargs_process(kvlist,\n+\t\t\t\tRNP_FW_4X10G_10G_1G_DET,\n+\t\t\t\t&rnp_parse_handle_devarg,\n+\t\t\t\tadapter);\n+\n+\tif (rte_kvargs_count(kvlist, RNP_FW_FORCE_SPEED_1G) == 1)\n+\t\tret = rte_kvargs_process(kvlist,\n+\t\t\t\tRNP_FW_FORCE_SPEED_1G,\n+\t\t\t\t&rnp_parse_handle_devarg,\n+\t\t\t\tadapter);\n+\n+\tif (rte_kvargs_count(kvlist, RNP_FW_UPDATE) == 1)\n+\t\tret = rte_kvargs_process(kvlist, RNP_FW_UPDATE,\n+\t\t\t\t&rnp_parse_handle_devarg, adapter);\n+\tif (rte_kvargs_count(kvlist, RNP_RX_FUNC_SELECT) == 1)\n+\t\tret = rte_kvargs_process(kvlist, RNP_RX_FUNC_SELECT,\n+\t\t\t\t&rnp_parse_io_select_func, &rx_io_func);\n+\tif (rte_kvargs_count(kvlist, RNP_TX_FUNC_SELECT) == 1)\n+\t\tret = rte_kvargs_process(kvlist, RNP_TX_FUNC_SELECT,\n+\t\t\t\t&rnp_parse_io_select_func, &tx_io_func);\n+\trte_kvargs_free(kvlist);\n+def:\n+\tadapter->loopback_en = loopback_en;\n+\tadapter->rx_func_sec = rx_io_func;\n+\tadapter->tx_func_sec = tx_io_func;\n+\n+\treturn ret;\n+}\n+\n+static int rnp_post_handle(struct rnp_eth_adapter *adapter)\n+{\n+\tbool on = false;\n+\n+\tif (!adapter->eth_dev)\n+\t\treturn -ENOMEM;\n+\tif (adapter->do_fw_update && adapter->fw_path) {\n+\t\trnp_fw_update(adapter);\n+\t\tadapter->do_fw_update = 0;\n+\t}\n+\n+\tif (adapter->fw_sfp_10g_1g_auto_det)\n+\t\treturn rnp_hw_set_fw_10g_1g_auto_detch(adapter->eth_dev, 1);\n+\n+\ton = (adapter->fw_force_speed_1g == FOCE_SPEED_1G_ENABLED) ? 1 : 0;\n+\tif (adapter->fw_force_speed_1g != FOCE_SPEED_1G_NOT_SET)\n+\t\treturn rnp_hw_set_fw_force_speed_1g(adapter->eth_dev, on);\n+\n+\treturn 0;\n+}\n+\n static int\n rnp_eth_dev_init(struct rte_eth_dev *dev)\n {\n@@ -492,6 +650,11 @@ rnp_eth_dev_init(struct rte_eth_dev *dev)\n \t/* We need Use Device Id To Change The Resource Mode */\n \trnp_special_ops_init(dev);\n \tport->hw = hw;\n+\tret = rnp_parse_devargs(adapter, pci_dev->device.devargs);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(ERR, \"parse_devargs failed\");\n+\t\treturn ret;\n+\t}\n \tfor (p_id = 0; p_id < adapter->num_ports; p_id++) {\n \t\t/* port 0 resource has been alloced When Probe */\n \t\tif (!p_id) {\n@@ -517,6 +680,9 @@ rnp_eth_dev_init(struct rte_eth_dev *dev)\n \t\trnp_mac_rx_disable(eth_dev);\n \t\trnp_mac_tx_disable(eth_dev);\n \t}\n+\tret = rnp_post_handle(adapter);\n+\tif (ret)\n+\t\tgoto eth_alloc_error;\n \n \treturn 0;\n eth_alloc_error:\ndiff --git a/drivers/net/rnp/rnp_mbx_fw.c b/drivers/net/rnp/rnp_mbx_fw.c\nindex aea4f1d619..d98dd2dcd2 100644\n--- a/drivers/net/rnp/rnp_mbx_fw.c\n+++ b/drivers/net/rnp/rnp_mbx_fw.c\n@@ -106,6 +106,27 @@ static int rnp_mbx_fw_post_req(struct rte_eth_dev *dev,\n \treturn err;\n }\n \n+static int\n+rnp_mbx_write_posted_locked(struct rte_eth_dev *dev, struct mbx_fw_cmd_req *req)\n+{\n+\tconst struct rnp_mbx_api *ops = RNP_DEV_TO_MBX_OPS(dev);\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tint err = 0;\n+\n+\trte_spinlock_lock(&hw->fw_lock);\n+\n+\terr = ops->write_posted(dev, (u32 *)req,\n+\t\t\t(req->datalen + MBX_REQ_HDR_LEN) / 4, MBX_FW);\n+\tif (err) {\n+\t\tRNP_PMD_LOG(ERR, \"%s failed!\\n\", __func__);\n+\t\tgoto quit;\n+\t}\n+\n+quit:\n+\trte_spinlock_unlock(&hw->fw_lock);\n+\treturn err;\n+}\n+\n static int rnp_fw_get_capablity(struct rte_eth_dev *dev,\n \t\t\t\tstruct phy_abilities *abil)\n {\n@@ -382,3 +403,146 @@ int rnp_mbx_get_lane_stat(struct rte_eth_dev *dev)\n quit:\n \treturn err;\n }\n+\n+static int rnp_maintain_req(struct rte_eth_dev *dev,\n+\t\tint cmd,\n+\t\tint arg0,\n+\t\tint req_data_bytes,\n+\t\tint reply_bytes,\n+\t\tphys_addr_t dma_phy_addr)\n+{\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct mbx_req_cookie *cookie = NULL;\n+\tstruct mbx_fw_cmd_req req;\n+\tint err;\n+\n+\tif (!hw->mbx.irq_enabled)\n+\t\treturn -EIO;\n+\tcookie = rnp_memzone_reserve(hw->cookie_p_name, 0);\n+\tif (!cookie)\n+\t\treturn -ENOMEM;\n+\tmemset(&req, 0, sizeof(req));\n+\tcookie->timeout_ms = 60 * 1000; /* 60s */\n+\n+\tbuild_maintain_req(&req,\n+\t\t\tcookie,\n+\t\t\tcmd,\n+\t\t\targ0,\n+\t\t\treq_data_bytes,\n+\t\t\treply_bytes,\n+\t\t\tdma_phy_addr & 0xffffffff,\n+\t\t\t(dma_phy_addr >> 32) & 0xffffffff);\n+\n+\terr = rnp_mbx_fw_post_req(dev, &req, cookie);\n+\n+\treturn (err) ? -EIO : 0;\n+}\n+\n+int rnp_fw_update(struct rnp_eth_adapter *adapter)\n+{\n+\tconst struct rte_memzone *rz = NULL;\n+\tstruct maintain_req *mt;\n+\tFILE *file;\n+\tint fsz;\n+#define MAX_FW_BIN_SZ (552 * 1024)\n+#define FW_256KB          (256 * 1024)\n+\n+\tRNP_PMD_LOG(INFO, \"%s: %s\\n\", __func__, adapter->fw_path);\n+\n+\tfile = fopen(adapter->fw_path, \"rb\");\n+\tif (!file) {\n+\t\tRNP_PMD_LOG(ERR,\n+\t\t\t\t\"RNP: [%s] %s can't open for read\\n\",\n+\t\t\t\t__func__,\n+\t\t\t\tadapter->fw_path);\n+\t\treturn -ENOENT;\n+\t}\n+\t/* get dma */\n+\trz = rte_memzone_reserve(\"fw_update\", MAX_FW_BIN_SZ, SOCKET_ID_ANY, 4);\n+\tif (rz == NULL) {\n+\t\tRNP_PMD_LOG(ERR, \"RNP: [%s] not memory:%d\\n\", __func__,\n+\t\t\t\tMAX_FW_BIN_SZ);\n+\t\treturn -EFBIG;\n+\t}\n+\tmemset(rz->addr, 0xff, rz->len);\n+\tmt = (struct maintain_req *)rz->addr;\n+\n+\t/* read data */\n+\tfsz = fread(mt->data, 1, rz->len, file);\n+\tif (fsz <= 0) {\n+\t\tRNP_PMD_LOG(INFO, \"RNP: [%s] read failed! err:%d\\n\",\n+\t\t\t\t__func__, fsz);\n+\t\treturn -EIO;\n+\t}\n+\tfclose(file);\n+\n+\tif (fsz > ((256 + 4) * 1024)) {\n+\t\tprintf(\"fw length:%d is two big. not supported!\\n\", fsz);\n+\t\treturn -EINVAL;\n+\t}\n+\tRNP_PMD_LOG(NOTICE, \"RNP: fw update ...\\n\");\n+\tfflush(stdout);\n+\n+\t/* ==== update fw */\n+\tmt->magic       = MAINTAIN_MAGIC;\n+\tmt->cmd         = MT_WRITE_FLASH;\n+\tmt->arg0        = 1;\n+\tmt->req_data_bytes = (fsz > FW_256KB) ? FW_256KB : fsz;\n+\tmt->reply_bytes = 0;\n+\n+\tif (rnp_maintain_req(adapter->eth_dev, mt->cmd, mt->arg0,\n+\t\t\t\tmt->req_data_bytes, mt->reply_bytes, rz->iova))\n+\t\tRNP_PMD_LOG(ERR, \"maintain request failed!\\n\");\n+\telse\n+\t\tRNP_PMD_LOG(INFO, \"maintail request done!\\n\");\n+\n+\t/* ==== update cfg */\n+\tif (fsz > FW_256KB) {\n+\t\tmt->magic       = MAINTAIN_MAGIC;\n+\t\tmt->cmd         = MT_WRITE_FLASH;\n+\t\tmt->arg0        = 2;\n+\t\tmt->req_data_bytes = 4096;\n+\t\tmt->reply_bytes    = 0;\n+\t\tmemcpy(mt->data, mt->data + FW_256KB, mt->req_data_bytes);\n+\n+\t\tif (rnp_maintain_req(adapter->eth_dev,\n+\t\t\t\t\tmt->cmd, mt->arg0, mt->req_data_bytes,\n+\t\t\t\t\tmt->reply_bytes, rz->iova))\n+\t\t\tRNP_PMD_LOG(ERR, \"maintain request failed!\\n\");\n+\t\telse\n+\t\t\tRNP_PMD_LOG(INFO, \"maintail request done!\\n\");\n+\t}\n+\n+\tRNP_PMD_LOG(NOTICE, \"done\\n\");\n+\tfflush(stdout);\n+\n+\trte_memzone_free(rz);\n+\n+\texit(0);\n+\n+\treturn 0;\n+}\n+\n+static int rnp_mbx_set_dump(struct rte_eth_dev *dev, int flag)\n+{\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\tstruct mbx_fw_cmd_req req;\n+\tint err;\n+\n+\tmemset(&req, 0, sizeof(req));\n+\tbuild_set_dump(&req, port->attr.nr_lane, flag);\n+\n+\terr = rnp_mbx_write_posted_locked(dev, &req);\n+\n+\treturn err;\n+}\n+\n+int rnp_hw_set_fw_10g_1g_auto_detch(struct rte_eth_dev *dev, int enable)\n+{\n+\treturn rnp_mbx_set_dump(dev, 0x01140000 | (enable & 1));\n+}\n+\n+int rnp_hw_set_fw_force_speed_1g(struct rte_eth_dev *dev, int enable)\n+{\n+\treturn rnp_mbx_set_dump(dev, 0x01150000 | (enable & 1));\n+}\ndiff --git a/drivers/net/rnp/rnp_mbx_fw.h b/drivers/net/rnp/rnp_mbx_fw.h\nindex 7bf5c2a865..051ffd1bdc 100644\n--- a/drivers/net/rnp/rnp_mbx_fw.h\n+++ b/drivers/net/rnp/rnp_mbx_fw.h\n@@ -16,6 +16,17 @@ struct mbx_req_cookie {\n \tint priv_len;\n \tchar priv[RNP_MAX_SHARE_MEM];\n };\n+struct maintain_req {\n+\tint magic;\n+#define MAINTAIN_MAGIC 0xa6a7a8a9\n+\n+\tint      cmd;\n+\tint      arg0;\n+\tint      req_data_bytes;\n+\tint      reply_bytes;\n+\tchar data[0];\n+} __rte_packed;\n+\n enum GENERIC_CMD {\n \t/* link configuration admin commands */\n \tGET_PHY_ABALITY = 0x0601,\n@@ -23,6 +34,9 @@ enum GENERIC_CMD {\n \tRESET_PHY = 0x0603,\n \tGET_LANE_STATUS = 0x0610,\n \tSET_EVENT_MASK = 0x0613,\n+\t /* fw update */\n+\tFW_MAINTAIN = 0x0701,\n+\tSET_DUMP = 0x0a10,\n };\n \n enum link_event_mask {\n@@ -211,6 +225,21 @@ struct mbx_fw_cmd_req {\n \t\tstruct {\n \t\t\tint nr_lane;\n \t\t} get_lane_st;\n+\n+\t\tstruct {\n+\t\t\tint cmd;\n+#define MT_WRITE_FLASH 1\n+\t\t\tint arg0;\n+\t\t\tint req_bytes;\n+\t\t\tint reply_bytes;\n+\t\t\tint ddr_lo;\n+\t\t\tint ddr_hi;\n+\t\t} maintain;\n+\n+\t\tstruct {\n+\t\t\tint flag;\n+\t\t\tint nr_lane;\n+\t\t} set_dump;\n \t};\n } __rte_packed __rte_aligned(4);\n \n@@ -284,6 +313,43 @@ build_get_lane_status_req(struct mbx_fw_cmd_req *req,\n \treq->get_lane_st.nr_lane = nr_lane;\n }\n \n+static inline void\n+build_maintain_req(struct mbx_fw_cmd_req *req,\n+\t\t   void *cookie,\n+\t\t   int cmd,\n+\t\t   int arg0,\n+\t\t   int req_bytes,\n+\t\t   int reply_bytes,\n+\t\t   u32 dma_phy_lo,\n+\t\t   u32 dma_phy_hi)\n+{\n+\treq->flags = 0;\n+\treq->opcode = FW_MAINTAIN;\n+\treq->datalen = sizeof(req->maintain);\n+\treq->cookie = cookie;\n+\treq->reply_lo = 0;\n+\treq->reply_hi = 0;\n+\treq->maintain.cmd = cmd;\n+\treq->maintain.arg0 = arg0;\n+\treq->maintain.req_bytes = req_bytes;\n+\treq->maintain.reply_bytes = reply_bytes;\n+\treq->maintain.ddr_lo = dma_phy_lo;\n+\treq->maintain.ddr_hi = dma_phy_hi;\n+}\n+\n+static inline void\n+build_set_dump(struct mbx_fw_cmd_req *req, int nr_lane, int flag)\n+{\n+\treq->flags = 0;\n+\treq->opcode = SET_DUMP;\n+\treq->datalen = sizeof(req->set_dump);\n+\treq->cookie = NULL;\n+\treq->reply_lo = 0;\n+\treq->reply_hi = 0;\n+\treq->set_dump.flag = flag;\n+\treq->set_dump.nr_lane = nr_lane;\n+}\n+\n int rnp_mbx_get_capability(struct rte_eth_dev *dev,\n \t\t\t   int *lane_mask,\n \t\t\t   int *nic_mode);\n@@ -295,4 +361,7 @@ rnp_fw_get_macaddr(struct rte_eth_dev *dev,\n \t\t   u8 *mac_addr,\n \t\t   int nr_lane);\n int rnp_mbx_get_lane_stat(struct rte_eth_dev *dev);\n+int rnp_fw_update(struct rnp_eth_adapter *adapter);\n+int rnp_hw_set_fw_10g_1g_auto_detch(struct rte_eth_dev *dev, int enable);\n+int rnp_hw_set_fw_force_speed_1g(struct rte_eth_dev *dev, int enable);\n #endif /* __RNP_MBX_FW_H__*/\n",
    "prefixes": [
        "v3",
        "7/8"
    ]
}