]> www.infradead.org Git - users/griffoul/linux.git/commitdiff
net/mlx5e: Update and set Xon/Xoff upon MTU set
authorAlexei Lazar <alazar@nvidia.com>
Mon, 25 Aug 2025 14:34:32 +0000 (17:34 +0300)
committerJakub Kicinski <kuba@kernel.org>
Wed, 27 Aug 2025 01:00:27 +0000 (18:00 -0700)
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: 0696d60853d5 ("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>
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index f4a19ffbb641c07b82291091e4f67f8524378e82..66d276a1be836a4de741c7ae8701730c7ddf2e20 100644 (file)
@@ -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);
index 21bb88c5d3dcee48c6918743d630cfc48f349d34..15eded36b872a2e1a429c3eb6da1e902758dafb3 100644 (file)
@@ -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;
 }