esw->mode == MLX5_ESWITCH_LEGACY;
 
        /* Enable PF vport */
-       if (pf_needed) {
+       if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev)) {
                ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF,
                                                    enabled_events);
                if (ret)
                        return ret;
        }
 
-       /* Enable external host PF HCA */
-       ret = host_pf_enable_hca(esw->dev);
-       if (ret)
-               goto pf_hca_err;
+       if (mlx5_esw_host_functions_enabled(esw->dev)) {
+               /* Enable external host PF HCA */
+               ret = host_pf_enable_hca(esw->dev);
+               if (ret)
+                       goto pf_hca_err;
+       }
 
        /* Enable ECPF vport */
        if (mlx5_ecpf_vport_exists(esw->dev)) {
        if (mlx5_ecpf_vport_exists(esw->dev))
                mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
 ecpf_err:
-       host_pf_disable_hca(esw->dev);
+       if (mlx5_esw_host_functions_enabled(esw->dev))
+               host_pf_disable_hca(esw->dev);
 pf_hca_err:
-       if (pf_needed)
+       if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev))
                mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
        return ret;
 }
                mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
        }
 
-       host_pf_disable_hca(esw->dev);
+       if (mlx5_esw_host_functions_enabled(esw->dev))
+               host_pf_disable_hca(esw->dev);
 
-       if (mlx5_core_is_ecpf_esw_manager(esw->dev) ||
-           esw->mode == MLX5_ESWITCH_LEGACY)
+       if ((mlx5_core_is_ecpf_esw_manager(esw->dev) ||
+            esw->mode == MLX5_ESWITCH_LEGACY) &&
+           mlx5_esw_host_functions_enabled(esw->dev))
                mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
 }
 
        void *hca_caps;
        int err;
 
-       if (!mlx5_core_is_ecpf(dev)) {
+       if (!mlx5_core_is_ecpf(dev) ||
+           !mlx5_esw_host_functions_enabled(dev)) {
                *max_sfs = 0;
                return 0;
        }
 
        xa_init(&esw->vports);
 
-       err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
-       if (err)
-               goto err;
-       if (esw->first_host_vport == MLX5_VPORT_PF)
-               xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
-       idx++;
-
-       for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
-               err = mlx5_esw_vport_alloc(esw, idx, idx);
+       if (mlx5_esw_host_functions_enabled(dev)) {
+               err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
                if (err)
                        goto err;
-               xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
-               xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
+               if (esw->first_host_vport == MLX5_VPORT_PF)
+                       xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
                idx++;
+               for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
+                       err = mlx5_esw_vport_alloc(esw, idx, idx);
+                       if (err)
+                               goto err;
+                       xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
+                       xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
+                       idx++;
+               }
        }
+
        base_sf_num = mlx5_sf_start_function_id(dev);
        for (i = 0; i < mlx5_sf_max_functions(dev); i++) {
                err = mlx5_esw_vport_alloc(esw, idx, base_sf_num + i);
                goto free_esw;
 
        esw->dev = dev;
+       dev->priv.eswitch = esw;
        esw->manager_vport = mlx5_eswitch_manager_vport(dev);
        esw->first_host_vport = mlx5_eswitch_first_host_vport_num(dev);
 
        if (err)
                goto abort;
 
-       dev->priv.eswitch = esw;
        err = esw_offloads_init(esw);
        if (err)
                goto reps_err;
        dev->num_ipsec_offloads--;
        mutex_unlock(&esw->state_lock);
 }
+
+bool mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev)
+{
+       if (!dev->priv.eswitch)
+               return true;
+
+       return !dev->priv.eswitch->esw_funcs.host_funcs_disabled;
+}
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_value,
                            misc_parameters);
 
-       if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
+       if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
+           mlx5_esw_host_functions_enabled(peer_dev)) {
                peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
                esw_set_peer_miss_rule_source_port(esw, peer_esw, spec,
                                                   MLX5_VPORT_PF);
                flows[peer_vport->index] = flow;
        }
 
-       mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
-                                  mlx5_core_max_vfs(peer_dev)) {
-               esw_set_peer_miss_rule_source_port(esw,
-                                                  peer_esw,
-                                                  spec, peer_vport->vport);
+       if (mlx5_esw_host_functions_enabled(esw->dev)) {
+               mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
+                                          mlx5_core_max_vfs(peer_dev)) {
+                       esw_set_peer_miss_rule_source_port(esw, peer_esw,
+                                                          spec,
+                                                          peer_vport->vport);
 
-               flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
-                                          spec, &flow_act, &dest, 1);
-               if (IS_ERR(flow)) {
-                       err = PTR_ERR(flow);
-                       goto add_vf_flow_err;
+                       flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
+                                                  spec, &flow_act, &dest, 1);
+                       if (IS_ERR(flow)) {
+                               err = PTR_ERR(flow);
+                               goto add_vf_flow_err;
+                       }
+                       flows[peer_vport->index] = flow;
                }
-               flows[peer_vport->index] = flow;
        }
 
        if (mlx5_core_ec_sriov_enabled(peer_dev)) {
                mlx5_del_flow_rules(flows[peer_vport->index]);
        }
 add_ecpf_flow_err:
-       if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
+
+       if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
+           mlx5_esw_host_functions_enabled(peer_dev)) {
                peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
                mlx5_del_flow_rules(flows[peer_vport->index]);
        }
 {
        /* Currently, only ECPF based device has representor for host PF. */
        if (vport_num == MLX5_VPORT_PF &&
-           !mlx5_core_is_ecpf_esw_manager(esw->dev))
+           (!mlx5_core_is_ecpf_esw_manager(esw->dev) ||
+            !mlx5_esw_host_functions_enabled(esw->dev)))
                return false;
 
        if (vport_num == MLX5_VPORT_ECPF &&