Commit ceddedc9 authored by Alexei Lazar's avatar Alexei Lazar Committed by Jakub Kicinski
Browse files

net/mlx5e: Update and set Xon/Xoff upon MTU set



Xon/Xoff sizes are derived from calculation that include the MTU size.
Set Xon/Xoff when MTU is set.
If Xon/Xoff fails, set the previous MTU.

Fixes: 0696d608 ("net/mlx5e: Receive buffer configuration")
Signed-off-by: default avatarAlexei Lazar <alazar@nvidia.com>
Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
Signed-off-by: default avatarMark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/20250825143435.598584-10-mbloch@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent cf9a8627
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -66,11 +66,23 @@ struct mlx5e_port_buffer {
	struct mlx5e_bufferx_reg  buffer[MLX5E_MAX_NETWORK_BUFFER];
};

#ifdef CONFIG_MLX5_CORE_EN_DCB
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
				    u32 change, unsigned int mtu,
				    struct ieee_pfc *pfc,
				    u32 *buffer_size,
				    u8 *prio2buffer);
#else
static inline int
mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
				u32 change, unsigned int mtu,
				void *pfc,
				u32 *buffer_size,
				u8 *prio2buffer)
{
	return 0;
}
#endif

int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
			    struct mlx5e_port_buffer *port_buffer);
+16 −1
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include "en.h"
#include "en/dim.h"
#include "en/txrx.h"
#include "en/port_buffer.h"
#include "en_tc.h"
#include "en_rep.h"
#include "en_accel/ipsec.h"
@@ -3040,9 +3041,11 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
	struct mlx5e_params *params = &priv->channels.params;
	struct net_device *netdev = priv->netdev;
	struct mlx5_core_dev *mdev = priv->mdev;
	u16 mtu;
	u16 mtu, prev_mtu;
	int err;

	mlx5e_query_mtu(mdev, params, &prev_mtu);

	err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
	if (err)
		return err;
@@ -3052,6 +3055,18 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
		netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
			    __func__, mtu, params->sw_mtu);

	if (mtu != prev_mtu && MLX5_BUFFER_SUPPORTED(mdev)) {
		err = mlx5e_port_manual_buffer_config(priv, 0, mtu,
						      NULL, NULL, NULL);
		if (err) {
			netdev_warn(netdev, "%s: Failed to set Xon/Xoff values with MTU %d (err %d), setting back to previous MTU %d\n",
				    __func__, mtu, err, prev_mtu);

			mlx5e_set_mtu(mdev, params, prev_mtu);
			return err;
		}
	}

	params->sw_mtu = mtu;
	return 0;
}