SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
        SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
        SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
+       SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
 };
 
 struct switchdev_attr {
                unsigned long brport_flags;             /* PORT_BRIDGE_FLAGS */
                clock_t ageing_time;                    /* BRIDGE_AGEING_TIME */
                bool vlan_filtering;                    /* BRIDGE_VLAN_FILTERING */
+               bool mc_disabled;                       /* MC_DISABLED */
        } u;
 };
 
 
 #include <linux/inetdevice.h>
 #include <linux/mroute.h>
 #include <net/ip.h>
+#include <net/switchdev.h>
 #if IS_ENABLED(CONFIG_IPV6)
 #include <net/ipv6.h>
 #include <net/mld.h>
 }
 #endif
 
+static void br_mc_disabled_update(struct net_device *dev, bool value)
+{
+       struct switchdev_attr attr = {
+               .orig_dev = dev,
+               .id = SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
+               .flags = SWITCHDEV_F_DEFER,
+               .u.mc_disabled = value,
+       };
+
+       switchdev_port_attr_set(dev, &attr);
+}
+
 int br_multicast_add_port(struct net_bridge_port *port)
 {
        port->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
        setup_timer(&port->ip6_own_query.timer,
                    br_ip6_multicast_port_query_expired, (unsigned long)port);
 #endif
+       br_mc_disabled_update(port->dev, port->br->multicast_disabled);
+
        port->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
        if (!port->mcast_stats)
                return -ENOMEM;
        if (br->multicast_disabled == !val)
                goto unlock;
 
+       br_mc_disabled_update(br->dev, !val);
        br->multicast_disabled = !val;
        if (br->multicast_disabled)
                goto unlock;