net/mlx5e: Revert parameters on errors when changing trust state without reset
Trust state may be changed without recreating the channels. It happens when the channels are closed, and when channel parameters (min inline mode) stay the same after changing the trust state. Changing the trust state is a hardware command that may fail. The current code didn't restore the channel parameters to their old values if an error happened and the channels were closed. This commit adds handling for this case. Fixes: 6e0504c69811 ("net/mlx5e: Change inline mode correctly when changing trust state") Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
57ac4a31c4
commit
912c9b5fcc
@ -1151,6 +1151,7 @@ static int mlx5e_set_trust_state(struct mlx5e_priv *priv, u8 trust_state)
|
||||
{
|
||||
struct mlx5e_channels new_channels = {};
|
||||
bool reset_channels = true;
|
||||
bool opened;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&priv->state_lock);
|
||||
@ -1159,22 +1160,24 @@ static int mlx5e_set_trust_state(struct mlx5e_priv *priv, u8 trust_state)
|
||||
mlx5e_params_calc_trust_tx_min_inline_mode(priv->mdev, &new_channels.params,
|
||||
trust_state);
|
||||
|
||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||
priv->channels.params = new_channels.params;
|
||||
opened = test_bit(MLX5E_STATE_OPENED, &priv->state);
|
||||
if (!opened)
|
||||
reset_channels = false;
|
||||
}
|
||||
|
||||
/* Skip if tx_min_inline is the same */
|
||||
if (new_channels.params.tx_min_inline_mode ==
|
||||
priv->channels.params.tx_min_inline_mode)
|
||||
reset_channels = false;
|
||||
|
||||
if (reset_channels)
|
||||
if (reset_channels) {
|
||||
err = mlx5e_safe_switch_channels(priv, &new_channels,
|
||||
mlx5e_update_trust_state_hw,
|
||||
&trust_state);
|
||||
else
|
||||
} else {
|
||||
err = mlx5e_update_trust_state_hw(priv, &trust_state);
|
||||
if (!err && !opened)
|
||||
priv->channels.params = new_channels.params;
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->state_lock);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user