mlxsw: Adding VID to FID translatation
authorElad Raz <eladr@mellanox.com>
Sun, 10 Jan 2016 20:06:27 +0000 (21:06 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 10 Jan 2016 21:50:21 +0000 (16:50 -0500)
Adding a generic function that translate VID to FID.

Signed-off-by: Elad Raz <eladr@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

index d64559e..f45c8e4 100644 (file)
 #include "core.h"
 #include "reg.h"
 
+static u16 mlxsw_sp_port_vid_to_fid_get(struct mlxsw_sp_port *mlxsw_sp_port,
+                                       u16 vid)
+{
+       u16 fid = vid;
+
+       if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
+               u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
+
+               fid = mlxsw_sp_vfid_to_fid(vfid);
+       }
+
+       if (!fid)
+               fid = mlxsw_sp_port->pvid;
+
+       return fid;
+}
+
 static struct mlxsw_sp_port *
 mlxsw_sp_port_orig_get(struct net_device *dev,
                       struct mlxsw_sp_port *mlxsw_sp_port)
@@ -641,22 +658,16 @@ mlxsw_sp_port_fdb_static_add(struct mlxsw_sp_port *mlxsw_sp_port,
                             const struct switchdev_obj_port_fdb *fdb,
                             struct switchdev_trans *trans)
 {
-       u16 fid = fdb->vid;
+       u16 fid = mlxsw_sp_port_vid_to_fid_get(mlxsw_sp_port, fdb->vid);
        u16 lag_vid = 0;
 
        if (switchdev_trans_ph_prepare(trans))
                return 0;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
-               u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
-
-               fid = mlxsw_sp_vfid_to_fid(vfid);
                lag_vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
        }
 
-       if (!fid)
-               fid = mlxsw_sp_port->pvid;
-
        if (!mlxsw_sp_port->lagged)
                return mlxsw_sp_port_fdb_uc_op(mlxsw_sp_port->mlxsw_sp,
                                               mlxsw_sp_port->local_port,
@@ -787,13 +798,10 @@ static int
 mlxsw_sp_port_fdb_static_del(struct mlxsw_sp_port *mlxsw_sp_port,
                             const struct switchdev_obj_port_fdb *fdb)
 {
-       u16 fid = fdb->vid;
+       u16 fid = mlxsw_sp_port_vid_to_fid_get(mlxsw_sp_port, fdb->vid);
        u16 lag_vid = 0;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
-               u16 vfid = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
-
-               fid = mlxsw_sp_vfid_to_fid(vfid);
                lag_vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
        }