ENA_ADMIN_LLQ                               = 4,
        ENA_ADMIN_EXTRA_PROPERTIES_STRINGS          = 5,
        ENA_ADMIN_EXTRA_PROPERTIES_FLAGS            = 6,
+       ENA_ADMIN_MAX_QUEUES_EXT                    = 7,
        ENA_ADMIN_RSS_HASH_FUNCTION                 = 10,
        ENA_ADMIN_STATELESS_OFFLOAD_CONFIG          = 11,
        ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG      = 12,
        /* as appears in ena_admin_aq_feature_id */
        u8 feature_id;
 
-       u16 reserved16;
+       /* The driver specifies the max feature version it supports and the
+        * device responds with the currently supported feature version. The
+        * field is zero based
+        */
+       u8 feature_version;
+
+       u8 reserved8;
 };
 
 struct ena_admin_device_attr_feature_desc {
        u32 max_tx_burst_size;
 };
 
+struct ena_admin_queue_ext_feature_fields {
+       u32 max_tx_sq_num;
+
+       u32 max_tx_cq_num;
+
+       u32 max_rx_sq_num;
+
+       u32 max_rx_cq_num;
+
+       u32 max_tx_sq_depth;
+
+       u32 max_tx_cq_depth;
+
+       u32 max_rx_sq_depth;
+
+       u32 max_rx_cq_depth;
+
+       u32 max_tx_header_size;
+
+       /* Maximum Descriptors number, including meta descriptor, allowed for
+        * a single Tx packet
+        */
+       u16 max_per_packet_tx_descs;
+
+       /* Maximum Descriptors number allowed for a single Rx packet */
+       u16 max_per_packet_rx_descs;
+};
+
 struct ena_admin_queue_feature_desc {
        u32 max_sq_num;
 
        u32 raw[11];
 };
 
+struct ena_admin_queue_ext_feature_desc {
+       /* version */
+       u8 version;
+
+       u8 reserved1[3];
+
+       union {
+               struct ena_admin_queue_ext_feature_fields max_queue_ext;
+
+               u32 raw[10];
+       };
+};
+
 struct ena_admin_get_feat_resp {
        struct ena_admin_acq_common_desc acq_common_desc;
 
 
                struct ena_admin_queue_feature_desc max_queue;
 
+               struct ena_admin_queue_ext_feature_desc max_queue_ext;
+
                struct ena_admin_feature_aenq_desc aenq;
 
                struct ena_admin_get_feature_link_desc link;
 
        u16 syndrom;
 
-       /* 0 : phase */
+       /* 0 : phase
+        * 7:1 : reserved - MBZ
+        */
        u8 flags;
 
        u8 reserved1[3];
 
                                  struct ena_admin_get_feat_resp *get_resp,
                                  enum ena_admin_aq_feature_id feature_id,
                                  dma_addr_t control_buf_dma_addr,
-                                 u32 control_buff_size)
+                                 u32 control_buff_size,
+                                 u8 feature_ver)
 {
        struct ena_com_admin_queue *admin_queue;
        struct ena_admin_get_feat_cmd get_cmd;
        }
 
        get_cmd.control_buffer.length = control_buff_size;
-
+       get_cmd.feat_common.feature_version = feature_ver;
        get_cmd.feat_common.feature_id = feature_id;
 
        ret = ena_com_execute_admin_command(admin_queue,
 
 static int ena_com_get_feature(struct ena_com_dev *ena_dev,
                               struct ena_admin_get_feat_resp *get_resp,
-                              enum ena_admin_aq_feature_id feature_id)
+                              enum ena_admin_aq_feature_id feature_id,
+                              u8 feature_ver)
 {
        return ena_com_get_feature_ex(ena_dev,
                                      get_resp,
                                      feature_id,
                                      0,
-                                     0);
+                                     0,
+                                     feature_ver);
 }
 
 static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev)
        int ret;
 
        ret = ena_com_get_feature(ena_dev, &get_resp,
-                                 ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG);
+                                 ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG, 0);
        if (unlikely(ret))
                return ret;
 
        struct ena_admin_get_feat_resp get_resp;
        int ret;
 
-       ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG);
+       ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG, 0);
        if (ret) {
                pr_info("Can't get aenq configuration\n");
                return ret;
 int ena_com_get_link_params(struct ena_com_dev *ena_dev,
                            struct ena_admin_get_feat_resp *resp)
 {
-       return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG);
+       return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG, 0);
 }
 
 int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev)
        rc = ena_com_get_feature_ex(ena_dev, &resp,
                                    ENA_ADMIN_EXTRA_PROPERTIES_STRINGS,
                                    extra_properties_strings->dma_addr,
-                                   extra_properties_strings->size);
+                                   extra_properties_strings->size, 0);
        if (rc) {
                pr_debug("Failed to get extra properties strings\n");
                goto err;
                                       struct ena_admin_get_feat_resp *resp)
 {
        return ena_com_get_feature(ena_dev, resp,
-                                  ENA_ADMIN_EXTRA_PROPERTIES_FLAGS);
+                                  ENA_ADMIN_EXTRA_PROPERTIES_FLAGS, 0);
 }
 
 int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
        int rc;
 
        rc = ena_com_get_feature(ena_dev, &get_resp,
-                                ENA_ADMIN_DEVICE_ATTRIBUTES);
+                                ENA_ADMIN_DEVICE_ATTRIBUTES, 0);
        if (rc)
                return rc;
 
               sizeof(get_resp.u.dev_attr));
        ena_dev->supported_features = get_resp.u.dev_attr.supported_features;
 
-       rc = ena_com_get_feature(ena_dev, &get_resp,
-                                ENA_ADMIN_MAX_QUEUES_NUM);
-       if (rc)
-               return rc;
+       if (ena_dev->supported_features & BIT(ENA_ADMIN_MAX_QUEUES_EXT)) {
+               rc = ena_com_get_feature(ena_dev, &get_resp,
+                                        ENA_ADMIN_MAX_QUEUES_EXT,
+                                        ENA_FEATURE_MAX_QUEUE_EXT_VER);
+               if (rc)
+                       return rc;
 
-       memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue,
-              sizeof(get_resp.u.max_queue));
-       ena_dev->tx_max_header_size = get_resp.u.max_queue.max_header_size;
+               if (get_resp.u.max_queue_ext.version != ENA_FEATURE_MAX_QUEUE_EXT_VER)
+                       return -EINVAL;
+
+               memcpy(&get_feat_ctx->max_queue_ext, &get_resp.u.max_queue_ext,
+                      sizeof(get_resp.u.max_queue_ext));
+               ena_dev->tx_max_header_size =
+                       get_resp.u.max_queue_ext.max_queue_ext.max_tx_header_size;
+       } else {
+               rc = ena_com_get_feature(ena_dev, &get_resp,
+                                        ENA_ADMIN_MAX_QUEUES_NUM, 0);
+               memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue,
+                      sizeof(get_resp.u.max_queue));
+               ena_dev->tx_max_header_size =
+                       get_resp.u.max_queue.max_header_size;
+
+               if (rc)
+                       return rc;
+       }
 
        rc = ena_com_get_feature(ena_dev, &get_resp,
-                                ENA_ADMIN_AENQ_CONFIG);
+                                ENA_ADMIN_AENQ_CONFIG, 0);
        if (rc)
                return rc;
 
               sizeof(get_resp.u.aenq));
 
        rc = ena_com_get_feature(ena_dev, &get_resp,
-                                ENA_ADMIN_STATELESS_OFFLOAD_CONFIG);
+                                ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
        if (rc)
                return rc;
 
        /* Driver hints isn't mandatory admin command. So in case the
         * command isn't supported set driver hints to 0
         */
-       rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS);
+       rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS, 0);
 
        if (!rc)
                memcpy(&get_feat_ctx->hw_hints, &get_resp.u.hw_hints,
        else
                return rc;
 
-       rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ);
+       rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ, 0);
        if (!rc)
                memcpy(&get_feat_ctx->llq, &get_resp.u.llq,
                       sizeof(get_resp.u.llq));
        struct ena_admin_get_feat_resp resp;
 
        ret = ena_com_get_feature(ena_dev, &resp,
-                                 ENA_ADMIN_STATELESS_OFFLOAD_CONFIG);
+                                 ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
        if (unlikely(ret)) {
                pr_err("Failed to get offload capabilities %d\n", ret);
                return ret;
 
        /* Validate hash function is supported */
        ret = ena_com_get_feature(ena_dev, &get_resp,
-                                 ENA_ADMIN_RSS_HASH_FUNCTION);
+                                 ENA_ADMIN_RSS_HASH_FUNCTION, 0);
        if (unlikely(ret))
                return ret;
 
        rc = ena_com_get_feature_ex(ena_dev, &get_resp,
                                    ENA_ADMIN_RSS_HASH_FUNCTION,
                                    rss->hash_key_dma_addr,
-                                   sizeof(*rss->hash_key));
+                                   sizeof(*rss->hash_key), 0);
        if (unlikely(rc))
                return rc;
 
        rc = ena_com_get_feature_ex(ena_dev, &get_resp,
                                    ENA_ADMIN_RSS_HASH_FUNCTION,
                                    rss->hash_key_dma_addr,
-                                   sizeof(*rss->hash_key));
+                                   sizeof(*rss->hash_key), 0);
        if (unlikely(rc))
                return rc;
 
        rc = ena_com_get_feature_ex(ena_dev, &get_resp,
                                    ENA_ADMIN_RSS_HASH_INPUT,
                                    rss->hash_ctrl_dma_addr,
-                                   sizeof(*rss->hash_ctrl));
+                                   sizeof(*rss->hash_ctrl), 0);
        if (unlikely(rc))
                return rc;
 
        rc = ena_com_get_feature_ex(ena_dev, &get_resp,
                                    ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG,
                                    rss->rss_ind_tbl_dma_addr,
-                                   tbl_size);
+                                   tbl_size, 0);
        if (unlikely(rc))
                return rc;
 
        int rc;
 
        rc = ena_com_get_feature(ena_dev, &get_resp,
-                                ENA_ADMIN_INTERRUPT_MODERATION);
+                                ENA_ADMIN_INTERRUPT_MODERATION, 0);
 
        if (rc) {
                if (rc == -EOPNOTSUPP) {