get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 131009,
    "url": "http://patches.dpdk.org/api/patches/131009/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230901023050.40893-7-caowenbo@mucse.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": "<20230901023050.40893-7-caowenbo@mucse.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230901023050.40893-7-caowenbo@mucse.com",
    "date": "2023-09-01T02:30:48",
    "name": "[v6,6/8] net/rnp add port info resource init",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "ec6b70344961287b5005c1130c80686294a78556",
    "submitter": {
        "id": 2142,
        "url": "http://patches.dpdk.org/api/people/2142/?format=api",
        "name": "11",
        "email": "caowenbo@mucse.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/20230901023050.40893-7-caowenbo@mucse.com/mbox/",
    "series": [
        {
            "id": 29398,
            "url": "http://patches.dpdk.org/api/series/29398/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29398",
            "date": "2023-09-01T02:30:42",
            "name": "drivers/net Add Support mucse N10 Pmd Driver",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/29398/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/131009/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/131009/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 BC82F42219;\n\tFri,  1 Sep 2023 04:31:56 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5DA79402C3;\n\tFri,  1 Sep 2023 04:31:44 +0200 (CEST)",
            "from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166])\n by mails.dpdk.org (Postfix) with ESMTP id 90D09402C3\n for <dev@dpdk.org>; Fri,  1 Sep 2023 04:31:42 +0200 (CEST)",
            "from steven.localdomain ( [183.81.182.182])\n by bizesmtp.qq.com (ESMTP) with\n id ; Fri, 01 Sep 2023 10:31:28 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp81t1693535492t991mgql",
        "X-QQ-SSF": "01400000000000D0F000000A0000000",
        "X-QQ-FEAT": "+ynUkgUhZJmLvp7Hc77A82RiKWucLN9PHf3vr6MFJLY7Lrp3YE8UStuXE5jEu\n yA5j1X+f4hB7QBqGbIoCWK2uj4NjAk71dmY+7y07KdRoagOBSE/YOAgzj3sd5mxSWP9PDlY\n p8GJderYWsnZ6Go31FfkHWWJNG68qf4QR8sJc76p21DUgbMsVs0CQYcVVKrmhZzYU8/a4Ct\n RhTH+wQj+6PsSCCppFKTIcxc5gs+JTsgiNsrfMSv2y8tN7XDxwmVKo8qxj+l3V93TNptZuA\n YAH7HgTXRjBfK9mBxWEJczGmnHzDssMqSkCupgutiWq6kwg/RC7oF/uGotvVq6xn47gQao4\n fnK0r4pTFCNdqipoag1QU845dhIJKxE7KyAE/e4i+nn/6GEPfGbiLpUzbHGGO769IUVg4tV\n wilFyktJQlZVd/ZYjmxRCA==",
        "X-QQ-GoodBg": "2",
        "X-BIZMAIL-ID": "202093954086557439",
        "From": "Wenbo Cao <caowenbo@mucse.com>",
        "To": "Wenbo Cao <caowenbo@mucse.com>",
        "Cc": "dev@dpdk.org, ferruh.yigit@amd.com, thomas@monjalon.net,\n andrew.rybchenko@oktetlabs.ru, yaojun@mucse.com",
        "Subject": "[PATCH v6 6/8] net/rnp add port info resource init",
        "Date": "Fri,  1 Sep 2023 02:30:48 +0000",
        "Message-Id": "<20230901023050.40893-7-caowenbo@mucse.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20230901023050.40893-1-caowenbo@mucse.com>",
        "References": "<20230901023050.40893-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 Api For FW Mac Info, Port Resoucre info init Code\nFor Different Shape Of Nic\n\nSigned-off-by: Wenbo Cao <caowenbo@mucse.com>\n---\n drivers/net/rnp/base/rnp_api.c |  48 +++++++\n drivers/net/rnp/base/rnp_api.h |  10 ++\n drivers/net/rnp/base/rnp_hw.h  |  18 +++\n drivers/net/rnp/meson.build    |   1 +\n drivers/net/rnp/rnp.h          |  88 +++++++++++++\n drivers/net/rnp/rnp_ethdev.c   | 224 +++++++++++++++++++++++++++++++--\n drivers/net/rnp/rnp_mbx_fw.c   | 112 +++++++++++++++++\n drivers/net/rnp/rnp_mbx_fw.h   | 115 +++++++++++++++++\n drivers/net/rnp/rnp_rxtx.c     |  82 ++++++++++++\n drivers/net/rnp/rnp_rxtx.h     |  14 +++\n 10 files changed, 705 insertions(+), 7 deletions(-)\n create mode 100644 drivers/net/rnp/rnp_rxtx.c\n create mode 100644 drivers/net/rnp/rnp_rxtx.h",
    "diff": "diff --git a/drivers/net/rnp/base/rnp_api.c b/drivers/net/rnp/base/rnp_api.c\nindex 550da6217d..cf74769fb6 100644\n--- a/drivers/net/rnp/base/rnp_api.c\n+++ b/drivers/net/rnp/base/rnp_api.c\n@@ -21,3 +21,51 @@ rnp_reset_hw(struct rte_eth_dev *dev, struct rnp_hw *hw)\n \t\treturn ops->reset_hw(hw);\n \treturn -EOPNOTSUPP;\n }\n+\n+int\n+rnp_get_mac_addr(struct rte_eth_dev *dev, uint8_t *macaddr)\n+{\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\tconst struct rnp_mac_api *ops = RNP_DEV_TO_MAC_OPS(dev);\n+\n+\tif (!macaddr)\n+\t\treturn -EINVAL;\n+\tif (ops->get_mac_addr)\n+\t\treturn ops->get_mac_addr(port, port->attr.nr_lane, macaddr);\n+\treturn -EOPNOTSUPP;\n+}\n+\n+int\n+rnp_set_default_mac(struct rte_eth_dev *dev, uint8_t *mac_addr)\n+{\n+\tconst struct rnp_mac_api *ops = RNP_DEV_TO_MAC_OPS(dev);\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\n+\tif (ops->set_default_mac)\n+\t\treturn ops->set_default_mac(port, mac_addr);\n+\treturn -EOPNOTSUPP;\n+}\n+\n+int\n+rnp_set_rafb(struct rte_eth_dev *dev, uint8_t *addr,\n+\t     uint8_t vm_pool, uint8_t index)\n+{\n+\tconst struct rnp_mac_api *ops = RNP_DEV_TO_MAC_OPS(dev);\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\n+\tif (ops->set_rafb)\n+\t\treturn ops->set_rafb(port, addr, vm_pool, index);\n+\treturn -EOPNOTSUPP;\n+}\n+\n+int\n+rnp_clear_rafb(struct rte_eth_dev *dev,\n+\t       uint8_t vm_pool, uint8_t index)\n+{\n+\tconst struct rnp_mac_api *ops = RNP_DEV_TO_MAC_OPS(dev);\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\n+\tif (ops->clear_rafb)\n+\t\treturn ops->clear_rafb(port, vm_pool, index);\n+\treturn -EOPNOTSUPP;\n+}\ndiff --git a/drivers/net/rnp/base/rnp_api.h b/drivers/net/rnp/base/rnp_api.h\nindex df574dab77..b998b11237 100644\n--- a/drivers/net/rnp/base/rnp_api.h\n+++ b/drivers/net/rnp/base/rnp_api.h\n@@ -4,4 +4,14 @@ int\n rnp_init_hw(struct rte_eth_dev *dev);\n int\n rnp_reset_hw(struct rte_eth_dev *dev, struct rnp_hw *hw);\n+int\n+rnp_get_mac_addr(struct rte_eth_dev *dev, uint8_t *macaddr);\n+int\n+rnp_set_default_mac(struct rte_eth_dev *dev, uint8_t *mac_addr);\n+int\n+rnp_set_rafb(struct rte_eth_dev *dev, uint8_t *addr,\n+\t\tuint8_t vm_pool, uint8_t index);\n+int\n+rnp_clear_rafb(struct rte_eth_dev *dev,\n+\t\tuint8_t vm_pool, uint8_t index);\n #endif /* __RNP_API_H__ */\ndiff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h\nindex 57b7dc75a0..395b9d5c71 100644\n--- a/drivers/net/rnp/base/rnp_hw.h\n+++ b/drivers/net/rnp/base/rnp_hw.h\n@@ -44,6 +44,10 @@ static inline void rnp_wr_reg(volatile void *reg, int val)\n \trnp_rd_reg((uint8_t *)((_hw)->comm_reg_base) + (_off))\n #define rnp_top_wr(_hw, _off, _val)\t\\\n \trnp_wr_reg((uint8_t *)((_hw)->comm_reg_base) + (_off), (_val))\n+#define RNP_MACADDR_UPDATE_LO(hw, hw_idx, val) \\\n+\trnp_eth_wr(hw, RNP_RAL_BASE_ADDR(hw_idx), val)\n+#define RNP_MACADDR_UPDATE_HI(hw, hw_idx, val) \\\n+\trnp_eth_wr(hw, RNP_RAH_BASE_ADDR(hw_idx), val)\n struct rnp_hw;\n /* Mbx Operate info */\n enum MBX_ID {\n@@ -112,9 +116,23 @@ struct rnp_mbx_info {\n \trte_atomic16_t state;\n } __rte_cache_aligned;\n \n+struct rnp_eth_port;\n struct rnp_mac_api {\n \tint32_t (*init_hw)(struct rnp_hw *hw);\n \tint32_t (*reset_hw)(struct rnp_hw *hw);\n+\t/* MAC Address */\n+\tint32_t (*get_mac_addr)(struct rnp_eth_port *port,\n+\t\t\t\tuint8_t lane,\n+\t\t\t\tuint8_t *macaddr);\n+\tint32_t (*set_default_mac)(struct rnp_eth_port *port, uint8_t *mac);\n+\t/* Receive Address Filter Table */\n+\tint32_t (*set_rafb)(struct rnp_eth_port *port,\n+\t\t\t    uint8_t *mac,\n+\t\t\t    uint8_t vm_pool,\n+\t\t\t    uint8_t index);\n+\tint32_t (*clear_rafb)(struct rnp_eth_port *port,\n+\t\t\t    uint8_t vm_pool,\n+\t\t\t    uint8_t index);\n };\n \n struct rnp_mac_info {\ndiff --git a/drivers/net/rnp/meson.build b/drivers/net/rnp/meson.build\nindex 855c894032..f72815b396 100644\n--- a/drivers/net/rnp/meson.build\n+++ b/drivers/net/rnp/meson.build\n@@ -10,6 +10,7 @@ sources = files(\n \t\t'rnp_ethdev.c',\n \t\t'rnp_mbx.c',\n \t\t'rnp_mbx_fw.c',\n+\t\t'rnp_rxtx.c',\n \t\t'base/rnp_api.c',\n )\n \ndiff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h\nindex 45638aae5b..9ae801414b 100644\n--- a/drivers/net/rnp/rnp.h\n+++ b/drivers/net/rnp/rnp.h\n@@ -9,14 +9,90 @@\n \n #define PCI_VENDOR_ID_MUCSE\t(0x8848)\n #define RNP_DEV_ID_N10G\t\t(0x1000)\n+#define RNP_DEV_ID_N400L_X4\t(0x1021)\n #define RNP_MAX_PORT_OF_PF\t(4)\n #define RNP_CFG_BAR\t\t(4)\n #define RNP_PF_INFO_BAR\t\t(0)\n \n+/* Peer Port Own Independent Resource */\n+#define RNP_PORT_MAX_MACADDR         (32)\n+#define RNP_PORT_MAX_UC_MAC_SIZE     (256)\n+#define RNP_PORT_MAX_VLAN_HASH       (12)\n+#define RNP_PORT_MAX_UC_HASH_TB      (8)\n+\n+/* Hardware Resource info */\n+#define RNP_MAX_RX_QUEUE_NUM         (128)\n+#define RNP_MAX_TX_QUEUE_NUM         (128)\n+#define RNP_N400_MAX_RX_QUEUE_NUM    (8)\n+#define RNP_N400_MAX_TX_QUEUE_NUM    (8)\n+#define RNP_MAX_HASH_KEY_SIZE        (10)\n+#define RNP_MAX_MAC_ADDRS            (128)\n+#define RNP_MAX_SUPPORT_VF_NUM       (64)\n+#define RNP_MAX_VFTA_SIZE            (128)\n+#define RNP_MAX_TC_SUPPORT           (4)\n+\n+#define RNP_MAX_UC_MAC_SIZE          (4096) /* Max Num of Unicast MAC addr */\n+#define RNP_MAX_UC_HASH_TB           (128)\n+#define RNP_MAX_MC_MAC_SIZE          (4096) /* Max Num of Multicast MAC addr */\n+#define RNP_MAC_MC_HASH_TB           (128)\n+#define RNP_MAX_VLAN_HASH_TB_SIZE    (4096)\n+\n+#define RNP_MAX_UC_HASH_TABLE        (128)\n+#define RNP_MAC_MC_HASH_TABLE        (128)\n+#define RNP_UTA_BIT_SHIFT            (5)\n+\n enum rnp_resource_share_m {\n \tRNP_SHARE_CORPORATE = 0,\n \tRNP_SHARE_INDEPENDENT,\n };\n+\n+/* media type */\n+enum rnp_media_type {\n+\tRNP_MEDIA_TYPE_UNKNOWN,\n+\tRNP_MEDIA_TYPE_FIBER,\n+\tRNP_MEDIA_TYPE_COPPER,\n+\tRNP_MEDIA_TYPE_BACKPLANE,\n+\tRNP_MEDIA_TYPE_NONE,\n+};\n+\n+struct rnp_phy_meta {\n+\tuint16_t phy_type;\n+\tuint32_t speed_cap;\n+\tuint32_t supported_link;\n+\tuint16_t link_duplex;\n+\tuint16_t link_autoneg;\n+\tuint8_t media_type;\n+\tbool is_sgmii;\n+\tbool is_backplane;\n+\tbool fec;\n+\tuint32_t phy_identifier;\n+};\n+\n+struct rnp_port_attr {\n+\tuint16_t max_mac_addrs;   /* Max Support Mac Address */\n+\tuint16_t uc_hash_tb_size; /* Unicast Hash Table Size */\n+\tuint16_t max_uc_mac_hash; /* Max Num of hash MAC addr for UC */\n+\tuint16_t mc_hash_tb_size; /* Multicast Hash Table Size */\n+\tuint16_t max_mc_mac_hash; /* Max Num Of Hash Mac addr For MC */\n+\tuint16_t max_vlan_hash;   /* Max Num Of Hash For Vlan ID*/\n+\tuint32_t hash_table_shift;\n+\tuint16_t rte_pid;         /* Dpdk Manage Port Sequence Id */\n+\tuint8_t max_rx_queues;    /* Belong To This Port Rxq Resource */\n+\tuint8_t max_tx_queues;    /* Belong To This Port Rxq Resource */\n+\tuint8_t queue_ring_base;\n+\tuint8_t port_offset;      /* Use For Redir Table Dma Ring Offset Of Port */\n+\tunion {\n+\t\tuint8_t nr_lane; /* phy lane of This PF:0~3 */\n+\t\tuint8_t nr_port; /* phy lane of This PF:0~3 */\n+\t};\n+\tstruct rnp_phy_meta phy_meta;\n+\tbool link_ready;\n+\tbool pre_link;\n+\tuint32_t speed;\n+\tuint16_t max_rx_pktlen;   /* Current Port Max Support Packet Len */\n+\tuint16_t max_mtu;\n+};\n+\n /*\n  * Structure to store private data for each driver instance (for each port).\n  */\n@@ -29,8 +105,16 @@ enum rnp_work_mode {\n \n 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 \tstruct rte_eth_dev *eth_dev;\n+\tstruct rnp_port_attr attr;\n+\t/* Recvice Mac Address Record Table */\n+\tuint8_t mac_use_tb[RNP_MAX_MAC_ADDRS];\n+\tuint8_t use_num_mac;\n+\tbool port_stopped;\n+\tbool port_closed;\n+\tenum rnp_resource_share_m s_mode; /* Independent Port Resource */\n } __rte_cache_aligned;\n \n struct rnp_share_ops {\n@@ -61,6 +145,10 @@ struct rnp_eth_adapter {\n \t(&((struct rnp_eth_adapter *)(RNP_DEV_TO_PORT((eth_dev))->adapt))->hw)\n #define RNP_HW_TO_ADAPTER(hw) \\\n \t((struct rnp_eth_adapter *)((hw)->back))\n+#define RNP_PORT_TO_HW(port) \\\n+\t(&(((struct rnp_eth_adapter *)(port)->adapt)->hw))\n+#define RNP_PORT_TO_ADAPTER(port) \\\n+\t((struct rnp_eth_adapter *)((port)->adapt))\n #define RNP_DEV_PP_PRIV_TO_MBX_OPS(dev) \\\n \t(((struct rnp_share_ops *)(dev)->process_private)->mbx_api)\n #define RNP_DEV_TO_MBX_OPS(dev)\tRNP_DEV_PP_PRIV_TO_MBX_OPS(dev)\ndiff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c\nindex 8bb4fd5963..f0ef2ef329 100644\n--- a/drivers/net/rnp/rnp_ethdev.c\n+++ b/drivers/net/rnp/rnp_ethdev.c\n@@ -11,6 +11,7 @@\n #include \"rnp_api.h\"\n #include \"rnp_mbx.h\"\n #include \"rnp_mbx_fw.h\"\n+#include \"rnp_rxtx.h\"\n #include \"rnp_logs.h\"\n \n static int\n@@ -40,6 +41,62 @@ static int rnp_dev_close(struct rte_eth_dev *dev)\n static const struct eth_dev_ops rnp_eth_dev_ops = {\n };\n \n+static void\n+rnp_setup_port_attr(struct rnp_eth_port *port,\n+\t\t    struct rte_eth_dev *dev,\n+\t\t    uint8_t num_ports,\n+\t\t    uint8_t p_id)\n+{\n+\tstruct rnp_port_attr *attr = &port->attr;\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tuint32_t lane_bit;\n+\n+\tif (port->s_mode == RNP_SHARE_INDEPENDENT) {\n+\t\tattr->max_mac_addrs = RNP_PORT_MAX_MACADDR;\n+\t\tattr->max_uc_mac_hash = RNP_PORT_MAX_UC_MAC_SIZE;\n+\t\tattr->uc_hash_tb_size = RNP_PORT_MAX_UC_HASH_TB;\n+\t\tattr->max_mc_mac_hash = RNP_PORT_MAX_MACADDR;\n+\t\tattr->max_vlan_hash = RNP_PORT_MAX_VLAN_HASH;\n+\t\tattr->hash_table_shift = 26 - (attr->max_uc_mac_hash >> 7);\n+\t} else {\n+\t\tattr->max_mac_addrs = RNP_MAX_MAC_ADDRS / num_ports;\n+\t\tattr->max_uc_mac_hash = RNP_MAX_UC_MAC_SIZE / num_ports;\n+\t\tattr->uc_hash_tb_size = RNP_MAX_UC_HASH_TB;\n+\t\tattr->max_mc_mac_hash = RNP_MAX_MC_MAC_SIZE / num_ports;\n+\t\tattr->mc_hash_tb_size = RNP_MAC_MC_HASH_TB;\n+\t\tattr->max_vlan_hash = RNP_MAX_VLAN_HASH_TB_SIZE / num_ports;\n+\t\tattr->hash_table_shift = RNP_UTA_BIT_SHIFT;\n+\t}\n+\tif (hw->ncsi_en)\n+\t\tattr->uc_hash_tb_size -= hw->ncsi_rar_entries;\n+\tif (hw->device_id == RNP_DEV_ID_N400L_X4) {\n+\t\tattr->max_rx_queues = RNP_N400_MAX_RX_QUEUE_NUM;\n+\t\tattr->max_tx_queues = RNP_N400_MAX_TX_QUEUE_NUM;\n+\t} else {\n+\t\tattr->max_rx_queues = RNP_MAX_RX_QUEUE_NUM / num_ports;\n+\t\tattr->max_tx_queues = RNP_MAX_TX_QUEUE_NUM / num_ports;\n+\t}\n+\n+\tattr->rte_pid = dev->data->port_id;\n+\tlane_bit = hw->phy_port_ids[p_id] & (hw->max_port_num - 1);\n+\n+\tattr->nr_port = lane_bit;\n+\tattr->port_offset = rnp_eth_rd(hw, RNP_TC_PORT_MAP_TB(attr->nr_port));\n+\n+\trnp_mbx_get_lane_stat(dev);\n+\n+\tPMD_DRV_LOG(INFO, \"PF[%d] SW-ETH-PORT[%d]<->PHY_LANE[%d]\\n\",\n+\t\t\thw->function, p_id, lane_bit);\n+}\n+\n+static void\n+rnp_init_filter_setup(struct rnp_eth_port *port,\n+\t\t      uint8_t num_ports)\n+{\n+\tRTE_SET_USED(port);\n+\tRTE_SET_USED(num_ports);\n+}\n+\n static int\n rnp_init_port_resource(struct rnp_eth_adapter *adapter,\n \t\t       struct rte_eth_dev *dev,\n@@ -47,11 +104,53 @@ rnp_init_port_resource(struct rnp_eth_adapter *adapter,\n \t\t       uint8_t p_id)\n {\n \tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\tstruct rte_pci_device *pci_dev = adapter->pdev;\n+\tstruct rnp_hw *hw = &adapter->hw;\n \n+\tport->adapt = adapter;\n+\tport->s_mode = adapter->s_mode;\n+\tport->port_stopped = 1;\n+\tport->hw = hw;\n \tport->eth_dev = dev;\n-\tadapter->ports[p_id] = port;\n+\n+\tdev->device = &pci_dev->device;\n+\trte_eth_copy_pci_info(dev, pci_dev);\n \tdev->dev_ops = &rnp_eth_dev_ops;\n-\tRTE_SET_USED(name);\n+\tdev->rx_queue_count       = rnp_dev_rx_queue_count;\n+\tdev->rx_descriptor_status = rnp_dev_rx_descriptor_status;\n+\tdev->tx_descriptor_status = rnp_dev_tx_descriptor_status;\n+\tdev->rx_pkt_burst = rnp_recv_pkts;\n+\tdev->tx_pkt_burst = rnp_xmit_pkts;\n+\tdev->tx_pkt_prepare = rnp_prep_pkts;\n+\n+\trnp_setup_port_attr(port, dev, adapter->num_ports, p_id);\n+\trnp_init_filter_setup(port, adapter->num_ports);\n+\trnp_get_mac_addr(dev, port->mac_addr);\n+\tdev->data->mac_addrs = rte_zmalloc(name, sizeof(struct rte_ether_addr) *\n+\t\t\tport->attr.max_mac_addrs, 0);\n+\tif (!dev->data->mac_addrs) {\n+\t\tRNP_PMD_DRV_LOG(ERR, \"Memory allocation \"\n+\t\t\t\t\"for MAC failed! Exiting.\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\t/* Allocate memory for storing hash filter MAC addresses */\n+\tdev->data->hash_mac_addrs = rte_zmalloc(name,\n+\t\t\tRTE_ETHER_ADDR_LEN * port->attr.max_uc_mac_hash, 0);\n+\tif (dev->data->hash_mac_addrs == NULL) {\n+\t\tRNP_PMD_INIT_LOG(ERR, \"Failed to allocate %d bytes \"\n+\t\t\t\t\"needed to store MAC addresses\",\n+\t\t\t\tRTE_ETHER_ADDR_LEN * port->attr.max_uc_mac_hash);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\trnp_set_default_mac(dev, port->mac_addr);\n+\trte_ether_addr_copy((const struct rte_ether_addr *)port->mac_addr,\n+\t\t\tdev->data->mac_addrs);\n+\t/* MTU */\n+\tdev->data->mtu = RTE_ETHER_MAX_LEN -\n+\t\tRTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN;\n+\tadapter->ports[p_id] = port;\n+\trte_eth_dev_probing_finish(dev);\n \n \treturn 0;\n }\n@@ -211,9 +310,116 @@ static int32_t rnp_reset_hw_pf(struct rnp_hw *hw)\n \treturn 0;\n }\n \n+static void\n+rnp_mac_res_take_in(struct rnp_eth_port *port,\n+\t\t    uint8_t index)\n+{\n+\tif (!port->mac_use_tb[index]) {\n+\t\tport->mac_use_tb[index] = true;\n+\t\tport->use_num_mac++;\n+\t}\n+}\n+\n+static void\n+rnp_mac_res_remove(struct rnp_eth_port *port,\n+\t\t   uint8_t index)\n+{\n+\tif (port->mac_use_tb[index]) {\n+\t\tport->mac_use_tb[index] = false;\n+\t\tport->use_num_mac--;\n+\t}\n+}\n+\n+static int32_t rnp_set_mac_addr_pf(struct rnp_eth_port *port,\n+\t\t\t\t   uint8_t *mac, uint8_t vm_pool,\n+\t\t\t\t   uint8_t index)\n+{\n+\tstruct rnp_hw *hw = RNP_PORT_TO_HW(port);\n+\tstruct rnp_port_attr *attr = &port->attr;\n+\tuint8_t hw_idx;\n+\tuint32_t value;\n+\n+\tif (port->use_num_mac > port->attr.max_mac_addrs ||\n+\t\t\tindex > port->attr.max_mac_addrs)\n+\t\treturn -ENOMEM;\n+\n+\tif (vm_pool != UINT8_MAX)\n+\t\thw_idx = (attr->nr_port * attr->max_mac_addrs) + vm_pool + index;\n+\telse\n+\t\thw_idx = (attr->nr_port * attr->max_mac_addrs) + index;\n+\n+\trnp_mac_res_take_in(port, hw_idx);\n+\n+\tvalue = (mac[0] << 8) | mac[1];\n+\tvalue |= RNP_MAC_FILTER_EN;\n+\tRNP_MACADDR_UPDATE_HI(hw, hw_idx, value);\n+\n+\tvalue = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5];\n+\tRNP_MACADDR_UPDATE_LO(hw, hw_idx, value);\n+\n+\treturn 0;\n+}\n+\n+static void\n+rnp_remove_mac_from_hw(struct rnp_eth_port *port,\n+\t\t       uint8_t vm_pool, uint8_t index)\n+{\n+\tstruct rnp_hw *hw = RNP_PORT_TO_HW(port);\n+\tstruct rnp_port_attr *attr = &port->attr;\n+\tuint16_t hw_idx;\n+\n+\tif (vm_pool != UINT8_MAX)\n+\t\thw_idx = (attr->nr_port * attr->max_mac_addrs) + vm_pool + index;\n+\telse\n+\t\thw_idx = (attr->nr_port * attr->max_mac_addrs) + index;\n+\n+\trnp_mac_res_remove(port, hw_idx);\n+\n+\trnp_eth_wr(hw, RNP_RAL_BASE_ADDR(hw_idx), 0);\n+\trnp_eth_wr(hw, RNP_RAH_BASE_ADDR(hw_idx), 0);\n+}\n+\n+static int32_t\n+rnp_clear_mac_addr_pf(struct rnp_eth_port *port,\n+\t\t      uint8_t vm_pool, uint8_t index)\n+{\n+\trnp_remove_mac_from_hw(port, vm_pool, index);\n+\n+\treturn 0;\n+}\n+\n+static int32_t rnp_get_mac_addr_pf(struct rnp_eth_port *port,\n+\t\t\t\t   uint8_t lane,\n+\t\t\t\t   uint8_t *macaddr)\n+{\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(port->eth_dev);\n+\n+\treturn rnp_fw_get_macaddr(port->eth_dev, hw->pf_vf_num, macaddr, lane);\n+}\n+\n+static int32_t\n+rnp_set_default_mac_pf(struct rnp_eth_port *port,\n+\t\t       uint8_t *mac)\n+{\n+\tstruct rnp_eth_adapter *adap = RNP_PORT_TO_ADAPTER(port);\n+\tuint16_t max_vfs;\n+\n+\tif (port->s_mode == RNP_SHARE_INDEPENDENT)\n+\t\treturn rnp_set_rafb(port->eth_dev, (uint8_t *)mac,\n+\t\t\t\tUINT8_MAX, 0);\n+\n+\tmax_vfs = adap->max_vfs;\n+\n+\treturn rnp_set_rafb(port->eth_dev, mac, max_vfs, 0);\n+}\n+\n const struct rnp_mac_api rnp_mac_ops = {\n \t.reset_hw\t= rnp_reset_hw_pf,\n-\t.init_hw\t= rnp_init_hw_pf\n+\t.init_hw\t= rnp_init_hw_pf,\n+\t.get_mac_addr\t= rnp_get_mac_addr_pf,\n+\t.set_default_mac = rnp_set_default_mac_pf,\n+\t.set_rafb\t= rnp_set_mac_addr_pf,\n+\t.clear_rafb\t= rnp_clear_mac_addr_pf\n };\n \n static void\n@@ -228,7 +434,11 @@ rnp_common_ops_init(struct rnp_eth_adapter *adapter)\n static int\n rnp_special_ops_init(struct rte_eth_dev *eth_dev)\n {\n-\tRTE_SET_USED(eth_dev);\n+\tstruct rnp_eth_adapter *adapter = RNP_DEV_TO_ADAPTER(eth_dev);\n+\tstruct rnp_share_ops *share_priv;\n+\n+\tshare_priv = adapter->share_priv;\n+\tshare_priv->mac_api = &rnp_mac_ops;\n \n \treturn 0;\n }\n@@ -237,9 +447,9 @@ static int\n rnp_eth_dev_init(struct rte_eth_dev *dev)\n {\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n \tstruct rnp_eth_adapter *adapter = NULL;\n \tchar name[RTE_ETH_NAME_MAX_LEN] = \" \";\n-\tstruct rnp_eth_port *port = NULL;\n \tstruct rte_eth_dev *eth_dev;\n \tstruct rnp_hw *hw = NULL;\n \tint32_t p_id;\n@@ -275,13 +485,13 @@ rnp_eth_dev_init(struct rte_eth_dev *dev)\n \t\treturn ret;\n \t}\n \tadapter->share_priv = dev->process_private;\n+\tport->adapt = adapter;\n \trnp_common_ops_init(adapter);\n+\trnp_init_mbx_ops_pf(hw);\n \trnp_get_nic_attr(adapter);\n \t/* We need Use Device Id To Change The Resource Mode */\n \trnp_special_ops_init(dev);\n-\tport->adapt = adapter;\n \tport->hw = hw;\n-\trnp_init_mbx_ops_pf(hw);\n \tfor (p_id = 0; p_id < adapter->num_ports; p_id++) {\n \t\t/* port 0 resource has been allocated When Probe */\n \t\tif (!p_id) {\ndiff --git a/drivers/net/rnp/rnp_mbx_fw.c b/drivers/net/rnp/rnp_mbx_fw.c\nindex 6fe008351b..856b3f956b 100644\n--- a/drivers/net/rnp/rnp_mbx_fw.c\n+++ b/drivers/net/rnp/rnp_mbx_fw.c\n@@ -269,3 +269,115 @@ int rnp_mbx_fw_reset_phy(struct rte_eth_dev *dev)\n \n \treturn rnp_fw_send_cmd_wait(dev, &req, &reply);\n }\n+\n+int\n+rnp_fw_get_macaddr(struct rte_eth_dev *dev,\n+\t\t   int pfvfnum,\n+\t\t   u8 *mac_addr,\n+\t\t   int nr_lane)\n+{\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct mbx_req_cookie *cookie;\n+\tstruct mbx_fw_cmd_reply reply;\n+\tstruct mbx_fw_cmd_req req;\n+\tstruct mac_addr *mac;\n+\tint err;\n+\n+\tmemset(&req, 0, sizeof(req));\n+\tmemset(&reply, 0, sizeof(reply));\n+\n+\tif (!mac_addr)\n+\t\treturn -EINVAL;\n+\n+\tif (hw->mbx.irq_enabled) {\n+\t\tcookie = rnp_memzone_reserve(hw->cookie_p_name, 0);\n+\t\tif (!cookie)\n+\t\t\treturn -ENOMEM;\n+\t\tmemset(cookie->priv, 0, cookie->priv_len);\n+\t\tmac = (struct mac_addr *)cookie->priv;\n+\t\tbuild_get_macaddress_req(&req, 1 << nr_lane, pfvfnum, cookie);\n+\t\terr = rnp_mbx_fw_post_req(dev, &req, cookie);\n+\t\tif (err)\n+\t\t\tgoto quit;\n+\n+\t\tif ((1 << nr_lane) & mac->lanes) {\n+\t\t\tmemcpy(mac_addr, mac->addrs[nr_lane].mac, 6);\n+\t\t\terr = 0;\n+\t\t} else {\n+\t\t\terr = -EIO;\n+\t\t}\n+quit:\n+\t\treturn err;\n+\t}\n+\tbuild_get_macaddress_req(&req, 1 << nr_lane, pfvfnum, &req);\n+\terr = rnp_fw_send_cmd_wait(dev, &req, &reply);\n+\tif (err) {\n+\t\tRNP_PMD_LOG(ERR, \"%s: failed. err:%d\\n\", __func__, err);\n+\t\treturn err;\n+\t}\n+\n+\tif ((1 << nr_lane) & reply.mac_addr.lanes) {\n+\t\tmemcpy(mac_addr, reply.mac_addr.addrs[nr_lane].mac, 6);\n+\t\treturn 0;\n+\t}\n+\n+\treturn -EIO;\n+}\n+\n+int rnp_mbx_get_lane_stat(struct rte_eth_dev *dev)\n+{\n+\tstruct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);\n+\tstruct rnp_phy_meta *phy_meta = &port->attr.phy_meta;\n+\tstruct rnp_hw *hw = RNP_DEV_TO_HW(dev);\n+\tstruct lane_stat_data *lane_stat;\n+\tint nr_lane = port->attr.nr_lane;\n+\tstruct mbx_req_cookie *cookie;\n+\tstruct mbx_fw_cmd_reply reply;\n+\tstruct mbx_fw_cmd_req req;\n+\tint err = 0;\n+\n+\tmemset(&req, 0, sizeof(req));\n+\n+\tif (hw->mbx.irq_enabled) {\n+\t\tcookie = rnp_memzone_reserve(hw->cookie_p_name, 0);\n+\n+\t\tif (!cookie)\n+\t\t\treturn -ENOMEM;\n+\t\tmemset(cookie->priv, 0, cookie->priv_len);\n+\t\tlane_stat = (struct lane_stat_data *)cookie->priv;\n+\t\tbuild_get_lane_status_req(&req, nr_lane, cookie);\n+\t\terr = rnp_mbx_fw_post_req(dev, &req, cookie);\n+\t\tif (err)\n+\t\t\tgoto quit;\n+\t} else {\n+\t\tmemset(&reply, 0, sizeof(reply));\n+\t\tbuild_get_lane_status_req(&req, nr_lane, &req);\n+\t\terr = rnp_fw_send_cmd_wait(dev, &req, &reply);\n+\t\tif (err)\n+\t\t\tgoto quit;\n+\t\tlane_stat = (struct lane_stat_data *)reply.data;\n+\t}\n+\n+\tphy_meta->supported_link = lane_stat->supported_link;\n+\tphy_meta->is_backplane = lane_stat->is_backplane;\n+\tphy_meta->phy_identifier = lane_stat->phy_addr;\n+\tphy_meta->link_autoneg = lane_stat->autoneg;\n+\tphy_meta->link_duplex = lane_stat->duplex;\n+\tphy_meta->phy_type = lane_stat->phy_type;\n+\tphy_meta->is_sgmii = lane_stat->is_sgmii;\n+\tphy_meta->fec = lane_stat->fec;\n+\n+\tif (phy_meta->is_sgmii) {\n+\t\tphy_meta->media_type = RNP_MEDIA_TYPE_COPPER;\n+\t\tphy_meta->supported_link |=\n+\t\t\tRNP_SPEED_CAP_100M_HALF | RNP_SPEED_CAP_10M_HALF;\n+\t} else if (phy_meta->is_backplane) {\n+\t\tphy_meta->media_type = RNP_MEDIA_TYPE_BACKPLANE;\n+\t} else {\n+\t\tphy_meta->media_type = RNP_MEDIA_TYPE_FIBER;\n+\t}\n+\n+\treturn 0;\n+quit:\n+\treturn err;\n+}\ndiff --git a/drivers/net/rnp/rnp_mbx_fw.h b/drivers/net/rnp/rnp_mbx_fw.h\nindex f842639c86..c4a04a3f09 100644\n--- a/drivers/net/rnp/rnp_mbx_fw.h\n+++ b/drivers/net/rnp/rnp_mbx_fw.h\n@@ -19,7 +19,9 @@ struct mbx_req_cookie {\n enum GENERIC_CMD {\n \t/* link configuration admin commands */\n \tGET_PHY_ABALITY = 0x0601,\n+\tGET_MAC_ADDRESS = 0x0602,\n \tRESET_PHY = 0x0603,\n+\tGET_LANE_STATUS = 0x0610,\n \tSET_EVENT_MASK = 0x0613,\n };\n \n@@ -82,6 +84,61 @@ struct phy_abilities {\n \t};\n } __rte_packed __rte_aligned(4);\n \n+#define RNP_SPEED_CAP_UNKNOWN    (0)\n+#define RNP_SPEED_CAP_10M_FULL   BIT(2)\n+#define RNP_SPEED_CAP_100M_FULL  BIT(3)\n+#define RNP_SPEED_CAP_1GB_FULL   BIT(4)\n+#define RNP_SPEED_CAP_10GB_FULL  BIT(5)\n+#define RNP_SPEED_CAP_40GB_FULL  BIT(6)\n+#define RNP_SPEED_CAP_25GB_FULL  BIT(7)\n+#define RNP_SPEED_CAP_50GB_FULL  BIT(8)\n+#define RNP_SPEED_CAP_100GB_FULL BIT(9)\n+#define RNP_SPEED_CAP_10M_HALF   BIT(10)\n+#define RNP_SPEED_CAP_100M_HALF  BIT(11)\n+#define RNP_SPEED_CAP_1GB_HALF   BIT(12)\n+\n+struct lane_stat_data {\n+\tu8 nr_lane;\t     /* 0-3 cur port correspond with hw lane */\n+\tu8 pci_gen\t: 4; /* nic cur pci speed genX: 1,2,3 */\n+\tu8 pci_lanes\t: 4; /* nic cur pci x1 x2 x4 x8 x16 */\n+\tu8 pma_type;\n+\tu8 phy_type;         /* interface media type */\n+\n+\tu16 linkup\t: 1; /* cur port link state */\n+\tu16 duplex\t: 1; /* duplex state only RJ45 valid */\n+\tu16 autoneg\t: 1; /* autoneg state */\n+\tu16 fec\t\t: 1; /* fec state */\n+\tu16 rev_an\t: 1;\n+\tu16 link_traing     : 1; /* link-traing state */\n+\tu16 media_available : 1;\n+\tu16 is_sgmii        : 1; /* 1: Twisted Pair 0: FIBRE */\n+\tu16 link_fault      : 4;\n+#define LINK_LINK_FAULT   BIT(0)\n+#define LINK_TX_FAULT     BIT(1)\n+#define LINK_RX_FAULT     BIT(2)\n+#define LINK_REMOTE_FAULT BIT(3)\n+\tu16 is_backplane : 1; /* 1: Backplane Mode */\n+\tunion {\n+\t\tu8 phy_addr; /* Phy MDIO address */\n+\t\tstruct {\n+\t\t\tu8 mod_abs : 1;\n+\t\t\tu8 fault   : 1;\n+\t\t\tu8 tx_dis  : 1;\n+\t\t\tu8 los     : 1;\n+\t\t} sfp;\n+\t};\n+\tu8 sfp_connector;\n+\tu32 speed; /* Current Speed Value */\n+\n+\tu32 si_main;\n+\tu32 si_pre;\n+\tu32 si_post;\n+\tu32 si_tx_boost;\n+\tu32 supported_link; /* Cur nic Support Link cap */\n+\tu32 phy_id;\n+\tu32 advertised_link; /* autoneg mode advertised cap */\n+} __rte_packed __rte_aligned(4);\n+\n /* firmware -> driver */\n struct mbx_fw_cmd_reply {\n \t/* fw must set: DD, CMP, Error(if error), copy value */\n@@ -99,6 +156,19 @@ struct mbx_fw_cmd_reply {\n \t};\n \t/* ===== data ==== [16-64] */\n \tunion {\n+\t\tchar data[0];\n+\n+\t\tstruct mac_addr {\n+\t\t\tint lanes;\n+\t\t\tstruct _addr {\n+\t\t\t\t/* for macaddr:01:02:03:04:05:06\n+\t\t\t\t *  mac-hi=0x01020304 mac-lo=0x05060000\n+\t\t\t\t */\n+\t\t\t\tunsigned char mac[8];\n+\t\t\t} addrs[4];\n+\t\t} mac_addr;\n+\n+\t\tstruct lane_stat_data lanestat;\n \t\tstruct phy_abilities phy_abilities;\n \t};\n } __rte_packed __rte_aligned(4);\n@@ -128,10 +198,19 @@ struct mbx_fw_cmd_req {\n #define REQUEST_BY_PXE  0xa3\n \t\t} get_phy_ablity;\n \n+\t\tstruct {\n+\t\t\tint lane_mask;\n+\t\t\tint pfvf_num;\n+\t\t} get_mac_addr;\n+\n \t\tstruct {\n \t\t\tunsigned short enable_stat;\n \t\t\tunsigned short event_mask; /* enum link_event_mask */\n \t\t} stat_event_mask;\n+\n+\t\tstruct {\n+\t\t\tint nr_lane;\n+\t\t} get_lane_st;\n \t};\n } __rte_packed __rte_aligned(4);\n \n@@ -146,6 +225,23 @@ build_phy_abalities_req(struct mbx_fw_cmd_req *req, void *cookie)\n \treq->cookie = cookie;\n }\n \n+static inline void\n+build_get_macaddress_req(struct mbx_fw_cmd_req *req,\n+\t\t\t int lane_mask,\n+\t\t\t int pfvfnum,\n+\t\t\t void *cookie)\n+{\n+\treq->flags = 0;\n+\treq->opcode = GET_MAC_ADDRESS;\n+\treq->datalen = sizeof(req->get_mac_addr);\n+\treq->cookie = cookie;\n+\treq->reply_lo = 0;\n+\treq->reply_hi = 0;\n+\n+\treq->get_mac_addr.lane_mask = lane_mask;\n+\treq->get_mac_addr.pfvf_num = pfvfnum;\n+}\n+\n /* enum link_event_mask or */\n static inline void\n build_link_set_event_mask(struct mbx_fw_cmd_req *req,\n@@ -175,9 +271,28 @@ build_reset_phy_req(struct mbx_fw_cmd_req *req,\n \treq->cookie = cookie;\n }\n \n+static inline void\n+build_get_lane_status_req(struct mbx_fw_cmd_req *req,\n+\t\t\t  int nr_lane, void *cookie)\n+{\n+\treq->flags = 0;\n+\treq->opcode = GET_LANE_STATUS;\n+\treq->datalen = sizeof(req->get_lane_st);\n+\treq->cookie = cookie;\n+\treq->reply_lo = 0;\n+\treq->reply_hi = 0;\n+\treq->get_lane_st.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 int rnp_mbx_link_event_enable(struct rte_eth_dev *dev, int enable);\n int rnp_mbx_fw_reset_phy(struct rte_eth_dev *dev);\n+int\n+rnp_fw_get_macaddr(struct rte_eth_dev *dev,\n+\t\t   int pfvfnum,\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 #endif /* __RNP_MBX_FW_H__*/\ndiff --git a/drivers/net/rnp/rnp_rxtx.c b/drivers/net/rnp/rnp_rxtx.c\nnew file mode 100644\nindex 0000000000..cc27c063ce\n--- /dev/null\n+++ b/drivers/net/rnp/rnp_rxtx.c\n@@ -0,0 +1,82 @@\n+#include <stdbool.h>\n+#include <stdint.h>\n+#include <unistd.h>\n+#include <stdlib.h>\n+#include <assert.h>\n+\n+#include <rte_version.h>\n+#include <rte_ether.h>\n+#include <rte_cycles.h>\n+#include <rte_ethdev.h>\n+#include <rte_malloc.h>\n+#include <rte_memzone.h>\n+#include <rte_vxlan.h>\n+#include <rte_gre.h>\n+#ifdef RTE_ARCH_ARM64\n+#include <rte_cpuflags_64.h>\n+#elif defined(RTE_ARCH_ARM)\n+#include <rte_cpuflags_32.h>\n+#endif\n+\n+#include \"base/rnp_hw.h\"\n+#include \"rnp.h\"\n+#include \"rnp_rxtx.h\"\n+#include \"rnp_logs.h\"\n+\n+int\n+rnp_dev_rx_descriptor_status(void *rx_queue, uint16_t offset)\n+{\n+\tRTE_SET_USED(rx_queue);\n+\tRTE_SET_USED(offset);\n+\n+\treturn 0;\n+}\n+\n+int\n+rnp_dev_tx_descriptor_status(void *tx_queue, uint16_t offset)\n+{\n+\tRTE_SET_USED(tx_queue);\n+\tRTE_SET_USED(offset);\n+\n+\treturn 0;\n+}\n+\n+uint32_t\n+rnp_dev_rx_queue_count(void *rx_queue)\n+{\n+\tRTE_SET_USED(rx_queue);\n+\n+\treturn 0;\n+}\n+\n+__rte_always_inline uint16_t\n+rnp_recv_pkts(void *_rxq,\n+\t      struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n+{\n+\tRTE_SET_USED(_rxq);\n+\tRTE_SET_USED(rx_pkts);\n+\tRTE_SET_USED(nb_pkts);\n+\n+\treturn 0;\n+}\n+\n+__rte_always_inline uint16_t\n+rnp_xmit_pkts(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)\n+{\n+\tRTE_SET_USED(_txq);\n+\tRTE_SET_USED(tx_pkts);\n+\tRTE_SET_USED(nb_pkts);\n+\n+\treturn 0;\n+}\n+\n+uint16_t rnp_prep_pkts(void *tx_queue,\n+\t\t       struct rte_mbuf **tx_pkts,\n+\t\t       uint16_t nb_pkts)\n+{\n+\tRTE_SET_USED(tx_queue);\n+\tRTE_SET_USED(tx_pkts);\n+\tRTE_SET_USED(nb_pkts);\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/net/rnp/rnp_rxtx.h b/drivers/net/rnp/rnp_rxtx.h\nnew file mode 100644\nindex 0000000000..0352971fcb\n--- /dev/null\n+++ b/drivers/net/rnp/rnp_rxtx.h\n@@ -0,0 +1,14 @@\n+#ifndef __RNP_RXTX_H__\n+#define __RNP_RXTX_H__\n+\n+uint32_t rnp_dev_rx_queue_count(void *rx_queue);\n+int rnp_dev_rx_descriptor_status(void *rx_queue, uint16_t offset);\n+int rnp_dev_tx_descriptor_status(void *tx_queue, uint16_t offset);\n+uint16_t\n+rnp_recv_pkts(void *_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);\n+uint16_t\n+rnp_xmit_pkts(void *_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);\n+uint16_t rnp_prep_pkts(void *tx_queue,\n+\t\tstruct rte_mbuf **tx_pkts,\n+\t\tuint16_t nb_pkts);\n+#endif /* __RNP_RXTX_H__ */\n",
    "prefixes": [
        "v6",
        "6/8"
    ]
}