struct net_device *dev;
        struct prestera_switchdev *swdev;
        struct list_head port_list;
+       struct list_head br_mdb_entry_list;
+       bool mrouter_exist;
        bool vlan_enabled;
+       bool multicast_enabled;
        u16 bridge_id;
 };
 
        struct net_device *dev;
        struct prestera_bridge *bridge;
        struct list_head vlan_list;
+       struct list_head br_mdb_port_list;
        refcount_t ref_count;
        unsigned long flags;
+       bool mrouter;
        u8 stp_state;
 };
 
        u16 vid;
 };
 
+struct prestera_br_mdb_port {
+       struct prestera_bridge_port *br_port;
+       struct list_head br_mdb_port_node;
+};
+
+/* Software representation of MDB table. */
+struct prestera_br_mdb_entry {
+       struct prestera_bridge *bridge;
+       struct prestera_mdb_entry *mdb;
+       struct list_head br_mdb_port_list;
+       struct list_head br_mdb_entry_node;
+       bool enabled;
+};
+
 static struct workqueue_struct *swdev_wq;
 
 static void prestera_bridge_port_put(struct prestera_bridge_port *br_port);
 static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
                                     u8 state);
 
+static struct prestera_bridge *
+prestera_bridge_find(const struct prestera_switch *sw,
+                    const struct net_device *br_dev)
+{
+       struct prestera_bridge *bridge;
+
+       list_for_each_entry(bridge, &sw->swdev->bridge_list, head)
+               if (bridge->dev == br_dev)
+                       return bridge;
+
+       return NULL;
+}
+
+static struct prestera_bridge_port *
+__prestera_bridge_port_find(const struct prestera_bridge *bridge,
+                           const struct net_device *brport_dev)
+{
+       struct prestera_bridge_port *br_port;
+
+       list_for_each_entry(br_port, &bridge->port_list, head)
+               if (br_port->dev == brport_dev)
+                       return br_port;
+
+       return NULL;
+}
+
+static struct prestera_bridge_port *
+prestera_bridge_port_find(struct prestera_switch *sw,
+                         struct net_device *brport_dev)
+{
+       struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
+       struct prestera_bridge *bridge;
+
+       if (!br_dev)
+               return NULL;
+
+       bridge = prestera_bridge_find(sw, br_dev);
+       if (!bridge)
+               return NULL;
+
+       return __prestera_bridge_port_find(bridge, brport_dev);
+}
+
 static void
 prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
                             struct prestera_port *port)
                return prestera_hw_fdb_flush_port(port, mode);
 }
 
+static void
+prestera_mdb_port_del(struct prestera_mdb_entry *mdb,
+                     struct net_device *orig_dev)
+{
+       struct prestera_flood_domain *fl_domain = mdb->flood_domain;
+       struct prestera_flood_domain_port *flood_domain_port;
+
+       flood_domain_port = prestera_flood_domain_port_find(fl_domain,
+                                                           orig_dev,
+                                                           mdb->vid);
+       if (flood_domain_port)
+               prestera_flood_domain_port_destroy(flood_domain_port);
+}
+
+static void
+prestera_br_mdb_entry_put(struct prestera_br_mdb_entry *br_mdb)
+{
+       struct prestera_bridge_port *br_port;
+
+       if (list_empty(&br_mdb->br_mdb_port_list)) {
+               list_for_each_entry(br_port, &br_mdb->bridge->port_list, head)
+                       prestera_mdb_port_del(br_mdb->mdb, br_port->dev);
+
+               prestera_mdb_entry_destroy(br_mdb->mdb);
+               list_del(&br_mdb->br_mdb_entry_node);
+               kfree(br_mdb);
+       }
+}
+
+static void
+prestera_br_mdb_port_del(struct prestera_br_mdb_entry *br_mdb,
+                        struct prestera_bridge_port *br_port)
+{
+       struct prestera_br_mdb_port *br_mdb_port, *tmp;
+
+       list_for_each_entry_safe(br_mdb_port, tmp, &br_mdb->br_mdb_port_list,
+                                br_mdb_port_node) {
+               if (br_mdb_port->br_port == br_port) {
+                       list_del(&br_mdb_port->br_mdb_port_node);
+                       kfree(br_mdb_port);
+               }
+       }
+}
+
+static void
+prestera_mdb_flush_bridge_port(struct prestera_bridge_port *br_port)
+{
+       struct prestera_br_mdb_port *br_mdb_port, *tmp_port;
+       struct prestera_br_mdb_entry *br_mdb, *br_mdb_tmp;
+       struct prestera_bridge *br_dev = br_port->bridge;
+
+       list_for_each_entry_safe(br_mdb, br_mdb_tmp, &br_dev->br_mdb_entry_list,
+                                br_mdb_entry_node) {
+               list_for_each_entry_safe(br_mdb_port, tmp_port,
+                                        &br_mdb->br_mdb_port_list,
+                                        br_mdb_port_node) {
+                       prestera_mdb_port_del(br_mdb->mdb,
+                                             br_mdb_port->br_port->dev);
+                       prestera_br_mdb_port_del(br_mdb,  br_mdb_port->br_port);
+               }
+               prestera_br_mdb_entry_put(br_mdb);
+       }
+}
+
 static void
 prestera_port_vlan_bridge_leave(struct prestera_port_vlan *port_vlan)
 {
        else
                prestera_fdb_flush_port_vlan(port, vid, fdb_flush_mode);
 
+       prestera_mdb_flush_bridge_port(br_port);
+
        list_del(&port_vlan->br_vlan_head);
        prestera_bridge_vlan_put(br_vlan);
        prestera_bridge_port_put(br_port);
        bridge->vlan_enabled = vlan_enabled;
        bridge->swdev = swdev;
        bridge->dev = dev;
+       bridge->multicast_enabled = br_multicast_enabled(dev);
 
        INIT_LIST_HEAD(&bridge->port_list);
+       INIT_LIST_HEAD(&bridge->br_mdb_entry_list);
 
        list_add(&bridge->head, &swdev->bridge_list);
 
        else
                prestera_hw_bridge_delete(swdev->sw, bridge->bridge_id);
 
+       WARN_ON(!list_empty(&bridge->br_mdb_entry_list));
        WARN_ON(!list_empty(&bridge->port_list));
        kfree(bridge);
 }
 
        INIT_LIST_HEAD(&br_port->vlan_list);
        list_add(&br_port->head, &bridge->port_list);
+       INIT_LIST_HEAD(&br_port->br_mdb_port_list);
 
        return br_port;
 }
 {
        list_del(&br_port->head);
        WARN_ON(!list_empty(&br_port->vlan_list));
+       WARN_ON(!list_empty(&br_port->br_mdb_port_list));
        kfree(br_port);
 }
 
 
        switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
 
+       prestera_mdb_flush_bridge_port(br_port);
+
        prestera_br_port_flags_reset(br_port, port);
        prestera_port_vid_stp_set(port, PRESTERA_VID_ALL, BR_STATE_FORWARDING);
        prestera_bridge_port_put(br_port);
        return err;
 }
 
+static int
+prestera_br_port_lag_mdb_mc_enable_sync(struct prestera_bridge_port *br_port,
+                                       bool enabled)
+{
+       struct prestera_port *pr_port;
+       struct prestera_switch *sw;
+       u16 lag_id;
+       int err;
+
+       pr_port = prestera_port_dev_lower_find(br_port->dev);
+       if (!pr_port)
+               return 0;
+
+       sw = pr_port->sw;
+       err = prestera_lag_id(sw, br_port->dev, &lag_id);
+       if (err)
+               return err;
+
+       list_for_each_entry(pr_port, &sw->port_list, list) {
+               if (pr_port->lag->lag_id == lag_id) {
+                       err = prestera_port_mc_flood_set(pr_port, enabled);
+                       if (err)
+                               return err;
+               }
+       }
+
+       return 0;
+}
+
+static int prestera_br_mdb_mc_enable_sync(struct prestera_bridge *br_dev)
+{
+       struct prestera_bridge_port *br_port;
+       struct prestera_port *port;
+       bool enabled;
+       int err;
+
+       /* if mrouter exists:
+        *  - make sure every mrouter receives unreg mcast traffic;
+        * if mrouter doesn't exists:
+        *  - make sure every port receives unreg mcast traffic;
+        */
+       list_for_each_entry(br_port, &br_dev->port_list, head) {
+               if (br_dev->multicast_enabled && br_dev->mrouter_exist)
+                       enabled = br_port->mrouter;
+               else
+                       enabled = br_port->flags & BR_MCAST_FLOOD;
+
+               if (netif_is_lag_master(br_port->dev)) {
+                       err = prestera_br_port_lag_mdb_mc_enable_sync(br_port,
+                                                                     enabled);
+                       if (err)
+                               return err;
+                       continue;
+               }
+
+               port = prestera_port_dev_lower_find(br_port->dev);
+               if (!port)
+                       continue;
+
+               err = prestera_port_mc_flood_set(port, enabled);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+static bool
+prestera_br_mdb_port_is_member(struct prestera_br_mdb_entry *br_mdb,
+                              struct net_device *orig_dev)
+{
+       struct prestera_br_mdb_port *tmp_port;
+
+       list_for_each_entry(tmp_port, &br_mdb->br_mdb_port_list,
+                           br_mdb_port_node)
+               if (tmp_port->br_port->dev == orig_dev)
+                       return true;
+
+       return false;
+}
+
+static int
+prestera_mdb_port_add(struct prestera_mdb_entry *mdb,
+                     struct net_device *orig_dev,
+                     const unsigned char addr[ETH_ALEN], u16 vid)
+{
+       struct prestera_flood_domain *flood_domain = mdb->flood_domain;
+       int err;
+
+       if (!prestera_flood_domain_port_find(flood_domain,
+                                            orig_dev, vid)) {
+               err = prestera_flood_domain_port_create(flood_domain, orig_dev,
+                                                       vid);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+/* Sync bridge mdb (software table) with HW table (if MC is enabled). */
+static int prestera_br_mdb_sync(struct prestera_bridge *br_dev)
+{
+       struct prestera_br_mdb_port *br_mdb_port;
+       struct prestera_bridge_port *br_port;
+       struct prestera_br_mdb_entry *br_mdb;
+       struct prestera_mdb_entry *mdb;
+       struct prestera_port *pr_port;
+       int err = 0;
+
+       if (!br_dev->multicast_enabled)
+               return 0;
+
+       list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
+                           br_mdb_entry_node) {
+               mdb = br_mdb->mdb;
+               /* Make sure every port that explicitly been added to the mdb
+                * joins the specified group.
+                */
+               list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
+                                   br_mdb_port_node) {
+                       br_port = br_mdb_port->br_port;
+                       pr_port = prestera_port_dev_lower_find(br_port->dev);
+
+                       /* Match only mdb and br_mdb ports that belong to the
+                        * same broadcast domain.
+                        */
+                       if (br_dev->vlan_enabled &&
+                           !prestera_port_vlan_by_vid(pr_port,
+                                                      mdb->vid))
+                               continue;
+
+                       /* If port is not in MDB or there's no Mrouter
+                        * clear HW mdb.
+                        */
+                       if (prestera_br_mdb_port_is_member(br_mdb,
+                                                          br_mdb_port->br_port->dev) &&
+                                                          br_dev->mrouter_exist)
+                               err = prestera_mdb_port_add(mdb, br_port->dev,
+                                                           mdb->addr,
+                                                           mdb->vid);
+                       else
+                               prestera_mdb_port_del(mdb, br_port->dev);
+
+                       if (err)
+                               return err;
+               }
+
+               /* Make sure that every mrouter port joins every MC group int
+                * broadcast domain. If it's not an mrouter - it should leave
+                */
+               list_for_each_entry(br_port, &br_dev->port_list, head) {
+                       pr_port = prestera_port_dev_lower_find(br_port->dev);
+
+                       /* Make sure mrouter woudln't receive traffci from
+                        * another broadcast domain (e.g. from a vlan, which
+                        * mrouter port is not a member of).
+                        */
+                       if (br_dev->vlan_enabled &&
+                           !prestera_port_vlan_by_vid(pr_port,
+                                                      mdb->vid))
+                               continue;
+
+                       if (br_port->mrouter) {
+                               err = prestera_mdb_port_add(mdb, br_port->dev,
+                                                           mdb->addr,
+                                                           mdb->vid);
+                               if (err)
+                                       return err;
+                       } else if (!br_port->mrouter &&
+                                  !prestera_br_mdb_port_is_member
+                                  (br_mdb, br_port->dev)) {
+                               prestera_mdb_port_del(mdb, br_port->dev);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int
+prestera_mdb_enable_set(struct prestera_br_mdb_entry *br_mdb, bool enable)
+{
+       int err;
+
+       if (enable != br_mdb->enabled) {
+               if (enable)
+                       err = prestera_hw_mdb_create(br_mdb->mdb);
+               else
+                       err = prestera_hw_mdb_destroy(br_mdb->mdb);
+
+               if (err)
+                       return err;
+
+               br_mdb->enabled = enable;
+       }
+
+       return 0;
+}
+
+static int
+prestera_br_mdb_enable_set(struct prestera_bridge *br_dev, bool enable)
+{
+       struct prestera_br_mdb_entry *br_mdb;
+       int err;
+
+       list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
+                           br_mdb_entry_node) {
+               err = prestera_mdb_enable_set(br_mdb, enable);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+static int prestera_port_attr_br_mc_disabled_set(struct prestera_port *port,
+                                                struct net_device *orig_dev,
+                                                bool mc_disabled)
+{
+       struct prestera_switch *sw = port->sw;
+       struct prestera_bridge *br_dev;
+
+       br_dev = prestera_bridge_find(sw, orig_dev);
+       if (!br_dev)
+               return 0;
+
+       br_dev->multicast_enabled = !mc_disabled;
+
+       /* There's no point in enabling mdb back if router is missing. */
+       WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
+                                          br_dev->mrouter_exist));
+
+       WARN_ON(prestera_br_mdb_sync(br_dev));
+
+       WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
+
+       return 0;
+}
+
+static bool
+prestera_bridge_mdb_mc_mrouter_exists(struct prestera_bridge *br_dev)
+{
+       struct prestera_bridge_port *br_port;
+
+       list_for_each_entry(br_port, &br_dev->port_list, head)
+               if (br_port->mrouter)
+                       return true;
+
+       return false;
+}
+
+static int
+prestera_port_attr_mrouter_set(struct prestera_port *port,
+                              struct net_device *orig_dev,
+                              bool is_port_mrouter)
+{
+       struct prestera_bridge_port *br_port;
+       struct prestera_bridge *br_dev;
+
+       br_port = prestera_bridge_port_find(port->sw, orig_dev);
+       if (!br_port)
+               return 0;
+
+       br_dev = br_port->bridge;
+       br_port->mrouter = is_port_mrouter;
+
+       br_dev->mrouter_exist = prestera_bridge_mdb_mc_mrouter_exists(br_dev);
+
+       /* Enable MDB processing if both mrouter exists and mc is enabled.
+        * In case if MC enabled, but there is no mrouter, device would flood
+        * all multicast traffic (even if MDB table is not empty) with the use
+        * of bridge's flood capabilities (without the use of flood_domain).
+        */
+       WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
+                                          br_dev->mrouter_exist));
+
+       WARN_ON(prestera_br_mdb_sync(br_dev));
+
+       WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
+
+       return 0;
+}
+
 static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack)
                err = prestera_port_attr_br_vlan_set(port, attr->orig_dev,
                                                     attr->u.vlan_filtering);
                break;
+       case SWITCHDEV_ATTR_ID_PORT_MROUTER:
+               err = prestera_port_attr_mrouter_set(port, attr->orig_dev,
+                                                    attr->u.mrouter);
+               break;
+       case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
+               err = prestera_port_attr_br_mc_disabled_set(port, attr->orig_dev,
+                                                           attr->u.mc_disabled);
+               break;
        default:
                err = -EOPNOTSUPP;
        }
                                             flag_pvid, extack);
 }
 
+static struct prestera_br_mdb_entry *
+prestera_br_mdb_entry_create(struct prestera_switch *sw,
+                            struct prestera_bridge *br_dev,
+                            const unsigned char *addr, u16 vid)
+{
+       struct prestera_br_mdb_entry *br_mdb_entry;
+       struct prestera_mdb_entry *mdb_entry;
+
+       br_mdb_entry = kzalloc(sizeof(*br_mdb_entry), GFP_KERNEL);
+       if (!br_mdb_entry)
+               return NULL;
+
+       mdb_entry = prestera_mdb_entry_create(sw, addr, vid);
+       if (!mdb_entry)
+               goto err_mdb_alloc;
+
+       br_mdb_entry->mdb = mdb_entry;
+       br_mdb_entry->bridge = br_dev;
+       br_mdb_entry->enabled = true;
+       INIT_LIST_HEAD(&br_mdb_entry->br_mdb_port_list);
+
+       list_add(&br_mdb_entry->br_mdb_entry_node, &br_dev->br_mdb_entry_list);
+
+       return br_mdb_entry;
+
+err_mdb_alloc:
+       kfree(br_mdb_entry);
+       return NULL;
+}
+
+static int prestera_br_mdb_port_add(struct prestera_br_mdb_entry *br_mdb,
+                                   struct prestera_bridge_port *br_port)
+{
+       struct prestera_br_mdb_port *br_mdb_port;
+
+       list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
+                           br_mdb_port_node)
+               if (br_mdb_port->br_port == br_port)
+                       return 0;
+
+       br_mdb_port = kzalloc(sizeof(*br_mdb_port), GFP_KERNEL);
+       if (!br_mdb_port)
+               return -ENOMEM;
+
+       br_mdb_port->br_port = br_port;
+       list_add(&br_mdb_port->br_mdb_port_node,
+                &br_mdb->br_mdb_port_list);
+
+       return 0;
+}
+
+static struct prestera_br_mdb_entry *
+prestera_br_mdb_entry_find(struct prestera_bridge *br_dev,
+                          const unsigned char *addr, u16 vid)
+{
+       struct prestera_br_mdb_entry *br_mdb;
+
+       list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
+                           br_mdb_entry_node)
+               if (ether_addr_equal(&br_mdb->mdb->addr[0], addr) &&
+                   vid == br_mdb->mdb->vid)
+                       return br_mdb;
+
+       return NULL;
+}
+
+static struct prestera_br_mdb_entry *
+prestera_br_mdb_entry_get(struct prestera_switch *sw,
+                         struct prestera_bridge *br_dev,
+                         const unsigned char *addr, u16 vid)
+{
+       struct prestera_br_mdb_entry *br_mdb;
+
+       br_mdb = prestera_br_mdb_entry_find(br_dev, addr, vid);
+       if (br_mdb)
+               return br_mdb;
+
+       return prestera_br_mdb_entry_create(sw, br_dev, addr, vid);
+}
+
+static int
+prestera_mdb_port_addr_obj_add(const struct switchdev_obj_port_mdb *mdb)
+{
+       struct prestera_br_mdb_entry *br_mdb;
+       struct prestera_bridge_port *br_port;
+       struct prestera_bridge *br_dev;
+       struct prestera_switch *sw;
+       struct prestera_port *port;
+       int err;
+
+       sw = prestera_switch_get(mdb->obj.orig_dev);
+       port = prestera_port_dev_lower_find(mdb->obj.orig_dev);
+
+       br_port = prestera_bridge_port_find(sw, mdb->obj.orig_dev);
+       if (!br_port)
+               return 0;
+
+       br_dev = br_port->bridge;
+
+       if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
+               return 0;
+
+       if (mdb->vid)
+               br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
+                                                  mdb->vid);
+       else
+               br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
+                                                  br_dev->bridge_id);
+
+       if (!br_mdb)
+               return -ENOMEM;
+
+       /* Make sure newly allocated MDB entry gets disabled if either MC is
+        * disabled, or the mrouter does not exist.
+        */
+       WARN_ON(prestera_mdb_enable_set(br_mdb, br_dev->multicast_enabled &&
+                                       br_dev->mrouter_exist));
+
+       err = prestera_br_mdb_port_add(br_mdb, br_port);
+       if (err) {
+               prestera_br_mdb_entry_put(br_mdb);
+               return err;
+       }
+
+       err = prestera_br_mdb_sync(br_dev);
+       if (err)
+               return err;
+
+       return 0;
+}
+
 static int prestera_port_obj_add(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj,
                                 struct netlink_ext_ack *extack)
 {
        struct prestera_port *port = netdev_priv(dev);
        const struct switchdev_obj_port_vlan *vlan;
+       const struct switchdev_obj_port_mdb *mdb;
+       int err = 0;
 
        switch (obj->id) {
        case SWITCHDEV_OBJ_ID_PORT_VLAN:
                vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
                return prestera_port_vlans_add(port, vlan, extack);
+       case SWITCHDEV_OBJ_ID_PORT_MDB:
+               mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
+               err = prestera_mdb_port_addr_obj_add(mdb);
+               break;
+       case SWITCHDEV_OBJ_ID_HOST_MDB:
+               fallthrough;
        default:
-               return -EOPNOTSUPP;
+               err = -EOPNOTSUPP;
+               break;
        }
+
+       return err;
 }
 
 static int prestera_port_vlans_del(struct prestera_port *port,
        return 0;
 }
 
+static int
+prestera_mdb_port_addr_obj_del(struct prestera_port *port,
+                              const struct switchdev_obj_port_mdb *mdb)
+{
+       struct prestera_br_mdb_entry *br_mdb;
+       struct prestera_bridge_port *br_port;
+       struct prestera_bridge *br_dev;
+       int err;
+
+       /* Bridge port no longer exists - and so does this MDB entry */
+       br_port = prestera_bridge_port_find(port->sw, mdb->obj.orig_dev);
+       if (!br_port)
+               return 0;
+
+       /* Removing MDB with non-existing VLAN - not supported; */
+       if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
+               return 0;
+
+       br_dev = br_port->bridge;
+
+       if (br_port->bridge->vlan_enabled)
+               br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
+                                                   mdb->vid);
+       else
+               br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
+                                                   br_port->bridge->bridge_id);
+
+       if (!br_mdb)
+               return 0;
+
+       /* Since there might be a situation that this port was the last in the
+        * MDB group, we have to both remove this port from software and HW MDB,
+        * sync MDB table, and then destroy software MDB (if needed).
+        */
+       prestera_br_mdb_port_del(br_mdb, br_port);
+
+       prestera_br_mdb_entry_put(br_mdb);
+
+       err = prestera_br_mdb_sync(br_dev);
+       if (err)
+               return err;
+
+       return 0;
+}
+
 static int prestera_port_obj_del(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj)
 {
        struct prestera_port *port = netdev_priv(dev);
+       const struct switchdev_obj_port_mdb *mdb;
+       int err = 0;
 
        switch (obj->id) {
        case SWITCHDEV_OBJ_ID_PORT_VLAN:
                return prestera_port_vlans_del(port, SWITCHDEV_OBJ_PORT_VLAN(obj));
+       case SWITCHDEV_OBJ_ID_PORT_MDB:
+               mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
+               err = prestera_mdb_port_addr_obj_del(port, mdb);
+               break;
        default:
-               return -EOPNOTSUPP;
+               err = -EOPNOTSUPP;
+               break;
        }
+
+       return err;
 }
 
 static int prestera_switchdev_blk_event(struct notifier_block *unused,