mirror of https://gitee.com/openkylin/linux.git
mlxsw: spectrum: Adjust headroom buffers for 8x ports
The port's headroom buffers are used to store packets while they
traverse the device's pipeline and also to store packets that are egress
mirrored.
On Spectrum-3, ports with eight lanes use two headroom buffers between
which the configured headroom size is split.
In order to prevent packet loss, multiply the calculated headroom size
by two for 8x ports.
Fixes: da382875c6
("mlxsw: spectrum: Extend to support Spectrum-3 ASIC")
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b15bb8817f
commit
60833d54d5
|
@ -978,8 +978,10 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
|
|||
|
||||
lossy = !(pfc || pause_en);
|
||||
thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu);
|
||||
mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &thres_cells);
|
||||
delay_cells = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay,
|
||||
pfc, pause_en);
|
||||
mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &delay_cells);
|
||||
total_cells = thres_cells + delay_cells;
|
||||
|
||||
taken_headroom_cells += total_cells;
|
||||
|
|
|
@ -374,6 +374,19 @@ mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
mlxsw_sp_port_headroom_8x_adjust(const struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
u16 *p_size)
|
||||
{
|
||||
/* Ports with eight lanes use two headroom buffers between which the
|
||||
* configured headroom size is split. Therefore, multiply the calculated
|
||||
* headroom size by two.
|
||||
*/
|
||||
if (mlxsw_sp_port->mapping.width != 8)
|
||||
return;
|
||||
*p_size *= 2;
|
||||
}
|
||||
|
||||
enum mlxsw_sp_flood_type {
|
||||
MLXSW_SP_FLOOD_TYPE_UC,
|
||||
MLXSW_SP_FLOOD_TYPE_BC,
|
||||
|
|
|
@ -312,6 +312,7 @@ static int mlxsw_sp_port_pb_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
|||
|
||||
if (i == MLXSW_SP_PB_UNUSED)
|
||||
continue;
|
||||
mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &size);
|
||||
mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl, i, size);
|
||||
}
|
||||
mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl,
|
||||
|
|
|
@ -782,6 +782,7 @@ mlxsw_sp_span_port_buffer_update(struct mlxsw_sp_port *mlxsw_sp_port, u16 mtu)
|
|||
speed = 0;
|
||||
|
||||
buffsize = mlxsw_sp_span_buffsize_get(mlxsw_sp, speed, mtu);
|
||||
mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, (u16 *) &buffsize);
|
||||
mlxsw_reg_sbib_pack(sbib_pl, mlxsw_sp_port->local_port, buffsize);
|
||||
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sbib), sbib_pl);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue