get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 53561,
    "url": "http://patches.dpdk.org/api/patches/53561/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1558426753-187020-1-git-send-email-xuanziyang2@huawei.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": "<1558426753-187020-1-git-send-email-xuanziyang2@huawei.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1558426753-187020-1-git-send-email-xuanziyang2@huawei.com",
    "date": "2019-05-21T08:19:13",
    "name": "[03/11] net/hinic/base: add mgmt module interactive code",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "43715452297c1666d965304427be63bf697a3617",
    "submitter": {
        "id": 1321,
        "url": "http://patches.dpdk.org/api/people/1321/?format=api",
        "name": "Ziyang Xuan",
        "email": "xuanziyang2@huawei.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/1558426753-187020-1-git-send-email-xuanziyang2@huawei.com/mbox/",
    "series": [
        {
            "id": 4727,
            "url": "http://patches.dpdk.org/api/series/4727/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4727",
            "date": "2019-05-21T08:13:07",
            "name": "A new net PMD - hinic",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/4727/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/53561/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/53561/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 D31C14CA6;\n\tTue, 21 May 2019 10:08:40 +0200 (CEST)",
            "from huawei.com (szxga04-in.huawei.com [45.249.212.190])\n\tby dpdk.org (Postfix) with ESMTP id 558A2569B\n\tfor <dev@dpdk.org>; Tue, 21 May 2019 10:08:38 +0200 (CEST)",
            "from DGGEMS407-HUB.china.huawei.com (unknown [172.30.72.60])\n\tby Forcepoint Email with ESMTP id B38A1237DEBB59AADAD3\n\tfor <dev@dpdk.org>; Tue, 21 May 2019 16:08:36 +0800 (CST)",
            "from tester_149.localdomain (10.175.119.39) by\n\tDGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP\n\tServer id 14.3.439.0; Tue, 21 May 2019 16:08:26 +0800"
        ],
        "From": "Ziyang Xuan <xuanziyang2@huawei.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<ferruh.yigit@intel.com>, <cloud.wangxiaoyun@huawei.com>,\n\t<zhouguoyang@huawei.com>, <rami.rosen@huawei.com>, Ziyang Xuan\n\t<xuanziyang2@huawei.com>",
        "Date": "Tue, 21 May 2019 16:19:13 +0800",
        "Message-ID": "<1558426753-187020-1-git-send-email-xuanziyang2@huawei.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.175.119.39]",
        "X-CFilter-Loop": "Reflected",
        "Subject": "[dpdk-dev] [PATCH 03/11] net/hinic/base: add mgmt module\n\tinteractive code",
        "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": "Add the structures, functionalities for interaction with\nmgmt module.\n\nSigned-off-by: Ziyang Xuan <xuanziyang2@huawei.com>\n---\n drivers/net/hinic/base/hinic_pmd_hw_mgmt.h        |  85 +++\n drivers/net/hinic/base/hinic_pmd_mgmt.c           | 619 ++++++++++++++++++++++\n drivers/net/hinic/base/hinic_pmd_mgmt.h           | 125 +++++\n drivers/net/hinic/base/hinic_pmd_mgmt_interface.h | 503 ++++++++++++++++++\n 4 files changed, 1332 insertions(+)\n create mode 100644 drivers/net/hinic/base/hinic_pmd_hw_mgmt.h\n create mode 100644 drivers/net/hinic/base/hinic_pmd_mgmt.c\n create mode 100644 drivers/net/hinic/base/hinic_pmd_mgmt.h\n create mode 100644 drivers/net/hinic/base/hinic_pmd_mgmt_interface.h",
    "diff": "diff --git a/drivers/net/hinic/base/hinic_pmd_hw_mgmt.h b/drivers/net/hinic/base/hinic_pmd_hw_mgmt.h\nnew file mode 100644\nindex 0000000..5f3b12b\n--- /dev/null\n+++ b/drivers/net/hinic/base/hinic_pmd_hw_mgmt.h\n@@ -0,0 +1,85 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2017 Huawei Technologies Co., Ltd\n+ */\n+\n+#ifndef _HINIC_PMD_HW_MGMT_H_\n+#define _HINIC_PMD_HW_MGMT_H_\n+\n+/* show each drivers only such as nic_service_cap,\n+ * toe_service_cap structure, but not show service_cap\n+ */\n+enum hinic_service_type {\n+\tSERVICE_T_NIC = 0,\n+\tSERVICE_T_MAX = 7,\n+\n+\t/* Only used for interruption resource management,\n+\t * mark the request module\n+\t */\n+\tSERVICE_T_INTF   = (1 << 15),\n+\tSERVICE_T_CQM    = (1 << 16),\n+};\n+\n+enum intr_type {\n+\tINTR_TYPE_MSIX,\n+\tINTR_TYPE_MSI,\n+\tINTR_TYPE_INT,\n+\t/* PXE,OVS need single thread processing, synchronization\n+\t * messages must use poll wait mechanism interface\n+\t */\n+\tINTR_TYPE_NONE,\n+};\n+\n+struct nic_service_cap {\n+\t/* PF resources */\n+\tu16 max_sqs;\n+\tu16 max_rqs;\n+\n+\t/* VF resources, VF obtain them through the MailBox mechanism from\n+\t * corresponding PF\n+\t */\n+\tu16 vf_max_sqs;\n+\tu16 vf_max_rqs;\n+\n+\tbool lro_en;    /* LRO feature enable bit */\n+\tu8 lro_sz;      /* LRO context space: n*16B */\n+\tu8 tso_sz;      /* TSO context space: n*16B */\n+};\n+\n+/* Defines the IRQ information structure*/\n+struct irq_info {\n+\tu16 msix_entry_idx; /* IRQ corresponding index number */\n+\tu32 irq_id;         /* the IRQ number from OS */\n+};\n+\n+/* Define the version information structure*/\n+struct dev_version_info {\n+\tu8 up_ver;       /* uP version, directly read from uP\n+\t\t\t  * is not configured to file\n+\t\t\t  */\n+\tu8 ucode_ver;    /* The microcode version,\n+\t\t\t  * read through the CMDq from microcode\n+\t\t\t  */\n+\tu8 cfg_file_ver; /* uP configuration file version */\n+\tu8 sdk_ver;      /* SDK driver version */\n+\tu8 hw_ver;       /* Hardware version */\n+};\n+\n+/* Obtain service_cap.nic_cap.dev_nic_cap.max_sqs */\n+u16 hinic_func_max_qnum(void *hwdev);\n+\n+u16 hinic_global_func_id(void *hwdev);\t/* func_attr.glb_func_idx */\n+\n+enum func_type {\n+\tTYPE_PF,\n+\tTYPE_VF,\n+\tTYPE_PPF,\n+};\n+\n+enum hinic_msix_state {\n+\tHINIC_MSIX_ENABLE,\n+\tHINIC_MSIX_DISABLE,\n+};\n+\n+enum func_type hinic_func_type(void *hwdev);\n+\n+#endif /* _HINIC_PMD_HW_MGMT_H_ */\ndiff --git a/drivers/net/hinic/base/hinic_pmd_mgmt.c b/drivers/net/hinic/base/hinic_pmd_mgmt.c\nnew file mode 100644\nindex 0000000..a28a27a\n--- /dev/null\n+++ b/drivers/net/hinic/base/hinic_pmd_mgmt.c\n@@ -0,0 +1,619 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2017 Huawei Technologies Co., Ltd\n+ */\n+\n+#include \"hinic_pmd_dpdev.h\"\n+\n+static void hinic_mgmt_recv_msg_handler(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t\t\tstruct hinic_recv_msg *recv_msg,\n+\t\t\t\t\tvoid *param);\n+\n+#define BUF_OUT_DEFAULT_SIZE\t\t1\n+\n+#define MAX_PF_MGMT_BUF_SIZE\t\t2048UL\n+\n+#define MGMT_MSG_SIZE_MIN\t\t20\n+#define MGMT_MSG_SIZE_STEP\t\t16\n+#define\tMGMT_MSG_RSVD_FOR_DEV\t\t8\n+\n+#define MGMT_MSG_TIMEOUT\t\t5000\t/* millisecond */\n+\n+#define SYNC_MSG_ID_MASK\t\t0x1FF\n+#define ASYNC_MSG_ID_MASK\t\t0x1FF\n+#define ASYNC_MSG_FLAG\t\t\t0x200\n+\n+#define MSG_NO_RESP\t\t\t0xFFFF\n+\n+#define MAX_MSG_SZ\t\t\t2016\n+\n+#define MSG_SZ_IS_VALID(in_size)\t((in_size) <= MAX_MSG_SZ)\n+\n+#define SYNC_MSG_ID(pf_to_mgmt)\t\t((pf_to_mgmt)->sync_msg_id)\n+\n+#define SYNC_MSG_ID_INC(pf_to_mgmt)\t(SYNC_MSG_ID(pf_to_mgmt) = \\\n+\t\t\t(SYNC_MSG_ID(pf_to_mgmt) + 1) & SYNC_MSG_ID_MASK)\n+\n+#define ASYNC_MSG_ID(pf_to_mgmt)\t((pf_to_mgmt)->async_msg_id)\n+\n+#define ASYNC_MSG_ID_INC(pf_to_mgmt)\t(ASYNC_MSG_ID(pf_to_mgmt) = \\\n+\t\t\t((ASYNC_MSG_ID(pf_to_mgmt) + 1) & ASYNC_MSG_ID_MASK) \\\n+\t\t\t| ASYNC_MSG_FLAG)\n+\n+#define HINIC_SEQ_ID_MAX_VAL\t\t42\n+#define HINIC_MSG_SEG_LEN\t\t48\n+\n+/**\n+ * mgmt_msg_len - calculate the total message length\n+ * @msg_data_len: the length of the message data\n+ * Return: the total message length\n+ **/\n+static u16 mgmt_msg_len(u16 msg_data_len)\n+{\n+\t/* u64 - the size of the header */\n+\tu16 msg_size = (u16)(MGMT_MSG_RSVD_FOR_DEV + sizeof(u64) +\n+\t\t\t     msg_data_len);\n+\n+\tif (msg_size > MGMT_MSG_SIZE_MIN)\n+\t\tmsg_size = MGMT_MSG_SIZE_MIN +\n+\t\t\tALIGN((msg_size - MGMT_MSG_SIZE_MIN),\n+\t\t\t      MGMT_MSG_SIZE_STEP);\n+\telse\n+\t\tmsg_size = MGMT_MSG_SIZE_MIN;\n+\n+\treturn msg_size;\n+}\n+\n+/**\n+ * prepare_header - prepare the header of the message\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * @header: pointer of the header to prepare\n+ * @msg_len: the length of the message\n+ * @mod: module in the chip that will get the message\n+ * @ack_type: the type to response\n+ * @direction: the direction of the original message\n+ * @cmd: the command to do\n+ * @msg_id: message id\n+ **/\n+static void prepare_header(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t   u64 *header, int msg_len, enum hinic_mod_type mod,\n+\t\t\t   enum hinic_msg_ack_type ack_type,\n+\t\t\t   enum hinic_msg_direction_type direction,\n+\t\t\t   u8 cmd, u32 msg_id)\n+{\n+\tstruct hinic_hwif *hwif = pf_to_mgmt->hwdev->hwif;\n+\n+\t*header = HINIC_MSG_HEADER_SET(msg_len, MSG_LEN) |\n+\t\tHINIC_MSG_HEADER_SET(mod, MODULE) |\n+\t\tHINIC_MSG_HEADER_SET(msg_len, SEG_LEN) |\n+\t\tHINIC_MSG_HEADER_SET(ack_type, NO_ACK) |\n+\t\tHINIC_MSG_HEADER_SET(0, ASYNC_MGMT_TO_PF) |\n+\t\tHINIC_MSG_HEADER_SET(0, SEQID) |\n+\t\tHINIC_MSG_HEADER_SET(LAST_SEGMENT, LAST) |\n+\t\tHINIC_MSG_HEADER_SET(direction, DIRECTION) |\n+\t\tHINIC_MSG_HEADER_SET(cmd, CMD) |\n+\t\tHINIC_MSG_HEADER_SET(HINIC_PCI_INTF_IDX(hwif), PCI_INTF_IDX) |\n+\t\tHINIC_MSG_HEADER_SET(hwif->attr.port_to_port_idx, P2P_IDX) |\n+\t\tHINIC_MSG_HEADER_SET(msg_id, MSG_ID);\n+}\n+\n+/**\n+ * prepare_mgmt_cmd - prepare the mgmt command\n+ * @mgmt_cmd: pointer to the command to prepare\n+ * @header: pointer of the header to prepare\n+ * @msg: the data of the message\n+ * @msg_len: the length of the message\n+ **/\n+static void prepare_mgmt_cmd(u8 *mgmt_cmd, u64 *header, void *msg,\n+\t\t\t     int msg_len)\n+{\n+\tu32 cmd_buf_max = MAX_PF_MGMT_BUF_SIZE;\n+\n+\tmemset(mgmt_cmd, 0, MGMT_MSG_RSVD_FOR_DEV);\n+\n+\tmgmt_cmd += MGMT_MSG_RSVD_FOR_DEV;\n+\tcmd_buf_max -= MGMT_MSG_RSVD_FOR_DEV;\n+\tmemcpy(mgmt_cmd, header, sizeof(*header));\n+\n+\tmgmt_cmd += sizeof(*header);\n+\tcmd_buf_max -= sizeof(*header);\n+\tmemcpy(mgmt_cmd, msg, msg_len);\n+}\n+\n+/**\n+ * alloc_recv_msg - allocate received message memory\n+ * @recv_msg: pointer that will hold the allocated data\n+ * Return: 0 - success, negative - failure\n+ **/\n+static int alloc_recv_msg(struct hinic_recv_msg *recv_msg)\n+{\n+\tint err;\n+\n+\trecv_msg->msg = kzalloc(MAX_PF_MGMT_BUF_SIZE, GFP_KERNEL);\n+\tif (!recv_msg->msg) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate recv msg buf failed\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\trecv_msg->buf_out = kzalloc(MAX_PF_MGMT_BUF_SIZE, GFP_KERNEL);\n+\tif (!recv_msg->buf_out) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate recv msg output buf failed\");\n+\t\terr = -ENOMEM;\n+\t\tgoto alloc_buf_out_err;\n+\t}\n+\n+\treturn 0;\n+\n+alloc_buf_out_err:\n+\tkfree(recv_msg->msg);\n+\treturn err;\n+}\n+\n+/**\n+ * free_recv_msg - free received message memory\n+ * @recv_msg: pointer that holds the allocated data\n+ **/\n+static void free_recv_msg(struct hinic_recv_msg *recv_msg)\n+{\n+\tkfree(recv_msg->buf_out);\n+\tkfree(recv_msg->msg);\n+}\n+\n+/**\n+ * alloc_msg_buf - allocate all the message buffers of PF to MGMT channel\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * Return: 0 - success, negative - failure\n+ **/\n+static int alloc_msg_buf(struct hinic_msg_pf_to_mgmt *pf_to_mgmt)\n+{\n+\tint err;\n+\n+\terr = alloc_recv_msg(&pf_to_mgmt->recv_msg_from_mgmt);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate recv msg failed\");\n+\t\treturn err;\n+\t}\n+\n+\terr = alloc_recv_msg(&pf_to_mgmt->recv_resp_msg_from_mgmt);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate resp recv msg failed\");\n+\t\tgoto alloc_msg_for_resp_err;\n+\t}\n+\n+\tpf_to_mgmt->async_msg_buf = kzalloc(MAX_PF_MGMT_BUF_SIZE, GFP_KERNEL);\n+\tif (!pf_to_mgmt->async_msg_buf)\t{\n+\t\tPMD_DRV_LOG(ERR, \"Allocate async msg buf failed\");\n+\t\terr = -ENOMEM;\n+\t\tgoto async_msg_buf_err;\n+\t}\n+\n+\tpf_to_mgmt->sync_msg_buf = kzalloc(MAX_PF_MGMT_BUF_SIZE, GFP_KERNEL);\n+\tif (!pf_to_mgmt->sync_msg_buf)\t{\n+\t\tPMD_DRV_LOG(ERR, \"Allocate sync msg buf failed\");\n+\t\terr = -ENOMEM;\n+\t\tgoto sync_msg_buf_err;\n+\t}\n+\n+\treturn 0;\n+\n+sync_msg_buf_err:\n+\tkfree(pf_to_mgmt->async_msg_buf);\n+\n+async_msg_buf_err:\n+\tfree_recv_msg(&pf_to_mgmt->recv_resp_msg_from_mgmt);\n+\n+alloc_msg_for_resp_err:\n+\tfree_recv_msg(&pf_to_mgmt->recv_msg_from_mgmt);\n+\n+\treturn err;\n+}\n+\n+/**\n+ * free_msg_buf - free all the message buffers of PF to MGMT channel\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * Return: 0 - success, negative - failure\n+ **/\n+static void free_msg_buf(struct hinic_msg_pf_to_mgmt *pf_to_mgmt)\n+{\n+\tkfree(pf_to_mgmt->sync_msg_buf);\n+\tkfree(pf_to_mgmt->async_msg_buf);\n+\n+\tfree_recv_msg(&pf_to_mgmt->recv_resp_msg_from_mgmt);\n+\tfree_recv_msg(&pf_to_mgmt->recv_msg_from_mgmt);\n+}\n+\n+/**\n+ * send_msg_to_mgmt_async - send async message\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * @mod: module in the chip that will get the message\n+ * @cmd: command of the message\n+ * @msg: the data of the message\n+ * @msg_len: the length of the message\n+ * @direction: the direction of the original message\n+ * @resp_msg_id: message id of response\n+ * Return: 0 - success, negative - failure\n+ **/\n+static int send_msg_to_mgmt_async(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t\t  enum hinic_mod_type mod, u8 cmd,\n+\t\t\t\t  void *msg, u16 msg_len,\n+\t\t\t\t  enum hinic_msg_direction_type direction,\n+\t\t\t\t  u16 resp_msg_id)\n+{\n+\tvoid *mgmt_cmd = pf_to_mgmt->async_msg_buf;\n+\tstruct hinic_api_cmd_chain *chain;\n+\tu64 header;\n+\tu16 cmd_size = mgmt_msg_len(msg_len);\n+\n+\tif (direction == HINIC_MSG_RESPONSE)\n+\t\tprepare_header(pf_to_mgmt, &header, msg_len, mod, HINIC_MSG_ACK,\n+\t\t\t       direction, cmd, resp_msg_id);\n+\telse\n+\t\tprepare_header(pf_to_mgmt, &header, msg_len, mod, HINIC_MSG_ACK,\n+\t\t\t       direction, cmd, ASYNC_MSG_ID(pf_to_mgmt));\n+\n+\tprepare_mgmt_cmd((u8 *)mgmt_cmd, &header, msg, msg_len);\n+\n+\tchain = pf_to_mgmt->cmd_chain[HINIC_API_CMD_WRITE_ASYNC_TO_MGMT_CPU];\n+\n+\treturn hinic_api_cmd_write(chain, HINIC_NODE_ID_MGMT_HOST, mgmt_cmd,\n+\t\t\t\t   cmd_size);\n+}\n+\n+/**\n+ * send_msg_to_mgmt_sync - send async message\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * @mod: module in the chip that will get the message\n+ * @cmd: command of the message\n+ * @msg: the msg data\n+ * @msg_len: the msg data length\n+ * @ack_type: indicate mgmt command whether need ack or not\n+ * @direction: the direction of the original message\n+ * @resp_msg_id: msg id to response for\n+ * Return: 0 - success, negative - failure\n+ **/\n+static int send_msg_to_mgmt_sync(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t\t enum hinic_mod_type mod, u8 cmd,\n+\t\t\t\t void *msg, u16 msg_len,\n+\t\t\t\t enum hinic_msg_ack_type ack_type,\n+\t\t\t\t enum hinic_msg_direction_type direction,\n+\t\t\t\t __rte_unused u16 resp_msg_id)\n+{\n+\tvoid *mgmt_cmd = pf_to_mgmt->sync_msg_buf;\n+\tstruct hinic_api_cmd_chain *chain;\n+\tu64 header;\n+\tu16 cmd_size = mgmt_msg_len(msg_len);\n+\n+\tif (direction == HINIC_MSG_RESPONSE)\n+\t\tprepare_header(pf_to_mgmt, &header, msg_len, mod, ack_type,\n+\t\t\t       direction, cmd, resp_msg_id);\n+\telse\n+\t\tprepare_header(pf_to_mgmt, &header, msg_len, mod, ack_type,\n+\t\t\t       direction, cmd, SYNC_MSG_ID(pf_to_mgmt));\n+\n+\tprepare_mgmt_cmd((u8 *)mgmt_cmd, &header, msg, msg_len);\n+\n+\tchain = pf_to_mgmt->cmd_chain[HINIC_API_CMD_PMD_WRITE_TO_MGMT];\n+\n+\treturn hinic_api_cmd_write(chain, HINIC_NODE_ID_MGMT_HOST,\n+\t\t\t\t   mgmt_cmd, cmd_size);\n+}\n+\n+/**\n+ * hinic_pf_to_mgmt_init - initialize PF to MGMT channel\n+ * @hwdev: the pointer to the private hardware device object\n+ * Return: 0 - success, negative - failure\n+ **/\n+int hinic_pf_to_mgmt_init(struct hinic_hwdev *hwdev)\n+{\n+\tstruct hinic_msg_pf_to_mgmt *pf_to_mgmt;\n+\tint err;\n+\n+\tpf_to_mgmt = kzalloc(sizeof(*pf_to_mgmt), GFP_KERNEL);\n+\tif (!pf_to_mgmt) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate pf to mgmt mem failed\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\thwdev->pf_to_mgmt = pf_to_mgmt;\n+\tpf_to_mgmt->hwdev = hwdev;\n+\n+\tspin_lock_init(&pf_to_mgmt->async_msg_lock);\n+\tspin_lock_init(&pf_to_mgmt->sync_msg_lock);\n+\n+\terr = alloc_msg_buf(pf_to_mgmt);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Allocate msg buffers failed\");\n+\t\tgoto alloc_msg_buf_err;\n+\t}\n+\n+\terr = hinic_api_cmd_init(hwdev, pf_to_mgmt->cmd_chain);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Init the api cmd chains failed\");\n+\t\tgoto api_cmd_init_err;\n+\t}\n+\n+\treturn 0;\n+\n+api_cmd_init_err:\n+\tfree_msg_buf(pf_to_mgmt);\n+\n+alloc_msg_buf_err:\n+\tkfree(pf_to_mgmt);\n+\n+\treturn err;\n+}\n+\n+/**\n+ * hinic_pf_to_mgmt_free - free PF to MGMT channel\n+ * @hwdev: the pointer to the private hardware device object\n+ **/\n+void hinic_pf_to_mgmt_free(struct hinic_hwdev *hwdev)\n+{\n+\tstruct hinic_msg_pf_to_mgmt *pf_to_mgmt = hwdev->pf_to_mgmt;\n+\n+\thinic_api_cmd_free(pf_to_mgmt->cmd_chain);\n+\tfree_msg_buf(pf_to_mgmt);\n+\tkfree(pf_to_mgmt);\n+}\n+\n+int hinic_pf_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,\n+\t\t\t  void *buf_in, u16 in_size, void *buf_out,\n+\t\t\t  u16 *out_size, u32 timeout)\n+{\n+\tstruct hinic_msg_pf_to_mgmt *pf_to_mgmt =\n+\t\t((struct hinic_hwdev *)hwdev)->pf_to_mgmt;\n+\tvoid *dev = ((struct hinic_hwdev *)hwdev)->dev_hdl;\n+\tstruct hinic_recv_msg *recv_msg;\n+\tu32 timeo;\n+\tint err, i;\n+\n+\tspin_lock(&pf_to_mgmt->sync_msg_lock);\n+\n+\tSYNC_MSG_ID_INC(pf_to_mgmt);\n+\trecv_msg = &pf_to_mgmt->recv_resp_msg_from_mgmt;\n+\n+\terr = send_msg_to_mgmt_sync(pf_to_mgmt, mod, cmd, buf_in, in_size,\n+\t\t\t\t    HINIC_MSG_ACK, HINIC_MSG_DIRECT_SEND,\n+\t\t\t\t    MSG_NO_RESP);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Send msg to mgmt failed\");\n+\t\tgoto unlock_sync_msg;\n+\t}\n+\n+\ttimeo = msecs_to_jiffies(timeout ? timeout : MGMT_MSG_TIMEOUT);\n+\tfor (i = 0; i < pf_to_mgmt->rx_aeq->poll_retry_nr; i++) {\n+\t\terr = hinic_aeq_poll_msg(pf_to_mgmt->rx_aeq, timeo, NULL);\n+\t\tif (err) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Poll mgmt rsp timeout, mod=%d cmd=%d msg_id=%u rc=%d\",\n+\t\t\t\tmod, cmd, pf_to_mgmt->sync_msg_id, err);\n+\t\t\terr = -ETIMEDOUT;\n+\t\t\thinic_dump_aeq_info((struct hinic_hwdev *)hwdev);\n+\t\t\tgoto unlock_sync_msg;\n+\t\t} else {\n+\t\t\tif (mod == recv_msg->mod && cmd == recv_msg->cmd &&\n+\t\t\t    recv_msg->msg_id == pf_to_mgmt->sync_msg_id) {\n+\t\t\t\t/* the expected response polled */\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tPMD_DRV_LOG(ERR, \"AEQ[%d] poll(mod=%d, cmd=%d, msg_id=%u) an \"\n+\t\t\t\t\"unexpected(mod=%d, cmd=%d, msg_id=%u) response\",\n+\t\t\t\tpf_to_mgmt->rx_aeq->q_id, mod, cmd,\n+\t\t\t\tpf_to_mgmt->sync_msg_id, recv_msg->mod,\n+\t\t\t\trecv_msg->cmd, recv_msg->msg_id);\n+\t\t}\n+\t}\n+\n+\tif (i == pf_to_mgmt->rx_aeq->poll_retry_nr) {\n+\t\tPMD_DRV_LOG(ERR, \"Get %d unexpected mgmt rsp from AEQ[%d], poll mgmt rsp failed\",\n+\t\t\ti, pf_to_mgmt->rx_aeq->q_id);\n+\t\terr = -EBADMSG;\n+\t\tgoto unlock_sync_msg;\n+\t}\n+\n+\trte_smp_rmb();\n+\tif ((recv_msg->msg_len) && (buf_out) && (out_size)) {\n+\t\tif (recv_msg->msg_len <= *out_size) {\n+\t\t\tmemcpy(buf_out, recv_msg->msg,\n+\t\t\t       recv_msg->msg_len);\n+\t\t\t*out_size = recv_msg->msg_len;\n+\t\t} else {\n+\t\t\tPMD_DRV_LOG(ERR, \"Mgmt rsp's msg len:%u overflow.\",\n+\t\t\t\trecv_msg->msg_len);\n+\t\t\terr = -ERANGE;\n+\t\t}\n+\t}\n+\n+unlock_sync_msg:\n+\tif (err && out_size)\n+\t\t*out_size = 0;\n+\tspin_unlock(&pf_to_mgmt->sync_msg_lock);\n+\treturn err;\n+}\n+\n+int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd,\n+\t\t     void *buf_in, u16 in_size, __rte_unused void *buf_out,\n+\t\t     __rte_unused u16 *out_size)\n+{\n+\tstruct hinic_msg_pf_to_mgmt *pf_to_mgmt =\n+\t\t\t\t((struct hinic_hwdev *)hwdev)->pf_to_mgmt;\n+\tvoid *dev = ((struct hinic_hwdev *)hwdev)->dev_hdl;\n+\tint err = -EINVAL;\n+\n+\tif (!MSG_SZ_IS_VALID(in_size)) {\n+\t\tPMD_DRV_LOG(ERR, \"Mgmt msg buffer size is invalid\");\n+\t\treturn err;\n+\t}\n+\n+\tspin_lock(&pf_to_mgmt->sync_msg_lock);\n+\n+\terr = send_msg_to_mgmt_sync(pf_to_mgmt, mod, cmd, buf_in, in_size,\n+\t\t\t\t    HINIC_MSG_NO_ACK, HINIC_MSG_DIRECT_SEND,\n+\t\t\t\t    MSG_NO_RESP);\n+\n+\tspin_unlock(&pf_to_mgmt->sync_msg_lock);\n+\n+\treturn err;\n+}\n+\n+static bool check_mgmt_seq_id_and_seg_len(struct hinic_recv_msg *recv_msg,\n+\t\t\t\t\t  u8 seq_id, u8 seg_len)\n+{\n+\tif (seq_id > HINIC_SEQ_ID_MAX_VAL || seg_len > HINIC_MSG_SEG_LEN)\n+\t\treturn false;\n+\n+\tif (seq_id == 0) {\n+\t\trecv_msg->sed_id = seq_id;\n+\t} else {\n+\t\tif (seq_id != recv_msg->sed_id + 1) {\n+\t\t\trecv_msg->sed_id = 0;\n+\t\t\treturn false;\n+\t\t}\n+\t\trecv_msg->sed_id = seq_id;\n+\t}\n+\n+\treturn true;\n+}\n+\n+/**\n+ * recv_mgmt_msg_handler - handler a message from mgmt cpu\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * @header: the header of the message\n+ * @recv_msg: received message details\n+ * @param: customized parameter\n+ * Return: 0 when aeq is response message, -1 default result,\n+ * and when wrong message or not last message\n+ **/\n+static int recv_mgmt_msg_handler(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t\t u8 *header, struct hinic_recv_msg *recv_msg,\n+\t\t\t\t void *param)\n+{\n+\tu64 msg_header = *((u64 *)header);\n+\tvoid *msg_body = header + sizeof(msg_header);\n+\tu8 *dest_msg;\n+\tu8 seq_id, seq_len;\n+\tu32 msg_buf_max = MAX_PF_MGMT_BUF_SIZE;\n+\n+\tseq_id = HINIC_MSG_HEADER_GET(msg_header, SEQID);\n+\tseq_len = HINIC_MSG_HEADER_GET(msg_header, SEG_LEN);\n+\n+\tif (!check_mgmt_seq_id_and_seg_len(recv_msg, seq_id, seq_len)) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t\"Mgmt msg sequence and segment check fail, \"\n+\t\t\t\"func id: 0x%x, front id: 0x%x, current id: 0x%x, seg len: 0x%x\",\n+\t\t\thinic_global_func_id(pf_to_mgmt->hwdev),\n+\t\t\trecv_msg->sed_id, seq_id, seq_len);\n+\t\treturn HINIC_RECV_NEXT_AEQE;\n+\t}\n+\n+\tdest_msg = (u8 *)recv_msg->msg + seq_id * HINIC_MSG_SEG_LEN;\n+\tmsg_buf_max -= seq_id * HINIC_MSG_SEG_LEN;\n+\tmemcpy(dest_msg, msg_body, seq_len);\n+\n+\tif (!HINIC_MSG_HEADER_GET(msg_header, LAST))\n+\t\treturn HINIC_RECV_NEXT_AEQE;\n+\n+\trecv_msg->cmd = HINIC_MSG_HEADER_GET(msg_header, CMD);\n+\trecv_msg->mod = HINIC_MSG_HEADER_GET(msg_header, MODULE);\n+\trecv_msg->async_mgmt_to_pf = HINIC_MSG_HEADER_GET(msg_header,\n+\t\t\t\t\t\t\t  ASYNC_MGMT_TO_PF);\n+\trecv_msg->msg_len = HINIC_MSG_HEADER_GET(msg_header, MSG_LEN);\n+\trecv_msg->msg_id = HINIC_MSG_HEADER_GET(msg_header, MSG_ID);\n+\n+\tif (HINIC_MSG_HEADER_GET(msg_header, DIRECTION) == HINIC_MSG_RESPONSE)\n+\t\treturn HINIC_RECV_DONE;\n+\n+\thinic_mgmt_recv_msg_handler(pf_to_mgmt, recv_msg, param);\n+\n+\treturn HINIC_RECV_NEXT_AEQE;\n+}\n+\n+/**\n+ * hinic_mgmt_msg_aeqe_handler - handler for a mgmt message event\n+ * @hwdev: the pointer to the private hardware device object\n+ * @header: the header of the message\n+ * @size: unused\n+ * @param: customized parameter\n+ * Return: 0 when aeq is response message,\n+ *\t   -1 default result, and when wrong message or not last message\n+ **/\n+int hinic_mgmt_msg_aeqe_handler(void *hwdev, u8 *header,\n+\t\t\t__rte_unused u8 size, void *param)\n+{\n+\tstruct hinic_msg_pf_to_mgmt *pf_to_mgmt =\n+\t\t((struct hinic_hwdev *)hwdev)->pf_to_mgmt;\n+\tstruct hinic_recv_msg *recv_msg;\n+\n+\trecv_msg = (HINIC_MSG_HEADER_GET(*(u64 *)header, DIRECTION) ==\n+\t\t    HINIC_MSG_DIRECT_SEND) ?\n+\t\t    &pf_to_mgmt->recv_msg_from_mgmt :\n+\t\t    &pf_to_mgmt->recv_resp_msg_from_mgmt;\n+\n+\treturn recv_mgmt_msg_handler(pf_to_mgmt, header, recv_msg, param);\n+}\n+\n+int hinic_comm_pf_to_mgmt_init(hinic_nic_dev *nic_dev)\n+{\n+\tint rc;\n+\tstruct hinic_hwdev *hwdev = nic_dev->hwdev;\n+\n+\trc = hinic_pf_to_mgmt_init(hwdev);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\thwdev->pf_to_mgmt->rx_aeq = &hwdev->aeqs->aeq[HINIC_MGMT_RSP_AEQN];\n+\n+\treturn 0;\n+}\n+\n+void hinic_comm_pf_to_mgmt_free(hinic_nic_dev *nic_dev)\n+{\n+\thinic_pf_to_mgmt_free(nic_dev->hwdev);\n+}\n+\n+/**\n+ * hinic_mgmt_recv_msg_handler - handler for message from mgmt cpu\n+ * @pf_to_mgmt: PF to MGMT channel\n+ * @recv_msg: received message details\n+ * @param: customized parameter\n+ **/\n+static void hinic_mgmt_recv_msg_handler(struct hinic_msg_pf_to_mgmt *pf_to_mgmt,\n+\t\t\t\t\tstruct hinic_recv_msg *recv_msg,\n+\t\t\t\t\tvoid *param)\n+{\n+\tvoid *buf_out = recv_msg->buf_out;\n+\tu16 out_size = 0;\n+\n+\tswitch (recv_msg->mod) {\n+\tcase HINIC_MOD_COMM:\n+\t\thinic_comm_async_event_handle(pf_to_mgmt->hwdev,\n+\t\t\t\t\t      recv_msg->cmd, recv_msg->msg,\n+\t\t\t\t\t      recv_msg->msg_len,\n+\t\t\t\t\t      buf_out, &out_size);\n+\t\tbreak;\n+\tcase HINIC_MOD_L2NIC:\n+\t\thinic_l2nic_async_event_handle(pf_to_mgmt->hwdev, param,\n+\t\t\t\t\t       recv_msg->cmd, recv_msg->msg,\n+\t\t\t\t\t       recv_msg->msg_len,\n+\t\t\t\t\t       buf_out, &out_size);\n+\t\tbreak;\n+\tcase HINIC_MOD_HILINK:\n+\t\thinic_hilink_async_event_handle(pf_to_mgmt->hwdev,\n+\t\t\t\t\t\trecv_msg->cmd, recv_msg->msg,\n+\t\t\t\t\t\trecv_msg->msg_len,\n+\t\t\t\t\t\tbuf_out, &out_size);\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_DRV_LOG(ERR, \"No handler, mod = %d\", recv_msg->mod);\n+\t\tbreak;\n+\t}\n+\n+\tif (!recv_msg->async_mgmt_to_pf) {\n+\t\tif (!out_size)\n+\t\t\tout_size = BUF_OUT_DEFAULT_SIZE;\n+\n+\t\t/* MGMT sent sync msg, send the response */\n+\t\t(void)send_msg_to_mgmt_async(pf_to_mgmt, recv_msg->mod,\n+\t\t\t\t\t     recv_msg->cmd, buf_out, out_size,\n+\t\t\t\t\t     HINIC_MSG_RESPONSE,\n+\t\t\t\t\t     recv_msg->msg_id);\n+\t}\n+}\ndiff --git a/drivers/net/hinic/base/hinic_pmd_mgmt.h b/drivers/net/hinic/base/hinic_pmd_mgmt.h\nnew file mode 100644\nindex 0000000..c060137\n--- /dev/null\n+++ b/drivers/net/hinic/base/hinic_pmd_mgmt.h\n@@ -0,0 +1,125 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2017 Huawei Technologies Co., Ltd\n+ */\n+\n+#ifndef _HINIC_PMD_MGMT_H_\n+#define _HINIC_PMD_MGMT_H_\n+\n+#define HINIC_MSG_HEADER_MSG_LEN_SHIFT\t\t\t\t0\n+#define HINIC_MSG_HEADER_MODULE_SHIFT\t\t\t\t11\n+#define HINIC_MSG_HEADER_SEG_LEN_SHIFT\t\t\t\t16\n+#define HINIC_MSG_HEADER_NO_ACK_SHIFT\t\t\t\t22\n+#define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_SHIFT\t\t\t23\n+#define HINIC_MSG_HEADER_SEQID_SHIFT\t\t\t\t24\n+#define HINIC_MSG_HEADER_LAST_SHIFT\t\t\t\t30\n+#define HINIC_MSG_HEADER_DIRECTION_SHIFT\t\t\t31\n+#define HINIC_MSG_HEADER_CMD_SHIFT\t\t\t\t32\n+#define HINIC_MSG_HEADER_PCI_INTF_IDX_SHIFT\t\t\t48\n+#define HINIC_MSG_HEADER_P2P_IDX_SHIFT\t\t\t\t50\n+#define HINIC_MSG_HEADER_MSG_ID_SHIFT\t\t\t\t54\n+\n+#define HINIC_MSG_HEADER_MSG_LEN_MASK\t\t\t\t0x7FF\n+#define HINIC_MSG_HEADER_MODULE_MASK\t\t\t\t0x1F\n+#define HINIC_MSG_HEADER_SEG_LEN_MASK\t\t\t\t0x3F\n+#define HINIC_MSG_HEADER_NO_ACK_MASK\t\t\t\t0x1\n+#define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_MASK\t\t\t0x1\n+#define HINIC_MSG_HEADER_SEQID_MASK\t\t\t\t0x3F\n+#define HINIC_MSG_HEADER_LAST_MASK\t\t\t\t0x1\n+#define HINIC_MSG_HEADER_DIRECTION_MASK\t\t\t\t0x1\n+#define HINIC_MSG_HEADER_CMD_MASK\t\t\t\t0xFF\n+#define HINIC_MSG_HEADER_PCI_INTF_IDX_MASK\t\t\t0x3\n+#define HINIC_MSG_HEADER_P2P_IDX_MASK\t\t\t\t0xF\n+#define HINIC_MSG_HEADER_MSG_ID_MASK\t\t\t\t0x3FF\n+\n+#define HINIC_MSG_HEADER_GET(val, member)\t\t\t\\\n+\t\t(((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \\\n+\t\tHINIC_MSG_HEADER_##member##_MASK)\n+\n+#define HINIC_MSG_HEADER_SET(val, member)\t\t\t\\\n+\t\t((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \\\n+\t\tHINIC_MSG_HEADER_##member##_SHIFT)\n+\n+enum hinic_msg_direction_type {\n+\tHINIC_MSG_DIRECT_SEND\t= 0,\n+\tHINIC_MSG_RESPONSE\t= 1\n+};\n+enum hinic_msg_segment_type {\n+\tNOT_LAST_SEGMENT = 0,\n+\tLAST_SEGMENT\t= 1,\n+};\n+\n+enum hinic_msg_ack_type {\n+\tHINIC_MSG_ACK = 0,\n+\tHINIC_MSG_NO_ACK = 1,\n+};\n+\n+struct hinic_recv_msg {\n+\tvoid\t\t\t*msg;\n+\tvoid\t\t\t*buf_out;\n+\n+\tu16\t\t\tmsg_len;\n+\tenum hinic_mod_type\tmod;\n+\tu8\t\t\tcmd;\n+\tu16\t\t\tmsg_id;\n+\tint\t\t\tasync_mgmt_to_pf;\n+\tu8\t\t\tsed_id;\n+};\n+\n+#define HINIC_COMM_SELF_CMD_MAX 8\n+\n+typedef void (*comm_up_self_msg_proc)(void *handle, void *buf_in,\n+\t\t\t\tu16 in_size, void *buf_out, u16 *out_size);\n+\n+struct comm_up_self_msg_sub_info {\n+\tu8 cmd;\n+\tcomm_up_self_msg_proc proc;\n+};\n+\n+struct comm_up_self_msg_info {\n+\tu8 cmd_num;\n+\tstruct comm_up_self_msg_sub_info info[HINIC_COMM_SELF_CMD_MAX];\n+};\n+\n+enum comm_pf_to_mgmt_event_state {\n+\tSEND_EVENT_START = 0,\n+\tSEND_EVENT_TIMEOUT,\n+\tSEND_EVENT_END,\n+};\n+\n+struct hinic_msg_pf_to_mgmt {\n+\tstruct hinic_hwdev\t\t*hwdev;\n+\n+\t/* Async cmd can not be scheduling */\n+\tspinlock_t\t\t\tasync_msg_lock;\n+\t/* spinlock for sync message */\n+\tspinlock_t\t\t\tsync_msg_lock;\n+\n+\tvoid\t\t\t\t*async_msg_buf;\n+\tvoid\t\t\t\t*sync_msg_buf;\n+\n+\tstruct hinic_recv_msg\t\trecv_msg_from_mgmt;\n+\tstruct hinic_recv_msg\t\trecv_resp_msg_from_mgmt;\n+\n+\tu16\t\t\t\tasync_msg_id;\n+\tu16\t\t\t\tsync_msg_id;\n+\n+\tstruct hinic_api_cmd_chain\t*cmd_chain[HINIC_API_CMD_MAX];\n+\n+\tstruct hinic_eq *rx_aeq;\n+};\n+\n+int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd,\n+\t\t\t     void *buf_in, u16 in_size, void *buf_out,\n+\t\t\t     u16 *out_size);\n+\n+int hinic_pf_to_mgmt_init(struct hinic_hwdev *hwdev);\n+void hinic_pf_to_mgmt_free(struct hinic_hwdev *hwdev);\n+\n+int hinic_mgmt_msg_aeqe_handler(void *hwdev, u8 *header, __rte_unused u8 size,\n+\t\t\t\tvoid *param);\n+\n+int hinic_pf_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,\n+\t\t\t  void *buf_in, u16 in_size, void *buf_out,\n+\t\t\t  u16 *out_size, u32 timeout);\n+\n+#endif /* _HINIC_PMD_MGMT_H_ */\ndiff --git a/drivers/net/hinic/base/hinic_pmd_mgmt_interface.h b/drivers/net/hinic/base/hinic_pmd_mgmt_interface.h\nnew file mode 100644\nindex 0000000..809db8a\n--- /dev/null\n+++ b/drivers/net/hinic/base/hinic_pmd_mgmt_interface.h\n@@ -0,0 +1,503 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2017 Huawei Technologies Co., Ltd\n+ */\n+\n+#ifndef _HINIC_PMD_MGMT_INTERFACE_H_\n+#define _HINIC_PMD_MGMT_INTERFACE_H_\n+\n+/* cmd of mgmt CPU message for HILINK module */\n+enum hinic_hilink_cmd {\n+\tHINIC_HILINK_CMD_GET_LINK_INFO\t\t= 0x3,\n+\tHINIC_HILINK_CMD_SET_LINK_SETTINGS\t= 0x8,\n+};\n+\n+enum hilink_info_print_event {\n+\tHILINK_EVENT_LINK_UP = 1,\n+\tHILINK_EVENT_LINK_DOWN,\n+\tHILINK_EVENT_CABLE_PLUGGED,\n+\tHILINK_EVENT_MAX_TYPE,\n+};\n+\n+#define NIC_LRO_MAX_WQE_NUM\t32\n+#define NIC_RSS_INDIR_SIZE\t256\n+#define NIC_DCB_UP_MAX\t\t0x8\n+#define NIC_RSS_KEY_SIZE        40\n+#define NIC_RSS_CMD_TEMP_ALLOC  0x01\n+#define NIC_RSS_CMD_TEMP_FREE   0x02\n+\n+enum hinic_resp_aeq_num {\n+\tHINIC_AEQ0 = 0,\n+\tHINIC_AEQ1 = 1,\n+\tHINIC_AEQ2 = 2,\n+\tHINIC_AEQ3 = 3,\n+};\n+\n+struct hinic_mgmt_msg_head {\n+\tu8\tstatus;\n+\tu8\tversion;\n+\tu8\tresp_aeq_num;\n+\tu8\trsvd0[5];\n+};\n+\n+enum {\n+\tRECYCLE_MODE_NIC = 0x0,\n+\tRECYCLE_MODE_DPDK = 0x1,\n+};\n+\n+struct hinic_fast_recycled_mode {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu8 fast_recycled_mode;/* 1: enable fast recycle, available in dpdk mode,\n+\t\t\t       * 0: normal mode, available in kernel nic mode\n+\t\t\t       */\n+\tu8 rsvd1;\n+};\n+\n+struct hinic_function_table {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trx_wqe_buf_size;\n+\tu32\tmtu;\n+};\n+\n+struct hinic_cmd_qpn {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tbase_qpn;\n+};\n+\n+struct hinic_port_mac_set {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tvlan_id;\n+\tu16\trsvd1;\n+\tu8\tmac[ETH_ALEN];\n+};\n+\n+struct hinic_port_mac_update {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tvlan_id;\n+\tu16\trsvd1;\n+\tu8\told_mac[ETH_ALEN];\n+\tu16\trsvd2;\n+\tu8\tnew_mac[ETH_ALEN];\n+};\n+\n+struct hinic_vport_state {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu8\tstate;\n+\tu8\trsvd2[3];\n+};\n+\n+struct hinic_port_state {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu8\tstate;\n+\tu8\trsvd1[3];\n+};\n+\n+struct hinic_mtu {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu32\tmtu;\n+};\n+\n+struct hinic_vlan_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tvlan_id;\n+};\n+\n+struct hinic_get_link {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\tlink_status;\n+\tu8\trsvd1;\n+};\n+\n+#define HINIC_DEFAUT_PAUSE_CONFIG 1\n+struct hinic_pause_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu32\tauto_neg;\n+\tu32\trx_pause;\n+\tu32\ttx_pause;\n+};\n+\n+struct hinic_port_info {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu8\tport_type;\n+\tu8\tautoneg_cap;\n+\tu8\tautoneg_state;\n+\tu8\tduplex;\n+\tu8\tspeed;\n+\tu8\tresv2[3];\n+};\n+\n+struct hinic_set_autoneg {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tenable;\t/* 1: enable , 0: disable */\n+};\n+\n+struct hinic_up_ets_cfg {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu8 port_id;\n+\tu8 rsvd1[3];\n+\tu8 up_tc[HINIC_DCB_UP_MAX];\n+\tu8 pg_bw[HINIC_DCB_PG_MAX];\n+\tu8 pgid[HINIC_DCB_UP_MAX];\n+\tu8 up_bw[HINIC_DCB_UP_MAX];\n+\tu8 prio[HINIC_DCB_PG_MAX];\n+};\n+\n+struct hinic_tso_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu8\ttso_en;\n+\tu8\tresv2[3];\n+};\n+\n+struct hinic_lro_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu8\tlro_ipv4_en;\n+\tu8\tlro_ipv6_en;\n+\tu8\tlro_max_wqe_num;\n+\tu8\tresv2[13];\n+};\n+\n+struct hinic_checksum_offload {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu32\trx_csum_offload;\n+};\n+\n+struct hinic_vlan_offload {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\tvlan_rx_offload;\n+\tu8\trsvd1[5];\n+};\n+\n+struct hinic_rx_mode_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu32\trx_mode;\n+};\n+\n+/* rss */\n+struct nic_rss_indirect_tbl {\n+\tu32 group_index;\n+\tu32 offset;\n+\tu32 size;\n+\tu32 rsvd;\n+\tu8 entry[NIC_RSS_INDIR_SIZE];\n+};\n+\n+struct nic_rss_context_tbl {\n+\tu32 group_index;\n+\tu32 offset;\n+\tu32 size;\n+\tu32 rsvd;\n+\tu32 ctx;\n+};\n+\n+struct hinic_rss_config {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\trss_en;\n+\tu8\ttemplate_id;\n+\tu8\trq_priority_number;\n+\tu8\trsvd1[3];\n+\tu8\tprio_tc[NIC_DCB_UP_MAX];\n+};\n+\n+struct hinic_rss_template_mgmt {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\tcmd;\n+\tu8\ttemplate_id;\n+\tu8\trsvd1[4];\n+};\n+\n+struct hinic_rss_indir_table {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\ttemplate_id;\n+\tu8\trsvd1;\n+\tu8\tindir[NIC_RSS_INDIR_SIZE];\n+};\n+\n+struct hinic_rss_template_key {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\ttemplate_id;\n+\tu8\trsvd1;\n+\tu8\tkey[NIC_RSS_KEY_SIZE];\n+};\n+\n+struct hinic_rss_engine_type {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\ttemplate_id;\n+\tu8\thash_engine;\n+\tu8\trsvd1[4];\n+};\n+\n+struct hinic_rss_context_table {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\ttemplate_id;\n+\tu8\trsvd1;\n+\tu32\tcontext;\n+};\n+\n+struct hinic_port_link_status {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\tlink;\n+\tu8\tport_id;\n+};\n+\n+struct hinic_cable_plug_event {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\tplugged;\t/* 0: unplugged, 1: plugged */\n+\tu8\tport_id;\n+};\n+\n+struct hinic_link_err_event {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\terr_type;\n+\tu8\tport_id;\n+};\n+\n+enum link_err_status {\n+\tLINK_ERR_MODULE_UNRECOGENIZED,\n+\tLINK_ERR_NUM,\n+};\n+\n+#define HINIC_PORT_STATS_VERSION\t0\n+\n+struct hinic_port_stats_info {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd1;\n+\tu32 stats_version;\n+\tu32 stats_size;\n+};\n+\n+struct hinic_port_qfilter_info {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd1;\n+\tu8 filter_enable;\n+\tu8 filter_type;\n+\tu8 qid;\n+\tu8 rsvd2;\n+};\n+\n+struct hinic_port_stats {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tstruct hinic_phy_port_stats stats;\n+};\n+\n+struct hinic_cmd_vport_stats {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tstruct hinic_vport_stats stats;\n+};\n+\n+struct hinic_clear_port_stats {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd;\n+\tu32  stats_version;\n+\tu32  stats_size;\n+};\n+\n+struct hinic_clear_vport_stats {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd;\n+\tu32  stats_version;\n+\tu32  stats_size;\n+};\n+\n+#define HINIC_COMPILE_TIME_LEN\t20\n+struct hinic_version_info {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu8 ver[HINIC_FW_VERSION_NAME];\n+\tu8 time[HINIC_COMPILE_TIME_LEN];\n+};\n+\n+/* get or set loopback mode, need to modify by base API */\n+#define HINIC_INTERNAL_LP_MODE 5\n+\n+#define ANTI_ATTACK_DEFAULT_CIR 500000\n+#define ANTI_ATTACK_DEFAULT_XIR 600000\n+#define ANTI_ATTACK_DEFAULT_CBS 10000000\n+#define ANTI_ATTACK_DEFAULT_XBS 12000000\n+\n+/* set physical port Anti-Attack rate */\n+struct hinic_port_anti_attack_rate {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\tenable; /* 1: enable rate-limiting, 0: disable rate-limiting */\n+\tu32\tcir;\t/* Committed Information Rate */\n+\tu32\txir;\t/* eXtended Information Rate */\n+\tu32\tcbs;\t/* Committed Burst Size */\n+\tu32\txbs;\t/* eXtended Burst Size */\n+};\n+\n+struct hinic_l2nic_reset {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 rsvd1;\n+};\n+\n+struct hinic_root_ctxt {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_idx;\n+\tu16\trsvd1;\n+\tu8\tset_cmdq_depth;\n+\tu8\tcmdq_depth;\n+\tu8\tlro_en;\n+\tu8\trsvd2;\n+\tu8\tppf_idx;\n+\tu8\trsvd3;\n+\tu16\trq_depth;\n+\tu16\trx_buf_sz;\n+\tu16\tsq_depth;\n+};\n+\n+struct hinic_page_size {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_idx;\n+\tu8\tppf_idx;\n+\tu8\tpage_size;\n+\tu32\trsvd;\n+};\n+\n+struct hinic_dcb_state {\n+\tu8 dcb_on;\n+\tu8 default_cos;\n+\tu8 up_cos[8];\n+};\n+\n+struct hinic_vf_default_cos {\n+\tu8\tstatus;\n+\tu8\tversion;\n+\tu8\trsvd0[6];\n+\n+\tstruct hinic_dcb_state state;\n+};\n+\n+struct hinic_reset_link_cfg {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+};\n+\n+struct hinic_set_vhd_mode {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16 func_id;\n+\tu16 vhd_type;\n+\tu16 rx_wqe_buffer_size;\n+\tu16 rsvd;\n+};\n+\n+struct hinic_vlan_filter {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu8\trsvd1[2];\n+\tu32\tvlan_filter_ctrl;\n+};\n+\n+struct hinic_set_link_follow {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd0;\n+\tu8\tfollow_status;\n+\tu8\trsvd1[3];\n+};\n+\n+struct hinic_link_mode_cmd {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+\tu16\tsupported;\t/* 0xFFFF represent Invalid value */\n+\tu16\tadvertised;\n+};\n+\n+struct hinic_clear_qp_resource {\n+\tstruct hinic_mgmt_msg_head mgmt_msg_head;\n+\n+\tu16\tfunc_id;\n+\tu16\trsvd1;\n+};\n+\n+int hinic_init_function_table(void *hwdev, u16 rx_buf_sz);\n+\n+int hinic_set_fast_recycle_mode(void *hwdev, u8 mode);\n+\n+int hinic_get_base_qpn(void *hwdev, u16 *global_qpn);\n+\n+int hinic_set_pagesize(void *hwdev, u8 page_size);\n+\n+#endif /* _HINIC_PMD_MGMT_INTERFACE_H_ */\n",
    "prefixes": [
        "03/11"
    ]
}