get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 94330,
    "url": "https://patches.dpdk.org/api/patches/94330/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210617110005.4132926-6-jiawenwu@trustnetic.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210617110005.4132926-6-jiawenwu@trustnetic.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210617110005.4132926-6-jiawenwu@trustnetic.com",
    "date": "2021-06-17T10:59:51",
    "name": "[v6,05/19] net/ngbe: set MAC type and LAN ID with device initialization",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "fc290428e205afe8c69d10b8ef23a1716ca8b719",
    "submitter": {
        "id": 1932,
        "url": "https://patches.dpdk.org/api/people/1932/?format=api",
        "name": "Jiawen Wu",
        "email": "jiawenwu@trustnetic.com"
    },
    "delegate": {
        "id": 3961,
        "url": "https://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210617110005.4132926-6-jiawenwu@trustnetic.com/mbox/",
    "series": [
        {
            "id": 17372,
            "url": "https://patches.dpdk.org/api/series/17372/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17372",
            "date": "2021-06-17T10:59:46",
            "name": "net: ngbe PMD",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/17372/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/94330/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/94330/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 B15B2A0C4D;\n\tThu, 17 Jun 2021 12:58:45 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id CBB4F41103;\n\tThu, 17 Jun 2021 12:58:20 +0200 (CEST)",
            "from smtpproxy21.qq.com (smtpbg704.qq.com [203.205.195.105])\n by mails.dpdk.org (Postfix) with ESMTP id AE71B410F3\n for <dev@dpdk.org>; Thu, 17 Jun 2021 12:58:16 +0200 (CEST)",
            "from wxdbg.localdomain.com (unknown [183.129.236.74])\n by esmtp6.qq.com (ESMTP) with\n id ; Thu, 17 Jun 2021 18:58:12 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp46t1623927493t2wbza5a",
        "X-QQ-SSF": "01400000000000D0E000B00A0000000",
        "X-QQ-FEAT": "YKCDl5A3/aqOjOgADts3hqcaPtkbMnW9mRMXu26aln7KSUMmKjDm+rTzo3Ctz\n mIFhWbfny5SW591OikCODWxp4Heb+Qe9+HgDbSt43S+U4vlzNxbZF9KmL+PPm0LRhC1Jya9\n dyJxeZ01LFI+52hjMDO88jxccJeEMmGQQOaX1CdgzMwTQcf9jdG53ZRtpHXoSQm/QpFHomi\n snYONgYstQycmIOw0NoJtYQDqhskajQnmQA2bqH8gVQyBSXGH8veQcFd8Cj8u35FBoFdrIc\n it9i+BdR4HfYRpi2zAmQNnIpMxtNNyVMOXR9jXvJl4Now+Ou0TEZ8Mj/qlPnUo6tznn94hP\n fppU2NRXtEjptRVBT8bT7pvfXfDsL02xg3Po4Nl",
        "X-QQ-GoodBg": "2",
        "From": "Jiawen Wu <jiawenwu@trustnetic.com>",
        "To": "dev@dpdk.org",
        "Cc": "Jiawen Wu <jiawenwu@trustnetic.com>",
        "Date": "Thu, 17 Jun 2021 18:59:51 +0800",
        "Message-Id": "<20210617110005.4132926-6-jiawenwu@trustnetic.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20210617110005.4132926-1-jiawenwu@trustnetic.com>",
        "References": "<20210617110005.4132926-1-jiawenwu@trustnetic.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "bizesmtp:trustnetic.com:qybgforeign:qybgforeign1",
        "X-QQ-Bgrelay": "1",
        "Subject": "[dpdk-dev] [PATCH v6 05/19] net/ngbe: set MAC type and LAN ID with\n device initialization",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add basic init and uninit function.\nMap device IDs and subsystem IDs to single ID for easy operation.\nThen initialize the shared code.\n\nSigned-off-by: Jiawen Wu <jiawenwu@trustnetic.com>\n---\n drivers/net/ngbe/base/meson.build  |   4 +-\n drivers/net/ngbe/base/ngbe.h       |  11 ++\n drivers/net/ngbe/base/ngbe_dummy.h |  37 ++++++\n drivers/net/ngbe/base/ngbe_hw.c    | 182 ++++++++++++++++++++++++++++\n drivers/net/ngbe/base/ngbe_hw.h    |  18 +++\n drivers/net/ngbe/base/ngbe_osdep.h | 183 +++++++++++++++++++++++++++++\n drivers/net/ngbe/base/ngbe_type.h  |  78 ++++++++++++\n drivers/net/ngbe/ngbe_ethdev.c     |  39 +++++-\n drivers/net/ngbe/ngbe_ethdev.h     |  19 ++-\n 9 files changed, 565 insertions(+), 6 deletions(-)\n create mode 100644 drivers/net/ngbe/base/ngbe.h\n create mode 100644 drivers/net/ngbe/base/ngbe_dummy.h\n create mode 100644 drivers/net/ngbe/base/ngbe_hw.c\n create mode 100644 drivers/net/ngbe/base/ngbe_hw.h\n create mode 100644 drivers/net/ngbe/base/ngbe_osdep.h\n create mode 100644 drivers/net/ngbe/base/ngbe_type.h",
    "diff": "diff --git a/drivers/net/ngbe/base/meson.build b/drivers/net/ngbe/base/meson.build\nindex c5f6467743..fdbfa99916 100644\n--- a/drivers/net/ngbe/base/meson.build\n+++ b/drivers/net/ngbe/base/meson.build\n@@ -1,7 +1,9 @@\n # SPDX-License-Identifier: BSD-3-Clause\n # Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n \n-sources = []\n+sources = [\n+\t'ngbe_hw.c',\n+]\n \n error_cflags = []\n \ndiff --git a/drivers/net/ngbe/base/ngbe.h b/drivers/net/ngbe/base/ngbe.h\nnew file mode 100644\nindex 0000000000..63fad12ad3\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe.h\n@@ -0,0 +1,11 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ */\n+\n+#ifndef _NGBE_H_\n+#define _NGBE_H_\n+\n+#include \"ngbe_type.h\"\n+#include \"ngbe_hw.h\"\n+\n+#endif /* _NGBE_H_ */\ndiff --git a/drivers/net/ngbe/base/ngbe_dummy.h b/drivers/net/ngbe/base/ngbe_dummy.h\nnew file mode 100644\nindex 0000000000..75b4e50bca\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe_dummy.h\n@@ -0,0 +1,37 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ */\n+\n+#ifndef _NGBE_TYPE_DUMMY_H_\n+#define _NGBE_TYPE_DUMMY_H_\n+\n+#ifdef TUP\n+#elif defined(__GNUC__)\n+#define TUP(x) x##_unused ngbe_unused\n+#elif defined(__LCLINT__)\n+#define TUP(x) x /*@unused@*/\n+#else\n+#define TUP(x) x\n+#endif /*TUP*/\n+#define TUP0 TUP(p0)\n+#define TUP1 TUP(p1)\n+#define TUP2 TUP(p2)\n+#define TUP3 TUP(p3)\n+#define TUP4 TUP(p4)\n+#define TUP5 TUP(p5)\n+#define TUP6 TUP(p6)\n+#define TUP7 TUP(p7)\n+#define TUP8 TUP(p8)\n+#define TUP9 TUP(p9)\n+\n+/* struct ngbe_bus_operations */\n+static inline void ngbe_bus_set_lan_id_dummy(struct ngbe_hw *TUP0)\n+{\n+}\n+static inline void ngbe_init_ops_dummy(struct ngbe_hw *hw)\n+{\n+\thw->bus.set_lan_id = ngbe_bus_set_lan_id_dummy;\n+}\n+\n+#endif /* _NGBE_TYPE_DUMMY_H_ */\n+\ndiff --git a/drivers/net/ngbe/base/ngbe_hw.c b/drivers/net/ngbe/base/ngbe_hw.c\nnew file mode 100644\nindex 0000000000..014bb0faee\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe_hw.c\n@@ -0,0 +1,182 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ * Copyright(c) 2010-2017 Intel Corporation\n+ */\n+\n+#include \"ngbe_type.h\"\n+#include \"ngbe_hw.h\"\n+\n+/**\n+ *  ngbe_set_lan_id_multi_port - Set LAN id for PCIe multiple port devices\n+ *  @hw: pointer to the HW structure\n+ *\n+ *  Determines the LAN function id by reading memory-mapped registers and swaps\n+ *  the port value if requested, and set MAC instance for devices.\n+ **/\n+void ngbe_set_lan_id_multi_port(struct ngbe_hw *hw)\n+{\n+\tstruct ngbe_bus_info *bus = &hw->bus;\n+\tu32 reg = 0;\n+\n+\tDEBUGFUNC(\"ngbe_set_lan_id_multi_port\");\n+\n+\treg = rd32(hw, NGBE_PORTSTAT);\n+\tbus->lan_id = NGBE_PORTSTAT_ID(reg);\n+\tbus->func = bus->lan_id;\n+}\n+\n+/**\n+ *  ngbe_set_mac_type - Sets MAC type\n+ *  @hw: pointer to the HW structure\n+ *\n+ *  This function sets the mac type of the adapter based on the\n+ *  vendor ID and device ID stored in the hw structure.\n+ **/\n+s32 ngbe_set_mac_type(struct ngbe_hw *hw)\n+{\n+\ts32 err = 0;\n+\n+\tDEBUGFUNC(\"ngbe_set_mac_type\");\n+\n+\tif (hw->vendor_id != PCI_VENDOR_ID_WANGXUN) {\n+\t\tDEBUGOUT(\"Unsupported vendor id: %x\", hw->vendor_id);\n+\t\treturn NGBE_ERR_DEVICE_NOT_SUPPORTED;\n+\t}\n+\n+\tswitch (hw->sub_device_id) {\n+\tcase NGBE_SUB_DEV_ID_EM_RTL_SGMII:\n+\tcase NGBE_SUB_DEV_ID_EM_MVL_RGMII:\n+\t\thw->phy.media_type = ngbe_media_type_copper;\n+\t\thw->mac.type = ngbe_mac_em;\n+\t\tbreak;\n+\tcase NGBE_SUB_DEV_ID_EM_MVL_SFP:\n+\tcase NGBE_SUB_DEV_ID_EM_YT8521S_SFP:\n+\t\thw->phy.media_type = ngbe_media_type_fiber;\n+\t\thw->mac.type = ngbe_mac_em;\n+\t\tbreak;\n+\tcase NGBE_SUB_DEV_ID_EM_VF:\n+\t\thw->phy.media_type = ngbe_media_type_virtual;\n+\t\thw->mac.type = ngbe_mac_em_vf;\n+\t\tbreak;\n+\tdefault:\n+\t\terr = NGBE_ERR_DEVICE_NOT_SUPPORTED;\n+\t\thw->phy.media_type = ngbe_media_type_unknown;\n+\t\thw->mac.type = ngbe_mac_unknown;\n+\t\tDEBUGOUT(\"Unsupported device id: %x\", hw->device_id);\n+\t\tbreak;\n+\t}\n+\n+\tDEBUGOUT(\"found mac: %d media: %d, returns: %d\\n\",\n+\t\t  hw->mac.type, hw->phy.media_type, err);\n+\treturn err;\n+}\n+\n+void ngbe_map_device_id(struct ngbe_hw *hw)\n+{\n+\tu16 oem = hw->sub_system_id & NGBE_OEM_MASK;\n+\tu16 internal = hw->sub_system_id & NGBE_INTERNAL_MASK;\n+\thw->is_pf = true;\n+\n+\t/* move subsystem_device_id to device_id */\n+\tswitch (hw->device_id) {\n+\tcase NGBE_DEV_ID_EM_WX1860AL_W_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A2_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A2S_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A4_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A4S_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860AL2_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860AL2S_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860AL4_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860AL4S_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860NCSI_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A1_VF:\n+\tcase NGBE_DEV_ID_EM_WX1860A1L_VF:\n+\t\thw->device_id = NGBE_DEV_ID_EM_VF;\n+\t\thw->sub_device_id = NGBE_SUB_DEV_ID_EM_VF;\n+\t\thw->is_pf = false;\n+\t\tbreak;\n+\tcase NGBE_DEV_ID_EM_WX1860AL_W:\n+\tcase NGBE_DEV_ID_EM_WX1860A2:\n+\tcase NGBE_DEV_ID_EM_WX1860A2S:\n+\tcase NGBE_DEV_ID_EM_WX1860A4:\n+\tcase NGBE_DEV_ID_EM_WX1860A4S:\n+\tcase NGBE_DEV_ID_EM_WX1860AL2:\n+\tcase NGBE_DEV_ID_EM_WX1860AL2S:\n+\tcase NGBE_DEV_ID_EM_WX1860AL4:\n+\tcase NGBE_DEV_ID_EM_WX1860AL4S:\n+\tcase NGBE_DEV_ID_EM_WX1860NCSI:\n+\tcase NGBE_DEV_ID_EM_WX1860A1:\n+\tcase NGBE_DEV_ID_EM_WX1860A1L:\n+\t\thw->device_id = NGBE_DEV_ID_EM;\n+\t\tif (oem == NGBE_LY_M88E1512_SFP ||\n+\t\t\t\tinternal == NGBE_INTERNAL_SFP)\n+\t\t\thw->sub_device_id = NGBE_SUB_DEV_ID_EM_MVL_SFP;\n+\t\telse if (hw->sub_system_id == NGBE_SUB_DEV_ID_EM_M88E1512_RJ45)\n+\t\t\thw->sub_device_id = NGBE_SUB_DEV_ID_EM_MVL_RGMII;\n+\t\telse if (oem == NGBE_YT8521S_SFP ||\n+\t\t\t\toem == NGBE_LY_YT8521S_SFP)\n+\t\t\thw->sub_device_id = NGBE_SUB_DEV_ID_EM_YT8521S_SFP;\n+\t\telse\n+\t\t\thw->sub_device_id = NGBE_SUB_DEV_ID_EM_RTL_SGMII;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+}\n+\n+/**\n+ *  ngbe_init_ops_pf - Inits func ptrs and MAC type\n+ *  @hw: pointer to hardware structure\n+ *\n+ *  Initialize the function pointers and assign the MAC type.\n+ *  Does not touch the hardware.\n+ **/\n+s32 ngbe_init_ops_pf(struct ngbe_hw *hw)\n+{\n+\tstruct ngbe_bus_info *bus = &hw->bus;\n+\n+\tDEBUGFUNC(\"ngbe_init_ops_pf\");\n+\n+\t/* BUS */\n+\tbus->set_lan_id = ngbe_set_lan_id_multi_port;\n+\n+\treturn 0;\n+}\n+\n+/**\n+ *  ngbe_init_shared_code - Initialize the shared code\n+ *  @hw: pointer to hardware structure\n+ *\n+ *  This will assign function pointers and assign the MAC type and PHY code.\n+ *  Does not touch the hardware. This function must be called prior to any\n+ *  other function in the shared code. The ngbe_hw structure should be\n+ *  memset to 0 prior to calling this function.  The following fields in\n+ *  hw structure should be filled in prior to calling this function:\n+ *  hw_addr, back, device_id, vendor_id, subsystem_device_id\n+ **/\n+s32 ngbe_init_shared_code(struct ngbe_hw *hw)\n+{\n+\ts32 status = 0;\n+\n+\tDEBUGFUNC(\"ngbe_init_shared_code\");\n+\n+\t/*\n+\t * Set the mac type\n+\t */\n+\tngbe_set_mac_type(hw);\n+\n+\tngbe_init_ops_dummy(hw);\n+\tswitch (hw->mac.type) {\n+\tcase ngbe_mac_em:\n+\t\tngbe_init_ops_pf(hw);\n+\t\tbreak;\n+\tdefault:\n+\t\tstatus = NGBE_ERR_DEVICE_NOT_SUPPORTED;\n+\t\tbreak;\n+\t}\n+\n+\thw->bus.set_lan_id(hw);\n+\n+\treturn status;\n+}\n+\ndiff --git a/drivers/net/ngbe/base/ngbe_hw.h b/drivers/net/ngbe/base/ngbe_hw.h\nnew file mode 100644\nindex 0000000000..7d5de49248\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe_hw.h\n@@ -0,0 +1,18 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ * Copyright(c) 2010-2017 Intel Corporation\n+ */\n+\n+#ifndef _NGBE_HW_H_\n+#define _NGBE_HW_H_\n+\n+#include \"ngbe_type.h\"\n+\n+void ngbe_set_lan_id_multi_port(struct ngbe_hw *hw);\n+\n+s32 ngbe_init_shared_code(struct ngbe_hw *hw);\n+s32 ngbe_set_mac_type(struct ngbe_hw *hw);\n+s32 ngbe_init_ops_pf(struct ngbe_hw *hw);\n+void ngbe_map_device_id(struct ngbe_hw *hw);\n+\n+#endif /* _NGBE_HW_H_ */\ndiff --git a/drivers/net/ngbe/base/ngbe_osdep.h b/drivers/net/ngbe/base/ngbe_osdep.h\nnew file mode 100644\nindex 0000000000..215a953081\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe_osdep.h\n@@ -0,0 +1,183 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ * Copyright(c) 2010-2017 Intel Corporation\n+ */\n+\n+#ifndef _NGBE_OS_H_\n+#define _NGBE_OS_H_\n+\n+#include <string.h>\n+#include <stdint.h>\n+#include <stdio.h>\n+#include <stdarg.h>\n+#include <rte_version.h>\n+#include <rte_common.h>\n+#include <rte_debug.h>\n+#include <rte_cycles.h>\n+#include <rte_log.h>\n+#include <rte_byteorder.h>\n+#include <rte_config.h>\n+#include <rte_io.h>\n+#include <rte_ether.h>\n+\n+#include \"../ngbe_logs.h\"\n+\n+#define RTE_LIBRTE_NGBE_TM        DCPV(1, 0)\n+#define TMZ_PADDR(mz)  ((mz)->iova)\n+#define TMZ_VADDR(mz)  ((mz)->addr)\n+#define TDEV_NAME(eth_dev)  ((eth_dev)->device->name)\n+\n+#define ASSERT(x) do {\t\t\t\\\n+\tif (!(x))\t\t\t\\\n+\t\tPMD_DRV_LOG(ERR, \"NGBE: %d\", x);\t\\\n+} while (0)\n+\n+#define ngbe_unused __rte_unused\n+\n+#define usec_delay(x) rte_delay_us(x)\n+#define msec_delay(x) rte_delay_ms(x)\n+#define usleep(x)     rte_delay_us(x)\n+#define msleep(x)     rte_delay_ms(x)\n+\n+#define FALSE               0\n+#define TRUE                1\n+\n+#ifndef false\n+#define false               0\n+#endif\n+#ifndef true\n+#define true                1\n+#endif\n+#define min(a, b)\tRTE_MIN(a, b)\n+#define max(a, b)\tRTE_MAX(a, b)\n+\n+/* Bunch of defines for shared code bogosity */\n+\n+static inline void UNREFERENCED(const char *a __rte_unused, ...) {}\n+#define UNREFERENCED_PARAMETER(args...) UNREFERENCED(\"\", ##args)\n+\n+#define STATIC static\n+\n+typedef uint8_t\t\tu8;\n+typedef int8_t\t\ts8;\n+typedef uint16_t\tu16;\n+typedef int16_t\t\ts16;\n+typedef uint32_t\tu32;\n+typedef int32_t\t\ts32;\n+typedef uint64_t\tu64;\n+typedef int64_t\t\ts64;\n+\n+/* Little Endian defines */\n+#ifndef __le16\n+#define __le16  u16\n+#define __le32  u32\n+#define __le64  u64\n+#endif\n+#ifndef __be16\n+#define __be16  u16\n+#define __be32  u32\n+#define __be64  u64\n+#endif\n+\n+/* Bit shift and mask */\n+#define BIT_MASK4                 (0x0000000FU)\n+#define BIT_MASK8                 (0x000000FFU)\n+#define BIT_MASK16                (0x0000FFFFU)\n+#define BIT_MASK32                (0xFFFFFFFFU)\n+#define BIT_MASK64                (0xFFFFFFFFFFFFFFFFUL)\n+\n+#ifndef cpu_to_le32\n+#define cpu_to_le16(v)          rte_cpu_to_le_16((u16)(v))\n+#define cpu_to_le32(v)          rte_cpu_to_le_32((u32)(v))\n+#define cpu_to_le64(v)          rte_cpu_to_le_64((u64)(v))\n+#define le_to_cpu16(v)          rte_le_to_cpu_16((u16)(v))\n+#define le_to_cpu32(v)          rte_le_to_cpu_32((u32)(v))\n+#define le_to_cpu64(v)          rte_le_to_cpu_64((u64)(v))\n+\n+#define cpu_to_be16(v)          rte_cpu_to_be_16((u16)(v))\n+#define cpu_to_be32(v)          rte_cpu_to_be_32((u32)(v))\n+#define cpu_to_be64(v)          rte_cpu_to_be_64((u64)(v))\n+#define be_to_cpu16(v)          rte_be_to_cpu_16((u16)(v))\n+#define be_to_cpu32(v)          rte_be_to_cpu_32((u32)(v))\n+#define be_to_cpu64(v)          rte_be_to_cpu_64((u64)(v))\n+\n+#define le_to_be16(v)           rte_bswap16((u16)(v))\n+#define le_to_be32(v)           rte_bswap32((u32)(v))\n+#define le_to_be64(v)           rte_bswap64((u64)(v))\n+#define be_to_le16(v)           rte_bswap16((u16)(v))\n+#define be_to_le32(v)           rte_bswap32((u32)(v))\n+#define be_to_le64(v)           rte_bswap64((u64)(v))\n+\n+#define npu_to_le16(v)          (v)\n+#define npu_to_le32(v)          (v)\n+#define npu_to_le64(v)          (v)\n+#define le_to_npu16(v)          (v)\n+#define le_to_npu32(v)          (v)\n+#define le_to_npu64(v)          (v)\n+\n+#define npu_to_be16(v)          le_to_be16((u16)(v))\n+#define npu_to_be32(v)          le_to_be32((u32)(v))\n+#define npu_to_be64(v)          le_to_be64((u64)(v))\n+#define be_to_npu16(v)          be_to_le16((u16)(v))\n+#define be_to_npu32(v)          be_to_le32((u32)(v))\n+#define be_to_npu64(v)          be_to_le64((u64)(v))\n+#endif /* !cpu_to_le32 */\n+\n+static inline u16 REVERT_BIT_MASK16(u16 mask)\n+{\n+\tmask = ((mask & 0x5555) << 1) | ((mask & 0xAAAA) >> 1);\n+\tmask = ((mask & 0x3333) << 2) | ((mask & 0xCCCC) >> 2);\n+\tmask = ((mask & 0x0F0F) << 4) | ((mask & 0xF0F0) >> 4);\n+\treturn ((mask & 0x00FF) << 8) | ((mask & 0xFF00) >> 8);\n+}\n+\n+static inline u32 REVERT_BIT_MASK32(u32 mask)\n+{\n+\tmask = ((mask & 0x55555555) << 1) | ((mask & 0xAAAAAAAA) >> 1);\n+\tmask = ((mask & 0x33333333) << 2) | ((mask & 0xCCCCCCCC) >> 2);\n+\tmask = ((mask & 0x0F0F0F0F) << 4) | ((mask & 0xF0F0F0F0) >> 4);\n+\tmask = ((mask & 0x00FF00FF) << 8) | ((mask & 0xFF00FF00) >> 8);\n+\treturn ((mask & 0x0000FFFF) << 16) | ((mask & 0xFFFF0000) >> 16);\n+}\n+\n+static inline u64 REVERT_BIT_MASK64(u64 mask)\n+{\n+\tmask = ((mask & 0x5555555555555555) << 1) |\n+\t       ((mask & 0xAAAAAAAAAAAAAAAA) >> 1);\n+\tmask = ((mask & 0x3333333333333333) << 2) |\n+\t       ((mask & 0xCCCCCCCCCCCCCCCC) >> 2);\n+\tmask = ((mask & 0x0F0F0F0F0F0F0F0F) << 4) |\n+\t       ((mask & 0xF0F0F0F0F0F0F0F0) >> 4);\n+\tmask = ((mask & 0x00FF00FF00FF00FF) << 8) |\n+\t       ((mask & 0xFF00FF00FF00FF00) >> 8);\n+\tmask = ((mask & 0x0000FFFF0000FFFF) << 16) |\n+\t       ((mask & 0xFFFF0000FFFF0000) >> 16);\n+\treturn ((mask & 0x00000000FFFFFFFF) << 32) |\n+\t       ((mask & 0xFFFFFFFF00000000) >> 32);\n+}\n+\n+#define IOMEM\n+\n+#define prefetch(x) rte_prefetch0(x)\n+\n+#define ARRAY_SIZE(x) ((int32_t)RTE_DIM(x))\n+\n+#ifndef MAX_UDELAY_MS\n+#define MAX_UDELAY_MS 5\n+#endif\n+\n+#define ETH_ADDR_LEN\t6\n+#define ETH_FCS_LEN\t4\n+\n+/* Check whether address is multicast. This is little-endian specific check.*/\n+#define NGBE_IS_MULTICAST(address) \\\n+\t\trte_is_multicast_ether_addr(address)\n+\n+/* Check whether an address is broadcast. */\n+#define NGBE_IS_BROADCAST(address) \\\n+\t\trte_is_broadcast_ether_addr(address)\n+\n+#define ETH_P_8021Q      0x8100\n+#define ETH_P_8021AD     0x88A8\n+\n+#endif /* _NGBE_OS_H_ */\ndiff --git a/drivers/net/ngbe/base/ngbe_type.h b/drivers/net/ngbe/base/ngbe_type.h\nnew file mode 100644\nindex 0000000000..d172f2702f\n--- /dev/null\n+++ b/drivers/net/ngbe/base/ngbe_type.h\n@@ -0,0 +1,78 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018-2020 Beijing WangXun Technology Co., Ltd.\n+ * Copyright(c) 2010-2017 Intel Corporation\n+ */\n+\n+#ifndef _NGBE_TYPE_H_\n+#define _NGBE_TYPE_H_\n+\n+#include \"ngbe_status.h\"\n+#include \"ngbe_osdep.h\"\n+#include \"ngbe_devids.h\"\n+\n+enum ngbe_mac_type {\n+\tngbe_mac_unknown = 0,\n+\tngbe_mac_em,\n+\tngbe_mac_em_vf,\n+\tngbe_num_macs\n+};\n+\n+enum ngbe_phy_type {\n+\tngbe_phy_unknown = 0,\n+\tngbe_phy_none,\n+\tngbe_phy_rtl,\n+\tngbe_phy_mvl,\n+\tngbe_phy_mvl_sfi,\n+\tngbe_phy_yt8521s,\n+\tngbe_phy_yt8521s_sfi,\n+\tngbe_phy_zte,\n+\tngbe_phy_cu_mtd,\n+};\n+\n+enum ngbe_media_type {\n+\tngbe_media_type_unknown = 0,\n+\tngbe_media_type_fiber,\n+\tngbe_media_type_fiber_qsfp,\n+\tngbe_media_type_copper,\n+\tngbe_media_type_backplane,\n+\tngbe_media_type_cx4,\n+\tngbe_media_type_virtual\n+};\n+\n+struct ngbe_hw;\n+\n+/* Bus parameters */\n+struct ngbe_bus_info {\n+\tvoid (*set_lan_id)(struct ngbe_hw *hw);\n+\n+\tu16 func;\n+\tu8 lan_id;\n+};\n+\n+struct ngbe_mac_info {\n+\tenum ngbe_mac_type type;\n+};\n+\n+struct ngbe_phy_info {\n+\tenum ngbe_media_type media_type;\n+\tenum ngbe_phy_type type;\n+};\n+\n+struct ngbe_hw {\n+\tvoid IOMEM *hw_addr;\n+\tvoid *back;\n+\tstruct ngbe_mac_info mac;\n+\tstruct ngbe_phy_info phy;\n+\tstruct ngbe_bus_info bus;\n+\tu16 device_id;\n+\tu16 vendor_id;\n+\tu16 sub_device_id;\n+\tu16 sub_system_id;\n+\n+\tbool is_pf;\n+};\n+\n+#include \"ngbe_regs.h\"\n+#include \"ngbe_dummy.h\"\n+\n+#endif /* _NGBE_TYPE_H_ */\ndiff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c\nindex e05766752a..a355c7dc29 100644\n--- a/drivers/net/ngbe/ngbe_ethdev.c\n+++ b/drivers/net/ngbe/ngbe_ethdev.c\n@@ -8,9 +8,11 @@\n #include <ethdev_pci.h>\n \n #include \"ngbe_logs.h\"\n-#include <base/ngbe_devids.h>\n+#include \"base/ngbe.h\"\n #include \"ngbe_ethdev.h\"\n \n+static int ngbe_dev_close(struct rte_eth_dev *dev);\n+\n /*\n  * The set of PCI devices this driver supports\n  */\n@@ -34,6 +36,8 @@ static int\n eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)\n {\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n+\tstruct ngbe_hw *hw = ngbe_dev_hw(eth_dev);\n+\tint err;\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -42,7 +46,21 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)\n \n \trte_eth_copy_pci_info(eth_dev, pci_dev);\n \n-\treturn -EINVAL;\n+\t/* Vendor and Device ID need to be set before init of shared code */\n+\thw->device_id = pci_dev->id.device_id;\n+\thw->vendor_id = pci_dev->id.vendor_id;\n+\thw->sub_system_id = pci_dev->id.subsystem_device_id;\n+\tngbe_map_device_id(hw);\n+\thw->hw_addr = (void *)pci_dev->mem_resource[0].addr;\n+\n+\t/* Initialize the shared code (base driver) */\n+\terr = ngbe_init_shared_code(hw);\n+\tif (err != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Shared code init failed: %d\", err);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n }\n \n static int\n@@ -53,9 +71,9 @@ eth_ngbe_dev_uninit(struct rte_eth_dev *eth_dev)\n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n \t\treturn 0;\n \n-\tRTE_SET_USED(eth_dev);\n+\tngbe_dev_close(eth_dev);\n \n-\treturn -EINVAL;\n+\treturn 0;\n }\n \n static int\n@@ -86,6 +104,19 @@ static struct rte_pci_driver rte_ngbe_pmd = {\n \t.remove = eth_ngbe_pci_remove,\n };\n \n+/*\n+ * Reset and stop device.\n+ */\n+static int\n+ngbe_dev_close(struct rte_eth_dev *dev)\n+{\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tRTE_SET_USED(dev);\n+\n+\treturn -EINVAL;\n+}\n+\n RTE_PMD_REGISTER_PCI(net_ngbe, rte_ngbe_pmd);\n RTE_PMD_REGISTER_PCI_TABLE(net_ngbe, pci_id_ngbe_map);\n RTE_PMD_REGISTER_KMOD_DEP(net_ngbe, \"* igb_uio | uio_pci_generic | vfio-pci\");\ndiff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h\nindex 38f55f7fb1..d4d02c6bd8 100644\n--- a/drivers/net/ngbe/ngbe_ethdev.h\n+++ b/drivers/net/ngbe/ngbe_ethdev.h\n@@ -10,7 +10,24 @@\n  * Structure to store private data for each driver instance (for each port).\n  */\n struct ngbe_adapter {\n-\tvoid *back;\n+\tstruct ngbe_hw             hw;\n };\n \n+static inline struct ngbe_adapter *\n+ngbe_dev_adapter(struct rte_eth_dev *dev)\n+{\n+\tstruct ngbe_adapter *ad = dev->data->dev_private;\n+\n+\treturn ad;\n+}\n+\n+static inline struct ngbe_hw *\n+ngbe_dev_hw(struct rte_eth_dev *dev)\n+{\n+\tstruct ngbe_adapter *ad = ngbe_dev_adapter(dev);\n+\tstruct ngbe_hw *hw = &ad->hw;\n+\n+\treturn hw;\n+}\n+\n #endif /* _NGBE_ETHDEV_H_ */\n",
    "prefixes": [
        "v6",
        "05/19"
    ]
}