Commit d7a7b697 authored by Amit Cohen's avatar Amit Cohen Committed by Paolo Abeni

mlxsw: Add a dedicated structure for bitmap of ports

Currently when bitmap of ports is needed, 'unsigned long *' type is
used. The functions which use the bitmap assume its length according to
its name, i.e., each function which gets a bitmap of ports queries the
maximum number of ports and uses it as the size.

As preparation for the next patch which will use bitmap of ports, add a
dedicated structure for it. Refactor the existing code to use the new
structure.
Signed-off-by: default avatarAmit Cohen <amcohen@nvidia.com>
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a1697d11
...@@ -395,6 +395,31 @@ struct mlxsw_sp_port_type_speed_ops { ...@@ -395,6 +395,31 @@ struct mlxsw_sp_port_type_speed_ops {
u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap); u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap);
}; };
struct mlxsw_sp_ports_bitmap {
unsigned long *bitmap;
unsigned int nbits;
};
static inline int
mlxsw_sp_port_bitmap_init(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_ports_bitmap *ports_bm)
{
unsigned int nbits = mlxsw_core_max_ports(mlxsw_sp->core);
ports_bm->nbits = nbits;
ports_bm->bitmap = bitmap_zalloc(nbits, GFP_KERNEL);
if (!ports_bm->bitmap)
return -ENOMEM;
return 0;
}
static inline void
mlxsw_sp_port_bitmap_fini(struct mlxsw_sp_ports_bitmap *ports_bm)
{
bitmap_free(ports_bm->bitmap);
}
static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn, static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn,
bool *trap_en) bool *trap_en)
{ {
......
...@@ -1646,9 +1646,10 @@ static int mlxsw_sp_port_mdb_op(struct mlxsw_sp *mlxsw_sp, const char *addr, ...@@ -1646,9 +1646,10 @@ static int mlxsw_sp_port_mdb_op(struct mlxsw_sp *mlxsw_sp, const char *addr,
return err; return err;
} }
static int mlxsw_sp_port_smid_full_entry(struct mlxsw_sp *mlxsw_sp, u16 mid_idx, static int
long *ports_bitmap, mlxsw_sp_port_smid_full_entry(struct mlxsw_sp *mlxsw_sp, u16 mid_idx,
bool set_router_port) const struct mlxsw_sp_ports_bitmap *ports_bm,
bool set_router_port)
{ {
char *smid2_pl; char *smid2_pl;
int err, i; int err, i;
...@@ -1666,7 +1667,7 @@ static int mlxsw_sp_port_smid_full_entry(struct mlxsw_sp *mlxsw_sp, u16 mid_idx, ...@@ -1666,7 +1667,7 @@ static int mlxsw_sp_port_smid_full_entry(struct mlxsw_sp *mlxsw_sp, u16 mid_idx,
mlxsw_reg_smid2_port_mask_set(smid2_pl, mlxsw_reg_smid2_port_mask_set(smid2_pl,
mlxsw_sp_router_port(mlxsw_sp), 1); mlxsw_sp_router_port(mlxsw_sp), 1);
for_each_set_bit(i, ports_bitmap, mlxsw_core_max_ports(mlxsw_sp->core)) for_each_set_bit(i, ports_bm->bitmap, ports_bm->nbits)
mlxsw_reg_smid2_port_set(smid2_pl, i, 1); mlxsw_reg_smid2_port_set(smid2_pl, i, 1);
mlxsw_reg_smid2_port_set(smid2_pl, mlxsw_sp_router_port(mlxsw_sp), mlxsw_reg_smid2_port_set(smid2_pl, mlxsw_sp_router_port(mlxsw_sp),
...@@ -1712,14 +1713,14 @@ mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp_bridge_device *bridge_device, ...@@ -1712,14 +1713,14 @@ mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp_bridge_device *bridge_device,
static void static void
mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp, mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_bridge_port *bridge_port, struct mlxsw_sp_bridge_port *bridge_port,
unsigned long *ports_bitmap) struct mlxsw_sp_ports_bitmap *ports_bm)
{ {
struct mlxsw_sp_port *mlxsw_sp_port; struct mlxsw_sp_port *mlxsw_sp_port;
u64 max_lag_members, i; u64 max_lag_members, i;
int lag_id; int lag_id;
if (!bridge_port->lagged) { if (!bridge_port->lagged) {
set_bit(bridge_port->system_port, ports_bitmap); set_bit(bridge_port->system_port, ports_bm->bitmap);
} else { } else {
max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core, max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
MAX_LAG_MEMBERS); MAX_LAG_MEMBERS);
...@@ -1729,13 +1730,13 @@ mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp, ...@@ -1729,13 +1730,13 @@ mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp,
lag_id, i); lag_id, i);
if (mlxsw_sp_port) if (mlxsw_sp_port)
set_bit(mlxsw_sp_port->local_port, set_bit(mlxsw_sp_port->local_port,
ports_bitmap); ports_bm->bitmap);
} }
} }
} }
static void static void
mlxsw_sp_mc_get_mrouters_bitmap(unsigned long *flood_bitmap, mlxsw_sp_mc_get_mrouters_bitmap(struct mlxsw_sp_ports_bitmap *flood_bm,
struct mlxsw_sp_bridge_device *bridge_device, struct mlxsw_sp_bridge_device *bridge_device,
struct mlxsw_sp *mlxsw_sp) struct mlxsw_sp *mlxsw_sp)
{ {
...@@ -1745,7 +1746,7 @@ mlxsw_sp_mc_get_mrouters_bitmap(unsigned long *flood_bitmap, ...@@ -1745,7 +1746,7 @@ mlxsw_sp_mc_get_mrouters_bitmap(unsigned long *flood_bitmap,
if (bridge_port->mrouter) { if (bridge_port->mrouter) {
mlxsw_sp_bridge_port_get_ports_bitmap(mlxsw_sp, mlxsw_sp_bridge_port_get_ports_bitmap(mlxsw_sp,
bridge_port, bridge_port,
flood_bitmap); flood_bm);
} }
} }
} }
...@@ -1755,8 +1756,7 @@ mlxsw_sp_mc_write_mdb_entry(struct mlxsw_sp *mlxsw_sp, ...@@ -1755,8 +1756,7 @@ mlxsw_sp_mc_write_mdb_entry(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mid *mid, struct mlxsw_sp_mid *mid,
struct mlxsw_sp_bridge_device *bridge_device) struct mlxsw_sp_bridge_device *bridge_device)
{ {
long *flood_bitmap; struct mlxsw_sp_ports_bitmap flood_bitmap;
int num_of_ports;
u16 mid_idx; u16 mid_idx;
int err; int err;
...@@ -1765,18 +1765,17 @@ mlxsw_sp_mc_write_mdb_entry(struct mlxsw_sp *mlxsw_sp, ...@@ -1765,18 +1765,17 @@ mlxsw_sp_mc_write_mdb_entry(struct mlxsw_sp *mlxsw_sp,
if (mid_idx == MLXSW_SP_MID_MAX) if (mid_idx == MLXSW_SP_MID_MAX)
return -ENOBUFS; return -ENOBUFS;
num_of_ports = mlxsw_core_max_ports(mlxsw_sp->core); err = mlxsw_sp_port_bitmap_init(mlxsw_sp, &flood_bitmap);
flood_bitmap = bitmap_alloc(num_of_ports, GFP_KERNEL); if (err)
if (!flood_bitmap) return err;
return -ENOMEM;
bitmap_copy(flood_bitmap, mid->ports_in_mid, num_of_ports); bitmap_copy(flood_bitmap.bitmap, mid->ports_in_mid, flood_bitmap.nbits);
mlxsw_sp_mc_get_mrouters_bitmap(flood_bitmap, bridge_device, mlxsw_sp); mlxsw_sp_mc_get_mrouters_bitmap(&flood_bitmap, bridge_device, mlxsw_sp);
mid->mid = mid_idx; mid->mid = mid_idx;
err = mlxsw_sp_port_smid_full_entry(mlxsw_sp, mid_idx, flood_bitmap, err = mlxsw_sp_port_smid_full_entry(mlxsw_sp, mid_idx, &flood_bitmap,
bridge_device->mrouter); bridge_device->mrouter);
bitmap_free(flood_bitmap); mlxsw_sp_port_bitmap_fini(&flood_bitmap);
if (err) if (err)
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment