From: Satha Rao <skotesh...@marvell.com>

Return -ENOSPC when there is no space to update the complete MC address
list, without flushing the existing list of addresses.

Signed-off-by: Satha Rao <skotesh...@marvell.com>
---
 drivers/net/cnxk/cnxk_ethdev_ops.c | 32 ++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/net/cnxk/cnxk_ethdev_ops.c 
b/drivers/net/cnxk/cnxk_ethdev_ops.c
index 5b0948e07a..9970c5ff5c 100644
--- a/drivers/net/cnxk/cnxk_ethdev_ops.c
+++ b/drivers/net/cnxk/cnxk_ethdev_ops.c
@@ -1117,17 +1117,14 @@ cnxk_nix_rss_hash_conf_get(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-int
-cnxk_nix_mc_addr_list_configure(struct rte_eth_dev *eth_dev,
-                               struct rte_ether_addr *mc_addr_set,
-                               uint32_t nb_mc_addr)
+static inline int
+nix_mc_addr_list_flush(struct rte_eth_dev *eth_dev)
 {
        struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
        struct rte_eth_dev_data *data = eth_dev->data;
        struct rte_ether_addr null_mac_addr;
        struct roc_nix *nix = &dev->nix;
-       int rc, index;
-       uint32_t i;
+       int i, rc = 0;
 
        memset(&null_mac_addr, 0, sizeof(null_mac_addr));
 
@@ -1148,15 +1145,34 @@ cnxk_nix_mc_addr_list_configure(struct rte_eth_dev 
*eth_dev,
                }
        }
 
+       return rc;
+}
+
+int
+cnxk_nix_mc_addr_list_configure(struct rte_eth_dev *eth_dev, struct 
rte_ether_addr *mc_addr_set,
+                               uint32_t nb_mc_addr)
+{
+       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+       struct rte_eth_dev_data *data = eth_dev->data;
+       struct roc_nix *nix = &dev->nix;
+       int index, mc_addr_cnt = 0;
+       uint32_t i;
+
        if (!mc_addr_set || !nb_mc_addr)
-               return 0;
+               return nix_mc_addr_list_flush(eth_dev);
+
+       /* Count multicast MAC addresses in list */
+       for (i = 0; i < dev->max_mac_entries; i++)
+               if (rte_is_multicast_ether_addr(&data->mac_addrs[i]))
+                       mc_addr_cnt++;
 
        /* Check for available space */
        if (nb_mc_addr >
-           ((uint32_t)(dev->max_mac_entries - dev->dmac_filter_count))) {
+           ((uint32_t)(dev->max_mac_entries - (dev->dmac_filter_count - 
mc_addr_cnt)))) {
                plt_err("No space is available to add multicast filters");
                return -ENOSPC;
        }
+       nix_mc_addr_list_flush(eth_dev);
 
        /* Multicast addresses are to be installed */
        for (i = 0; i < nb_mc_addr; i++) {
-- 
2.34.1

Reply via email to