mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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: 0696d60853
("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>
This commit is contained in:
parent
cf9a8627b9
commit
ceddedc969
@ -66,11 +66,23 @@ struct mlx5e_port_buffer {
|
|||||||
struct mlx5e_bufferx_reg buffer[MLX5E_MAX_NETWORK_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,
|
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,
|
||||||
u32 *buffer_size,
|
u32 *buffer_size,
|
||||||
u8 *prio2buffer);
|
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,
|
int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
|
||||||
struct mlx5e_port_buffer *port_buffer);
|
struct mlx5e_port_buffer *port_buffer);
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "en.h"
|
#include "en.h"
|
||||||
#include "en/dim.h"
|
#include "en/dim.h"
|
||||||
#include "en/txrx.h"
|
#include "en/txrx.h"
|
||||||
|
#include "en/port_buffer.h"
|
||||||
#include "en_tc.h"
|
#include "en_tc.h"
|
||||||
#include "en_rep.h"
|
#include "en_rep.h"
|
||||||
#include "en_accel/ipsec.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 mlx5e_params *params = &priv->channels.params;
|
||||||
struct net_device *netdev = priv->netdev;
|
struct net_device *netdev = priv->netdev;
|
||||||
struct mlx5_core_dev *mdev = priv->mdev;
|
struct mlx5_core_dev *mdev = priv->mdev;
|
||||||
u16 mtu;
|
u16 mtu, prev_mtu;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
mlx5e_query_mtu(mdev, params, &prev_mtu);
|
||||||
|
|
||||||
err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
|
err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
|
||||||
if (err)
|
if (err)
|
||||||
return 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",
|
netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
|
||||||
__func__, mtu, params->sw_mtu);
|
__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;
|
params->sw_mtu = mtu;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user