Commit 164fa130 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

mlxsw: spectrum_router: Encode adjacency group size ranges in an array

The device supports a fixed set of adjacency group sizes. Encode these
sizes in an array, so that the next patch will be able to split it
between Spectrum-1 and Spectrum-{2,3}, which support different size
ranges.
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d354fdd9
...@@ -3559,34 +3559,57 @@ mlxsw_sp_nexthop_fib_entries_update(struct mlxsw_sp *mlxsw_sp, ...@@ -3559,34 +3559,57 @@ mlxsw_sp_nexthop_fib_entries_update(struct mlxsw_sp *mlxsw_sp,
return 0; return 0;
} }
struct mlxsw_sp_adj_grp_size_range {
u16 start; /* Inclusive */
u16 end; /* Inclusive */
};
/* Ordered by range start value */
static const struct mlxsw_sp_adj_grp_size_range
mlxsw_sp_adj_grp_size_ranges[] = {
{ .start = 1, .end = 64 },
{ .start = 512, .end = 512 },
{ .start = 1024, .end = 1024 },
{ .start = 2048, .end = 2048 },
{ .start = 4096, .end = 4096 },
};
static void mlxsw_sp_adj_grp_size_round_up(u16 *p_adj_grp_size) static void mlxsw_sp_adj_grp_size_round_up(u16 *p_adj_grp_size)
{ {
/* Valid sizes for an adjacency group are: int i;
* 1-64, 512, 1024, 2048 and 4096.
*/ for (i = 0; i < ARRAY_SIZE(mlxsw_sp_adj_grp_size_ranges); i++) {
if (*p_adj_grp_size <= 64) const struct mlxsw_sp_adj_grp_size_range *size_range;
size_range = &mlxsw_sp_adj_grp_size_ranges[i];
if (*p_adj_grp_size >= size_range->start &&
*p_adj_grp_size <= size_range->end)
return; return;
else if (*p_adj_grp_size <= 512)
*p_adj_grp_size = 512; if (*p_adj_grp_size <= size_range->end) {
else if (*p_adj_grp_size <= 1024) *p_adj_grp_size = size_range->end;
*p_adj_grp_size = 1024; return;
else if (*p_adj_grp_size <= 2048) }
*p_adj_grp_size = 2048; }
else
*p_adj_grp_size = 4096;
} }
static void mlxsw_sp_adj_grp_size_round_down(u16 *p_adj_grp_size, static void mlxsw_sp_adj_grp_size_round_down(u16 *p_adj_grp_size,
unsigned int alloc_size) unsigned int alloc_size)
{ {
if (alloc_size >= 4096) size_t arr_size = ARRAY_SIZE(mlxsw_sp_adj_grp_size_ranges);
*p_adj_grp_size = 4096; int i;
else if (alloc_size >= 2048)
*p_adj_grp_size = 2048; for (i = arr_size - 1; i >= 0; i--) {
else if (alloc_size >= 1024) const struct mlxsw_sp_adj_grp_size_range *size_range;
*p_adj_grp_size = 1024;
else if (alloc_size >= 512) size_range = &mlxsw_sp_adj_grp_size_ranges[i];
*p_adj_grp_size = 512;
if (alloc_size >= size_range->end) {
*p_adj_grp_size = size_range->end;
return;
}
}
} }
static int mlxsw_sp_fix_adj_grp_size(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp_fix_adj_grp_size(struct mlxsw_sp *mlxsw_sp,
......
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