get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 79625,
    "url": "https://patches.dpdk.org/api/patches/79625/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201005120910.189343-9-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": "<20201005120910.189343-9-jiawenwu@trustnetic.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201005120910.189343-9-jiawenwu@trustnetic.com",
    "date": "2020-10-05T12:08:22",
    "name": "[v2,08/56] net/txgbe: add HW init and reset operation",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "e859e709f8f23b1ca551d4c99550f2ff24cac4f6",
    "submitter": {
        "id": 1932,
        "url": "https://patches.dpdk.org/api/people/1932/?format=api",
        "name": "Jiawen Wu",
        "email": "jiawenwu@trustnetic.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20201005120910.189343-9-jiawenwu@trustnetic.com/mbox/",
    "series": [
        {
            "id": 12690,
            "url": "https://patches.dpdk.org/api/series/12690/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=12690",
            "date": "2020-10-05T12:08:14",
            "name": "net: txgbe PMD",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/12690/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/79625/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/79625/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id AF5C1A04B1;\n\tMon,  5 Oct 2020 14:12:01 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 493291BAA8;\n\tMon,  5 Oct 2020 14:09:02 +0200 (CEST)",
            "from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166])\n by dpdk.org (Postfix) with ESMTP id EB3D91BA7F\n for <dev@dpdk.org>; Mon,  5 Oct 2020 14:08:56 +0200 (CEST)",
            "from localhost.localdomain.com (unknown [183.129.236.74])\n by esmtp6.qq.com (ESMTP) with\n id ; Mon, 05 Oct 2020 20:08:49 +0800 (CST)"
        ],
        "X-QQ-mid": "bizesmtp9t1601899730tsszzm1js",
        "X-QQ-SSF": "01400000002000C0C000B00A0000000",
        "X-QQ-FEAT": "vXHWdJQTAMezvgVgM8uQEGoThrzbmVMoATc0IloNEckrEq7CGopaNwZuAeUDp\n Bfdzm3gtSzMM2TAdnYO1MzD4ruBkV0azdpGfEQ2zUbffrjIFL+KWE5zLENmj9RTLTltQEZd\n pzDlUZ+UyWRqQ1HKgfoqz92ZEetRQrdnOKW/XBUepTuyPMSfe+aiw/+lt0TY/vrbldc6OQC\n RBneMM4TjebvBItgeuH9RczR1wJ4pTwCAGL04Kz/sUiTMiOHGWbNzqPDLifziaQY11/Do9e\n Hww7yBLvpKq6gR4L/aREF0R8csMct+1LHuGM/Zx3u4ieywP2JQfFeTdOu3rZau70kKrVgpB\n FfBYqVkznv5L47tRlU=",
        "X-QQ-GoodBg": "2",
        "From": "Jiawen Wu <jiawenwu@trustnetic.com>",
        "To": "dev@dpdk.org",
        "Cc": "jiawenwu <jiawenwu@trustnetic.com>",
        "Date": "Mon,  5 Oct 2020 20:08:22 +0800",
        "Message-Id": "<20201005120910.189343-9-jiawenwu@trustnetic.com>",
        "X-Mailer": "git-send-email 2.18.4",
        "In-Reply-To": "<20201005120910.189343-1-jiawenwu@trustnetic.com>",
        "References": "<20201005120910.189343-1-jiawenwu@trustnetic.com>",
        "X-QQ-SENDSIZE": "520",
        "Feedback-ID": "bizesmtp:trustnetic.com:qybgforeign:qybgforeign7",
        "X-QQ-Bgrelay": "1",
        "Subject": "[dpdk-dev] [PATCH v2 08/56] net/txgbe: add HW init and reset\n\toperation",
        "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 <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": "From: jiawenwu <jiawenwu@trustnetic.com>\n\nAdd hardware init function adn reset operation in mac layer.\n\nSigned-off-by: jiawenwu <jiawenwu@trustnetic.com>\n---\n drivers/net/txgbe/base/txgbe_hw.c   | 260 ++++++++++++++++++++++++++++\n drivers/net/txgbe/base/txgbe_hw.h   |   6 +-\n drivers/net/txgbe/base/txgbe_type.h |  15 ++\n drivers/net/txgbe/txgbe_ethdev.c    |  34 ++++\n 4 files changed, 314 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/txgbe/base/txgbe_hw.c b/drivers/net/txgbe/base/txgbe_hw.c\nindex 4132266e0..58bf9cea8 100644\n--- a/drivers/net/txgbe/base/txgbe_hw.c\n+++ b/drivers/net/txgbe/base/txgbe_hw.c\n@@ -4,10 +4,44 @@\n \n #include \"txgbe_type.h\"\n #include \"txgbe_eeprom.h\"\n+#include \"txgbe_mng.h\"\n #include \"txgbe_hw.h\"\n \n #define TXGBE_RAPTOR_RAR_ENTRIES   128\n \n+/**\n+ *  txgbe_init_hw - Generic hardware initialization\n+ *  @hw: pointer to hardware structure\n+ *\n+ *  Initialize the hardware by resetting the hardware, filling the bus info\n+ *  structure and media type, clears all on chip counters, initializes receive\n+ *  address registers, multicast table, VLAN filter table, calls routine to set\n+ *  up link and flow control settings, and leaves transmit and receive units\n+ *  disabled and uninitialized\n+ **/\n+s32 txgbe_init_hw(struct txgbe_hw *hw)\n+{\n+\ts32 status;\n+\n+\tDEBUGFUNC(\"txgbe_init_hw\");\n+\n+\t/* Reset the hardware */\n+\tstatus = hw->mac.reset_hw(hw);\n+\tif (status == 0 || status == TXGBE_ERR_SFP_NOT_PRESENT) {\n+\t\t/* Start the HW */\n+\t\tstatus = hw->mac.start_hw(hw);\n+\t}\n+\n+\t/* Initialize the LED link active for LED blink support */\n+\thw->mac.init_led_link_act(hw);\n+\n+\tif (status != 0)\n+\t\tDEBUGOUT(\"Failed to initialize HW, STATUS = %d\\n\", status);\n+\n+\treturn status;\n+}\n+\n+\n /**\n  *  txgbe_set_lan_id_multi_port - Set LAN id for PCIe multiple port devices\n  *  @hw: pointer to the HW structure\n@@ -33,6 +67,75 @@ void txgbe_set_lan_id_multi_port(struct txgbe_hw *hw)\n \t\tbus->func = bus->lan_id;\n }\n \n+/**\n+ *  txgbe_validate_mac_addr - Validate MAC address\n+ *  @mac_addr: pointer to MAC address.\n+ *\n+ *  Tests a MAC address to ensure it is a valid Individual Address.\n+ **/\n+s32 txgbe_validate_mac_addr(u8 *mac_addr)\n+{\n+\ts32 status = 0;\n+\n+\tDEBUGFUNC(\"txgbe_validate_mac_addr\");\n+\n+\t/* Make sure it is not a multicast address */\n+\tif (TXGBE_IS_MULTICAST(mac_addr)) {\n+\t\tstatus = TXGBE_ERR_INVALID_MAC_ADDR;\n+\t/* Not a broadcast address */\n+\t} else if (TXGBE_IS_BROADCAST(mac_addr)) {\n+\t\tstatus = TXGBE_ERR_INVALID_MAC_ADDR;\n+\t/* Reject the zero address */\n+\t} else if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&\n+\t\t   mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {\n+\t\tstatus = TXGBE_ERR_INVALID_MAC_ADDR;\n+\t}\n+\treturn status;\n+}\n+\n+/**\n+ * txgbe_clear_tx_pending - Clear pending TX work from the PCIe fifo\n+ * @hw: pointer to the hardware structure\n+ *\n+ * The MACs can experience issues if TX work is still pending\n+ * when a reset occurs.  This function prevents this by flushing the PCIe\n+ * buffers on the system.\n+ **/\n+void txgbe_clear_tx_pending(struct txgbe_hw *hw)\n+{\n+\tu32 hlreg0, i, poll;\n+\n+\t/*\n+\t * If double reset is not requested then all transactions should\n+\t * already be clear and as such there is no work to do\n+\t */\n+\tif (!(hw->mac.flags & TXGBE_FLAGS_DOUBLE_RESET_REQUIRED))\n+\t\treturn;\n+\n+\thlreg0 = rd32(hw, TXGBE_PSRCTL);\n+\twr32(hw, TXGBE_PSRCTL, hlreg0 | TXGBE_PSRCTL_LBENA);\n+\n+\t/* Wait for a last completion before clearing buffers */\n+\ttxgbe_flush(hw);\n+\tmsec_delay(3);\n+\n+\t/*\n+\t * Before proceeding, make sure that the PCIe block does not have\n+\t * transactions pending.\n+\t */\n+\tpoll = (800 * 11) / 10;\n+\tfor (i = 0; i < poll; i++) {\n+\t\tusec_delay(100);\n+\t}\n+\n+\t/* Flush all writes and allow 20usec for all transactions to clear */\n+\ttxgbe_flush(hw);\n+\tusec_delay(20);\n+\n+\t/* restore previous register values */\n+\twr32(hw, TXGBE_PSRCTL, hlreg0);\n+}\n+\n /**\n  *  txgbe_init_shared_code - Initialize the shared code\n  *  @hw: pointer to hardware structure\n@@ -144,6 +247,8 @@ s32 txgbe_init_ops_pf(struct txgbe_hw *hw)\n \tbus->set_lan_id = txgbe_set_lan_id_multi_port;\n \n \t/* MAC */\n+\tmac->init_hw = txgbe_init_hw;\n+\tmac->reset_hw = txgbe_reset_hw;\n \tmac->num_rar_entries\t= TXGBE_RAPTOR_RAR_ENTRIES;\n \n \t/* EEPROM */\n@@ -162,3 +267,158 @@ s32 txgbe_init_ops_pf(struct txgbe_hw *hw)\n \n \treturn 0;\n }\n+\n+static int\n+txgbe_check_flash_load(struct txgbe_hw *hw, u32 check_bit)\n+{\n+\tu32 reg = 0;\n+\tu32 i;\n+\tint err = 0;\n+\t/* if there's flash existing */\n+\tif (!(rd32(hw, TXGBE_SPISTAT) & TXGBE_SPISTAT_BPFLASH)) {\n+\t\t/* wait hw load flash done */\n+\t\tfor (i = 0; i < 10; i++) {\n+\t\t\treg = rd32(hw, TXGBE_ILDRSTAT);\n+\t\t\tif (!(reg & check_bit)) {\n+\t\t\t\t/* done */\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tmsleep(100);\n+\t\t}\n+\t\tif (i == 10) {\n+\t\t\terr = TXGBE_ERR_FLASH_LOADING_FAILED;\n+\t\t}\n+\t}\n+\treturn err;\n+}\n+\n+/**\n+ *  txgbe_reset_hw - Perform hardware reset\n+ *  @hw: pointer to hardware structure\n+ *\n+ *  Resets the hardware by resetting the transmit and receive units, masks\n+ *  and clears all interrupts, perform a PHY reset, and perform a link (MAC)\n+ *  reset.\n+ **/\n+s32 txgbe_reset_hw(struct txgbe_hw *hw)\n+{\n+\ts32 status;\n+\tu32 autoc;\n+\n+\tDEBUGFUNC(\"txgbe_reset_hw\");\n+\n+\t/* Call adapter stop to disable tx/rx and clear interrupts */\n+\tstatus = hw->mac.stop_hw(hw);\n+\tif (status != 0)\n+\t\treturn status;\n+\n+\t/* flush pending Tx transactions */\n+\ttxgbe_clear_tx_pending(hw);\n+\n+\t/* Identify PHY and related function pointers */\n+\tstatus = hw->phy.init(hw);\n+\tif (status == TXGBE_ERR_SFP_NOT_SUPPORTED)\n+\t\treturn status;\n+\n+\t/* Setup SFP module if there is one present. */\n+\tif (hw->phy.sfp_setup_needed) {\n+\t\tstatus = hw->mac.setup_sfp(hw);\n+\t\thw->phy.sfp_setup_needed = false;\n+\t}\n+\tif (status == TXGBE_ERR_SFP_NOT_SUPPORTED)\n+\t\treturn status;\n+\n+\t/* Reset PHY */\n+\tif (hw->phy.reset_disable == false)\n+\t\thw->phy.reset(hw);\n+\n+\t/* remember AUTOC from before we reset */\n+\tautoc = hw->mac.autoc_read(hw);\n+\n+mac_reset_top:\n+\t/*\n+\t * Issue global reset to the MAC.  Needs to be SW reset if link is up.\n+\t * If link reset is used when link is up, it might reset the PHY when\n+\t * mng is using it.  If link is down or the flag to force full link\n+\t * reset is set, then perform link reset.\n+\t */\n+\tif (txgbe_mng_present(hw)) {\n+\t\ttxgbe_hic_reset(hw);\n+\t} else {\n+\t\twr32(hw, TXGBE_RST, TXGBE_RST_LAN(hw->bus.lan_id));\n+\t\ttxgbe_flush(hw);\n+\t}\n+\tusec_delay(10);\n+\n+\tif (hw->bus.lan_id == 0) {\n+\t\tstatus = txgbe_check_flash_load(hw,\n+\t\t\t\tTXGBE_ILDRSTAT_SWRST_LAN0);\n+\t} else {\n+\t\tstatus = txgbe_check_flash_load(hw,\n+\t\t\t\tTXGBE_ILDRSTAT_SWRST_LAN1);\n+\t}\n+\tif (status != 0)\n+\t\treturn status;\n+\n+\tmsec_delay(50);\n+\n+\t/*\n+\t * Double resets are required for recovery from certain error\n+\t * conditions.  Between resets, it is necessary to stall to\n+\t * allow time for any pending HW events to complete.\n+\t */\n+\tif (hw->mac.flags & TXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {\n+\t\thw->mac.flags &= ~TXGBE_FLAGS_DOUBLE_RESET_REQUIRED;\n+\t\tgoto mac_reset_top;\n+\t}\n+\n+\t/*\n+\t * Store the original AUTOC/AUTOC2 values if they have not been\n+\t * stored off yet.  Otherwise restore the stored original\n+\t * values since the reset operation sets back to defaults.\n+\t */\n+\tif (hw->mac.orig_link_settings_stored == false) {\n+\t\thw->mac.orig_autoc = hw->mac.autoc_read(hw);\n+\t\thw->mac.autoc_write(hw, hw->mac.orig_autoc);\n+\t\thw->mac.orig_link_settings_stored = true;\n+\t} else {\n+\t\thw->mac.orig_autoc = autoc;\n+\t}\n+\n+\t/* Store the permanent mac address */\n+\thw->mac.get_mac_addr(hw, hw->mac.perm_addr);\n+\n+\t/*\n+\t * Store MAC address from RAR0, clear receive address registers, and\n+\t * clear the multicast table.  Also reset num_rar_entries to 128,\n+\t * since we modify this value when programming the SAN MAC address.\n+\t */\n+\thw->mac.num_rar_entries = 128;\n+\thw->mac.init_rx_addrs(hw);\n+\n+\t/* Store the permanent SAN mac address */\n+\thw->mac.get_san_mac_addr(hw, hw->mac.san_addr);\n+\n+\t/* Add the SAN MAC address to the RAR only if it's a valid address */\n+\tif (txgbe_validate_mac_addr(hw->mac.san_addr) == 0) {\n+\t\t/* Save the SAN MAC RAR index */\n+\t\thw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;\n+\n+\t\thw->mac.set_rar(hw, hw->mac.san_mac_rar_index,\n+\t\t\t\t    hw->mac.san_addr, 0, true);\n+\n+\t\t/* clear VMDq pool/queue selection for this RAR */\n+\t\thw->mac.clear_vmdq(hw, hw->mac.san_mac_rar_index,\n+\t\t\t\t       BIT_MASK32);\n+\n+\t\t/* Reserve the last RAR for the SAN MAC address */\n+\t\thw->mac.num_rar_entries--;\n+\t}\n+\n+\t/* Store the alternative WWNN/WWPN prefix */\n+\thw->mac.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,\n+\t\t\t\t   &hw->mac.wwpn_prefix);\n+\n+\treturn status;\n+}\n+\ndiff --git a/drivers/net/txgbe/base/txgbe_hw.h b/drivers/net/txgbe/base/txgbe_hw.h\nindex f9cf2a8f0..8a9515524 100644\n--- a/drivers/net/txgbe/base/txgbe_hw.h\n+++ b/drivers/net/txgbe/base/txgbe_hw.h\n@@ -7,10 +7,14 @@\n \n #include \"txgbe_type.h\"\n \n+s32 txgbe_init_hw(struct txgbe_hw *hw);\n+\n void txgbe_set_lan_id_multi_port(struct txgbe_hw *hw);\n \n+s32 txgbe_validate_mac_addr(u8 *mac_addr);\n+void txgbe_clear_tx_pending(struct txgbe_hw *hw);\n s32 txgbe_init_shared_code(struct txgbe_hw *hw);\n s32 txgbe_set_mac_type(struct txgbe_hw *hw);\n s32 txgbe_init_ops_pf(struct txgbe_hw *hw);\n-\n+s32 txgbe_reset_hw(struct txgbe_hw *hw);\n #endif /* _TXGBE_HW_H_ */\ndiff --git a/drivers/net/txgbe/base/txgbe_type.h b/drivers/net/txgbe/base/txgbe_type.h\nindex 101372a8e..a5c498f33 100644\n--- a/drivers/net/txgbe/base/txgbe_type.h\n+++ b/drivers/net/txgbe/base/txgbe_type.h\n@@ -201,6 +201,7 @@ struct txgbe_flash_info {\n \tu16 address_bits;\n };\n \n+#define TXGBE_FLAGS_DOUBLE_RESET_REQUIRED\t0x01\n struct txgbe_mac_info {\n \ts32 (*init_hw)(struct txgbe_hw *);\n \ts32 (*reset_hw)(struct txgbe_hw *);\n@@ -308,7 +309,19 @@ struct txgbe_mac_info {\n \n \tenum txgbe_mac_type type;\n \tu8 perm_addr[ETH_ADDR_LEN];\n+\tu8 san_addr[ETH_ADDR_LEN];\n+\t/* prefix for World Wide Node Name (WWNN) */\n+\tu16 wwnn_prefix;\n+\t/* prefix for World Wide Port Name (WWPN) */\n+\tu16 wwpn_prefix;\n+\n \tu32 num_rar_entries;\n+\n+\tu8  san_mac_rar_index;\n+\tu64 orig_autoc;  /* cached value of AUTOC */\n+\tbool orig_link_settings_stored;\n+\tbool autotry_restart;\n+\tu8 flags;\n \tu32  max_link_up_time;\n };\n \n@@ -344,6 +357,8 @@ struct txgbe_phy_info {\n \n \tenum txgbe_phy_type type;\n \tenum txgbe_sfp_type sfp_type;\n+\tbool sfp_setup_needed;\n+\tbool reset_disable;\n \tu32 media_type;\n };\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex bda7bc097..d3d7533cc 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -95,6 +95,40 @@ eth_txgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)\n \t\treturn -EIO;\n \t}\n \n+\terr = hw->mac.init_hw(hw);\n+\n+\t/*\n+\t * Devices with copper phys will fail to initialise if txgbe_init_hw()\n+\t * is called too soon after the kernel driver unbinding/binding occurs.\n+\t * The failure occurs in txgbe_identify_phy() for all devices,\n+\t * but for non-copper devies, txgbe_identify_sfp_module() is\n+\t * also called. See txgbe_identify_phy(). The reason for the\n+\t * failure is not known, and only occuts when virtualisation features\n+\t * are disabled in the bios. A delay of 200ms  was found to be enough by\n+\t * trial-and-error, and is doubled to be safe.\n+\t */\n+\tif (err && (hw->phy.media_type == txgbe_media_type_copper)) {\n+\t\trte_delay_ms(200);\n+\t\terr = hw->mac.init_hw(hw);\n+\t}\n+\n+\tif (err == TXGBE_ERR_SFP_NOT_PRESENT)\n+\t\terr = 0;\n+\n+\tif (err == TXGBE_ERR_EEPROM_VERSION) {\n+\t\tPMD_INIT_LOG(ERR, \"This device is a pre-production adapter/\"\n+\t\t\t     \"LOM.  Please be aware there may be issues associated \"\n+\t\t\t     \"with your hardware.\");\n+\t\tPMD_INIT_LOG(ERR, \"If you are experiencing problems \"\n+\t\t\t     \"please contact your hardware representative \"\n+\t\t\t     \"who provided you with this hardware.\");\n+\t} else if (err == TXGBE_ERR_SFP_NOT_SUPPORTED)\n+\t\tPMD_INIT_LOG(ERR, \"Unsupported SFP+ Module\");\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Hardware Initialization Failure: %d\", err);\n+\t\treturn -EIO;\n+\t}\n+\n \t/* Allocate memory for storing MAC addresses */\n \teth_dev->data->mac_addrs = rte_zmalloc(\"txgbe\", RTE_ETHER_ADDR_LEN *\n \t\t\t\t\t       hw->mac.num_rar_entries, 0);\n",
    "prefixes": [
        "v2",
        "08/56"
    ]
}