]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bnxt: convert to ndo_set_rx_mode_async
authorStanislav Fomichev <sdf.kernel@gmail.com>
Thu, 16 Apr 2026 18:57:04 +0000 (11:57 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 21 Apr 2026 10:50:25 +0000 (12:50 +0200)
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 <michael.chan@broadcom.com>
Cc: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20260416185712.2155425-8-sdf@fomichev.me
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 2715632115a5f55b7e052654dc786c2cd362a6d1..61d4a99114133f9e63bede165ae63349e081b4d2 100644 (file)
@@ -11132,7 +11132,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)
 {
@@ -11222,7 +11223,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;
        }
 
@@ -13620,17 +13621,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;
@@ -13654,17 +13655,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;
 
@@ -13673,7 +13674,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;
@@ -13694,7 +13697,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;
@@ -13702,7 +13705,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) {
@@ -13721,7 +13724,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)
@@ -15986,7 +15989,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,