get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 27983,
    "url": "https://patches.dpdk.org/api/patches/27983/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20170825133319.15207-1-dharton@cisco.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": "<20170825133319.15207-1-dharton@cisco.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20170825133319.15207-1-dharton@cisco.com",
    "date": "2017-08-25T13:33:19",
    "name": "[dpdk-dev,v2] ethdev: modifiy vlan_offload_set_t to return int",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ee0e09af3f4c0f83599bf0cc630494340e046f32",
    "submitter": {
        "id": 252,
        "url": "https://patches.dpdk.org/api/people/252/?format=api",
        "name": "David Harton",
        "email": "dharton@cisco.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20170825133319.15207-1-dharton@cisco.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/27983/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/27983/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 521917D1C;\n\tFri, 25 Aug 2017 15:34:00 +0200 (CEST)",
            "from alln-iport-1.cisco.com (alln-iport-1.cisco.com\n\t[173.37.142.88]) by dpdk.org (Postfix) with ESMTP id 333287D0B\n\tfor <dev@dpdk.org>; Fri, 25 Aug 2017 15:33:57 +0200 (CEST)",
            "from rcdn-core-9.cisco.com ([173.37.93.145])\n\tby alln-iport-1.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t25 Aug 2017 13:33:56 +0000",
            "from cpp-rtpbld-31.cisco.com (cpp-rtpbld-31.cisco.com\n\t[172.18.5.114])\n\tby rcdn-core-9.cisco.com (8.14.5/8.14.5) with ESMTP id v7PDXucB016552;\n\tFri, 25 Aug 2017 13:33:56 GMT",
            "by cpp-rtpbld-31.cisco.com (Postfix, from userid 140087)\n\tid 766145C6; Fri, 25 Aug 2017 09:33:56 -0400 (EDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n\td=cisco.com; i=@cisco.com; l=26903; q=dns/txt;\n\ts=iport; t=1503668038; x=1504877638;\n\th=from:to:cc:subject:date:message-id:in-reply-to: references;\n\tbh=VDDa8rmeB4KrFQAH9ceD7pVJCYDyXS6AX1cfflrpUf8=;\n\tb=CcH+YEApzj0B2ceJSb4WpWo2/OYYJf2g7PE60x7Jnk9kVqbID77yitSL\n\tGEHp3xWx9FPMpKYkhs988cezKMmEkU6rj3iFnp6p4nhvEf923s1HVAOU0\n\tvQMBXFoR5z33McqG0fnIIinKabWNRJWkQ1xCXnNO4q/TPrgakI3YFvxpF k=;",
        "X-IronPort-AV": "E=Sophos;i=\"5.41,425,1498521600\"; d=\"scan'208\";a=\"448329054\"",
        "From": "David Harton <dharton@cisco.com>",
        "To": "thomas@monjalon.net, ferruh.yigit@intel.com, stephen.hurd@broadcom.com, \n\tajit.khaparde@broadcom.com, johndale@cisco.com,\n\tkonstantin.ananyev@intel.com, jingjing.wu@intel.com,\n\tbeilei.xing@intel.com, jing.d.chen@intel.com,\n\tadrien.mazarguil@6wind.com, nelio.laranjeiro@6wind.com,\n\talejandro.lucero@netronome.com, hemant.agrawal@nxp.com,\n\trasesh.mody@cavium.com, harish.patil@cavium.com, skhare@vmware.com,\n\tyliu@fridaylinux.org, maxime.coquelin@redhat.com,\n\tallain.legacy@windriver.com",
        "Cc": "dev@dpdk.org, David Harton <dharton@cisco.com>",
        "Date": "Fri, 25 Aug 2017 09:33:19 -0400",
        "Message-Id": "<20170825133319.15207-1-dharton@cisco.com>",
        "X-Mailer": "git-send-email 2.10.3.dirty",
        "In-Reply-To": "<20170824231851.21829-1-dharton@cisco.com>",
        "References": "<20170824231851.21829-1-dharton@cisco.com>",
        "Subject": "[dpdk-dev] [PATCH v2] ethdev: modifiy vlan_offload_set_t to return\n\tint",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Some devices may not support or fail setting VLAN offload\nconfiguration based on dynamic circurmstances so the\nvlan_offload_set_t vector is modified to return an int so\nthe caller can determine success or not.\n\nrte_eth_dev_set_vlan_offload is updated to return the\nvalue provided by the vector when called along with restoring\nthe original offload configs on failure.\n\nExisting vlan_offload_set_t vectors are modified to return\nan int.  Majority of cases return 0 but a few that actually\ncan fail now return their failure codes.\n\nFinally, a vlan_offload_set_t vector is added to virtio\nto facilitate dynamically turning VLAN strip on or off.\n\nSigned-off-by: David Harton <dharton@cisco.com>\n---\n\n*v2\nFixed a missed format error.\nRemoved vlan offload vector call casts and replaced with checks \nfor return values.\n\n*v1\nThis is an ABI breakage that has been previously negotiated\nwith Thomas and the proposed rel note change is included as well.\n\n doc/guides/rel_notes/release_17_11.rst |  2 +-\n drivers/net/avp/avp_ethdev.c           | 12 +++++++++---\n drivers/net/bnxt/bnxt_ethdev.c         |  9 ++++++---\n drivers/net/dpaa2/dpaa2_ethdev.c       | 13 ++++++++++---\n drivers/net/e1000/em_ethdev.c          | 12 +++++++++---\n drivers/net/e1000/igb_ethdev.c         | 12 +++++++++---\n drivers/net/enic/enic_ethdev.c         |  8 +++++---\n drivers/net/fm10k/fm10k_ethdev.c       |  3 ++-\n drivers/net/i40e/i40e_ethdev.c         | 11 ++++++++---\n drivers/net/i40e/i40e_ethdev_vf.c      |  9 ++++++---\n drivers/net/ixgbe/ixgbe_ethdev.c       | 25 ++++++++++++++++++-------\n drivers/net/mlx5/mlx5.h                |  2 +-\n drivers/net/mlx5/mlx5_vlan.c           |  3 ++-\n drivers/net/nfp/nfp_net.c              | 13 +++++++------\n drivers/net/qede/qede_ethdev.c         |  9 +++++++--\n drivers/net/virtio/virtio_ethdev.c     | 21 +++++++++++++++++++++\n drivers/net/vmxnet3/vmxnet3_ethdev.c   | 10 +++++++---\n lib/librte_ether/rte_ethdev.c          | 14 +++++++++++++-\n lib/librte_ether/rte_ethdev.h          |  2 +-\n 19 files changed, 142 insertions(+), 48 deletions(-)",
    "diff": "diff --git a/doc/guides/rel_notes/release_17_11.rst b/doc/guides/rel_notes/release_17_11.rst\nindex 170f4f9..e74f70c 100644\n--- a/doc/guides/rel_notes/release_17_11.rst\n+++ b/doc/guides/rel_notes/release_17_11.rst\n@@ -124,7 +124,7 @@ ABI Changes\n    Also, make sure to start the actual text at the margin.\n    =========================================================\n \n-\n+* Changed return type of ``vlan_offload_set_t`` from ``void`` to ``int``.\n \n Shared Library Versions\n -----------------------\ndiff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c\nindex c746a0e..4011dfa 100644\n--- a/drivers/net/avp/avp_ethdev.c\n+++ b/drivers/net/avp/avp_ethdev.c\n@@ -70,7 +70,7 @@ static int avp_dev_create(struct rte_pci_device *pci_dev,\n static void avp_dev_close(struct rte_eth_dev *dev);\n static void avp_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t     struct rte_eth_dev_info *dev_info);\n-static void avp_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int avp_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static int avp_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete);\n static void avp_dev_promiscuous_enable(struct rte_eth_dev *dev);\n static void avp_dev_promiscuous_disable(struct rte_eth_dev *dev);\n@@ -2031,7 +2031,12 @@ struct avp_queue {\n \tmask = (ETH_VLAN_STRIP_MASK |\n \t\tETH_VLAN_FILTER_MASK |\n \t\tETH_VLAN_EXTEND_MASK);\n-\tavp_vlan_offload_set(eth_dev, mask);\n+\tret = avp_vlan_offload_set(eth_dev, mask);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"VLAN offload set failed by host, ret=%d\\n\",\n+\t\t\t    ret);\n+\t\tgoto unlock;\n+\t}\n \n \t/* update device config */\n \tmemset(&config, 0, sizeof(config));\n@@ -2214,7 +2219,7 @@ struct avp_queue {\n \t}\n }\n \n-static void\n+static int\n avp_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n {\n \tstruct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n@@ -2239,6 +2244,7 @@ struct avp_queue {\n \t\tif (eth_dev->data->dev_conf.rxmode.hw_vlan_extend)\n \t\t\tPMD_DRV_LOG(ERR, \"VLAN extend offload not supported\\n\");\n \t}\n+\treturn 0;\n }\n \n static void\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex c9d1122..547bd55 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -144,7 +144,7 @@\n \tETH_RSS_NONFRAG_IPV6_TCP |\t\\\n \tETH_RSS_NONFRAG_IPV6_UDP)\n \n-static void bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);\n+static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);\n \n /***********************/\n \n@@ -522,7 +522,9 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)\n \t\tvlan_mask |= ETH_VLAN_FILTER_MASK;\n \tif (eth_dev->data->dev_conf.rxmode.hw_vlan_strip)\n \t\tvlan_mask |= ETH_VLAN_STRIP_MASK;\n-\tbnxt_vlan_offload_set_op(eth_dev, vlan_mask);\n+\trc = bnxt_vlan_offload_set_op(eth_dev, vlan_mask);\n+\tif (rc)\n+\t\tgoto error;\n \n \treturn 0;\n \n@@ -1275,7 +1277,7 @@ static int bnxt_vlan_filter_set_op(struct rte_eth_dev *eth_dev,\n \t\treturn bnxt_del_vlan_filter(bp, vlan_id);\n }\n \n-static void\n+static int\n bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)\n {\n \tstruct bnxt *bp = (struct bnxt *)dev->data->dev_private;\n@@ -1307,6 +1309,7 @@ static int bnxt_vlan_filter_set_op(struct rte_eth_dev *eth_dev,\n \n \tif (mask & ETH_VLAN_EXTEND_MASK)\n \t\tRTE_LOG(ERR, PMD, \"Extend VLAN Not supported\\n\");\n+\treturn 0;\n }\n \n static void\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex 429b3a0..3390cb3 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -138,7 +138,7 @@\n \treturn ret;\n }\n \n-static void\n+static int\n dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct dpaa2_dev_priv *priv = dev->data->dev_private;\n@@ -158,6 +158,7 @@\n \t\t\tRTE_LOG(ERR, PMD, \"Unable to set vlan filter = %d\\n\",\n \t\t\t\tret);\n \t}\n+\treturn 0;\n }\n \n static int\n@@ -643,8 +644,14 @@\n \t\treturn ret;\n \t}\n \t/* VLAN Offload Settings */\n-\tif (priv->max_vlan_filters)\n-\t\tdpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);\n+\tif (priv->max_vlan_filters) {\n+\t\tret = dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Error to dpaa2_vlan_offload_set:\"\n+\t\t\t\t     \"code = %d\\n\", ret);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n \n \treturn 0;\n }\ndiff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c\nindex 3d4ab93..51f49d8 100644\n--- a/drivers/net/e1000/em_ethdev.c\n+++ b/drivers/net/e1000/em_ethdev.c\n@@ -99,7 +99,7 @@ static int eth_em_interrupt_action(struct rte_eth_dev *dev,\n \n static int eth_em_vlan_filter_set(struct rte_eth_dev *dev,\n \t\tuint16_t vlan_id, int on);\n-static void eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void em_vlan_hw_filter_enable(struct rte_eth_dev *dev);\n static void em_vlan_hw_filter_disable(struct rte_eth_dev *dev);\n static void em_vlan_hw_strip_enable(struct rte_eth_dev *dev);\n@@ -668,7 +668,12 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)\n \n \tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK | \\\n \t\t\tETH_VLAN_EXTEND_MASK;\n-\teth_em_vlan_offload_set(dev, mask);\n+\tret = eth_em_vlan_offload_set(dev, mask);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to update vlan offload\");\n+\t\tem_dev_clear_queues(dev);\n+\t\treturn ret;\n+\t}\n \n \t/* Set Interrupt Throttling Rate to maximum allowed value. */\n \tE1000_WRITE_REG(hw, E1000_ITR, UINT16_MAX);\n@@ -1447,7 +1452,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)\n \tE1000_WRITE_REG(hw, E1000_CTRL, reg);\n }\n \n-static void\n+static int\n eth_em_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tif(mask & ETH_VLAN_STRIP_MASK){\n@@ -1463,6 +1468,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)\n \t\telse\n \t\t\tem_vlan_hw_filter_disable(dev);\n \t}\n+\treturn 0;\n }\n \n /*\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex e4f7a9f..fa15ee9 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -157,7 +157,7 @@ static int eth_igb_vlan_filter_set(struct rte_eth_dev *dev,\n static int eth_igb_vlan_tpid_set(struct rte_eth_dev *dev,\n \t\t\t\t enum rte_vlan_type vlan_type,\n \t\t\t\t uint16_t tpid_id);\n-static void eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n \n static void igb_vlan_hw_filter_enable(struct rte_eth_dev *dev);\n static void igb_vlan_hw_filter_disable(struct rte_eth_dev *dev);\n@@ -1400,7 +1400,12 @@ static int eth_igbvf_pci_remove(struct rte_pci_device *pci_dev)\n \t */\n \tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK | \\\n \t\t\tETH_VLAN_EXTEND_MASK;\n-\teth_igb_vlan_offload_set(dev, mask);\n+\tret = eth_igb_vlan_offload_set(dev, mask);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to set vlan offload\");\n+\t\tigb_dev_clear_queues(dev);\n+\t\treturn ret;\n+\t}\n \n \tif (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {\n \t\t/* Enable VLAN filter since VMDq always use VLAN filter */\n@@ -2715,7 +2720,7 @@ static int eth_igbvf_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \t\t\t\t\t\t2 * VLAN_TAG_SIZE);\n }\n \n-static void\n+static int\n eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tif(mask & ETH_VLAN_STRIP_MASK){\n@@ -2738,6 +2743,7 @@ static int eth_igbvf_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \t\telse\n \t\t\tigb_vlan_hw_extend_disable(dev);\n \t}\n+\treturn 0;\n }\n \n \ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex da8fec2..fc1eac2 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -347,7 +347,7 @@ static int enicpmd_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \treturn err;\n }\n \n-static void enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n+static int enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n {\n \tstruct enic *enic = pmd_priv(eth_dev);\n \n@@ -371,6 +371,8 @@ static void enicpmd_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n \t\tdev_warning(enic,\n \t\t\t\"Configuration of extended VLAN is not supported\\n\");\n \t}\n+\n+\treturn 0;\n }\n \n static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)\n@@ -392,9 +394,9 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)\n \t\t\teth_dev->data->dev_conf.rxmode.split_hdr_size);\n \t}\n \n-\tenicpmd_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK);\n+\tret = enicpmd_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK);\n \tenic->hw_ip_checksum = eth_dev->data->dev_conf.rxmode.hw_ip_checksum;\n-\treturn 0;\n+\treturn ret;\n }\n \n /* Start the device.\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex e60d3a3..f4626f7 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -1590,7 +1590,7 @@ static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \treturn 0;\n }\n \n-static void\n+static int\n fm10k_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tif (mask & ETH_VLAN_STRIP_MASK) {\n@@ -1609,6 +1609,7 @@ static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \t\tif (!dev->data->dev_conf.rxmode.hw_vlan_filter)\n \t\t\tPMD_INIT_LOG(ERR, \"VLAN filter is always on in fm10k\");\n \t}\n+\treturn 0;\n }\n \n /* Add/Remove a MAC address, and update filters to main VSI */\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 00b6082..d03a44b 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -278,7 +278,7 @@ static int i40e_vlan_filter_set(struct rte_eth_dev *dev,\n static int i40e_vlan_tpid_set(struct rte_eth_dev *dev,\n \t\t\t      enum rte_vlan_type vlan_type,\n \t\t\t      uint16_t tpid);\n-static void i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void i40e_vlan_strip_queue_set(struct rte_eth_dev *dev,\n \t\t\t\t      uint16_t queue,\n \t\t\t\t      int on);\n@@ -3130,7 +3130,7 @@ static int i40e_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \treturn ret;\n }\n \n-static void\n+static int\n i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n@@ -3163,6 +3163,7 @@ static int i40e_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \t\telse\n \t\t\ti40e_vsi_config_double_vlan(vsi, FALSE);\n \t}\n+\treturn 0;\n }\n \n static void\n@@ -5216,7 +5217,11 @@ struct i40e_vsi *\n \n \t/* Apply vlan offload setting */\n \tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK;\n-\ti40e_vlan_offload_set(dev, mask);\n+\tret = i40e_vlan_offload_set(dev, mask);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(INFO, \"Failed to update vlan offload\");\n+\t\treturn ret;\n+\t}\n \n \t/* Apply double-vlan setting, not implemented yet */\n \ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex f6d8293..f7fffc2 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -118,7 +118,7 @@ static int i40evf_dev_xstats_get_names(struct rte_eth_dev *dev,\n static void i40evf_dev_xstats_reset(struct rte_eth_dev *dev);\n static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t  uint16_t vlan_id, int on);\n-static void i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static int i40evf_vlan_pvid_set(struct rte_eth_dev *dev, uint16_t pvid,\n \t\t\t\tint on);\n static void i40evf_dev_close(struct rte_eth_dev *dev);\n@@ -1634,7 +1634,9 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n \tint ret;\n \n \t/* Apply vlan offload setting */\n-\ti40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);\n+\tret = i40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);\n+\tif (ret)\n+\t\treturn ret;\n \n \t/* Apply pvid setting */\n \tret = i40evf_vlan_pvid_set(dev, data->dev_conf.txmode.pvid,\n@@ -1642,7 +1644,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n \treturn ret;\n }\n \n-static void\n+static int\n i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n@@ -1655,6 +1657,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n \t\telse\n \t\t\ti40evf_disable_vlan_strip(dev);\n \t}\n+\treturn 0;\n }\n \n static int\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 22171d8..1ec5aaf 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -218,7 +218,7 @@ static void ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev,\n \t\tuint16_t queue, bool on);\n static void ixgbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue,\n \t\tint on);\n-static void ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue);\n static void ixgbe_vlan_hw_strip_disable(struct rte_eth_dev *dev, uint16_t queue);\n static void ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev);\n@@ -274,7 +274,7 @@ static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,\n \t\tuint16_t vlan_id, int on);\n static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev,\n \t\tuint16_t queue, int on);\n-static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);\n static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,\n \t\t\t\t\t    uint16_t queue_id);\n@@ -2125,7 +2125,7 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)\n \t */\n }\n \n-static void\n+static int\n ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tif (mask & ETH_VLAN_STRIP_MASK) {\n@@ -2148,6 +2148,7 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)\n \t\telse\n \t\t\tixgbe_vlan_hw_extend_disable(dev);\n \t}\n+\treturn 0;\n }\n \n static void\n@@ -2568,9 +2569,13 @@ static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)\n \t\tgoto error;\n \t}\n \n-    mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |\n+\tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |\n \t\tETH_VLAN_EXTEND_MASK;\n-\tixgbe_vlan_offload_set(dev, mask);\n+\terr = ixgbe_vlan_offload_set(dev, mask);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to set VLAN offload\");\n+\t\tgoto error;\n+\t}\n \n \tif (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {\n \t\t/* Enable vlan filtering for VMDq */\n@@ -4993,7 +4998,12 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,\n \t/* Set HW strip */\n \tmask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |\n \t\tETH_VLAN_EXTEND_MASK;\n-\tixgbevf_vlan_offload_set(dev, mask);\n+\terr = ixgbevf_vlan_offload_set(dev, mask);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Unable to set VLAN offload (%d)\", err);\n+\t\tixgbe_dev_clear_queues(dev);\n+\t\treturn err;\n+\t}\n \n \tixgbevf_dev_rxtx_start(dev);\n \n@@ -5153,7 +5163,7 @@ static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)\n \tixgbe_vlan_hw_strip_bitmap_set(dev, queue, on);\n }\n \n-static void\n+static int\n ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct ixgbe_hw *hw =\n@@ -5168,6 +5178,7 @@ static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)\n \t\tfor (i = 0; i < hw->mac.max_rx_queues; i++)\n \t\t\tixgbevf_vlan_strip_queue_set(dev, i, on);\n \t}\n+\treturn 0;\n }\n \n int\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 43c5384..93e71be 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -283,7 +283,7 @@ int mlx5_xstats_get_names(struct rte_eth_dev *,\n /* mlx5_vlan.c */\n \n int mlx5_vlan_filter_set(struct rte_eth_dev *, uint16_t, int);\n-void mlx5_vlan_offload_set(struct rte_eth_dev *, int);\n+int mlx5_vlan_offload_set(struct rte_eth_dev *, int);\n void mlx5_vlan_strip_queue_set(struct rte_eth_dev *, uint16_t, int);\n \n /* mlx5_trigger.c */\ndiff --git a/drivers/net/mlx5/mlx5_vlan.c b/drivers/net/mlx5/mlx5_vlan.c\nindex 1b0fa40..7215909 100644\n--- a/drivers/net/mlx5/mlx5_vlan.c\n+++ b/drivers/net/mlx5/mlx5_vlan.c\n@@ -210,7 +210,7 @@\n  * @param mask\n  *   VLAN offload bit mask.\n  */\n-void\n+int\n mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct priv *priv = dev->data->dev_private;\n@@ -230,4 +230,5 @@\n \t\t\tpriv_vlan_strip_queue_set(priv, i, hw_vlan_strip);\n \t\tpriv_unlock(priv);\n \t}\n+\treturn 0;\n }\ndiff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c\nindex 92b03c4..6473edc 100644\n--- a/drivers/net/nfp/nfp_net.c\n+++ b/drivers/net/nfp/nfp_net.c\n@@ -2149,11 +2149,12 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq)\n \treturn i;\n }\n \n-static void\n+static int\n nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tuint32_t new_ctrl, update;\n \tstruct nfp_net_hw *hw;\n+\tint ret;\n \n \thw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tnew_ctrl = 0;\n@@ -2174,14 +2175,14 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq)\n \t\tnew_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_RXVLAN;\n \n \tif (new_ctrl == 0)\n-\t\treturn;\n+\t\treturn 0;\n \n \tupdate = NFP_NET_CFG_UPDATE_GEN;\n \n-\tif (nfp_net_reconfig(hw, new_ctrl, update) < 0)\n-\t\treturn;\n-\n-\thw->ctrl = new_ctrl;\n+\tret = nfp_net_reconfig(hw, new_ctrl, update);\n+\tif (!ret)\n+\t\thw->ctrl = new_ctrl;\n+\treturn ret;\n }\n \n /* Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device */\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 0e05989..c5b1653 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -975,7 +975,7 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,\n \treturn rc;\n }\n \n-static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n+static int qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n {\n \tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n \tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n@@ -1013,6 +1013,8 @@ static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)\n \n \tDP_INFO(edev, \"vlan offload mask %d vlan-strip %d vlan-filter %d\\n\",\n \t\tmask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);\n+\n+\treturn 0;\n }\n \n static void qede_prandom_bytes(uint32_t *buff)\n@@ -1157,6 +1159,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)\n \tstruct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);\n \tstruct ecore_dev *edev = QEDE_INIT_EDEV(qdev);\n \tstruct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;\n+        int ret;\n \n \tPMD_INIT_FUNC_TRACE(edev);\n \n@@ -1237,9 +1240,11 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)\n \tqdev->enable_lro = rxmode->enable_lro;\n \n \t/* Enable VLAN offloads by default */\n-\tqede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |\n+\tret = qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |\n \t\t\tETH_VLAN_FILTER_MASK |\n \t\t\tETH_VLAN_EXTEND_MASK);\n+\tif (ret)\n+\t\treturn ret;\n \n \tDP_INFO(edev, \"Device configured with RSS=%d TSS=%d\\n\",\n \t\t\tQEDE_RSS_COUNT(qdev), QEDE_TSS_COUNT(qdev));\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex e320811..72b4248 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -72,6 +72,7 @@ static void virtio_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info);\n static int virtio_dev_link_update(struct rte_eth_dev *dev,\n \tint wait_to_complete);\n+static int virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n \n static void virtio_set_hwaddr(struct virtio_hw *hw);\n static void virtio_get_hwaddr(struct virtio_hw *hw);\n@@ -779,6 +780,7 @@ struct rte_virtio_xstats_name_off {\n \t.stats_reset             = virtio_dev_stats_reset,\n \t.xstats_reset            = virtio_dev_stats_reset,\n \t.link_update             = virtio_dev_link_update,\n+\t.vlan_offload_set        = virtio_dev_vlan_offload_set,\n \t.rx_queue_setup          = virtio_dev_rx_queue_setup,\n \t.rx_queue_intr_enable    = virtio_dev_rx_queue_intr_enable,\n \t.rx_queue_intr_disable   = virtio_dev_rx_queue_intr_disable,\n@@ -1875,6 +1877,25 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)\n \treturn (old.link_status == link.link_status) ? -1 : 0;\n }\n \n+static int\n+virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n+{\n+\tconst struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;\n+\tstruct virtio_hw *hw = dev->data->dev_private;\n+\n+\tif (rxmode->hw_vlan_filter &&\n+\t    !vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) {\n+\t\tPMD_DRV_LOG(NOTICE,\n+\t\t\t    \"vlan filtering not available on this host\");\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tif (mask & ETH_VLAN_STRIP_MASK)\n+\t\thw->vlan_strip = rxmode->hw_vlan_strip;\n+\n+\treturn 0;\n+}\n+\n static void\n virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n {\ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 3910991..06735dd 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -100,7 +100,7 @@ static void vmxnet3_dev_info_get(struct rte_eth_dev *dev,\n vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t       uint16_t vid, int on);\n-static void vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void vmxnet3_mac_addr_set(struct rte_eth_dev *dev,\n \t\t\t\t struct ether_addr *mac_addr);\n static void vmxnet3_interrupt_handler(void *param);\n@@ -730,8 +730,10 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)\n \t\tdevRead->rssConfDesc.confPA  = hw->rss_confPA;\n \t}\n \n-\tvmxnet3_dev_vlan_offload_set(dev,\n+\tret = vmxnet3_dev_vlan_offload_set(dev,\n \t\t\t\t     ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK);\n+\tif (ret)\n+\t\treturn ret;\n \n \tvmxnet3_write_mac(hw, dev->data->mac_addrs->addr_bytes);\n \n@@ -1275,7 +1277,7 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)\n \treturn 0;\n }\n \n-static void\n+static int\n vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n \tstruct vmxnet3_hw *hw = dev->data->dev_private;\n@@ -1301,6 +1303,8 @@ static int eth_vmxnet3_pci_remove(struct rte_pci_device *pci_dev)\n \t\tVMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,\n \t\t\t\t       VMXNET3_CMD_UPDATE_VLAN_FILTERS);\n \t}\n+\n+\treturn 0;\n }\n \n static void\ndiff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c\nindex 0597641..d592a96 100644\n--- a/lib/librte_ether/rte_ethdev.c\n+++ b/lib/librte_ether/rte_ethdev.c\n@@ -2049,10 +2049,16 @@ struct rte_eth_dev *\n \tint ret = 0;\n \tint mask = 0;\n \tint cur, org = 0;\n+\tuint8_t org_strip, org_filter, org_extend;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n \n+\t/* save original values in case of failure */\n+\torg_strip = dev->data->dev_conf.rxmode.hw_vlan_strip;\n+\torg_filter = dev->data->dev_conf.rxmode.hw_vlan_filter;\n+\torg_extend = dev->data->dev_conf.rxmode.hw_vlan_extend;\n+\n \t/*check which option changed by application*/\n \tcur = !!(offload_mask & ETH_VLAN_STRIP_OFFLOAD);\n \torg = !!(dev->data->dev_conf.rxmode.hw_vlan_strip);\n@@ -2080,7 +2086,13 @@ struct rte_eth_dev *\n \t\treturn ret;\n \n \tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_offload_set, -ENOTSUP);\n-\t(*dev->dev_ops->vlan_offload_set)(dev, mask);\n+\tret = (*dev->dev_ops->vlan_offload_set)(dev, mask);\n+\tif (ret) {\n+\t\t/* hit an error restore  original values */\n+\t\tdev->data->dev_conf.rxmode.hw_vlan_strip = org_strip;\n+\t\tdev->data->dev_conf.rxmode.hw_vlan_filter = org_filter;\n+\t\tdev->data->dev_conf.rxmode.hw_vlan_extend = org_extend;\n+\t}\n \n \treturn ret;\n }\ndiff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h\nindex 0adf327..7254fd0 100644\n--- a/lib/librte_ether/rte_ethdev.h\n+++ b/lib/librte_ether/rte_ethdev.h\n@@ -1245,7 +1245,7 @@ typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev,\n \t\t\t       enum rte_vlan_type type, uint16_t tpid);\n /**< @internal set the outer/inner VLAN-TPID by an Ethernet device. */\n \n-typedef void (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);\n+typedef int (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);\n /**< @internal set VLAN offload function by an Ethernet device. */\n \n typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev,\n",
    "prefixes": [
        "dpdk-dev",
        "v2"
    ]
}