priv->sh = sh;
        priv->ctx = sh->ctx;
        priv->ibv_port = spawn->ibv_port;
-       priv->device_attr = sh->device_attr;
        priv->mtu = ETHER_MTU;
 #ifndef RTE_ARCH_64
        /* Initialize UAR access locks for 32bit implementations. */
 
        struct mlx5_ibv_shared *sh; /* Shared IB device context. */
        uint32_t ibv_port; /* IB device port number. */
        struct ibv_context *ctx; /* Verbs context. */
-       struct ibv_device_attr_ex device_attr; /* Device properties. */
        struct ether_addr mac[MLX5_MAX_MAC_ADDRESSES]; /* MAC addresses. */
        BITFIELD_DECLARE(mac_own, uint64_t, MLX5_MAX_MAC_ADDRESSES);
        /* Bit-field of MAC addresses owned by the PMD. */
 
         * Since we need one CQ per QP, the limit is the minimum number
         * between the two values.
         */
-       max = RTE_MIN(priv->device_attr.orig_attr.max_cq,
-                     priv->device_attr.orig_attr.max_qp);
+       max = RTE_MIN(priv->sh->device_attr.orig_attr.max_cq,
+                     priv->sh->device_attr.orig_attr.max_qp);
        /* If max >= 65535 then max = 0, max_rx_queues is uint16_t. */
        if (max >= 65535)
                max = 65535;
 int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
-       struct ibv_device_attr *attr = &priv->device_attr.orig_attr;
+       struct ibv_device_attr *attr = &priv->sh->device_attr.orig_attr;
        size_t size = strnlen(attr->fw_ver, sizeof(attr->fw_ver)) + 1;
 
        if (fw_size < size)
 
                rte_errno = ENOMEM;
                goto error;
        }
-       DRV_LOG(DEBUG, "port %u priv->device_attr.max_qp_wr is %d",
-               dev->data->port_id, priv->device_attr.orig_attr.max_qp_wr);
-       DRV_LOG(DEBUG, "port %u priv->device_attr.max_sge is %d",
-               dev->data->port_id, priv->device_attr.orig_attr.max_sge);
+       DRV_LOG(DEBUG, "port %u device_attr.max_qp_wr is %d",
+               dev->data->port_id, priv->sh->device_attr.orig_attr.max_qp_wr);
+       DRV_LOG(DEBUG, "port %u device_attr.max_sge is %d",
+               dev->data->port_id, priv->sh->device_attr.orig_attr.max_sge);
        attr.wq.ibv = (struct ibv_wq_init_attr){
                .wq_context = NULL, /* Could be useful in the future. */
                .wq_type = IBV_WQT_RQ,
 
                .cap = {
                        /* Max number of outstanding WRs. */
                        .max_send_wr =
-                               ((priv->device_attr.orig_attr.max_qp_wr <
+                               ((priv->sh->device_attr.orig_attr.max_qp_wr <
                                  desc) ?
-                                priv->device_attr.orig_attr.max_qp_wr :
+                                priv->sh->device_attr.orig_attr.max_qp_wr :
                                 desc),
                        /*
                         * Max number of scatter/gather elements in a WR,
                         * must be 1 to prevent libmlx5 from trying to affect
                         * too much memory. TX gather is not impacted by the
-                        * priv->device_attr.max_sge limit and will still work
+                        * device_attr.max_sge limit and will still work
                         * properly.
                         */
                        .max_send_sge = 1,
        tmpl->txq.elts_n = log2above(desc);
        tmpl->idx = idx;
        txq_set_params(tmpl);
-       DRV_LOG(DEBUG, "port %u priv->device_attr.max_qp_wr is %d",
-               dev->data->port_id, priv->device_attr.orig_attr.max_qp_wr);
-       DRV_LOG(DEBUG, "port %u priv->device_attr.max_sge is %d",
-               dev->data->port_id, priv->device_attr.orig_attr.max_sge);
+       DRV_LOG(DEBUG, "port %u device_attr.max_qp_wr is %d",
+               dev->data->port_id, priv->sh->device_attr.orig_attr.max_qp_wr);
+       DRV_LOG(DEBUG, "port %u device_attr.max_sge is %d",
+               dev->data->port_id, priv->sh->device_attr.orig_attr.max_sge);
        tmpl->txq.elts =
                (struct rte_mbuf *(*)[1 << tmpl->txq.elts_n])(tmpl + 1);
        tmpl->txq.stats.idx = idx;