]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5e: Allow set_rx_mode on uplink representor
authorSaeed Mahameed <saeedm@nvidia.com>
Thu, 19 Mar 2026 00:54:56 +0000 (17:54 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 Mar 2026 02:56:15 +0000 (19:56 -0700)
set_rx_mode handler was skipped on uplink representor, since uplink
relies on FDB to forward all traffic to it by default, which works
perfectly on a single PF per physical port configuration, as explicit
mac request isn't required, but In case of multi-host and DPU
environments, uplink can only use own mac address, as set_rx_mode
wasn't honored in uplink rep.

Since MPFs (Multi PF switch) requires PFs to request explicit mac
forwarding, this patch enables set_rx_mode on uplink representor to
allow PF mac programming into MPFs table in switchdev mode, allowing
use-cases such as arbitrary mac address forwarding via linux bridge.

Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260319005456.82745-1-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

index 55255fe6e415f53512296e03d71f03cb068ae742..fdfe9d1cfe21b882e05ee10e3f4cb4a47d9980ab 100644 (file)
@@ -822,8 +822,14 @@ static void mlx5e_destroy_promisc_table(struct mlx5e_flow_steering *fs)
 void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs,
                               struct net_device *netdev)
 {
+       struct mlx5e_priv *priv = netdev_priv(netdev);
        struct mlx5e_l2_table *ea = &fs->l2;
 
+       if (mlx5e_is_uplink_rep(priv)) {
+               mlx5e_handle_netdev_addr(fs, netdev);
+               goto update_vport_context;
+       }
+
        bool rx_mode_enable  = fs->state_destroy;
        bool promisc_enabled   = rx_mode_enable && (netdev->flags & IFF_PROMISC);
        bool allmulti_enabled  = rx_mode_enable && (netdev->flags & IFF_ALLMULTI);
@@ -863,6 +869,7 @@ void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs,
        ea->allmulti_enabled  = allmulti_enabled;
        ea->broadcast_enabled = broadcast_enabled;
 
+update_vport_context:
        mlx5e_vport_context_update(fs, netdev);
 }
 
@@ -983,6 +990,9 @@ static int mlx5e_add_l2_flow_rule(struct mlx5e_flow_steering *fs,
        u8 *mc_dmac;
        u8 *mv_dmac;
 
+       if (!ft)
+               return -EINVAL;
+
        spec = kvzalloc_obj(*spec);
        if (!spec)
                return -ENOMEM;
index f7009da94f0b4abeb600b87f15fc906721c69496..3eebdf40212995151c32d0895a204397b1c56414 100644 (file)
@@ -4102,9 +4102,6 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
 
 static void mlx5e_nic_set_rx_mode(struct mlx5e_priv *priv)
 {
-       if (mlx5e_is_uplink_rep(priv))
-               return; /* no rx mode for uplink rep */
-
        queue_work(priv->wq, &priv->set_rx_mode_work);
 }
 
index 1db4ecb2356fd7cb299b8352efe6c15cd183ebee..8992f0f7a870bd72fc8336f3a66a803f14a31803 100644 (file)
@@ -1369,6 +1369,8 @@ static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
        netdev_unlock(priv->netdev);
        rtnl_unlock();
 
+       /* clean-up uplink's mpfs mac table */
+       queue_work(priv->wq, &priv->set_rx_mode_work);
        mlx5e_rep_bridge_cleanup(priv);
        mlx5e_dcbnl_delete_app(priv);
        mlx5_notifier_unregister(mdev, &priv->events_nb);