| From f684dd0ac10c395c4ef8ca0ccab982a57f48ce73 Mon Sep 17 00:00:00 2001 |
| From: Petr Machata <petrm@mellanox.com> |
| Date: Sun, 17 Feb 2019 07:18:41 +0000 |
| Subject: mlxsw: __mlxsw_sp_port_headroom_set(): Fix a use of local variable |
| |
| [ Upstream commit 289460404f6947ef1c38e67d680be9a84161250b ] |
| |
| The function-local variable "delay" enters the loop interpreted as delay |
| in bits. However, inside the loop it gets overwritten by the result of |
| mlxsw_sp_pg_buf_delay_get(), and thus leaves the loop as quantity in |
| cells. Thus on second and further loop iterations, the headroom for a |
| given priority is configured with a wrong size. |
| |
| Fix by introducing a loop-local variable, delay_cells. Rename thres to |
| thres_cells for consistency. |
| |
| Fixes: f417f04da589 ("mlxsw: spectrum: Refactor port buffer configuration") |
| Signed-off-by: Petr Machata <petrm@mellanox.com> |
| Acked-by: Jiri Pirko <jiri@mellanox.com> |
| Signed-off-by: Ido Schimmel <idosch@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
| index d64cd8d44d837..a12b5710891ec 100644 |
| --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
| +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c |
| @@ -841,8 +841,9 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu, |
| for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { |
| bool configure = false; |
| bool pfc = false; |
| + u16 thres_cells; |
| + u16 delay_cells; |
| bool lossy; |
| - u16 thres; |
| |
| for (j = 0; j < IEEE_8021QAZ_MAX_TCS; j++) { |
| if (prio_tc[j] == i) { |
| @@ -856,10 +857,11 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu, |
| continue; |
| |
| lossy = !(pfc || pause_en); |
| - thres = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu); |
| - delay = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay, pfc, |
| - pause_en); |
| - mlxsw_sp_pg_buf_pack(pbmc_pl, i, thres + delay, thres, lossy); |
| + thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu); |
| + delay_cells = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay, |
| + pfc, pause_en); |
| + mlxsw_sp_pg_buf_pack(pbmc_pl, i, thres_cells + delay_cells, |
| + thres_cells, lossy); |
| } |
| |
| return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pbmc), pbmc_pl); |
| -- |
| 2.19.1 |
| |