mlxsw: spectrum: Add FID get / set functions
authorIdo Schimmel <idosch@mellanox.com>
Mon, 20 Jun 2016 21:04:17 +0000 (23:04 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jun 2016 09:02:50 +0000 (05:02 -0400)
As previously explained, not all vPorts will be assigned FIDs, so instead
of returning the FID index of a vPort, return a pointer to its FID
struct. This will allow us to know whether it's legal to access the
vPort's FID parameters such as index and device.

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.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

index 08f3f51d3efb00b0f5838b51a1b615e0020f124e..ea007f021ec81c19eecb2ae95b121466f73b18e3 100644 (file)
@@ -776,7 +776,7 @@ static int mlxsw_sp_vport_vfid_join(struct mlxsw_sp_port *mlxsw_sp_vport)
        if (err)
                goto err_vport_fid_map;
 
-       mlxsw_sp_vport->vport.f = f;
+       mlxsw_sp_vport_fid_set(mlxsw_sp_vport, f);
        f->ref_count++;
 
        return 0;
@@ -792,9 +792,9 @@ err_vport_flood_set:
 
 static void mlxsw_sp_vport_vfid_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
 {
-       struct mlxsw_sp_fid *f = mlxsw_sp_vport->vport.f;
+       struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
 
-       mlxsw_sp_vport->vport.f = NULL;
+       mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
 
        mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, false);
 
@@ -2639,7 +2639,8 @@ static int mlxsw_sp_vport_fdb_flush(struct mlxsw_sp_port *mlxsw_sp_vport,
                return mlxsw_sp_port_fdb_flush_by_lag_id_fid(mlxsw_sp_vport,
                                                             fid);
        else
-               return mlxsw_sp_port_fdb_flush_by_port_fid(mlxsw_sp_vport, fid);
+               return mlxsw_sp_port_fdb_flush_by_port_fid(mlxsw_sp_vport,
+                                                          fid);
 }
 
 static bool mlxsw_sp_port_dev_check(const struct net_device *dev)
@@ -3229,7 +3230,7 @@ static int mlxsw_sp_vport_br_vfid_join(struct mlxsw_sp_port *mlxsw_sp_vport,
        if (err)
                goto err_vport_fid_map;
 
-       mlxsw_sp_vport->vport.f = f;
+       mlxsw_sp_vport_fid_set(mlxsw_sp_vport, f);
        f->ref_count++;
 
        return 0;
@@ -3244,13 +3245,13 @@ err_vport_flood_set:
 
 static void mlxsw_sp_vport_br_vfid_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
 {
-       struct mlxsw_sp_fid *f = mlxsw_sp_vport->vport.f;
+       struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
 
        mlxsw_sp_vport_fid_map(mlxsw_sp_vport, f->fid, false);
 
        mlxsw_sp_vport_flood_set(mlxsw_sp_vport, f->fid, false);
 
-       mlxsw_sp_vport->vport.f = NULL;
+       mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
        if (--f->ref_count == 0)
                mlxsw_sp_br_vfid_destroy(mlxsw_sp_vport->mlxsw_sp, f);
 }
@@ -3293,8 +3294,8 @@ err_vport_br_vfid_join:
 static void mlxsw_sp_vport_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_vport,
                                        bool flush_fdb)
 {
+       u16 fid = mlxsw_sp_vport_fid_get(mlxsw_sp_vport)->fid;
        u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
-       u16 fid = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
 
        mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, false);
 
index 1d3441930a5aa6c9bbb13051c26f14a60ecb2b73..a6dd295be5edca07961a88dfea7d83bd7545f675 100644 (file)
@@ -259,12 +259,6 @@ mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
        return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
 }
 
-static inline struct net_device *
-mlxsw_sp_vport_br_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
-{
-       return mlxsw_sp_vport->vport.f->dev;
-}
-
 static inline u16
 mlxsw_sp_vport_vid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
 {
@@ -279,10 +273,24 @@ mlxsw_sp_port_is_vport(const struct mlxsw_sp_port *mlxsw_sp_port)
        return vid != 0;
 }
 
-static inline u16
+static inline void mlxsw_sp_vport_fid_set(struct mlxsw_sp_port *mlxsw_sp_vport,
+                                         struct mlxsw_sp_fid *f)
+{
+       mlxsw_sp_vport->vport.f = f;
+}
+
+static inline struct mlxsw_sp_fid *
 mlxsw_sp_vport_fid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
 {
-       return mlxsw_sp_vport->vport.f->fid;
+       return mlxsw_sp_vport->vport.f;
+}
+
+static inline struct net_device *
+mlxsw_sp_vport_br_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
+{
+       struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
+
+       return f->dev;
 }
 
 static inline struct mlxsw_sp_port *
@@ -307,7 +315,9 @@ mlxsw_sp_port_vport_find_by_fid(const struct mlxsw_sp_port *mlxsw_sp_port,
 
        list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
                            vport.list) {
-               if (mlxsw_sp_vport_fid_get(mlxsw_sp_vport) == fid)
+               struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
+
+               if (f->fid == fid)
                        return mlxsw_sp_vport;
        }
 
index 671376984af29a3062300c587df6feee623f8232..b31b2ce0f1ed7425dac2ac70d54aee0c9c589a92 100644 (file)
@@ -58,7 +58,7 @@ static u16 mlxsw_sp_port_vid_to_fid_get(struct mlxsw_sp_port *mlxsw_sp_port,
        u16 fid = vid;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port))
-               fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
+               fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port)->fid;
 
        if (!fid)
                fid = mlxsw_sp_port->pvid;
@@ -233,9 +233,9 @@ static int mlxsw_sp_port_uc_flood_set(struct mlxsw_sp_port *mlxsw_sp_port,
        int err;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
-               u16 vfid, fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
+               u16 fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port)->fid;
+               u16 vfid = mlxsw_sp_fid_to_vfid(fid);
 
-               vfid = mlxsw_sp_fid_to_vfid(fid);
                return  __mlxsw_sp_port_flood_set(mlxsw_sp_port, vfid, vfid,
                                                  set, true);
        }
@@ -1212,7 +1212,7 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
                return -ENOMEM;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port))
-               vport_fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port);
+               vport_fid = mlxsw_sp_vport_fid_get(mlxsw_sp_port)->fid;
 
        mlxsw_reg_sfd_pack(sfd_pl, MLXSW_REG_SFD_OP_QUERY_DUMP, 0);
        do {