Commit e28408e9 authored by Huy Nguyen's avatar Huy Nguyen Committed by Saeed Mahameed

net/mlx5e: Update xon formula

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: 0696d608 ("net/mlx5e: Receive buffer configuration")
Signed-off-by: default avatarHuy Nguyen <huyn@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 5ec983e9
...@@ -143,7 +143,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu) ...@@ -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, static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
u32 xoff, unsigned int mtu) u32 xoff, unsigned int max_mtu)
{ {
int i; int i;
...@@ -155,11 +155,12 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, ...@@ -155,11 +155,12 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
} }
if (port_buffer->buffer[i].size < if (port_buffer->buffer[i].size <
(xoff + mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
return -ENOMEM; return -ENOMEM;
port_buffer->buffer[i].xoff = port_buffer->buffer[i].size - xoff; 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; return 0;
...@@ -167,7 +168,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, ...@@ -167,7 +168,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
/** /**
* update_buffer_lossy() * update_buffer_lossy()
* mtu: device's MTU * max_mtu: netdev's max_mtu
* pfc_en: <input> current pfc configuration * pfc_en: <input> current pfc configuration
* buffer: <input> current prio to buffer mapping * buffer: <input> current prio to buffer mapping
* xoff: <input> xoff value * xoff: <input> xoff value
...@@ -184,7 +185,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, ...@@ -184,7 +185,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
* Return 0 if no error. * Return 0 if no error.
* Set change to true if buffer configuration is modified. * 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, u8 pfc_en, u8 *buffer, u32 xoff,
struct mlx5e_port_buffer *port_buffer, struct mlx5e_port_buffer *port_buffer,
bool *change) bool *change)
...@@ -221,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu, ...@@ -221,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu,
} }
if (changed) { if (changed) {
err = update_xoff_threshold(port_buffer, xoff, mtu); err = update_xoff_threshold(port_buffer, xoff, max_mtu);
if (err) if (err)
return err; return err;
...@@ -231,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu, ...@@ -231,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu,
return 0; return 0;
} }
#define MINIMUM_MAX_MTU 9216
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
u32 change, unsigned int mtu, u32 change, unsigned int mtu,
struct ieee_pfc *pfc, struct ieee_pfc *pfc,
...@@ -242,12 +244,14 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -242,12 +244,14 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
bool update_prio2buffer = false; bool update_prio2buffer = false;
u8 buffer[MLX5E_MAX_PRIORITY]; u8 buffer[MLX5E_MAX_PRIORITY];
bool update_buffer = false; bool update_buffer = false;
unsigned int max_mtu;
u32 total_used = 0; u32 total_used = 0;
u8 curr_pfc_en; u8 curr_pfc_en;
int err; int err;
int i; int i;
mlx5e_dbg(HW, priv, "%s: change=%x\n", __func__, change); 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); err = mlx5e_port_query_buffer(priv, &port_buffer);
if (err) if (err)
...@@ -255,7 +259,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -255,7 +259,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
if (change & MLX5E_PORT_BUFFER_CABLE_LEN) { if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
update_buffer = true; update_buffer = true;
err = update_xoff_threshold(&port_buffer, xoff, mtu); err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
if (err) if (err)
return err; return err;
} }
...@@ -265,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -265,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
if (err) if (err)
return 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); &port_buffer, &update_buffer);
if (err) if (err)
return err; return err;
...@@ -277,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -277,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
if (err) if (err)
return err; return err;
err = update_buffer_lossy(mtu, curr_pfc_en, prio2buffer, xoff, err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer,
&port_buffer, &update_buffer); xoff, &port_buffer, &update_buffer);
if (err) if (err)
return err; return err;
} }
...@@ -302,7 +306,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -302,7 +306,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
return -EINVAL; return -EINVAL;
update_buffer = true; update_buffer = true;
err = update_xoff_threshold(&port_buffer, xoff, mtu); err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
if (err) if (err)
return err; return err;
} }
...@@ -310,7 +314,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, ...@@ -310,7 +314,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
/* Need to update buffer configuration if xoff value is changed */ /* Need to update buffer configuration if xoff value is changed */
if (!update_buffer && xoff != priv->dcbx.xoff) { if (!update_buffer && xoff != priv->dcbx.xoff) {
update_buffer = true; update_buffer = true;
err = update_xoff_threshold(&port_buffer, xoff, mtu); err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
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