return err;
 }
 
+static int
+mlx5_esw_bridge_changeupper_validate_netdev(void *ptr)
+{
+       struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+       struct netdev_notifier_changeupper_info *info = ptr;
+       struct net_device *upper = info->upper_dev;
+       struct net_device *lower;
+       struct list_head *iter;
+
+       if (!netif_is_bridge_master(upper) || !netif_is_lag_master(dev))
+               return 0;
+
+       netdev_for_each_lower_dev(dev, lower, iter) {
+               struct mlx5_core_dev *mdev;
+               struct mlx5e_priv *priv;
+
+               if (!mlx5e_eswitch_rep(lower))
+                       continue;
+
+               priv = netdev_priv(lower);
+               mdev = priv->mdev;
+               if (!mlx5_lag_is_active(mdev))
+                       return -EAGAIN;
+               if (!mlx5_lag_is_shared_fdb(mdev))
+                       return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
 static int mlx5_esw_bridge_switchdev_port_event(struct notifier_block *nb,
                                                unsigned long event, void *ptr)
 {
 
        switch (event) {
        case NETDEV_PRECHANGEUPPER:
+               err = mlx5_esw_bridge_changeupper_validate_netdev(ptr);
                break;
 
        case NETDEV_CHANGEUPPER: