get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 24014,
    "url": "http://patches.dpdk.org/api/patches/24014/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1493446107-62078-2-git-send-email-wei.dai@intel.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<1493446107-62078-2-git-send-email-wei.dai@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1493446107-62078-2-git-send-email-wei.dai@intel.com",
    "date": "2017-04-29T06:08:25",
    "name": "[dpdk-dev,v5,1/3] ethdev: fix adding invalid MAC addr",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "98128869434b64dd9b8fbd8b00c0b8707dcc60bc",
    "submitter": {
        "id": 490,
        "url": "http://patches.dpdk.org/api/people/490/?format=api",
        "name": "Wei Dai",
        "email": "wei.dai@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1493446107-62078-2-git-send-email-wei.dai@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/24014/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/24014/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 3C06458EC;\n\tSat, 29 Apr 2017 08:16:43 +0200 (CEST)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id 624E05587;\n\tSat, 29 Apr 2017 08:16:37 +0200 (CEST)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t28 Apr 2017 23:16:36 -0700",
            "from dpdk6.bj.intel.com ([172.16.182.81])\n\tby orsmga003.jf.intel.com with ESMTP; 28 Apr 2017 23:16:29 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.37,391,1488873600\"; d=\"scan'208\";a=\"962495018\"",
        "From": "Wei Dai <wei.dai@intel.com>",
        "To": "wenzhuo.lu@intel.com, thomas@monjalon.net, harish.patil@cavium.com,\n\trasesh.mody@cavium.com, stephen.hurd@broadcom.com,\n\tajit.khaparde@broadcom.com, helin.zhang@intel.com,\n\tkonstantin.ananyev@intel.com, jingjing.wu@intel.com,\n\tjing.d.chen@intel.com, \n\tadrien.mazarguil@6wind.com, nelio.laranjeiro@6wind.com,\n\tbruce.richardson@intel.com, yuanhan.liu@linux.intel.com,\n\tmaxime.coquelin@redhat.com, shepard.siegel@atomicrules.com,\n\ted.czeck@atomicrules.com, john.miller@atomicrules.com",
        "Cc": "dev@dpdk.org,\n\tWei Dai <wei.dai@intel.com>,\n\tstable@dpdk.org",
        "Date": "Sat, 29 Apr 2017 14:08:25 +0800",
        "Message-Id": "<1493446107-62078-2-git-send-email-wei.dai@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1493446107-62078-1-git-send-email-wei.dai@intel.com>",
        "References": "<1493446107-62078-1-git-send-email-wei.dai@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v5 1/3] ethdev: fix adding invalid MAC addr",
        "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 customers find adding MAC addr to VF sometimes can fail,\nbut it is still stored in dev->data->mac_addrs[ ]. So this\ncan lead to some errors that assumes the non-zero entry in\ndev->data->mac_addrs[ ] is valid.\n\nFixes: af75078fece3 (\"first public release\")\nCc: stable@dpdk.org\n\nSigned-off-by: Wei Dai <wei.dai@intel.com>\n---\n drivers/net/ark/ark_ethdev.c       | 15 +++++++++------\n drivers/net/bnx2x/bnx2x_ethdev.c   |  7 +++++--\n drivers/net/bnxt/bnxt_ethdev.c     | 16 ++++++++--------\n drivers/net/e1000/base/e1000_api.c |  2 +-\n drivers/net/e1000/em_ethdev.c      |  8 ++++----\n drivers/net/e1000/igb_ethdev.c     |  9 +++++----\n drivers/net/enic/enic.h            |  2 +-\n drivers/net/enic/enic_ethdev.c     |  4 ++--\n drivers/net/enic/enic_main.c       |  9 ++++-----\n drivers/net/fm10k/fm10k_ethdev.c   |  3 ++-\n drivers/net/i40e/i40e_ethdev.c     | 17 +++++++++--------\n drivers/net/i40e/i40e_ethdev_vf.c  | 14 +++++++-------\n drivers/net/ixgbe/ixgbe_ethdev.c   | 33 +++++++++++++++++++++------------\n drivers/net/mlx4/mlx4.c            | 16 ++++++++++------\n drivers/net/mlx5/mlx5.h            |  4 ++--\n drivers/net/mlx5/mlx5_mac.c        | 16 ++++++++++------\n drivers/net/qede/qede_ethdev.c     |  6 ++++--\n drivers/net/ring/rte_eth_ring.c    |  3 ++-\n drivers/net/virtio/virtio_ethdev.c | 13 +++++++------\n lib/librte_ether/rte_ethdev.c      | 15 +++++++++------\n lib/librte_ether/rte_ethdev.h      |  2 +-\n 21 files changed, 123 insertions(+), 91 deletions(-)",
    "diff": "diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c\nindex 4caad98..0c3fa42 100644\n--- a/drivers/net/ark/ark_ethdev.c\n+++ b/drivers/net/ark/ark_ethdev.c\n@@ -71,10 +71,10 @@ static void eth_ark_dev_stats_get(struct rte_eth_dev *dev,\n static void eth_ark_dev_stats_reset(struct rte_eth_dev *dev);\n static void eth_ark_set_default_mac_addr(struct rte_eth_dev *dev,\n \t\t\t\t\t struct ether_addr *mac_addr);\n-static void eth_ark_macaddr_add(struct rte_eth_dev *dev,\n-\t\t\t\tstruct ether_addr *mac_addr,\n-\t\t\t\tuint32_t index,\n-\t\t\t\tuint32_t pool);\n+static int eth_ark_macaddr_add(struct rte_eth_dev *dev,\n+\t\t\t       struct ether_addr *mac_addr,\n+\t\t\t       uint32_t index,\n+\t\t\t       uint32_t pool);\n static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,\n \t\t\t\t   uint32_t index);\n \n@@ -831,7 +831,7 @@ eth_ark_dev_stats_reset(struct rte_eth_dev *dev)\n \t\tark->user_ext.stats_reset(dev, ark->user_data);\n }\n \n-static void\n+static int\n eth_ark_macaddr_add(struct rte_eth_dev *dev,\n \t\t    struct ether_addr *mac_addr,\n \t\t    uint32_t index,\n@@ -840,12 +840,15 @@ eth_ark_macaddr_add(struct rte_eth_dev *dev,\n \tstruct ark_adapter *ark =\n \t\t(struct ark_adapter *)dev->data->dev_private;\n \n-\tif (ark->user_ext.mac_addr_add)\n+\tif (ark->user_ext.mac_addr_add) {\n \t\tark->user_ext.mac_addr_add(dev,\n \t\t\t\t\t   mac_addr,\n \t\t\t\t\t   index,\n \t\t\t\t\t   pool,\n \t\t\t\t\t   ark->user_data);\n+\t\treturn 0;\n+\t}\n+\treturn -ENOTSUP;\n }\n \n static void\ndiff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c\nindex 314e5ea..b79cfdb 100644\n--- a/drivers/net/bnx2x/bnx2x_ethdev.c\n+++ b/drivers/net/bnx2x/bnx2x_ethdev.c\n@@ -451,14 +451,17 @@ bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_inf\n \tdev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_20G;\n }\n \n-static void\n+static int\n bnx2x_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\tuint32_t index, uint32_t pool)\n {\n \tstruct bnx2x_softc *sc = dev->data->dev_private;\n \n-\tif (sc->mac_ops.mac_addr_add)\n+\tif (sc->mac_ops.mac_addr_add) {\n \t\tsc->mac_ops.mac_addr_add(dev, mac_addr, index, pool);\n+\t\treturn 0;\n+\t}\n+\treturn -ENOTSUP;\n }\n \n static void\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 5dc3ff0..c18555f 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -614,9 +614,9 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,\n \t}\n }\n \n-static void bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,\n-\t\t\t\t struct ether_addr *mac_addr,\n-\t\t\t\t uint32_t index, uint32_t pool)\n+static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,\n+\t\t\t\tstruct ether_addr *mac_addr,\n+\t\t\t\tuint32_t index, uint32_t pool)\n {\n \tstruct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;\n \tstruct bnxt_vnic_info *vnic = STAILQ_FIRST(&bp->ff_pool[pool]);\n@@ -624,30 +624,30 @@ static void bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,\n \n \tif (BNXT_VF(bp)) {\n \t\tRTE_LOG(ERR, PMD, \"Cannot add MAC address to a VF interface\\n\");\n-\t\treturn;\n+\t\treturn -ENOTSUP;\n \t}\n \n \tif (!vnic) {\n \t\tRTE_LOG(ERR, PMD, \"VNIC not found for pool %d!\\n\", pool);\n-\t\treturn;\n+\t\treturn -EINVAL;\n \t}\n \t/* Attach requested MAC address to the new l2_filter */\n \tSTAILQ_FOREACH(filter, &vnic->filter, next) {\n \t\tif (filter->mac_index == index) {\n \t\t\tRTE_LOG(ERR, PMD,\n \t\t\t\t\"MAC addr already existed for pool %d\\n\", pool);\n-\t\t\treturn;\n+\t\t\treturn -EINVAL;\n \t\t}\n \t}\n \tfilter = bnxt_alloc_filter(bp);\n \tif (!filter) {\n \t\tRTE_LOG(ERR, PMD, \"L2 filter alloc failed\\n\");\n-\t\treturn;\n+\t\treturn -ENODEV;\n \t}\n \tSTAILQ_INSERT_TAIL(&vnic->filter, filter, next);\n \tfilter->mac_index = index;\n \tmemcpy(filter->l2_addr, mac_addr, ETHER_ADDR_LEN);\n-\tbnxt_hwrm_set_filter(bp, vnic, filter);\n+\treturn bnxt_hwrm_set_filter(bp, vnic, filter);\n }\n \n int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)\ndiff --git a/drivers/net/e1000/base/e1000_api.c b/drivers/net/e1000/base/e1000_api.c\nindex f7cf83b..dcb53f7 100644\n--- a/drivers/net/e1000/base/e1000_api.c\n+++ b/drivers/net/e1000/base/e1000_api.c\n@@ -855,7 +855,7 @@ int e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)\n \tif (hw->mac.ops.rar_set)\n \t\treturn hw->mac.ops.rar_set(hw, addr, index);\n \n-\treturn E1000_SUCCESS;\n+\treturn E1000_ERR_NO_SPACE;\n }\n \n /**\ndiff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c\nindex 599b9e0..57eb017 100644\n--- a/drivers/net/e1000/em_ethdev.c\n+++ b/drivers/net/e1000/em_ethdev.c\n@@ -120,8 +120,8 @@ static int eth_em_led_on(struct rte_eth_dev *dev);\n static int eth_em_led_off(struct rte_eth_dev *dev);\n \n static int em_get_rx_buffer_size(struct e1000_hw *hw);\n-static void eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n-\t\tuint32_t index, uint32_t pool);\n+static int eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n+\t\t\t  uint32_t index, uint32_t pool);\n static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index);\n \n static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev,\n@@ -1794,13 +1794,13 @@ eth_em_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)\n \treturn -EIO;\n }\n \n-static void\n+static int\n eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\tuint32_t index, __rte_unused uint32_t pool)\n {\n \tstruct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \n-\te1000_rar_set(hw, mac_addr->addr_bytes, index);\n+\treturn e1000_rar_set(hw, mac_addr->addr_bytes, index);\n }\n \n static void\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex ca9f98c..7574c26 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -169,9 +169,9 @@ static int eth_igb_led_off(struct rte_eth_dev *dev);\n \n static void igb_intr_disable(struct e1000_hw *hw);\n static int  igb_get_rx_buffer_size(struct e1000_hw *hw);\n-static void eth_igb_rar_set(struct rte_eth_dev *dev,\n-\t\tstruct ether_addr *mac_addr,\n-\t\tuint32_t index, uint32_t pool);\n+static int eth_igb_rar_set(struct rte_eth_dev *dev,\n+\t\t\t   struct ether_addr *mac_addr,\n+\t\t\t   uint32_t index, uint32_t pool);\n static void eth_igb_rar_clear(struct rte_eth_dev *dev, uint32_t index);\n static void eth_igb_default_mac_addr_set(struct rte_eth_dev *dev,\n \t\tstruct ether_addr *addr);\n@@ -3077,7 +3077,7 @@ eth_igb_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)\n }\n \n #define E1000_RAH_POOLSEL_SHIFT      (18)\n-static void\n+static int\n eth_igb_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t        uint32_t index, __rte_unused uint32_t pool)\n {\n@@ -3088,6 +3088,7 @@ eth_igb_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \trah = E1000_READ_REG(hw, E1000_RAH(index));\n \trah |= (0x1 << (E1000_RAH_POOLSEL_SHIFT + pool));\n \tE1000_WRITE_REG(hw, E1000_RAH(index), rah);\n+\treturn 0;\n }\n \n static void\ndiff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h\nindex e921de4..d17a35f 100644\n--- a/drivers/net/enic/enic.h\n+++ b/drivers/net/enic/enic.h\n@@ -279,7 +279,7 @@ extern void enic_dev_stats_get(struct enic *enic,\n \tstruct rte_eth_stats *r_stats);\n extern void enic_dev_stats_clear(struct enic *enic);\n extern void enic_add_packet_filter(struct enic *enic);\n-void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);\n+int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);\n void enic_del_mac_address(struct enic *enic, int mac_index);\n extern unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq);\n extern void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,\ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex 7579696..372bae7 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -533,14 +533,14 @@ static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)\n \tenic_add_packet_filter(enic);\n }\n \n-static void enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,\n+static int enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,\n \tstruct ether_addr *mac_addr,\n \t__rte_unused uint32_t index, __rte_unused uint32_t pool)\n {\n \tstruct enic *enic = pmd_priv(eth_dev);\n \n \tENICPMD_FUNC_TRACE();\n-\tenic_set_mac_address(enic, mac_addr->addr_bytes);\n+\treturn enic_set_mac_address(enic, mac_addr->addr_bytes);\n }\n \n static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)\ndiff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c\nindex 5f2188b..d026241 100644\n--- a/drivers/net/enic/enic_main.c\n+++ b/drivers/net/enic/enic_main.c\n@@ -202,20 +202,19 @@ void enic_del_mac_address(struct enic *enic, int mac_index)\n \t\tdev_err(enic, \"del mac addr failed\\n\");\n }\n \n-void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)\n+int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)\n {\n \tint err;\n \n \tif (!is_eth_addr_valid(mac_addr)) {\n \t\tdev_err(enic, \"invalid mac address\\n\");\n-\t\treturn;\n+\t\treturn -EINVAL;\n \t}\n \n \terr = vnic_dev_add_addr(enic->vdev, mac_addr);\n-\tif (err) {\n+\tif (err)\n \t\tdev_err(enic, \"add mac addr failed\\n\");\n-\t\treturn;\n-\t}\n+\treturn err;\n }\n \n static void\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex 94b4d40..a742eec 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -1690,7 +1690,7 @@ static void fm10k_MAC_filter_set(struct rte_eth_dev *dev,\n }\n \n /* Add a MAC address, and update filters */\n-static void\n+static int\n fm10k_macaddr_add(struct rte_eth_dev *dev,\n \t\tstruct ether_addr *mac_addr,\n \t\tuint32_t index,\n@@ -1701,6 +1701,7 @@ fm10k_macaddr_add(struct rte_eth_dev *dev,\n \tmacvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);\n \tfm10k_MAC_filter_set(dev, mac_addr->addr_bytes, TRUE, pool);\n \tmacvlan->mac_vmdq_id[index] = pool;\n+\treturn 0;\n }\n \n /* Remove a MAC address, and update filters */\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 3fa25dc..986031d 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -291,10 +291,10 @@ static int i40e_flow_ctrl_set(struct rte_eth_dev *dev,\n \t\t\t      struct rte_eth_fc_conf *fc_conf);\n static int i40e_priority_flow_ctrl_set(struct rte_eth_dev *dev,\n \t\t\t\t       struct rte_eth_pfc_conf *pfc_conf);\n-static void i40e_macaddr_add(struct rte_eth_dev *dev,\n-\t\t\t  struct ether_addr *mac_addr,\n-\t\t\t  uint32_t index,\n-\t\t\t  uint32_t pool);\n+static int i40e_macaddr_add(struct rte_eth_dev *dev,\n+\t\t\t    struct ether_addr *mac_addr,\n+\t\t\t    uint32_t index,\n+\t\t\t    uint32_t pool);\n static void i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index);\n static int i40e_dev_rss_reta_update(struct rte_eth_dev *dev,\n \t\t\t\t    struct rte_eth_rss_reta_entry64 *reta_conf,\n@@ -3267,7 +3267,7 @@ i40e_priority_flow_ctrl_set(__rte_unused struct rte_eth_dev *dev,\n }\n \n /* Add a MAC address, and update filters */\n-static void\n+static int\n i40e_macaddr_add(struct rte_eth_dev *dev,\n \t\t struct ether_addr *mac_addr,\n \t\t __rte_unused uint32_t index,\n@@ -3284,13 +3284,13 @@ i40e_macaddr_add(struct rte_eth_dev *dev,\n \t\tPMD_DRV_LOG(ERR, \"VMDQ not %s, can't set mac to pool %u\",\n \t\t\tpf->flags & I40E_FLAG_VMDQ ? \"configured\" : \"enabled\",\n \t\t\tpool);\n-\t\treturn;\n+\t\treturn -ENOTSUP;\n \t}\n \n \tif (pool > pf->nb_cfg_vmdq_vsi) {\n \t\tPMD_DRV_LOG(ERR, \"Pool number %u invalid. Max pool is %u\",\n \t\t\t\tpool, pf->nb_cfg_vmdq_vsi);\n-\t\treturn;\n+\t\treturn -EINVAL;\n \t}\n \n \t(void)rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);\n@@ -3307,8 +3307,9 @@ i40e_macaddr_add(struct rte_eth_dev *dev,\n \tret = i40e_vsi_add_mac(vsi, &mac_filter);\n \tif (ret != I40E_SUCCESS) {\n \t\tPMD_DRV_LOG(ERR, \"Failed to add MACVLAN filter\");\n-\t\treturn;\n+\t\treturn -ENODEV;\n \t}\n+\treturn 0;\n }\n \n /* Remove a MAC address, and update filters */\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex cb34023..6c081f0 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -136,10 +136,10 @@ static int i40evf_dev_tx_queue_start(struct rte_eth_dev *dev,\n \t\t\t\t     uint16_t tx_queue_id);\n static int i40evf_dev_tx_queue_stop(struct rte_eth_dev *dev,\n \t\t\t\t    uint16_t tx_queue_id);\n-static void i40evf_add_mac_addr(struct rte_eth_dev *dev,\n-\t\t\t\tstruct ether_addr *addr,\n-\t\t\t\tuint32_t index,\n-\t\t\t\tuint32_t pool);\n+static int i40evf_add_mac_addr(struct rte_eth_dev *dev,\n+\t\t\t       struct ether_addr *addr,\n+\t\t\t       uint32_t index,\n+\t\t\t       uint32_t pool);\n static void i40evf_del_mac_addr(struct rte_eth_dev *dev, uint32_t index);\n static int i40evf_dev_rss_reta_update(struct rte_eth_dev *dev,\n \t\t\tstruct rte_eth_rss_reta_entry64 *reta_conf,\n@@ -855,7 +855,7 @@ i40evf_stop_queues(struct rte_eth_dev *dev)\n \treturn 0;\n }\n \n-static void\n+static int\n i40evf_add_mac_addr(struct rte_eth_dev *dev,\n \t\t    struct ether_addr *addr,\n \t\t    __rte_unused uint32_t index,\n@@ -873,7 +873,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,\n \t\t\t    addr->addr_bytes[0], addr->addr_bytes[1],\n \t\t\t    addr->addr_bytes[2], addr->addr_bytes[3],\n \t\t\t    addr->addr_bytes[4], addr->addr_bytes[5]);\n-\t\treturn;\n+\t\treturn I40E_ERR_INVALID_MAC_ADDR;\n \t}\n \n \tlist = (struct i40e_virtchnl_ether_addr_list *)cmd_buffer;\n@@ -892,7 +892,7 @@ i40evf_add_mac_addr(struct rte_eth_dev *dev,\n \t\tPMD_DRV_LOG(ERR, \"fail to execute command \"\n \t\t\t    \"OP_ADD_ETHER_ADDRESS\");\n \n-\treturn;\n+\treturn err;\n }\n \n static void\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 7b856bb..e134bcd 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -247,8 +247,8 @@ static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,\n \t\t\t\t      struct rte_intr_handle *handle);\n static void ixgbe_dev_interrupt_handler(void *param);\n static void ixgbe_dev_interrupt_delayed_handler(void *param);\n-static void ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n-\t\tuint32_t index, uint32_t pool);\n+static int ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n+\t\t\t uint32_t index, uint32_t pool);\n static void ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index);\n static void ixgbe_set_default_mac_addr(struct rte_eth_dev *dev,\n \t\t\t\t\t   struct ether_addr *mac_addr);\n@@ -304,9 +304,9 @@ static void ixgbe_configure_msix(struct rte_eth_dev *dev);\n static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,\n \t\tuint16_t queue_idx, uint16_t tx_rate);\n \n-static void ixgbevf_add_mac_addr(struct rte_eth_dev *dev,\n-\t\t\t\t struct ether_addr *mac_addr,\n-\t\t\t\t uint32_t index, uint32_t pool);\n+static int ixgbevf_add_mac_addr(struct rte_eth_dev *dev,\n+\t\t\t\tstruct ether_addr *mac_addr,\n+\t\t\t\tuint32_t index, uint32_t pool);\n static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);\n static void ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,\n \t\t\t\t\t     struct ether_addr *mac_addr);\n@@ -4622,14 +4622,15 @@ ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,\n \treturn 0;\n }\n \n-static void\n+static int\n ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\t\t\tuint32_t index, uint32_t pool)\n {\n \tstruct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tuint32_t enable_addr = 1;\n \n-\tixgbe_set_rar(hw, index, mac_addr->addr_bytes, pool, enable_addr);\n+\treturn ixgbe_set_rar(hw, index, mac_addr->addr_bytes,\n+\t\t\t     pool, enable_addr);\n }\n \n static void\n@@ -5625,7 +5626,7 @@ static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,\n \treturn 0;\n }\n \n-static void\n+static int\n ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\t     __attribute__((unused)) uint32_t index,\n \t\t     __attribute__((unused)) uint32_t pool)\n@@ -5639,11 +5640,19 @@ ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t * set of PF resources used to store VF MAC addresses.\n \t */\n \tif (memcmp(hw->mac.perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)\n-\t\treturn;\n+\t\treturn -1;\n \tdiag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);\n-\tif (diag == 0)\n-\t\treturn;\n-\tPMD_DRV_LOG(ERR, \"Unable to add MAC address - diag=%d\", diag);\n+\tif (diag != 0)\n+\t\tPMD_DRV_LOG(ERR, \"Unable to add MAC address \"\n+\t\t\t    \"%02x:%02x:%02x:%02x:%02x:%02x- diag=%d\",\n+\t\t\t    mac_addr->addr_bytes[0],\n+\t\t\t    mac_addr->addr_bytes[1],\n+\t\t\t    mac_addr->addr_bytes[2],\n+\t\t\t    mac_addr->addr_bytes[3],\n+\t\t\t    mac_addr->addr_bytes[4],\n+\t\t\t    mac_addr->addr_bytes[5],\n+\t\t\t    diag);\n+\treturn diag;\n }\n \n static void\ndiff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex 0fdba80..2bb9645 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -4503,26 +4503,30 @@ mlx4_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)\n  * @param vmdq\n  *   VMDq pool index to associate address with (ignored).\n  */\n-static void\n+static int\n mlx4_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\t  uint32_t index, uint32_t vmdq)\n {\n \tstruct priv *priv = dev->data->dev_private;\n+\tint re;\n \n \tif (mlx4_is_secondary())\n-\t\treturn;\n+\t\treturn -ENOTSUP;\n \t(void)vmdq;\n \tpriv_lock(priv);\n \tDEBUG(\"%p: adding MAC address at index %\" PRIu32,\n \t      (void *)dev, index);\n \t/* Last array entry is reserved for broadcast. */\n-\tif (index >= (elemof(priv->mac) - 1))\n+\tif (index >= (elemof(priv->mac) - 1)) {\n+\t\tre = EINVAL;\n \t\tgoto end;\n-\tpriv_mac_addr_add(priv, index,\n-\t\t\t  (const uint8_t (*)[ETHER_ADDR_LEN])\n-\t\t\t  mac_addr->addr_bytes);\n+\t}\n+\tre = priv_mac_addr_add(priv, index,\n+\t\t\t       (const uint8_t (*)[ETHER_ADDR_LEN])\n+\t\t\t       mac_addr->addr_bytes);\n end:\n \tpriv_unlock(priv);\n+\treturn -re;\n }\n \n /**\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 71e19ec..67fd742 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -238,8 +238,8 @@ int hash_rxq_mac_addrs_add(struct hash_rxq *);\n int priv_mac_addr_add(struct priv *, unsigned int,\n \t\t      const uint8_t (*)[ETHER_ADDR_LEN]);\n int priv_mac_addrs_enable(struct priv *);\n-void mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,\n-\t\t       uint32_t);\n+int mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,\n+\t\t      uint32_t);\n void mlx5_mac_addr_set(struct rte_eth_dev *, struct ether_addr *);\n \n /* mlx5_rss.c */\ndiff --git a/drivers/net/mlx5/mlx5_mac.c b/drivers/net/mlx5/mlx5_mac.c\nindex 4fcfd3b..79e0c41 100644\n--- a/drivers/net/mlx5/mlx5_mac.c\n+++ b/drivers/net/mlx5/mlx5_mac.c\n@@ -470,26 +470,30 @@ priv_mac_addrs_enable(struct priv *priv)\n  * @param vmdq\n  *   VMDq pool index to associate address with (ignored).\n  */\n-void\n+int\n mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\t  uint32_t index, uint32_t vmdq)\n {\n \tstruct priv *priv = dev->data->dev_private;\n+\tint re;\n \n \tif (mlx5_is_secondary())\n-\t\treturn;\n+\t\treturn -ENOTSUP;\n \n \t(void)vmdq;\n \tpriv_lock(priv);\n \tDEBUG(\"%p: adding MAC address at index %\" PRIu32,\n \t      (void *)dev, index);\n-\tif (index >= RTE_DIM(priv->mac))\n+\tif (index >= RTE_DIM(priv->mac)) {\n+\t\tre = EINVAL;\n \t\tgoto end;\n-\tpriv_mac_addr_add(priv, index,\n-\t\t\t  (const uint8_t (*)[ETHER_ADDR_LEN])\n-\t\t\t  mac_addr->addr_bytes);\n+\t}\n+\tre = priv_mac_addr_add(priv, index,\n+\t\t\t       (const uint8_t (*)[ETHER_ADDR_LEN])\n+\t\t\t       mac_addr->addr_bytes);\n end:\n \tpriv_unlock(priv);\n+\treturn -re;\n }\n \n /**\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex fbad2a6..e2e963e 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -506,16 +506,18 @@ qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,\n \treturn rc;\n }\n \n-static void\n+static int\n qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,\n \t\t  uint32_t index, __rte_unused uint32_t pool)\n {\n \tstruct ecore_filter_ucast ucast;\n+\tint re;\n \n \tqede_set_ucast_cmn_params(&ucast);\n \tucast.type = ECORE_FILTER_MAC;\n \tether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);\n-\t(void)qede_mac_int_ops(eth_dev, &ucast, 1);\n+\tre = (int)qede_mac_int_ops(eth_dev, &ucast, 1);\n+\treturn re;\n }\n \n static void\ndiff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c\nindex 36867e6..87d2258 100644\n--- a/drivers/net/ring/rte_eth_ring.c\n+++ b/drivers/net/ring/rte_eth_ring.c\n@@ -224,12 +224,13 @@ eth_mac_addr_remove(struct rte_eth_dev *dev __rte_unused,\n {\n }\n \n-static void\n+static int\n eth_mac_addr_add(struct rte_eth_dev *dev __rte_unused,\n \tstruct ether_addr *mac_addr __rte_unused,\n \tuint32_t index __rte_unused,\n \tuint32_t vmdq __rte_unused)\n {\n+\treturn -ENOTSUP;\n }\n \n static void\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex e6c57b3..a042b31 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -87,7 +87,7 @@ static void virtio_dev_stats_reset(struct rte_eth_dev *dev);\n static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);\n static int virtio_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\tuint16_t vlan_id, int on);\n-static void virtio_mac_addr_add(struct rte_eth_dev *dev,\n+static int virtio_mac_addr_add(struct rte_eth_dev *dev,\n \t\t\t\tstruct ether_addr *mac_addr,\n \t\t\t\tuint32_t index, uint32_t vmdq __rte_unused);\n static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);\n@@ -1020,7 +1020,7 @@ virtio_get_hwaddr(struct virtio_hw *hw)\n \t}\n }\n \n-static void\n+static int\n virtio_mac_table_set(struct virtio_hw *hw,\n \t\t     const struct virtio_net_ctrl_mac *uc,\n \t\t     const struct virtio_net_ctrl_mac *mc)\n@@ -1030,7 +1030,7 @@ virtio_mac_table_set(struct virtio_hw *hw,\n \n \tif (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {\n \t\tPMD_DRV_LOG(INFO, \"host does not support mac table\");\n-\t\treturn;\n+\t\treturn -1;\n \t}\n \n \tctrl.hdr.class = VIRTIO_NET_CTRL_MAC;\n@@ -1045,9 +1045,10 @@ virtio_mac_table_set(struct virtio_hw *hw,\n \terr = virtio_send_command(hw->cvq, &ctrl, len, 2);\n \tif (err != 0)\n \t\tPMD_DRV_LOG(NOTICE, \"mac table set failed: %d\", err);\n+\treturn err;\n }\n \n-static void\n+static int\n virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\t    uint32_t index, uint32_t vmdq __rte_unused)\n {\n@@ -1058,7 +1059,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \n \tif (index >= VIRTIO_MAX_MAC_ADDRS) {\n \t\tPMD_DRV_LOG(ERR, \"mac address index %u out of range\", index);\n-\t\treturn;\n+\t\treturn -EINVAL;\n \t}\n \n \tuc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));\n@@ -1075,7 +1076,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,\n \t\tmemcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);\n \t}\n \n-\tvirtio_mac_table_set(hw, uc, mc);\n+\treturn virtio_mac_table_set(hw, uc, mc);\n }\n \n static void\ndiff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c\nindex 89f6514..59bed5d 100644\n--- a/lib/librte_ether/rte_ethdev.c\n+++ b/lib/librte_ether/rte_ethdev.c\n@@ -2297,6 +2297,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,\n \tstruct rte_eth_dev *dev;\n \tint index;\n \tuint64_t pool_mask;\n+\tint ret;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n@@ -2329,15 +2330,17 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,\n \t}\n \n \t/* Update NIC */\n-\t(*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);\n+\tret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);\n \n-\t/* Update address in NIC data structure */\n-\tether_addr_copy(addr, &dev->data->mac_addrs[index]);\n+\tif (ret == 0) {\n+\t\t/* Update address in NIC data structure */\n+\t\tether_addr_copy(addr, &dev->data->mac_addrs[index]);\n \n-\t/* Update pool bitmap in NIC data structure */\n-\tdev->data->mac_pool_sel[index] |= (1ULL << pool);\n+\t\t/* Update pool bitmap in NIC data structure */\n+\t\tdev->data->mac_pool_sel[index] |= (1ULL << pool);\n+\t}\n \n-\treturn 0;\n+\treturn ret;\n }\n \n int\ndiff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h\nindex e0f7ee5..1917252 100644\n--- a/lib/librte_ether/rte_ethdev.h\n+++ b/lib/librte_ether/rte_ethdev.h\n@@ -1296,7 +1296,7 @@ typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev);\n typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);\n /**< @internal Remove MAC address from receive address register */\n \n-typedef void (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,\n+typedef int (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,\n \t\t\t\t  struct ether_addr *mac_addr,\n \t\t\t\t  uint32_t index,\n \t\t\t\t  uint32_t vmdq);\n",
    "prefixes": [
        "dpdk-dev",
        "v5",
        "1/3"
    ]
}