Convert bnxt from ndo_set_rx_mode to ndo_set_rx_mode_async.
bnxt_set_rx_mode, bnxt_mc_list_updated and bnxt_uc_list_updated
now take explicit uc/mc list parameters and iterate with
netdev_hw_addr_list_for_each instead of netdev_for_each_{uc,mc}_addr.

The bnxt_cfg_rx_mode internal caller passes the real lists under
netif_addr_lock_bh.

BNXT_RX_MASK_SP_EVENT is still used here, next patch converts to
the direct call.

Cc: Michael Chan <[email protected]>
Cc: Pavan Chebbi <[email protected]>
Signed-off-by: Stanislav Fomichev <[email protected]>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 31 +++++++++++++----------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index c982aac714d1..225217b32e4b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11040,7 +11040,8 @@ static int bnxt_setup_nitroa0_vnic(struct bnxt *bp)
 }
 
 static int bnxt_cfg_rx_mode(struct bnxt *);
-static bool bnxt_mc_list_updated(struct bnxt *, u32 *);
+static bool bnxt_mc_list_updated(struct bnxt *, u32 *,
+                                const struct netdev_hw_addr_list *);
 
 static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
 {
@@ -11130,7 +11131,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool 
irq_re_init)
        } else if (bp->dev->flags & IFF_MULTICAST) {
                u32 mask = 0;
 
-               bnxt_mc_list_updated(bp, &mask);
+               bnxt_mc_list_updated(bp, &mask, &bp->dev->mc);
                vnic->rx_mask |= mask;
        }
 
@@ -13519,17 +13520,17 @@ void bnxt_get_ring_drv_stats(struct bnxt *bp,
                bnxt_get_one_ring_drv_stats(bp, stats, &bp->bnapi[i]->cp_ring);
 }
 
-static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask)
+static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask,
+                                const struct netdev_hw_addr_list *mc)
 {
        struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
-       struct net_device *dev = bp->dev;
        struct netdev_hw_addr *ha;
        u8 *haddr;
        int mc_count = 0;
        bool update = false;
        int off = 0;
 
-       netdev_for_each_mc_addr(ha, dev) {
+       netdev_hw_addr_list_for_each(ha, mc) {
                if (mc_count >= BNXT_MAX_MC_ADDRS) {
                        *rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
                        vnic->mc_list_count = 0;
@@ -13553,17 +13554,17 @@ static bool bnxt_mc_list_updated(struct bnxt *bp, u32 
*rx_mask)
        return update;
 }
 
-static bool bnxt_uc_list_updated(struct bnxt *bp)
+static bool bnxt_uc_list_updated(struct bnxt *bp,
+                                const struct netdev_hw_addr_list *uc)
 {
-       struct net_device *dev = bp->dev;
        struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
        struct netdev_hw_addr *ha;
        int off = 0;
 
-       if (netdev_uc_count(dev) != (vnic->uc_filter_count - 1))
+       if (netdev_hw_addr_list_count(uc) != (vnic->uc_filter_count - 1))
                return true;
 
-       netdev_for_each_uc_addr(ha, dev) {
+       netdev_hw_addr_list_for_each(ha, uc) {
                if (!ether_addr_equal(ha->addr, vnic->uc_list + off))
                        return true;
 
@@ -13572,7 +13573,9 @@ static bool bnxt_uc_list_updated(struct bnxt *bp)
        return false;
 }
 
-static void bnxt_set_rx_mode(struct net_device *dev)
+static void bnxt_set_rx_mode(struct net_device *dev,
+                            struct netdev_hw_addr_list *uc,
+                            struct netdev_hw_addr_list *mc)
 {
        struct bnxt *bp = netdev_priv(dev);
        struct bnxt_vnic_info *vnic;
@@ -13593,7 +13596,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
        if (dev->flags & IFF_PROMISC)
                mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
 
-       uc_update = bnxt_uc_list_updated(bp);
+       uc_update = bnxt_uc_list_updated(bp, uc);
 
        if (dev->flags & IFF_BROADCAST)
                mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
@@ -13601,7 +13604,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
                mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
                vnic->mc_list_count = 0;
        } else if (dev->flags & IFF_MULTICAST) {
-               mc_update = bnxt_mc_list_updated(bp, &mask);
+               mc_update = bnxt_mc_list_updated(bp, &mask, mc);
        }
 
        if (mask != vnic->rx_mask || uc_update || mc_update) {
@@ -13620,7 +13623,7 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp)
        bool uc_update;
 
        netif_addr_lock_bh(dev);
-       uc_update = bnxt_uc_list_updated(bp);
+       uc_update = bnxt_uc_list_updated(bp, &dev->uc);
        netif_addr_unlock_bh(dev);
 
        if (!uc_update)
@@ -15871,7 +15874,7 @@ static const struct net_device_ops bnxt_netdev_ops = {
        .ndo_start_xmit         = bnxt_start_xmit,
        .ndo_stop               = bnxt_close,
        .ndo_get_stats64        = bnxt_get_stats64,
-       .ndo_set_rx_mode        = bnxt_set_rx_mode,
+       .ndo_set_rx_mode_async  = bnxt_set_rx_mode,
        .ndo_eth_ioctl          = bnxt_ioctl,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_mac_address    = bnxt_change_mac_addr,
-- 
2.53.0


Reply via email to