}
 }
 
-static int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
+int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
 {
        struct devlink_port *dl_port;
        struct mlx5_vport *vport;
        return 0;
 }
 
-static void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
 {
        struct mlx5_vport *vport;
 
        if (IS_ERR(vport))
                return PTR_ERR(vport);
 
-       err = mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport_num);
-       if (err)
-               return err;
-
        dl_port = vport->dl_port;
        if (!dl_port)
                return 0;
        err = devl_port_register_with_ops(devlink, dl_port, dl_port_index,
                                          &mlx5_esw_pf_vf_dl_port_ops);
        if (err)
-               goto reg_err;
+               return err;
 
        err = devl_rate_leaf_create(dl_port, vport, NULL);
        if (err)
 
 rate_err:
        devl_port_unregister(dl_port);
-reg_err:
-       mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
        return err;
 }
 
        devl_rate_leaf_destroy(vport->dl_port);
 
        devl_port_unregister(vport->dl_port);
-       mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
 }
 
 struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num)
 
        mlx5_esw_vport_disable(esw, vport_num);
 }
 
+static int mlx5_eswitch_load_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num,
+                                        enum mlx5_eswitch_vport_event enabled_events)
+{
+       int err;
+
+       err = mlx5_esw_offloads_init_pf_vf_rep(esw, vport_num);
+       if (err)
+               return err;
+
+       err = mlx5_eswitch_load_vport(esw, vport_num, enabled_events);
+       if (err)
+               goto err_load;
+       return 0;
+
+err_load:
+       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
+       return err;
+}
+
+static void mlx5_eswitch_unload_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num)
+{
+       mlx5_eswitch_unload_vport(esw, vport_num);
+       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
+}
+
 void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs)
 {
        struct mlx5_vport *vport;
        mlx5_esw_for_each_vf_vport(esw, i, vport, num_vfs) {
                if (!vport->enabled)
                        continue;
-               mlx5_eswitch_unload_vport(esw, vport->vport);
+               mlx5_eswitch_unload_pf_vf_vport(esw, vport->vport);
        }
 }
 
        mlx5_esw_for_each_ec_vf_vport(esw, i, vport, num_ec_vfs) {
                if (!vport->enabled)
                        continue;
-               mlx5_eswitch_unload_vport(esw, vport->vport);
+               mlx5_eswitch_unload_pf_vf_vport(esw, vport->vport);
        }
 }
 
        int err;
 
        mlx5_esw_for_each_vf_vport(esw, i, vport, num_vfs) {
-               err = mlx5_eswitch_load_vport(esw, vport->vport, enabled_events);
+               err = mlx5_eswitch_load_pf_vf_vport(esw, vport->vport, enabled_events);
                if (err)
                        goto vf_err;
        }
        int err;
 
        mlx5_esw_for_each_ec_vf_vport(esw, i, vport, num_ec_vfs) {
-               err = mlx5_eswitch_load_vport(esw, vport->vport, enabled_events);
+               err = mlx5_eswitch_load_pf_vf_vport(esw, vport->vport, enabled_events);
                if (err)
                        goto vf_err;
        }
        int ret;
 
        /* Enable PF vport */
-       ret = mlx5_eswitch_load_vport(esw, MLX5_VPORT_PF, enabled_events);
+       ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF, enabled_events);
        if (ret)
                return ret;
 
 
        /* Enable ECPF vport */
        if (mlx5_ecpf_vport_exists(esw->dev)) {
-               ret = mlx5_eswitch_load_vport(esw, MLX5_VPORT_ECPF, enabled_events);
+               ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events);
                if (ret)
                        goto ecpf_err;
                if (mlx5_core_ec_sriov_enabled(esw->dev)) {
                mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs);
 ec_vf_err:
        if (mlx5_ecpf_vport_exists(esw->dev))
-               mlx5_eswitch_unload_vport(esw, MLX5_VPORT_ECPF);
+               mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
 ecpf_err:
        host_pf_disable_hca(esw->dev);
 pf_hca_err:
-       mlx5_eswitch_unload_vport(esw, MLX5_VPORT_PF);
+       mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
        return ret;
 }
 
        if (mlx5_ecpf_vport_exists(esw->dev)) {
                if (mlx5_core_ec_sriov_enabled(esw->dev))
                        mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs);
-               mlx5_eswitch_unload_vport(esw, MLX5_VPORT_ECPF);
+               mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
        }
 
        host_pf_disable_hca(esw->dev);
-       mlx5_eswitch_unload_vport(esw, MLX5_VPORT_PF);
+       mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
 }
 
 static void mlx5_eswitch_get_devlink_param(struct mlx5_eswitch *esw)
 
                                   u16 vport,
                                   struct mlx5_flow_spec *spec);
 
+int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
+void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
 int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, u16 vport_num);
 void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, u16 vport_num);
 
                                enum mlx5_eswitch_vport_event enabled_events);
 void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs);
 
+int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num);
+void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num);
 int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_num);
 void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vport_num);
 struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num);