| From b5cdbd732afacffe05eed172f68b0cb162da60d3 Mon Sep 17 00:00:00 2001 |
| From: Huy Nguyen <huyn@mellanox.com> |
| Date: Thu, 7 Mar 2019 14:07:32 -0600 |
| Subject: net/mlx5e: Update xon formula |
| |
| [ Upstream commit e28408e98bced123038857b6e3c81fa12a2e3e68 ] |
| |
| Set xon = xoff - netdev's max_mtu. |
| netdev's max_mtu will give enough time for the pause frame to |
| arrive at the sender. |
| |
| Fixes: 0696d60853d5 ("net/mlx5e: Receive buffer configuration") |
| Signed-off-by: Huy Nguyen <huyn@mellanox.com> |
| Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../mellanox/mlx5/core/en/port_buffer.c | 28 +++++++++++-------- |
| 1 file changed, 16 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c |
| index f00de0c987cd..4ab0d030b544 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c |
| @@ -143,7 +143,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu) |
| } |
| |
| static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, |
| - u32 xoff, unsigned int mtu) |
| + u32 xoff, unsigned int max_mtu) |
| { |
| int i; |
| |
| @@ -155,11 +155,12 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, |
| } |
| |
| if (port_buffer->buffer[i].size < |
| - (xoff + mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) |
| + (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) |
| return -ENOMEM; |
| |
| port_buffer->buffer[i].xoff = port_buffer->buffer[i].size - xoff; |
| - port_buffer->buffer[i].xon = port_buffer->buffer[i].xoff - mtu; |
| + port_buffer->buffer[i].xon = |
| + port_buffer->buffer[i].xoff - max_mtu; |
| } |
| |
| return 0; |
| @@ -167,7 +168,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, |
| |
| /** |
| * update_buffer_lossy() |
| - * mtu: device's MTU |
| + * max_mtu: netdev's max_mtu |
| * pfc_en: <input> current pfc configuration |
| * buffer: <input> current prio to buffer mapping |
| * xoff: <input> xoff value |
| @@ -184,7 +185,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, |
| * Return 0 if no error. |
| * Set change to true if buffer configuration is modified. |
| */ |
| -static int update_buffer_lossy(unsigned int mtu, |
| +static int update_buffer_lossy(unsigned int max_mtu, |
| u8 pfc_en, u8 *buffer, u32 xoff, |
| struct mlx5e_port_buffer *port_buffer, |
| bool *change) |
| @@ -221,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu, |
| } |
| |
| if (changed) { |
| - err = update_xoff_threshold(port_buffer, xoff, mtu); |
| + err = update_xoff_threshold(port_buffer, xoff, max_mtu); |
| if (err) |
| return err; |
| |
| @@ -231,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu, |
| return 0; |
| } |
| |
| +#define MINIMUM_MAX_MTU 9216 |
| int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| u32 change, unsigned int mtu, |
| struct ieee_pfc *pfc, |
| @@ -242,12 +244,14 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| bool update_prio2buffer = false; |
| u8 buffer[MLX5E_MAX_PRIORITY]; |
| bool update_buffer = false; |
| + unsigned int max_mtu; |
| u32 total_used = 0; |
| u8 curr_pfc_en; |
| int err; |
| int i; |
| |
| mlx5e_dbg(HW, priv, "%s: change=%x\n", __func__, change); |
| + max_mtu = max_t(unsigned int, priv->netdev->max_mtu, MINIMUM_MAX_MTU); |
| |
| err = mlx5e_port_query_buffer(priv, &port_buffer); |
| if (err) |
| @@ -255,7 +259,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| |
| if (change & MLX5E_PORT_BUFFER_CABLE_LEN) { |
| update_buffer = true; |
| - err = update_xoff_threshold(&port_buffer, xoff, mtu); |
| + err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
| if (err) |
| return err; |
| } |
| @@ -265,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| if (err) |
| return err; |
| |
| - err = update_buffer_lossy(mtu, pfc->pfc_en, buffer, xoff, |
| + err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff, |
| &port_buffer, &update_buffer); |
| if (err) |
| return err; |
| @@ -277,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| if (err) |
| return err; |
| |
| - err = update_buffer_lossy(mtu, curr_pfc_en, prio2buffer, xoff, |
| - &port_buffer, &update_buffer); |
| + err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, |
| + xoff, &port_buffer, &update_buffer); |
| if (err) |
| return err; |
| } |
| @@ -302,7 +306,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| return -EINVAL; |
| |
| update_buffer = true; |
| - err = update_xoff_threshold(&port_buffer, xoff, mtu); |
| + err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
| if (err) |
| return err; |
| } |
| @@ -310,7 +314,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, |
| /* Need to update buffer configuration if xoff value is changed */ |
| if (!update_buffer && xoff != priv->dcbx.xoff) { |
| update_buffer = true; |
| - err = update_xoff_threshold(&port_buffer, xoff, mtu); |
| + err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
| if (err) |
| return err; |
| } |
| -- |
| 2.19.1 |
| |