| From 79dd26f90d897baf282770c250e567b420a57031 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 3 Feb 2021 18:01:03 +0200 |
| Subject: net/mlx5e: Change interrupt moderation channel params also when |
| channels are closed |
| |
| From: Maxim Mikityanskiy <maximmi@mellanox.com> |
| |
| [ Upstream commit 65ba8594a238c20e458b3d2d39d91067cbffd0b1 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../ethernet/mellanox/mlx5/core/en_ethtool.c | 29 +++++++++---------- |
| 1 file changed, 14 insertions(+), 15 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
| index d7ff5fa45cb7d..8612c388db7d3 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
| @@ -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: |
| -- |
| 2.27.0 |
| |