/* Function pointer to be used to modify HW or kernel settings while
  * switching channels
  */
-typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv);
+typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv, void *context);
+#define MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(fn) \
+int fn##_ctx(struct mlx5e_priv *priv, void *context) \
+{ \
+       return fn(priv); \
+}
 int mlx5e_safe_reopen_channels(struct mlx5e_priv *priv);
 int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
                               struct mlx5e_channels *new_chs,
-                              mlx5e_fp_preactivate preactivate);
+                              mlx5e_fp_preactivate preactivate,
+                              void *context);
 int mlx5e_num_channels_changed(struct mlx5e_priv *priv);
+int mlx5e_num_channels_changed_ctx(struct mlx5e_priv *priv, void *context);
 void mlx5e_activate_priv_channels(struct mlx5e_priv *priv);
 void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv);
 
 void mlx5e_queue_update_stats(struct mlx5e_priv *priv);
 int mlx5e_bits_invert(unsigned long a, int size);
 
-typedef int (*change_hw_mtu_cb)(struct mlx5e_priv *priv);
 int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv);
+int mlx5e_set_dev_port_mtu_ctx(struct mlx5e_priv *priv, void *context);
 int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
-                    change_hw_mtu_cb set_mtu_cb);
+                    mlx5e_fp_preactivate preactivate);
 
 /* ethtool helpers */
 void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
 
            priv->channels.params.tx_min_inline_mode)
                goto out;
 
-       mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 
 out:
        mutex_unlock(&priv->state_lock);
 
                goto unlock;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 
 unlock:
        mutex_unlock(&priv->state_lock);
                mlx5e_arfs_disable(priv);
 
        /* Switch to new channels, set new parameters and close old ones */
-       err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed);
+       err = mlx5e_safe_switch_channels(priv, &new_channels,
+                                        mlx5e_num_channels_changed_ctx, NULL);
 
        if (arfs_enabled) {
                int err2 = mlx5e_arfs_enable(priv);
                goto out;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 
 out:
        mutex_unlock(&priv->state_lock);
                return 0;
        }
 
-       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 }
 
 static int set_pflag_tx_cqe_based_moder(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
        if (err)
                return err;
 
                return 0;
        }
 
-       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 }
 
 static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
        return err;
 }
 
 
        return err;
 }
 
+static MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_modify_tirs_lro);
+
 static int mlx5e_set_mtu(struct mlx5_core_dev *mdev,
                         struct mlx5e_params *params, u16 mtu)
 {
        return 0;
 }
 
+MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_set_dev_port_mtu);
+
 void mlx5e_set_netdev_mtu_boundaries(struct mlx5e_priv *priv)
 {
        struct mlx5e_params *params = &priv->channels.params;
        return 0;
 }
 
+MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_num_channels_changed);
+
 static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
 {
        int i, ch;
 
 static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
                                      struct mlx5e_channels *new_chs,
-                                     mlx5e_fp_preactivate preactivate)
+                                     mlx5e_fp_preactivate preactivate,
+                                     void *context)
 {
        struct net_device *netdev = priv->netdev;
        struct mlx5e_channels old_chs;
         * to modify HW settings or update kernel parameters.
         */
        if (preactivate) {
-               err = preactivate(priv);
+               err = preactivate(priv, context);
                if (err) {
                        priv->channels = old_chs;
                        goto out;
 
 int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
                               struct mlx5e_channels *new_chs,
-                              mlx5e_fp_preactivate preactivate)
+                              mlx5e_fp_preactivate preactivate,
+                              void *context)
 {
        int err;
 
        if (err)
                return err;
 
-       err = mlx5e_switch_priv_channels(priv, new_chs, preactivate);
+       err = mlx5e_switch_priv_channels(priv, new_chs, preactivate, context);
        if (err)
                goto err_close;
 
        struct mlx5e_channels new_channels = {};
 
        new_channels.params = priv->channels.params;
-       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
 }
 
 void mlx5e_timestamp_init(struct mlx5e_priv *priv)
                goto out;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed);
+       err = mlx5e_safe_switch_channels(priv, &new_channels,
+                                        mlx5e_num_channels_changed_ctx, NULL);
        if (err)
                goto out;
 
                goto out;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
+       err = mlx5e_safe_switch_channels(priv, &new_channels,
+                                        mlx5e_modify_tirs_lro_ctx, NULL);
 out:
        mutex_unlock(&priv->state_lock);
        return err;
 }
 
 int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
-                    change_hw_mtu_cb set_mtu_cb)
+                    mlx5e_fp_preactivate preactivate)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
        struct mlx5e_channels new_channels = {};
 
        if (!reset) {
                params->sw_mtu = new_mtu;
-               if (set_mtu_cb)
-                       set_mtu_cb(priv);
+               if (preactivate)
+                       preactivate(priv, NULL);
                netdev->mtu = params->sw_mtu;
                goto out;
        }
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, set_mtu_cb);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, preactivate, NULL);
        if (err)
                goto out;
 
 
 static int mlx5e_change_nic_mtu(struct net_device *netdev, int new_mtu)
 {
-       return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
+       return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu_ctx);
 }
 
 int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
                mlx5e_set_rq_type(priv->mdev, &new_channels.params);
                old_prog = priv->channels.params.xdp_prog;
 
-               err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+               err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
                if (err)
                        goto unlock;
        } else {
 
 
 static int mlx5e_uplink_rep_change_mtu(struct net_device *netdev, int new_mtu)
 {
-       return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
+       return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu_ctx);
 }
 
 static int mlx5e_uplink_rep_set_mac(struct net_device *netdev, void *addr)
 
        new_channels.params = *params;
        new_channels.params.sw_mtu = new_mtu;
 
-       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
        if (err)
                goto out;