net/mlx5e: Change interrupt moderation channel params also when channels are closed
authorMaxim Mikityanskiy <maximmi@mellanox.com>
Wed, 3 Feb 2021 16:01:03 +0000 (18:01 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 12 Feb 2021 02:50:11 +0000 (18:50 -0800)
struct mlx5e_params contains fields ({rx,tx}_cq_moderation) that depend
on two things: whether DIM is enabled and the state of a private flag
(MLX5E_PFLAG_{RX,TX}_CQE_BASED_MODER). Whenever the DIM state changes,
mlx5e_reset_{rx,tx}_moderation is called to update the fields, however,
only if the channels are open. The flow where the channels are closed
misses the required update of the fields. This commit moves the calls of
mlx5e_reset_{rx,tx}_moderation, so that they run in both flows.

Fixes: ebeaf084ad5c ("net/mlx5e: Properly set default values when disabling adaptive moderation")
Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

index d7ff5fa..8612c38 100644 (file)
@@ -597,24 +597,9 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
        tx_moder->pkts    = coal->tx_max_coalesced_frames;
        new_channels.params.tx_dim_enabled = !!coal->use_adaptive_tx_coalesce;
 
-       if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
-               priv->channels.params = new_channels.params;
-               goto out;
-       }
-       /* we are opened */
-
        reset_rx = !!coal->use_adaptive_rx_coalesce != priv->channels.params.rx_dim_enabled;
        reset_tx = !!coal->use_adaptive_tx_coalesce != priv->channels.params.tx_dim_enabled;
 
-       if (!reset_rx && !reset_tx) {
-               if (!coal->use_adaptive_rx_coalesce)
-                       mlx5e_set_priv_channels_rx_coalesce(priv, coal);
-               if (!coal->use_adaptive_tx_coalesce)
-                       mlx5e_set_priv_channels_tx_coalesce(priv, coal);
-               priv->channels.params = new_channels.params;
-               goto out;
-       }
-
        if (reset_rx) {
                u8 mode = MLX5E_GET_PFLAG(&new_channels.params,
                                          MLX5E_PFLAG_RX_CQE_BASED_MODER);
@@ -628,6 +613,20 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
                mlx5e_reset_tx_moderation(&new_channels.params, mode);
        }
 
+       if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
+               priv->channels.params = new_channels.params;
+               goto out;
+       }
+
+       if (!reset_rx && !reset_tx) {
+               if (!coal->use_adaptive_rx_coalesce)
+                       mlx5e_set_priv_channels_rx_coalesce(priv, coal);
+               if (!coal->use_adaptive_tx_coalesce)
+                       mlx5e_set_priv_channels_tx_coalesce(priv, coal);
+               priv->channels.params = new_channels.params;
+               goto out;
+       }
+
        err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 
 out: