get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 94600,
    "url": "https://patches.dpdk.org/api/patches/94600/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210621075206.4020456-2-robinx.zhang@intel.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": "<20210621075206.4020456-2-robinx.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210621075206.4020456-2-robinx.zhang@intel.com",
    "date": "2021-06-21T07:51:52",
    "name": "[v3,01/15] net/i40e/base: add new versions of send ASQ command functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "107b77994ec180f9f294a42695719ea4dc956c99",
    "submitter": {
        "id": 2004,
        "url": "https://patches.dpdk.org/api/people/2004/?format=api",
        "name": "Robin Zhang",
        "email": "robinx.zhang@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "https://patches.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210621075206.4020456-2-robinx.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 17420,
            "url": "https://patches.dpdk.org/api/series/17420/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17420",
            "date": "2021-06-21T07:51:52",
            "name": "i40e base code update",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/17420/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/94600/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/94600/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 4B5E8A0547;\n\tMon, 21 Jun 2021 10:02:19 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1508441158;\n\tMon, 21 Jun 2021 10:02:19 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n by mails.dpdk.org (Postfix) with ESMTP id F194740040\n for <dev@dpdk.org>; Mon, 21 Jun 2021 10:02:16 +0200 (CEST)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 21 Jun 2021 01:02:15 -0700",
            "from unknown (HELO intel-npg-odc-srv03.cd.intel.com)\n ([10.240.178.145])\n by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 21 Jun 2021 01:02:12 -0700"
        ],
        "IronPort-SDR": [
            "\n 47IBrwgQcvGD6vuOsIlwGnKdH61Rc2oO6x+0ToSNhmTORY7Wk7VoXkQ0GIROfu9dUgzDrmvWwI\n DT6YujjCiofg==",
            "\n wrgs5nmKlPjI82U41EBezCLGoUVccePxcelG6yyZUlSLosPfLRRdLODuJ3RSe/gwWI4Ius0AvI\n AL54wqASf/0Q=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10021\"; a=\"206744880\"",
            "E=Sophos;i=\"5.83,289,1616482800\"; d=\"scan'208\";a=\"206744880\"",
            "E=Sophos;i=\"5.83,289,1616482800\"; d=\"scan'208\";a=\"452101685\""
        ],
        "From": "Robin Zhang <robinx.zhang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "beilei.xing@intel.com, junfeng.guo@intel.com, stevex.yang@intel.com,\n Robin Zhang <robinx.zhang@intel.com>,\n Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>",
        "Date": "Mon, 21 Jun 2021 07:51:52 +0000",
        "Message-Id": "<20210621075206.4020456-2-robinx.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210621075206.4020456-1-robinx.zhang@intel.com>",
        "References": "<20210618063851.3694702-1-robinx.zhang@intel.com>\n <20210621075206.4020456-1-robinx.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3 01/15] net/i40e/base: add new versions of send\n ASQ command functions",
        "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": "ASQ send command functions are returning only i40e status codes\nyet some calling functions also need Admin Queue status\nthat is stored in hw->aq.asq_last_status. Since hw object\nis stored on a heap it introduces a possibility for\na race condition in access to hw if calling function is not\nfast enough to read hw->aq.asq_last_status before next\nsend ASQ command is executed.\n\nAdded new versions of send ASQ command functions that return\nAdmin Queue status on the stack to avoid race conditions\nin access to hw->aq.asq_last_status.\nAdded new _v2 version of i40e_aq_remove_macvlan and i40e_aq_add_macvlan\nthat is using new _v2 versions of ASQ send command functions and\nreturns the Admin Queue status on the stack.\n\nSigned-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>\nSigned-off-by: Robin Zhang <robinx.zhang@intel.com>\n---\n drivers/net/i40e/base/i40e_adminq.c    |  73 +++++++++++--\n drivers/net/i40e/base/i40e_common.c    | 139 ++++++++++++++++++++++---\n drivers/net/i40e/base/i40e_prototype.h |  17 +++\n 3 files changed, 205 insertions(+), 24 deletions(-)",
    "diff": "diff --git a/drivers/net/i40e/base/i40e_adminq.c b/drivers/net/i40e/base/i40e_adminq.c\nindex 0da45f03e4..eafacbdbec 100644\n--- a/drivers/net/i40e/base/i40e_adminq.c\n+++ b/drivers/net/i40e/base/i40e_adminq.c\n@@ -834,7 +834,7 @@ STATIC bool i40e_asq_done(struct i40e_hw *hw)\n }\n \n /**\n- *  i40e_asq_send_command - send command to Admin Queue\n+ *  i40e_asq_send_command_exec - send command to Admin Queue\n  *  @hw: pointer to the hw struct\n  *  @desc: prefilled descriptor describing the command (non DMA mem)\n  *  @buff: buffer to use for indirect commands\n@@ -844,11 +844,12 @@ STATIC bool i40e_asq_done(struct i40e_hw *hw)\n  *  This is the main send command driver routine for the Admin Queue send\n  *  queue.  It runs the queue, cleans the queue, etc\n  **/\n-enum i40e_status_code i40e_asq_send_command(struct i40e_hw *hw,\n-\t\t\t\tstruct i40e_aq_desc *desc,\n-\t\t\t\tvoid *buff, /* can be NULL */\n-\t\t\t\tu16  buff_size,\n-\t\t\t\tstruct i40e_asq_cmd_details *cmd_details)\n+STATIC enum i40e_status_code\n+i40e_asq_send_command_exec(struct i40e_hw *hw,\n+\t\t\t   struct i40e_aq_desc *desc,\n+\t\t\t   void *buff, /* can be NULL */\n+\t\t\t   u16  buff_size,\n+\t\t\t   struct i40e_asq_cmd_details *cmd_details)\n {\n \tenum i40e_status_code status = I40E_SUCCESS;\n \tstruct i40e_dma_mem *dma_buff = NULL;\n@@ -858,8 +859,6 @@ enum i40e_status_code i40e_asq_send_command(struct i40e_hw *hw,\n \tu16  retval = 0;\n \tu32  val = 0;\n \n-\ti40e_acquire_spinlock(&hw->aq.asq_spinlock);\n-\n \thw->aq.asq_last_status = I40E_AQ_RC_OK;\n \n \tif (hw->aq.asq.count == 0) {\n@@ -1042,6 +1041,64 @@ enum i40e_status_code i40e_asq_send_command(struct i40e_hw *hw,\n \t}\n \n asq_send_command_error:\n+\treturn status;\n+}\n+\n+/**\n+ *  i40e_asq_send_command - send command to Admin Queue\n+ *  @hw: pointer to the hw struct\n+ *  @desc: prefilled descriptor describing the command (non DMA mem)\n+ *  @buff: buffer to use for indirect commands\n+ *  @buff_size: size of buffer for indirect commands\n+ *  @cmd_details: pointer to command details structure\n+ *\n+ *  Acquires the lock and calls the main send command execution\n+ *  routine.\n+ **/\n+enum i40e_status_code\n+i40e_asq_send_command(struct i40e_hw *hw,\n+\t\t      struct i40e_aq_desc *desc,\n+\t\t      void *buff, /* can be NULL */\n+\t\t      u16  buff_size,\n+\t\t      struct i40e_asq_cmd_details *cmd_details)\n+{\n+\tenum i40e_status_code status = I40E_SUCCESS;\n+\n+\ti40e_acquire_spinlock(&hw->aq.asq_spinlock);\n+\tstatus = i40e_asq_send_command_exec(hw, desc, buff, buff_size,\n+\t\t\t\t\t    cmd_details);\n+\ti40e_release_spinlock(&hw->aq.asq_spinlock);\n+\treturn status;\n+}\n+\n+/**\n+ *  i40e_asq_send_command_v2 - send command to Admin Queue\n+ *  @hw: pointer to the hw struct\n+ *  @desc: prefilled descriptor describing the command (non DMA mem)\n+ *  @buff: buffer to use for indirect commands\n+ *  @buff_size: size of buffer for indirect commands\n+ *  @cmd_details: pointer to command details structure\n+ *  @aq_status: pointer to Admin Queue status return value\n+ *\n+ *  Acquires the lock and calls the main send command execution\n+ *  routine. Returns the last Admin Queue status in aq_status\n+ *  to avoid race conditions in access to hw->aq.asq_last_status.\n+ **/\n+enum i40e_status_code\n+i40e_asq_send_command_v2(struct i40e_hw *hw,\n+\t\t\t struct i40e_aq_desc *desc,\n+\t\t\t void *buff, /* can be NULL */\n+\t\t\t u16  buff_size,\n+\t\t\t struct i40e_asq_cmd_details *cmd_details,\n+\t\t\t enum i40e_admin_queue_err *aq_status)\n+{\n+\tenum i40e_status_code status = I40E_SUCCESS;\n+\n+\ti40e_acquire_spinlock(&hw->aq.asq_spinlock);\n+\tstatus = i40e_asq_send_command_exec(hw, desc, buff, buff_size,\n+\t\t\t\t\t    cmd_details);\n+\tif (aq_status)\n+\t\t*aq_status = hw->aq.asq_last_status;\n \ti40e_release_spinlock(&hw->aq.asq_spinlock);\n \treturn status;\n }\ndiff --git a/drivers/net/i40e/base/i40e_common.c b/drivers/net/i40e/base/i40e_common.c\nindex e20bb9ac35..32642f3e2b 100644\n--- a/drivers/net/i40e/base/i40e_common.c\n+++ b/drivers/net/i40e/base/i40e_common.c\n@@ -3114,6 +3114,46 @@ enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,\n \treturn status;\n }\n \n+/**\n+ * i40e_prepare_add_macvlan\n+ * @mv_list: list of macvlans to be added\n+ * @desc: pointer to AQ descriptor structure\n+ * @count: length of the list\n+ * @seid: VSI for the mac address\n+ *\n+ * Internal helper function that prepares the add macvlan request\n+ * and returns the buffer size.\n+ **/\n+static u16\n+i40e_prepare_add_macvlan(struct i40e_aqc_add_macvlan_element_data *mv_list,\n+\t\t\t struct i40e_aq_desc *desc, u16 count, u16 seid)\n+{\n+\tstruct i40e_aqc_macvlan *cmd =\n+\t\t(struct i40e_aqc_macvlan *)&desc->params.raw;\n+\tu16 buf_size;\n+\tint i;\n+\n+\tbuf_size = count * sizeof(*mv_list);\n+\n+\t/* prep the rest of the request */\n+\ti40e_fill_default_direct_cmd_desc(desc, i40e_aqc_opc_add_macvlan);\n+\tcmd->num_addresses = CPU_TO_LE16(count);\n+\tcmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);\n+\tcmd->seid[1] = 0;\n+\tcmd->seid[2] = 0;\n+\n+\tfor (i = 0; i < count; i++)\n+\t\tif (I40E_IS_MULTICAST(mv_list[i].mac_addr))\n+\t\t\tmv_list[i].flags |=\n+\t\t\t    CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);\n+\n+\tdesc->flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));\n+\tif (buf_size > I40E_AQ_LARGE_BUF)\n+\t\tdesc->flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);\n+\n+\treturn buf_size;\n+}\n+\n /**\n  * i40e_aq_add_macvlan\n  * @hw: pointer to the hw struct\n@@ -3124,8 +3164,74 @@ enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,\n  *\n  * Add MAC/VLAN addresses to the HW filtering\n  **/\n-enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,\n-\t\t\tstruct i40e_aqc_add_macvlan_element_data *mv_list,\n+enum i40e_status_code\n+i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,\n+\t\t    struct i40e_aqc_add_macvlan_element_data *mv_list,\n+\t\t    u16 count, struct i40e_asq_cmd_details *cmd_details)\n+{\n+\tstruct i40e_aq_desc desc;\n+\tenum i40e_status_code status;\n+\tu16 buf_size;\n+\n+\tif (count == 0 || !mv_list || !hw)\n+\t\treturn I40E_ERR_PARAM;\n+\n+\tbuf_size = i40e_prepare_add_macvlan(mv_list, &desc, count, seid);\n+\n+\tstatus = i40e_asq_send_command(hw, &desc, mv_list, buf_size,\n+\t\t\t\t       cmd_details);\n+\n+\treturn status;\n+}\n+\n+/**\n+ * i40e_aq_add_macvlan_v2\n+ * @hw: pointer to the hw struct\n+ * @seid: VSI for the mac address\n+ * @mv_list: list of macvlans to be added\n+ * @count: length of the list\n+ * @cmd_details: pointer to command details structure or NULL\n+ * @aq_status: pointer to Admin Queue status return value\n+ *\n+ * Add MAC/VLAN addresses to the HW filtering.\n+ * The _v2 version returns the last Admin Queue status in aq_status\n+ * to avoid race conditions in access to hw->aq.asq_last_status.\n+ * It also calls _v2 versions of asq_send_command functions to\n+ * get the aq_status on the stack.\n+ **/\n+enum i40e_status_code\n+i40e_aq_add_macvlan_v2(struct i40e_hw *hw, u16 seid,\n+\t\t       struct i40e_aqc_add_macvlan_element_data *mv_list,\n+\t\t       u16 count, struct i40e_asq_cmd_details *cmd_details,\n+\t\t       enum i40e_admin_queue_err *aq_status)\n+{\n+\tstruct i40e_aq_desc desc;\n+\tenum i40e_status_code status;\n+\tu16 buf_size;\n+\n+\tif (count == 0 || !mv_list || !hw)\n+\t\treturn I40E_ERR_PARAM;\n+\n+\tbuf_size = i40e_prepare_add_macvlan(mv_list, &desc, count, seid);\n+\n+\tstatus = i40e_asq_send_command_v2(hw, &desc, mv_list, buf_size,\n+\t\t\t\t\t  cmd_details, aq_status);\n+\n+\treturn status;\n+}\n+\n+/**\n+ * i40e_aq_remove_macvlan\n+ * @hw: pointer to the hw struct\n+ * @seid: VSI for the mac address\n+ * @mv_list: list of macvlans to be removed\n+ * @count: length of the list\n+ * @cmd_details: pointer to command details structure or NULL\n+ *\n+ * Remove MAC/VLAN addresses from the HW filtering\n+ **/\n+enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,\n+\t\t\tstruct i40e_aqc_remove_macvlan_element_data *mv_list,\n \t\t\tu16 count, struct i40e_asq_cmd_details *cmd_details)\n {\n \tstruct i40e_aq_desc desc;\n@@ -3133,7 +3239,6 @@ enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,\n \t\t(struct i40e_aqc_macvlan *)&desc.params.raw;\n \tenum i40e_status_code status;\n \tu16 buf_size;\n-\tint i;\n \n \tif (count == 0 || !mv_list || !hw)\n \t\treturn I40E_ERR_PARAM;\n@@ -3141,17 +3246,12 @@ enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,\n \tbuf_size = count * sizeof(*mv_list);\n \n \t/* prep the rest of the request */\n-\ti40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);\n+\ti40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);\n \tcmd->num_addresses = CPU_TO_LE16(count);\n \tcmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);\n \tcmd->seid[1] = 0;\n \tcmd->seid[2] = 0;\n \n-\tfor (i = 0; i < count; i++)\n-\t\tif (I40E_IS_MULTICAST(mv_list[i].mac_addr))\n-\t\t\tmv_list[i].flags |=\n-\t\t\t    CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);\n-\n \tdesc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));\n \tif (buf_size > I40E_AQ_LARGE_BUF)\n \t\tdesc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);\n@@ -3163,18 +3263,25 @@ enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,\n }\n \n /**\n- * i40e_aq_remove_macvlan\n+ * i40e_aq_remove_macvlan_v2\n  * @hw: pointer to the hw struct\n  * @seid: VSI for the mac address\n  * @mv_list: list of macvlans to be removed\n  * @count: length of the list\n  * @cmd_details: pointer to command details structure or NULL\n+ * @aq_status: pointer to Admin Queue status return value\n  *\n- * Remove MAC/VLAN addresses from the HW filtering\n+ * Remove MAC/VLAN addresses from the HW filtering.\n+ * The _v2 version returns the last Admin Queue status in aq_status\n+ * to avoid race conditions in access to hw->aq.asq_last_status.\n+ * It also calls _v2 versions of asq_send_command functions to\n+ * get the aq_status on the stack.\n  **/\n-enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,\n-\t\t\tstruct i40e_aqc_remove_macvlan_element_data *mv_list,\n-\t\t\tu16 count, struct i40e_asq_cmd_details *cmd_details)\n+enum i40e_status_code\n+i40e_aq_remove_macvlan_v2(struct i40e_hw *hw, u16 seid,\n+\t\t\t  struct i40e_aqc_remove_macvlan_element_data *mv_list,\n+\t\t\t  u16 count, struct i40e_asq_cmd_details *cmd_details,\n+\t\t\t  enum i40e_admin_queue_err *aq_status)\n {\n \tstruct i40e_aq_desc desc;\n \tstruct i40e_aqc_macvlan *cmd =\n@@ -3198,8 +3305,8 @@ enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,\n \tif (buf_size > I40E_AQ_LARGE_BUF)\n \t\tdesc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);\n \n-\tstatus = i40e_asq_send_command(hw, &desc, mv_list, buf_size,\n-\t\t\t\t       cmd_details);\n+\tstatus = i40e_asq_send_command_v2(hw, &desc, mv_list, buf_size,\n+\t\t\t\t\t  cmd_details, aq_status);\n \n \treturn status;\n }\ndiff --git a/drivers/net/i40e/base/i40e_prototype.h b/drivers/net/i40e/base/i40e_prototype.h\nindex 124222e476..29c86c7fe8 100644\n--- a/drivers/net/i40e/base/i40e_prototype.h\n+++ b/drivers/net/i40e/base/i40e_prototype.h\n@@ -38,6 +38,13 @@ enum i40e_status_code i40e_asq_send_command(struct i40e_hw *hw,\n \t\t\t\tvoid *buff, /* can be NULL */\n \t\t\t\tu16  buff_size,\n \t\t\t\tstruct i40e_asq_cmd_details *cmd_details);\n+enum i40e_status_code\n+i40e_asq_send_command_v2(struct i40e_hw *hw,\n+\t\t\t struct i40e_aq_desc *desc,\n+\t\t\t void *buff, /* can be NULL */\n+\t\t\t u16  buff_size,\n+\t\t\t struct i40e_asq_cmd_details *cmd_details,\n+\t\t\t enum i40e_admin_queue_err *aq_status);\n #ifdef VF_DRIVER\n bool i40e_asq_done(struct i40e_hw *hw);\n #endif\n@@ -188,9 +195,19 @@ enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,\n enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 vsi_id,\n \t\t\tstruct i40e_aqc_add_macvlan_element_data *mv_list,\n \t\t\tu16 count, struct i40e_asq_cmd_details *cmd_details);\n+enum i40e_status_code\n+i40e_aq_add_macvlan_v2(struct i40e_hw *hw, u16 seid,\n+\t\t       struct i40e_aqc_add_macvlan_element_data *mv_list,\n+\t\t       u16 count, struct i40e_asq_cmd_details *cmd_details,\n+\t\t       enum i40e_admin_queue_err *aq_status);\n enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 vsi_id,\n \t\t\tstruct i40e_aqc_remove_macvlan_element_data *mv_list,\n \t\t\tu16 count, struct i40e_asq_cmd_details *cmd_details);\n+enum i40e_status_code\n+i40e_aq_remove_macvlan_v2(struct i40e_hw *hw, u16 seid,\n+\t\t\t  struct i40e_aqc_remove_macvlan_element_data *mv_list,\n+\t\t\t  u16 count, struct i40e_asq_cmd_details *cmd_details,\n+\t\t\t  enum i40e_admin_queue_err *aq_status);\n enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,\n \t\t\tu16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,\n \t\t\tstruct i40e_asq_cmd_details *cmd_details,\n",
    "prefixes": [
        "v3",
        "01/15"
    ]
}