Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da9b353c authored by Huy Nguyen's avatar Huy Nguyen Committed by Greg Kroah-Hartman
Browse files

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: 0696d608 ("net/mlx5e: Receive buffer configuration")
Signed-off-by: default avatarHuy Nguyen <huyn@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e2d92a74
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -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;
	}