Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/94600/?format=api
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" ] }{ "id": 94600, "url": "