|
@@ -997,13 +997,13 @@ static int mlxsw_sp_port_obj_add(struct net_device *dev,
|
|
|
}
|
|
|
|
|
|
static int __mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
|
|
|
- u16 vid_begin, u16 vid_end, bool init)
|
|
|
+ u16 vid_begin, u16 vid_end)
|
|
|
{
|
|
|
struct net_device *dev = mlxsw_sp_port->dev;
|
|
|
u16 vid, pvid;
|
|
|
int err;
|
|
|
|
|
|
- if (!init && !mlxsw_sp_port->bridged)
|
|
|
+ if (!mlxsw_sp_port->bridged)
|
|
|
return -EINVAL;
|
|
|
|
|
|
err = __mlxsw_sp_port_vlans_set(mlxsw_sp_port, vid_begin, vid_end,
|
|
@@ -1014,9 +1014,6 @@ static int __mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
- if (init)
|
|
|
- goto out;
|
|
|
-
|
|
|
pvid = mlxsw_sp_port->pvid;
|
|
|
if (pvid >= vid_begin && pvid <= vid_end) {
|
|
|
err = mlxsw_sp_port_pvid_set(mlxsw_sp_port, 0);
|
|
@@ -1028,7 +1025,6 @@ static int __mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
|
|
|
|
|
|
mlxsw_sp_port_fid_leave(mlxsw_sp_port, vid_begin, vid_end);
|
|
|
|
|
|
-out:
|
|
|
/* Changing activity bits only if HW operation succeded */
|
|
|
for (vid = vid_begin; vid <= vid_end; vid++)
|
|
|
clear_bit(vid, mlxsw_sp_port->active_vlans);
|
|
@@ -1039,8 +1035,8 @@ out:
|
|
|
static int mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
|
|
|
const struct switchdev_obj_port_vlan *vlan)
|
|
|
{
|
|
|
- return __mlxsw_sp_port_vlans_del(mlxsw_sp_port,
|
|
|
- vlan->vid_begin, vlan->vid_end, false);
|
|
|
+ return __mlxsw_sp_port_vlans_del(mlxsw_sp_port, vlan->vid_begin,
|
|
|
+ vlan->vid_end);
|
|
|
}
|
|
|
|
|
|
void mlxsw_sp_port_active_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port)
|
|
@@ -1048,7 +1044,7 @@ void mlxsw_sp_port_active_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port)
|
|
|
u16 vid;
|
|
|
|
|
|
for_each_set_bit(vid, mlxsw_sp_port->active_vlans, VLAN_N_VID)
|
|
|
- __mlxsw_sp_port_vlans_del(mlxsw_sp_port, vid, vid, false);
|
|
|
+ __mlxsw_sp_port_vlans_del(mlxsw_sp_port, vid, vid);
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -1546,32 +1542,6 @@ void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
|
|
|
mlxsw_sp_fdb_fini(mlxsw_sp);
|
|
|
}
|
|
|
|
|
|
-int mlxsw_sp_port_vlan_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
|
|
-{
|
|
|
- struct net_device *dev = mlxsw_sp_port->dev;
|
|
|
- int err;
|
|
|
-
|
|
|
- /* Allow only untagged packets to ingress and tag them internally
|
|
|
- * with VID 1.
|
|
|
- */
|
|
|
- mlxsw_sp_port->pvid = 1;
|
|
|
- err = __mlxsw_sp_port_vlans_del(mlxsw_sp_port, 0, VLAN_N_VID - 1,
|
|
|
- true);
|
|
|
- if (err) {
|
|
|
- netdev_err(dev, "Unable to init VLANs\n");
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
- /* Add implicit VLAN interface in the device, so that untagged
|
|
|
- * packets will be classified to the default vFID.
|
|
|
- */
|
|
|
- err = mlxsw_sp_port_add_vid(dev, 0, 1);
|
|
|
- if (err)
|
|
|
- netdev_err(dev, "Failed to configure default vFID\n");
|
|
|
-
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
|
|
{
|
|
|
mlxsw_sp_port->dev->switchdev_ops = &mlxsw_sp_port_switchdev_ops;
|