return err;
 }
 
-int mlxsw_sp_port_kill_vid(struct net_device *dev,
-                          __be16 __always_unused proto, u16 vid)
+static int mlxsw_sp_port_kill_vid(struct net_device *dev,
+                                 __be16 __always_unused proto, u16 vid)
 {
        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
        struct mlxsw_sp_port *mlxsw_sp_vport;
        return err;
 }
 
-static void mlxsw_sp_port_vports_fini(struct mlxsw_sp_port *mlxsw_sp_port)
-{
-       struct net_device *dev = mlxsw_sp_port->dev;
-       struct mlxsw_sp_port *mlxsw_sp_vport, *tmp;
-
-       list_for_each_entry_safe(mlxsw_sp_vport, tmp,
-                                &mlxsw_sp_port->vports_list, vport.list) {
-               u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
-
-               /* vPorts created for VLAN devices should already be gone
-                * by now, since we unregistered the port netdev.
-                */
-               WARN_ON(is_vlan_dev(mlxsw_sp_vport->dev));
-               mlxsw_sp_port_kill_vid(dev, 0, vid);
-       }
-}
-
 static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
 {
        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp->ports[local_port];
        mlxsw_core_port_fini(&mlxsw_sp_port->core_port);
        unregister_netdev(mlxsw_sp_port->dev); /* This calls ndo_stop */
        mlxsw_sp_port_dcb_fini(mlxsw_sp_port);
-       mlxsw_sp_port_vports_fini(mlxsw_sp_port);
+       mlxsw_sp_port_kill_vid(mlxsw_sp_port->dev, 0, 1);
        mlxsw_sp_port_switchdev_fini(mlxsw_sp_port);
        mlxsw_sp_port_swid_set(mlxsw_sp_port, MLXSW_PORT_SWID_DISABLED_PORT);
        mlxsw_sp_port_module_unmap(mlxsw_sp, mlxsw_sp_port->local_port);
        free_percpu(mlxsw_sp_port->pcpu_stats);
        kfree(mlxsw_sp_port->untagged_vlans);
        kfree(mlxsw_sp_port->active_vlans);
+       WARN_ON_ONCE(!list_empty(&mlxsw_sp_port->vports_list));
        free_netdev(mlxsw_sp_port->dev);
 }
 
 
                           u16 vid_end, bool is_member, bool untagged);
 int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
                          u16 vid);
-int mlxsw_sp_port_kill_vid(struct net_device *dev,
-                          __be16 __always_unused proto, u16 vid);
 int mlxsw_sp_vport_flood_set(struct mlxsw_sp_port *mlxsw_sp_vport, u16 fid,
                             bool set);
 void mlxsw_sp_port_active_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port);
 
        return err;
 }
 
-static int mlxsw_sp_port_add_vids(struct net_device *dev, u16 vid_begin,
-                                 u16 vid_end)
-{
-       u16 vid;
-       int err;
-
-       for (vid = vid_begin; vid <= vid_end; vid++) {
-               err = mlxsw_sp_port_add_vid(dev, 0, vid);
-               if (err)
-                       goto err_port_add_vid;
-       }
-       return 0;
-
-err_port_add_vid:
-       for (vid--; vid >= vid_begin; vid--)
-               mlxsw_sp_port_kill_vid(dev, 0, vid);
-       return err;
-}
-
 static int __mlxsw_sp_port_vlans_set(struct mlxsw_sp_port *mlxsw_sp_port,
                                     u16 vid_begin, u16 vid_end, bool is_member,
                                     bool untagged)
        u16 vid, old_pvid;
        int err;
 
-       /* In case this is invoked with BRIDGE_FLAGS_SELF and port is
-        * not bridged, then packets ingressing through the port with
-        * the specified VIDs will be directed to CPU.
-        */
        if (!mlxsw_sp_port->bridged)
-               return mlxsw_sp_port_add_vids(dev, vid_begin, vid_end);
+               return -EINVAL;
 
        err = mlxsw_sp_port_fid_join(mlxsw_sp_port, vid_begin, vid_end);
        if (err) {
        return err;
 }
 
-static int mlxsw_sp_port_kill_vids(struct net_device *dev, u16 vid_begin,
-                                  u16 vid_end)
-{
-       u16 vid;
-       int err;
-
-       for (vid = vid_begin; vid <= vid_end; vid++) {
-               err = mlxsw_sp_port_kill_vid(dev, 0, vid);
-               if (err)
-                       return err;
-       }
-
-       return 0;
-}
-
 static int __mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
                                     u16 vid_begin, u16 vid_end, bool init)
 {
        u16 vid, pvid;
        int err;
 
-       /* In case this is invoked with BRIDGE_FLAGS_SELF and port is
-        * not bridged, then prevent packets ingressing through the
-        * port with the specified VIDs from being trapped to CPU.
-        */
        if (!init && !mlxsw_sp_port->bridged)
-               return mlxsw_sp_port_kill_vids(dev, vid_begin, vid_end);
+               return -EINVAL;
 
        err = __mlxsw_sp_port_vlans_set(mlxsw_sp_port, vid_begin, vid_end,
                                        false, false);