return err;
 }
 
+static int
+mlxsw_sp_br_ban_rif_pvid_change(struct mlxsw_sp *mlxsw_sp,
+                               const struct net_device *br_dev,
+                               const struct switchdev_obj_port_vlan *vlan)
+{
+       struct mlxsw_sp_rif *rif;
+       struct mlxsw_sp_fid *fid;
+       u16 pvid;
+       u16 vid;
+
+       rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, br_dev);
+       if (!rif)
+               return 0;
+       fid = mlxsw_sp_rif_fid(rif);
+       pvid = mlxsw_sp_fid_8021q_vid(fid);
+
+       for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
+               if (vlan->flags & BRIDGE_VLAN_INFO_PVID) {
+                       if (vid != pvid) {
+                               netdev_err(br_dev, "Can't change PVID, it's used by router interface\n");
+                               return -EBUSY;
+                       }
+               } else {
+                       if (vid == pvid) {
+                               netdev_err(br_dev, "Can't remove PVID, it's used by router interface\n");
+                               return -EBUSY;
+                       }
+               }
+       }
+
+       return 0;
+}
+
 static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
                                   const struct switchdev_obj_port_vlan *vlan,
                                   struct switchdev_trans *trans)
        struct mlxsw_sp_bridge_port *bridge_port;
        u16 vid;
 
-       if (netif_is_bridge_master(orig_dev))
-               return -EOPNOTSUPP;
+       if (netif_is_bridge_master(orig_dev)) {
+               int err = 0;
+
+               if ((vlan->flags & BRIDGE_VLAN_INFO_BRENTRY) &&
+                   br_vlan_enabled(orig_dev) &&
+                   switchdev_trans_ph_prepare(trans))
+                       err = mlxsw_sp_br_ban_rif_pvid_change(mlxsw_sp,
+                                                             orig_dev, vlan);
+               if (!err)
+                       err = -EOPNOTSUPP;
+               return err;
+       }
 
        if (switchdev_trans_ph_prepare(trans))
                return 0;