goto unlock;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto unlock;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
 unlock:
        mutex_unlock(&priv->state_lock);
                goto out;
        }
 
-       /* Create fresh channels with new parameters */
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
        arfs_enabled = priv->netdev->features & NETIF_F_NTUPLE;
        if (arfs_enabled)
                mlx5e_arfs_disable(priv);
                                              MLX5E_INDIR_RQT_SIZE, count);
 
        /* Switch to new channels, set new parameters and close old ones */
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
        if (arfs_enabled) {
-               err = mlx5e_arfs_enable(priv);
-               if (err)
+               int err2 = mlx5e_arfs_enable(priv);
+
+               if (err2)
                        netdev_err(priv->netdev, "%s: mlx5e_arfs_enable failed: %d\n",
-                                  __func__, err);
+                                  __func__, err2);
        }
 
 out:
                goto out;
        }
 
-       /* open fresh channels with new coal parameters */
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
 out:
        mutex_unlock(&priv->state_lock);
        struct mlx5e_channels new_channels = {};
        bool mode_changed;
        u8 cq_period_mode, current_cq_period_mode;
-       int err = 0;
 
        cq_period_mode = enable ?
                MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 }
 
 static int set_pflag_tx_cqe_based_moder(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
        if (err)
                return err;
 
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
        mlx5e_dbg(DRV, priv, "MLX5E: RxCqeCmprss was turned %s\n",
                  MLX5E_GET_PFLAG(&priv->channels.params,
                                  MLX5E_PFLAG_RX_CQE_COMPRESS) ? "ON" : "OFF");
        struct mlx5e_priv *priv = netdev_priv(netdev);
        struct mlx5_core_dev *mdev = priv->mdev;
        struct mlx5e_channels new_channels = {};
-       int err;
 
        if (enable) {
                if (!mlx5e_check_fragmented_striding_rq_cap(mdev))
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 }
 
 static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       return err;
 }
 
 static const struct pflag_desc mlx5e_priv_flags[MLX5E_NUM_PFLAGS] = {
 
        mlx5e_deactivate_channels(&priv->channels);
 }
 
-void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
-                               struct mlx5e_channels *new_chs,
-                               mlx5e_fp_hw_modify hw_modify)
+static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
+                                      struct mlx5e_channels *new_chs,
+                                      mlx5e_fp_hw_modify hw_modify)
 {
        struct net_device *netdev = priv->netdev;
        int new_num_txqs;
        int carrier_ok;
+
        new_num_txqs = new_chs->num * new_chs->params.num_tc;
 
        carrier_ok = netif_carrier_ok(netdev);
                netif_carrier_on(netdev);
 }
 
+int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
+                              struct mlx5e_channels *new_chs,
+                              mlx5e_fp_hw_modify hw_modify)
+{
+       int err;
+
+       err = mlx5e_open_channels(priv, new_chs);
+       if (err)
+               return err;
+
+       mlx5e_switch_priv_channels(priv, new_chs, hw_modify);
+       return 0;
+}
+
 void mlx5e_timestamp_init(struct mlx5e_priv *priv)
 {
        priv->tstamp.tx_type   = HWTSTAMP_TX_OFF;
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
        if (err)
                goto out;
 
        priv->max_opened_tc = max_t(u8, priv->max_opened_tc,
                                    new_channels.params.num_tc);
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
 out:
        mutex_unlock(&priv->state_lock);
        return err;
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
 out:
        mutex_unlock(&priv->state_lock);
        return err;
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, set_mtu_cb);
        if (err)
                goto out;
 
-       mlx5e_switch_priv_channels(priv, &new_channels, set_mtu_cb);
        netdev->mtu = new_channels.params.sw_mtu;
 
 out: