From: Nogah Frankel <nogahf@mellanox.com>
Date: Wed, 20 Sep 2017 16:15:08 +0200
Subject: mlxsw: spectrum_switchdev: Don't write mids to the HW when mc is
disabled
Patch-mainline: v4.15-rc1
Git-commit: 846fd8a0e7dcd9f455a86dc17ddf0a51c124f9c0
References: bsc#1112374
Don't write multicast related data to the HW when mc is disabled.
Also, don't allocate mid id to new mids (so the remove function could know
that they weren't wrote to the HW)
Signed-off-by: Nogah Frankel <nogahf@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | 21 ++++++++++++---
1 file changed, 17 insertions(+), 4 deletions(-)
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
@@ -1290,6 +1290,9 @@ mlxsw_sp_mc_write_mdb_entry(struct mlxsw
static int mlxsw_sp_mc_remove_mdb_entry(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mid *mid)
{
+ if (!mid->in_hw)
+ return 0;
+
clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
mid->in_hw = false;
return mlxsw_sp_port_mdb_op(mlxsw_sp, mid->addr, mid->fid, mid->mid,
@@ -1319,11 +1322,15 @@ mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct
ether_addr_copy(mid->addr, addr);
mid->fid = fid;
mid->in_hw = false;
+
+ if (!bridge_device->multicast_enabled)
+ goto out;
+
if (!mlxsw_sp_mc_write_mdb_entry(mlxsw_sp, mid))
goto err_write_mdb_entry;
+out:
list_add_tail(&mid->list, &bridge_device->mids_list);
-
return mid;
err_write_mdb_entry:
@@ -1391,6 +1398,9 @@ static int mlxsw_sp_port_mdb_add(struct
}
set_bit(mlxsw_sp_port->local_port, mid->ports_in_mid);
+ if (!bridge_device->multicast_enabled)
+ return 0;
+
err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, true);
if (err) {
netdev_err(dev, "Unable to set SMID\n");
@@ -1476,9 +1486,12 @@ __mlxsw_sp_port_mdb_del(struct mlxsw_sp_
struct net_device *dev = mlxsw_sp_port->dev;
int err;
- err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false);
- if (err)
- netdev_err(dev, "Unable to remove port from SMID\n");
+ if (bridge_port->bridge_device->multicast_enabled) {
+ err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false);
+
+ if (err)
+ netdev_err(dev, "Unable to remove port from SMID\n");
+ }
err = mlxsw_sp_port_remove_from_mid(mlxsw_sp_port, mid);
if (err)