fallback = true;
 #else
        fallback = false;
-       if (!sh->devx || !priv->config.dv_flow_en ||
+       if (!sh->cdev->config.devx || !priv->config.dv_flow_en ||
            !hca_attr->flow_counters_dump ||
            !(hca_attr->flow_counter_bulk_alloc_bitmap & 0x4) ||
            (mlx5_flow_dv_discover_counter_offset_support(dev) == -ENOTSUP))
                config->mps == MLX5_MPW_ENHANCED ? "enhanced " :
                config->mps == MLX5_MPW ? "legacy " : "",
                config->mps != MLX5_MPW_DISABLED ? "enabled" : "disabled");
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
                sh->steering_format_version = hca_attr->steering_format_version;
                /* Check for LRO support. */
                if (config->dest_tir && hca_attr->lro_cap &&
                config->cqe_comp = 0;
        }
        if (config->cqe_comp_fmt == MLX5_CQE_RESP_FORMAT_FTAG_STRIDX &&
-           (!sh->devx || !hca_attr->mini_cqe_resp_flow_tag)) {
+           (!sh->cdev->config.devx || !hca_attr->mini_cqe_resp_flow_tag)) {
                DRV_LOG(WARNING, "Flow Tag CQE compression"
                                 " format isn't supported.");
                config->cqe_comp = 0;
        }
        if (config->cqe_comp_fmt == MLX5_CQE_RESP_FORMAT_L34H_STRIDX &&
-           (!sh->devx || !hca_attr->mini_cqe_resp_l3_l4_tag)) {
+           (!sh->cdev->config.devx || !hca_attr->mini_cqe_resp_l3_l4_tag)) {
                DRV_LOG(WARNING, "L3/L4 Header CQE compression"
                                 " format isn't supported.");
                config->cqe_comp = 0;
                        hca_attr->log_max_static_sq_wq);
                DRV_LOG(DEBUG, "WQE rate PP mode is %ssupported",
                        hca_attr->qos.wqe_rate_pp ? "" : "not ");
-               if (!sh->devx) {
+               if (!sh->cdev->config.devx) {
                        DRV_LOG(ERR, "DevX is required for packet pacing");
                        err = ENODEV;
                        goto error;
                                priv->dev_port);
                }
        }
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
                uint32_t reg[MLX5_ST_SZ_DW(register_mtutc)];
 
                err = hca_attr->access_register_user ?
                if (mlx5_flex_item_port_init(eth_dev) < 0)
                        goto error;
        }
-       if (sh->devx && config->dv_flow_en && config->dest_tir) {
+       if (sh->cdev->config.devx && config->dv_flow_en && config->dest_tir) {
                priv->obj_ops = devx_obj_ops;
                mlx5_queue_counter_id_prepare(eth_dev);
                priv->obj_ops.lb_dummy_queue_create =
                        rte_intr_fd_set(sh->intr_handle, -1);
                }
        }
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
 #ifdef HAVE_IBV_DEVX_ASYNC
                sh->intr_handle_devx =
                        rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_SHARED);
 
        qp.comp_mask = MLX5DV_QP_MASK_UAR_MMAP_OFFSET;
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
        /* If using DevX, need additional mask to read tisn value. */
-       if (priv->sh->devx && !priv->sh->tdn)
+       if (priv->sh->cdev->config.devx && !priv->sh->tdn)
                qp.comp_mask |= MLX5DV_QP_MASK_RAW_QP_HANDLES;
 #endif
        obj.cq.in = txq_obj->cq;
         * This is done once per port.
         * Will use this value on Rx, when creating matching TIR.
         */
-       if (priv->sh->devx && !priv->sh->tdn) {
+       if (priv->sh->cdev->config.devx && !priv->sh->tdn) {
                ret = mlx5_devx_cmd_qp_query_tis_td(txq_obj->qp, qp.tisn,
                                                    &priv->sh->tdn);
                if (ret) {
 
        pthread_mutex_init(&sh->txpp.mutex, NULL);
        sh->numa_node = spawn->cdev->dev->numa_node;
        sh->cdev = spawn->cdev;
-       sh->devx = sh->cdev->config.devx;
        if (spawn->bond_info)
                sh->bond = *spawn->bond_info;
        err = mlx5_os_get_dev_attr(sh->cdev, &sh->device_attr);
                sh->port[i].ih_port_id = RTE_MAX_ETHPORTS;
                sh->port[i].devx_ih_port_id = RTE_MAX_ETHPORTS;
        }
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
                sh->td = mlx5_devx_cmd_create_td(sh->cdev->ctx);
                if (!sh->td) {
                        DRV_LOG(ERR, "TD allocation failure");
 
 struct mlx5_dev_ctx_shared {
        LIST_ENTRY(mlx5_dev_ctx_shared) next;
        uint32_t refcnt;
-       uint32_t devx:1; /* Opened with DV. */
        uint32_t flow_hit_aso_en:1; /* Flow Hit ASO is supported. */
        uint32_t steering_format_version:4;
        /* Indicates the device steering logic format. */
 
        struct mlx5_priv *priv = dev->data->dev_private;
        struct mlx5_dev_config *config = &priv->config;
 
-       if (!priv->sh->devx || !config->dest_tir || !config->dv_flow_en) {
+       if (!priv->sh->cdev->config.devx || !config->dest_tir ||
+           !config->dv_flow_en) {
                rte_errno = ENOTSUP;
                return -rte_errno;
        }
 
        type = mlx5_flow_os_get_type();
        if (type == MLX5_FLOW_TYPE_MAX) {
                type = MLX5_FLOW_TYPE_VERBS;
-               if (priv->sh->devx && priv->config.dv_flow_en)
+               if (priv->sh->cdev->config.devx && priv->config.dv_flow_en)
                        type = MLX5_FLOW_TYPE_DV;
        }
        fops = flow_get_drv_ops(type);
 
 {
        struct mlx5_priv *priv = dev->data->dev_private;
 
-       if (!priv->sh->devx)
+       if (!priv->sh->cdev->config.devx)
                goto notsup_err;
        if (action_flags & MLX5_FLOW_ACTION_COUNT)
                return rte_flow_error_set(error, EINVAL,
        struct mlx5_priv *priv = dev->data->dev_private;
        const struct rte_flow_action_age *age = action->conf;
 
-       if (!priv->sh->devx || (priv->sh->cmng.counter_fallback &&
-           !priv->sh->aso_age_mng))
+       if (!priv->sh->cdev->config.devx ||
+           (priv->sh->cmng.counter_fallback && !priv->sh->aso_age_mng))
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
                                          NULL,
                return rte_flow_error_set(error, EINVAL,
                                          RTE_FLOW_ERROR_TYPE_ACTION, action,
                                          "ratio value starts from 1");
-       if (!priv->sh->devx || (sample->ratio > 0 && !priv->sampler_en))
+       if (!priv->sh->cdev->config.devx ||
+           (sample->ratio > 0 && !priv->sampler_en))
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
                                          NULL,
                        age ? MLX5_COUNTER_TYPE_AGE : MLX5_COUNTER_TYPE_ORIGIN;
        uint32_t cnt_idx;
 
-       if (!priv->sh->devx) {
+       if (!priv->sh->cdev->config.devx) {
                rte_errno = ENOTSUP;
                return 0;
        }
        struct mlx5_aso_mtr_pool *pool;
        uint32_t mtr_idx = 0;
 
-       if (!priv->sh->devx) {
+       if (!priv->sh->cdev->config.devx) {
                rte_errno = ENOTSUP;
                return 0;
        }
        uint32_t ct_idx;
 
        MLX5_ASSERT(mng);
-       if (!priv->sh->devx) {
+       if (!priv->sh->cdev->config.devx) {
                rte_errno = ENOTSUP;
                return 0;
        }
                        }
                        break;
                case RTE_FLOW_ACTION_TYPE_COUNT:
-                       if (!priv->sh->devx) {
+                       if (!priv->sh->cdev->config.devx) {
                                return rte_flow_error_set
                                              (error, ENOTSUP,
                                               RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
        struct mlx5_priv *priv = dev->data->dev_private;
        struct rte_flow_query_count *qc = data;
 
-       if (!priv->sh->devx)
+       if (!priv->sh->cdev->config.devx)
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
                                          NULL,
 {
        struct mlx5_priv *priv = dev->data->dev_private;
 
-       if (!priv->sh->devx || !action_ptr)
+       if (!priv->sh->cdev->config.devx || !action_ptr)
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
                                          NULL,
        uint64_t inn_pkts, inn_bytes;
        int ret;
 
-       if (!priv->sh->devx)
+       if (!priv->sh->cdev->config.devx)
                return -1;
 
        ret = _flow_dv_query_count(dev, counter, &inn_pkts, &inn_bytes);
 
                        dev->data->port_id, strerror(rte_errno));
                goto error;
        }
-       if ((priv->sh->devx && priv->config.dv_flow_en &&
+       if ((priv->sh->cdev->config.devx && priv->config.dv_flow_en &&
            priv->config.dest_tir) && priv->obj_ops.lb_dummy_queue_create) {
                ret = priv->obj_ops.lb_dummy_queue_create(dev);
                if (ret)
 
        fallback = true;
 #else
        fallback = false;
-       if (!sh->devx || !priv->config.dv_flow_en ||
+       if (!sh->cdev->config.devx || !priv->config.dv_flow_en ||
            !hca_attr->flow_counters_dump ||
            !(hca_attr->flow_counter_bulk_alloc_bitmap & 0x4) ||
            (mlx5_flow_dv_discover_counter_offset_support(dev) == -ENOTSUP))
                DRV_LOG(WARNING, "Rx CQE compression isn't supported.");
                config->cqe_comp = 0;
        }
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
                hca_attr = &sh->cdev->config.hca_attr;
                config->hw_csum = hca_attr->csum_cap;
                DRV_LOG(DEBUG, "checksum offloading is %ssupported",
                        goto error;
                }
        }
-       if (sh->devx) {
+       if (sh->cdev->config.devx) {
                priv->obj_ops = devx_obj_ops;
        } else {
                DRV_LOG(ERR, "Windows flow must be DevX.");