Skip to content

Commit 5c0fe21

Browse files
Alexei Lazargregkh
authored andcommitted
net/mlx5e: Update and set Xon/Xoff upon MTU set
[ Upstream commit ceddedc ] 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: 0696d60 ("net/mlx5e: Receive buffer configuration") Signed-off-by: Alexei Lazar <alazar@nvidia.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Mark Bloch <mbloch@nvidia.com> Link: https://patch.msgid.link/20250825143435.598584-10-mbloch@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent f49a44b commit 5c0fe21

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,23 @@ struct mlx5e_port_buffer {
6464
struct mlx5e_bufferx_reg buffer[MLX5E_MAX_BUFFER];
6565
};
6666

67+
#ifdef CONFIG_MLX5_CORE_EN_DCB
6768
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
6869
u32 change, unsigned int mtu,
6970
struct ieee_pfc *pfc,
7071
u32 *buffer_size,
7172
u8 *prio2buffer);
73+
#else
74+
static inline int
75+
mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
76+
u32 change, unsigned int mtu,
77+
void *pfc,
78+
u32 *buffer_size,
79+
u8 *prio2buffer)
80+
{
81+
return 0;
82+
}
83+
#endif
7284

7385
int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
7486
struct mlx5e_port_buffer *port_buffer);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "eswitch.h"
4343
#include "en.h"
4444
#include "en/txrx.h"
45+
#include "en/port_buffer.h"
4546
#include "en_tc.h"
4647
#include "en_rep.h"
4748
#include "en_accel/ipsec.h"
@@ -2894,9 +2895,11 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
28942895
struct mlx5e_params *params = &priv->channels.params;
28952896
struct net_device *netdev = priv->netdev;
28962897
struct mlx5_core_dev *mdev = priv->mdev;
2897-
u16 mtu;
2898+
u16 mtu, prev_mtu;
28982899
int err;
28992900

2901+
mlx5e_query_mtu(mdev, params, &prev_mtu);
2902+
29002903
err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
29012904
if (err)
29022905
return err;
@@ -2906,6 +2909,18 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
29062909
netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
29072910
__func__, mtu, params->sw_mtu);
29082911

2912+
if (mtu != prev_mtu && MLX5_BUFFER_SUPPORTED(mdev)) {
2913+
err = mlx5e_port_manual_buffer_config(priv, 0, mtu,
2914+
NULL, NULL, NULL);
2915+
if (err) {
2916+
netdev_warn(netdev, "%s: Failed to set Xon/Xoff values with MTU %d (err %d), setting back to previous MTU %d\n",
2917+
__func__, mtu, err, prev_mtu);
2918+
2919+
mlx5e_set_mtu(mdev, params, prev_mtu);
2920+
return err;
2921+
}
2922+
}
2923+
29092924
params->sw_mtu = mtu;
29102925
return 0;
29112926
}

0 commit comments

Comments
 (0)