net/i40e: fix boundary check in RSS config
[dpdk.git] / drivers / net / ena / base / ena_defs / ena_admin_defs.h
index 04d4e9a..6d266c4 100644 (file)
-/*-
-* BSD LICENSE
-*
-* Copyright (c) 2015-2016 Amazon.com, Inc. or its affiliates.
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-*
-* * Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-* * Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in
-* the documentation and/or other materials provided with the
-* distribution.
-* * Neither the name of copyright holder nor the names of its
-* contributors may be used to endorse or promote products derived
-* from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2015-2020 Amazon.com, Inc. or its affiliates.
+ * All rights reserved.
+ */
 
 #ifndef _ENA_ADMIN_H_
 #define _ENA_ADMIN_H_
 
-enum ena_admin_aq_opcode {
-       ENA_ADMIN_CREATE_SQ     = 1,
-
-       ENA_ADMIN_DESTROY_SQ    = 2,
-
-       ENA_ADMIN_CREATE_CQ     = 3,
-
-       ENA_ADMIN_DESTROY_CQ    = 4,
-
-       ENA_ADMIN_GET_FEATURE   = 8,
-
-       ENA_ADMIN_SET_FEATURE   = 9,
+#define ENA_ADMIN_EXTRA_PROPERTIES_STRING_LEN 32
+#define ENA_ADMIN_EXTRA_PROPERTIES_COUNT     32
 
-       ENA_ADMIN_GET_STATS     = 11,
+enum ena_admin_aq_opcode {
+       ENA_ADMIN_CREATE_SQ                         = 1,
+       ENA_ADMIN_DESTROY_SQ                        = 2,
+       ENA_ADMIN_CREATE_CQ                         = 3,
+       ENA_ADMIN_DESTROY_CQ                        = 4,
+       ENA_ADMIN_GET_FEATURE                       = 8,
+       ENA_ADMIN_SET_FEATURE                       = 9,
+       ENA_ADMIN_GET_STATS                         = 11,
 };
 
 enum ena_admin_aq_completion_status {
-       ENA_ADMIN_SUCCESS                       = 0,
-
-       ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE   = 1,
-
-       ENA_ADMIN_BAD_OPCODE                    = 2,
-
-       ENA_ADMIN_UNSUPPORTED_OPCODE            = 3,
-
-       ENA_ADMIN_MALFORMED_REQUEST             = 4,
-
+       ENA_ADMIN_SUCCESS                           = 0,
+       ENA_ADMIN_RESOURCE_ALLOCATION_FAILURE       = 1,
+       ENA_ADMIN_BAD_OPCODE                        = 2,
+       ENA_ADMIN_UNSUPPORTED_OPCODE                = 3,
+       ENA_ADMIN_MALFORMED_REQUEST                 = 4,
        /* Additional status is provided in ACQ entry extended_status */
-       ENA_ADMIN_ILLEGAL_PARAMETER             = 5,
-
-       ENA_ADMIN_UNKNOWN_ERROR                 = 6,
+       ENA_ADMIN_ILLEGAL_PARAMETER                 = 5,
+       ENA_ADMIN_UNKNOWN_ERROR                     = 6,
+       ENA_ADMIN_RESOURCE_BUSY                     = 7,
 };
 
 enum ena_admin_aq_feature_id {
-       ENA_ADMIN_DEVICE_ATTRIBUTES             = 1,
-
-       ENA_ADMIN_MAX_QUEUES_NUM                = 2,
-
-       ENA_ADMIN_HW_HINTS                      = 3,
-
-       ENA_ADMIN_RSS_HASH_FUNCTION             = 10,
-
-       ENA_ADMIN_STATELESS_OFFLOAD_CONFIG      = 11,
-
-       ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG  = 12,
-
-       ENA_ADMIN_MTU                           = 14,
-
-       ENA_ADMIN_RSS_HASH_INPUT                = 18,
-
-       ENA_ADMIN_INTERRUPT_MODERATION          = 20,
-
-       ENA_ADMIN_AENQ_CONFIG                   = 26,
-
-       ENA_ADMIN_LINK_CONFIG                   = 27,
-
-       ENA_ADMIN_HOST_ATTR_CONFIG              = 28,
-
-       ENA_ADMIN_FEATURES_OPCODE_NUM           = 32,
+       ENA_ADMIN_DEVICE_ATTRIBUTES                 = 1,
+       ENA_ADMIN_MAX_QUEUES_NUM                    = 2,
+       ENA_ADMIN_HW_HINTS                          = 3,
+       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,
+       ENA_ADMIN_MTU                               = 14,
+       ENA_ADMIN_RSS_HASH_INPUT                    = 18,
+       ENA_ADMIN_INTERRUPT_MODERATION              = 20,
+       ENA_ADMIN_AENQ_CONFIG                       = 26,
+       ENA_ADMIN_LINK_CONFIG                       = 27,
+       ENA_ADMIN_HOST_ATTR_CONFIG                  = 28,
+       ENA_ADMIN_FEATURES_OPCODE_NUM               = 32,
 };
 
 enum ena_admin_placement_policy_type {
        /* descriptors and headers are in host memory */
-       ENA_ADMIN_PLACEMENT_POLICY_HOST = 1,
-
+       ENA_ADMIN_PLACEMENT_POLICY_HOST             = 1,
        /* descriptors and headers are in device memory (a.k.a Low Latency
         * Queue)
         */
-       ENA_ADMIN_PLACEMENT_POLICY_DEV  = 3,
+       ENA_ADMIN_PLACEMENT_POLICY_DEV              = 3,
 };
 
 enum ena_admin_link_types {
-       ENA_ADMIN_LINK_SPEED_1G         = 0x1,
-
-       ENA_ADMIN_LINK_SPEED_2_HALF_G   = 0x2,
-
-       ENA_ADMIN_LINK_SPEED_5G         = 0x4,
-
-       ENA_ADMIN_LINK_SPEED_10G        = 0x8,
-
-       ENA_ADMIN_LINK_SPEED_25G        = 0x10,
-
-       ENA_ADMIN_LINK_SPEED_40G        = 0x20,
-
-       ENA_ADMIN_LINK_SPEED_50G        = 0x40,
-
-       ENA_ADMIN_LINK_SPEED_100G       = 0x80,
-
-       ENA_ADMIN_LINK_SPEED_200G       = 0x100,
-
-       ENA_ADMIN_LINK_SPEED_400G       = 0x200,
+       ENA_ADMIN_LINK_SPEED_1G                     = 0x1,
+       ENA_ADMIN_LINK_SPEED_2_HALF_G               = 0x2,
+       ENA_ADMIN_LINK_SPEED_5G                     = 0x4,
+       ENA_ADMIN_LINK_SPEED_10G                    = 0x8,
+       ENA_ADMIN_LINK_SPEED_25G                    = 0x10,
+       ENA_ADMIN_LINK_SPEED_40G                    = 0x20,
+       ENA_ADMIN_LINK_SPEED_50G                    = 0x40,
+       ENA_ADMIN_LINK_SPEED_100G                   = 0x80,
+       ENA_ADMIN_LINK_SPEED_200G                   = 0x100,
+       ENA_ADMIN_LINK_SPEED_400G                   = 0x200,
 };
 
 enum ena_admin_completion_policy_type {
        /* completion queue entry for each sq descriptor */
-       ENA_ADMIN_COMPLETION_POLICY_DESC                = 0,
-
+       ENA_ADMIN_COMPLETION_POLICY_DESC            = 0,
        /* completion queue entry upon request in sq descriptor */
-       ENA_ADMIN_COMPLETION_POLICY_DESC_ON_DEMAND      = 1,
-
+       ENA_ADMIN_COMPLETION_POLICY_DESC_ON_DEMAND  = 1,
        /* current queue head pointer is updated in OS memory upon sq
         * descriptor request
         */
-       ENA_ADMIN_COMPLETION_POLICY_HEAD_ON_DEMAND      = 2,
-
+       ENA_ADMIN_COMPLETION_POLICY_HEAD_ON_DEMAND  = 2,
        /* current queue head pointer is updated in OS memory for each sq
         * descriptor
         */
-       ENA_ADMIN_COMPLETION_POLICY_HEAD                = 3,
+       ENA_ADMIN_COMPLETION_POLICY_HEAD            = 3,
 };
 
 /* basic stats return ena_admin_basic_stats while extanded stats return a
@@ -150,15 +93,13 @@ enum ena_admin_completion_policy_type {
  * device id
  */
 enum ena_admin_get_stats_type {
-       ENA_ADMIN_GET_STATS_TYPE_BASIC          = 0,
-
-       ENA_ADMIN_GET_STATS_TYPE_EXTENDED       = 1,
+       ENA_ADMIN_GET_STATS_TYPE_BASIC              = 0,
+       ENA_ADMIN_GET_STATS_TYPE_EXTENDED           = 1,
 };
 
 enum ena_admin_get_stats_scope {
-       ENA_ADMIN_SPECIFIC_QUEUE        = 0,
-
-       ENA_ADMIN_ETH_TRAFFIC           = 1,
+       ENA_ADMIN_SPECIFIC_QUEUE                    = 0,
+       ENA_ADMIN_ETH_TRAFFIC                       = 1,
 };
 
 struct ena_admin_aq_common_desc {
@@ -229,7 +170,9 @@ struct ena_admin_acq_common_desc {
 
        uint16_t extended_status;
 
-       /* serves as a hint what AQ entries can be revoked */
+       /* indicates to the driver which AQ entry has been consumed by the
+        *    device and could be reused
+        */
        uint16_t sq_head_indx;
 };
 
@@ -298,9 +241,8 @@ struct ena_admin_aq_create_sq_cmd {
 };
 
 enum ena_admin_sq_direction {
-       ENA_ADMIN_SQ_DIRECTION_TX       = 1,
-
-       ENA_ADMIN_SQ_DIRECTION_RX       = 2,
+       ENA_ADMIN_SQ_DIRECTION_TX                   = 1,
+       ENA_ADMIN_SQ_DIRECTION_RX                   = 2,
 };
 
 struct ena_admin_acq_create_sq_resp_desc {
@@ -440,6 +382,10 @@ struct ena_admin_basic_stats {
        uint32_t rx_drops_low;
 
        uint32_t rx_drops_high;
+
+       uint32_t tx_drops_low;
+
+       uint32_t tx_drops_high;
 };
 
 struct ena_admin_acq_get_stats_resp {
@@ -458,7 +404,13 @@ struct ena_admin_get_set_feature_common_desc {
        /* as appears in ena_admin_aq_feature_id */
        uint8_t feature_id;
 
-       uint16_t 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
+        */
+       uint8_t feature_version;
+
+       uint8_t reserved8;
 };
 
 struct ena_admin_device_attr_feature_desc {
@@ -485,8 +437,151 @@ struct ena_admin_device_attr_feature_desc {
        uint32_t max_mtu;
 };
 
+enum ena_admin_llq_header_location {
+       /* header is in descriptor list */
+       ENA_ADMIN_INLINE_HEADER                     = 1,
+       /* header in a separate ring, implies 16B descriptor list entry */
+       ENA_ADMIN_HEADER_RING                       = 2,
+};
+
+enum ena_admin_llq_ring_entry_size {
+       ENA_ADMIN_LIST_ENTRY_SIZE_128B              = 1,
+       ENA_ADMIN_LIST_ENTRY_SIZE_192B              = 2,
+       ENA_ADMIN_LIST_ENTRY_SIZE_256B              = 4,
+};
+
+enum ena_admin_llq_num_descs_before_header {
+       ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_0     = 0,
+       ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_1     = 1,
+       ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_2     = 2,
+       ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_4     = 4,
+       ENA_ADMIN_LLQ_NUM_DESCS_BEFORE_HEADER_8     = 8,
+};
+
+/* packet descriptor list entry always starts with one or more descriptors,
+ * followed by a header. The rest of the descriptors are located in the
+ * beginning of the subsequent entry. Stride refers to how the rest of the
+ * descriptors are placed. This field is relevant only for inline header
+ * mode
+ */
+enum ena_admin_llq_stride_ctrl {
+       ENA_ADMIN_SINGLE_DESC_PER_ENTRY             = 1,
+       ENA_ADMIN_MULTIPLE_DESCS_PER_ENTRY          = 2,
+};
+
+enum ena_admin_accel_mode_feat {
+       ENA_ADMIN_DISABLE_META_CACHING              = 0,
+       ENA_ADMIN_LIMIT_TX_BURST                    = 1,
+};
+
+struct ena_admin_accel_mode_get {
+       /* bit field of enum ena_admin_accel_mode_feat */
+       uint16_t supported_flags;
+
+       /* maximum burst size between two doorbells. The size is in bytes */
+       uint16_t max_tx_burst_size;
+};
+
+struct ena_admin_accel_mode_set {
+       /* bit field of enum ena_admin_accel_mode_feat */
+       uint16_t enabled_flags;
+
+       uint16_t reserved;
+};
+
+struct ena_admin_accel_mode_req {
+       union {
+               uint32_t raw[2];
+
+               struct ena_admin_accel_mode_get get;
+
+               struct ena_admin_accel_mode_set set;
+       } u;
+};
+
+struct ena_admin_feature_llq_desc {
+       uint32_t max_llq_num;
+
+       uint32_t max_llq_depth;
+
+       /*  specify the header locations the device supports. bitfield of
+        *    enum ena_admin_llq_header_location.
+        */
+       uint16_t header_location_ctrl_supported;
+
+       /* the header location the driver selected to use. */
+       uint16_t header_location_ctrl_enabled;
+
+       /* if inline header is specified - this is the size of descriptor
+        *    list entry. If header in a separate ring is specified - this is
+        *    the size of header ring entry. bitfield of enum
+        *    ena_admin_llq_ring_entry_size. specify the entry sizes the device
+        *    supports
+        */
+       uint16_t entry_size_ctrl_supported;
+
+       /* the entry size the driver selected to use. */
+       uint16_t entry_size_ctrl_enabled;
+
+       /* valid only if inline header is specified. First entry associated
+        *    with the packet includes descriptors and header. Rest of the
+        *    entries occupied by descriptors. This parameter defines the max
+        *    number of descriptors precedding the header in the first entry.
+        *    The field is bitfield of enum
+        *    ena_admin_llq_num_descs_before_header and specify the values the
+        *    device supports
+        */
+       uint16_t desc_num_before_header_supported;
+
+       /* the desire field the driver selected to use */
+       uint16_t desc_num_before_header_enabled;
+
+       /* valid only if inline was chosen. bitfield of enum
+        *    ena_admin_llq_stride_ctrl
+        */
+       uint16_t descriptors_stride_ctrl_supported;
+
+       /* the stride control the driver selected to use */
+       uint16_t descriptors_stride_ctrl_enabled;
+
+       /* reserved */
+       uint32_t reserved1;
+
+       /* accelerated low latency queues requirement. Driver needs to
+        * support those requirements in order to use accelerated LLQ
+        */
+       struct ena_admin_accel_mode_req accel_mode;
+};
+
+struct ena_admin_queue_ext_feature_fields {
+       uint32_t max_tx_sq_num;
+
+       uint32_t max_tx_cq_num;
+
+       uint32_t max_rx_sq_num;
+
+       uint32_t max_rx_cq_num;
+
+       uint32_t max_tx_sq_depth;
+
+       uint32_t max_tx_cq_depth;
+
+       uint32_t max_rx_sq_depth;
+
+       uint32_t max_rx_cq_depth;
+
+       uint32_t max_tx_header_size;
+
+       /* Maximum Descriptors number, including meta descriptor, allowed for
+        *    a single Tx packet
+        */
+       uint16_t max_per_packet_tx_descs;
+
+       /* Maximum Descriptors number allowed for a single Rx packet */
+       uint16_t max_per_packet_rx_descs;
+};
+
 struct ena_admin_queue_feature_desc {
-       /* including LLQs */
        uint32_t max_sq_num;
 
        uint32_t max_sq_depth;
@@ -495,9 +590,9 @@ struct ena_admin_queue_feature_desc {
 
        uint32_t max_cq_depth;
 
-       uint32_t max_llq_num;
+       uint32_t max_legacy_llq_num;
 
-       uint32_t max_llq_depth;
+       uint32_t max_legacy_llq_depth;
 
        uint32_t max_header_size;
 
@@ -515,6 +610,14 @@ struct ena_admin_set_feature_mtu_desc {
        uint32_t mtu;
 };
 
+struct ena_admin_get_extra_properties_strings_desc {
+       uint32_t count;
+};
+
+struct ena_admin_get_extra_properties_flags_desc {
+       uint32_t flags;
+};
+
 struct ena_admin_set_feature_host_attr_desc {
        /* host OS info base address in OS memory. host info is 4KB of
         * physically contiguous
@@ -585,9 +688,8 @@ struct ena_admin_feature_offload_desc {
 };
 
 enum ena_admin_hash_functions {
-       ENA_ADMIN_TOEPLITZ      = 1,
-
-       ENA_ADMIN_CRC32         = 2,
+       ENA_ADMIN_TOEPLITZ                          = 1,
+       ENA_ADMIN_CRC32                             = 2,
 };
 
 struct ena_admin_feature_rss_flow_hash_control {
@@ -613,50 +715,35 @@ struct ena_admin_feature_rss_flow_hash_function {
 
 /* RSS flow hash protocols */
 enum ena_admin_flow_hash_proto {
-       ENA_ADMIN_RSS_TCP4      = 0,
-
-       ENA_ADMIN_RSS_UDP4      = 1,
-
-       ENA_ADMIN_RSS_TCP6      = 2,
-
-       ENA_ADMIN_RSS_UDP6      = 3,
-
-       ENA_ADMIN_RSS_IP4       = 4,
-
-       ENA_ADMIN_RSS_IP6       = 5,
-
-       ENA_ADMIN_RSS_IP4_FRAG  = 6,
-
-       ENA_ADMIN_RSS_NOT_IP    = 7,
-
+       ENA_ADMIN_RSS_TCP4                          = 0,
+       ENA_ADMIN_RSS_UDP4                          = 1,
+       ENA_ADMIN_RSS_TCP6                          = 2,
+       ENA_ADMIN_RSS_UDP6                          = 3,
+       ENA_ADMIN_RSS_IP4                           = 4,
+       ENA_ADMIN_RSS_IP6                           = 5,
+       ENA_ADMIN_RSS_IP4_FRAG                      = 6,
+       ENA_ADMIN_RSS_NOT_IP                        = 7,
        /* TCPv6 with extension header */
-       ENA_ADMIN_RSS_TCP6_EX   = 8,
-
+       ENA_ADMIN_RSS_TCP6_EX                       = 8,
        /* IPv6 with extension header */
-       ENA_ADMIN_RSS_IP6_EX    = 9,
-
-       ENA_ADMIN_RSS_PROTO_NUM = 16,
+       ENA_ADMIN_RSS_IP6_EX                        = 9,
+       ENA_ADMIN_RSS_PROTO_NUM                     = 16,
 };
 
 /* RSS flow hash fields */
 enum ena_admin_flow_hash_fields {
        /* Ethernet Dest Addr */
-       ENA_ADMIN_RSS_L2_DA     = BIT(0),
-
+       ENA_ADMIN_RSS_L2_DA                         = BIT(0),
        /* Ethernet Src Addr */
-       ENA_ADMIN_RSS_L2_SA     = BIT(1),
-
+       ENA_ADMIN_RSS_L2_SA                         = BIT(1),
        /* ipv4/6 Dest Addr */
-       ENA_ADMIN_RSS_L3_DA     = BIT(2),
-
+       ENA_ADMIN_RSS_L3_DA                         = BIT(2),
        /* ipv4/6 Src Addr */
-       ENA_ADMIN_RSS_L3_SA     = BIT(3),
-
+       ENA_ADMIN_RSS_L3_SA                         = BIT(3),
        /* tcp/udp Dest Port */
-       ENA_ADMIN_RSS_L4_DP     = BIT(4),
-
+       ENA_ADMIN_RSS_L4_DP                         = BIT(4),
        /* tcp/udp Src Port */
-       ENA_ADMIN_RSS_L4_SP     = BIT(5),
+       ENA_ADMIN_RSS_L4_SP                         = BIT(5),
 };
 
 struct ena_admin_proto_input {
@@ -695,15 +782,13 @@ struct ena_admin_feature_rss_flow_hash_input {
 };
 
 enum ena_admin_os_type {
-       ENA_ADMIN_OS_LINUX      = 1,
-
-       ENA_ADMIN_OS_WIN        = 2,
-
-       ENA_ADMIN_OS_DPDK       = 3,
-
-       ENA_ADMIN_OS_FREEBSD    = 4,
-
-       ENA_ADMIN_OS_IPXE       = 5,
+       ENA_ADMIN_OS_LINUX                          = 1,
+       ENA_ADMIN_OS_WIN                            = 2,
+       ENA_ADMIN_OS_DPDK                           = 3,
+       ENA_ADMIN_OS_FREEBSD                        = 4,
+       ENA_ADMIN_OS_IPXE                           = 5,
+       ENA_ADMIN_OS_ESXI                           = 6,
+       ENA_ADMIN_OS_GROUPS_NUM                     = 6,
 };
 
 struct ena_admin_host_info {
@@ -725,11 +810,35 @@ struct ena_admin_host_info {
        /* 7:0 : major
         * 15:8 : minor
         * 23:16 : sub_minor
+        * 31:24 : module_type
         */
        uint32_t driver_version;
 
        /* features bitmap */
-       uint32_t supported_network_features[4];
+       uint32_t supported_network_features[2];
+
+       /* ENA spec version of driver */
+       uint16_t ena_spec_version;
+
+       /* ENA device's Bus, Device and Function
+        * 2:0 : function
+        * 7:3 : device
+        * 15:8 : bus
+        */
+       uint16_t bdf;
+
+       /* Number of CPUs */
+       uint16_t num_cpus;
+
+       uint16_t reserved;
+
+       /* 0 : mutable_rss_table_size
+        * 1 : rx_offset
+        * 2 : interrupt_moderation
+        * 3 : map_rx_buf_bidirectional
+        * 31:4 : reserved
+        */
+       uint32_t driver_supported_features;
 };
 
 struct ena_admin_rss_ind_table_entry {
@@ -748,7 +857,12 @@ struct ena_admin_feature_rss_ind_table {
        /* table size (2^size) */
        uint16_t size;
 
-       uint16_t reserved;
+       /* 0 : one_entry_update - The ENA device supports
+        *    setting a single RSS table entry
+        */
+       uint8_t flags;
+
+       uint8_t reserved;
 
        /* index of the inline entry. 0xFFFFFFFF means invalid */
        uint32_t inline_index;
@@ -794,6 +908,19 @@ struct ena_admin_get_feat_cmd {
        uint32_t raw[11];
 };
 
+struct ena_admin_queue_ext_feature_desc {
+       /* version */
+       uint8_t version;
+
+       uint8_t reserved1[3];
+
+       union {
+               struct ena_admin_queue_ext_feature_fields max_queue_ext;
+
+               uint32_t raw[10];
+       } ;
+};
+
 struct ena_admin_get_feat_resp {
        struct ena_admin_acq_common_desc acq_common_desc;
 
@@ -802,8 +929,12 @@ struct ena_admin_get_feat_resp {
 
                struct ena_admin_device_attr_feature_desc dev_attr;
 
+               struct ena_admin_feature_llq_desc llq;
+
                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;
@@ -819,6 +950,10 @@ struct ena_admin_get_feat_resp {
                struct ena_admin_feature_intr_moder_desc intr_moderation;
 
                struct ena_admin_ena_hw_hints hw_hints;
+
+               struct ena_admin_get_extra_properties_strings_desc extra_properties_strings;
+
+               struct ena_admin_get_extra_properties_flags_desc extra_properties_flags;
        } u;
 };
 
@@ -849,6 +984,9 @@ struct ena_admin_set_feat_cmd {
 
                /* rss indirection table */
                struct ena_admin_feature_rss_ind_table ind_table;
+
+               /* LLQ configuration */
+               struct ena_admin_feature_llq_desc llq;
        } u;
 };
 
@@ -865,7 +1003,9 @@ struct ena_admin_aenq_common_desc {
 
        uint16_t syndrom;
 
-       /* 0 : phase */
+       /* 0 : phase
+        * 7:1 : reserved - MBZ
+        */
        uint8_t flags;
 
        uint8_t reserved1[3];
@@ -877,25 +1017,18 @@ struct ena_admin_aenq_common_desc {
 
 /* asynchronous event notification groups */
 enum ena_admin_aenq_group {
-       ENA_ADMIN_LINK_CHANGE           = 0,
-
-       ENA_ADMIN_FATAL_ERROR           = 1,
-
-       ENA_ADMIN_WARNING               = 2,
-
-       ENA_ADMIN_NOTIFICATION          = 3,
-
-       ENA_ADMIN_KEEP_ALIVE            = 4,
-
-       ENA_ADMIN_AENQ_GROUPS_NUM       = 5,
+       ENA_ADMIN_LINK_CHANGE                       = 0,
+       ENA_ADMIN_FATAL_ERROR                       = 1,
+       ENA_ADMIN_WARNING                           = 2,
+       ENA_ADMIN_NOTIFICATION                      = 3,
+       ENA_ADMIN_KEEP_ALIVE                        = 4,
+       ENA_ADMIN_AENQ_GROUPS_NUM                   = 5,
 };
 
 enum ena_admin_aenq_notification_syndrom {
-       ENA_ADMIN_SUSPEND       = 0,
-
-       ENA_ADMIN_RESUME        = 1,
-
-       ENA_ADMIN_UPDATE_HINTS  = 2,
+       ENA_ADMIN_SUSPEND                           = 0,
+       ENA_ADMIN_RESUME                            = 1,
+       ENA_ADMIN_UPDATE_HINTS                      = 2,
 };
 
 struct ena_admin_aenq_entry {
@@ -918,6 +1051,10 @@ struct ena_admin_aenq_keep_alive_desc {
        uint32_t rx_drops_low;
 
        uint32_t rx_drops_high;
+
+       uint32_t tx_drops_low;
+
+       uint32_t tx_drops_high;
 };
 
 struct ena_admin_ena_mmio_req_read_less_resp {
@@ -930,27 +1067,27 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 };
 
 /* aq_common_desc */
-#define ENA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK GENMASK(11, 0)
-#define ENA_ADMIN_AQ_COMMON_DESC_PHASE_MASK BIT(0)
-#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_SHIFT 1
-#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK BIT(1)
-#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_SHIFT 2
-#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK BIT(2)
+#define ENA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK            GENMASK(11, 0)
+#define ENA_ADMIN_AQ_COMMON_DESC_PHASE_MASK                 BIT(0)
+#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_SHIFT            1
+#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_MASK             BIT(1)
+#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_SHIFT   2
+#define ENA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT_MASK    BIT(2)
 
 /* sq */
-#define ENA_ADMIN_SQ_SQ_DIRECTION_SHIFT 5
-#define ENA_ADMIN_SQ_SQ_DIRECTION_MASK GENMASK(7, 5)
+#define ENA_ADMIN_SQ_SQ_DIRECTION_SHIFT                     5
+#define ENA_ADMIN_SQ_SQ_DIRECTION_MASK                      GENMASK(7, 5)
 
 /* acq_common_desc */
-#define ENA_ADMIN_ACQ_COMMON_DESC_COMMAND_ID_MASK GENMASK(11, 0)
-#define ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK BIT(0)
+#define ENA_ADMIN_ACQ_COMMON_DESC_COMMAND_ID_MASK           GENMASK(11, 0)
+#define ENA_ADMIN_ACQ_COMMON_DESC_PHASE_MASK                BIT(0)
 
 /* aq_create_sq_cmd */
-#define ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_SHIFT 5
-#define ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_MASK GENMASK(7, 5)
-#define ENA_ADMIN_AQ_CREATE_SQ_CMD_PLACEMENT_POLICY_MASK GENMASK(3, 0)
-#define ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_SHIFT 4
-#define ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_MASK GENMASK(6, 4)
+#define ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_SHIFT       5
+#define ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_MASK        GENMASK(7, 5)
+#define ENA_ADMIN_AQ_CREATE_SQ_CMD_PLACEMENT_POLICY_MASK    GENMASK(3, 0)
+#define ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_SHIFT  4
+#define ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_MASK   GENMASK(6, 4)
 #define ENA_ADMIN_AQ_CREATE_SQ_CMD_IS_PHYSICALLY_CONTIGUOUS_MASK BIT(0)
 
 /* aq_create_cq_cmd */
@@ -959,12 +1096,12 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 #define ENA_ADMIN_AQ_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS_MASK GENMASK(4, 0)
 
 /* get_set_feature_common_desc */
-#define ENA_ADMIN_GET_SET_FEATURE_COMMON_DESC_SELECT_MASK GENMASK(1, 0)
+#define ENA_ADMIN_GET_SET_FEATURE_COMMON_DESC_SELECT_MASK   GENMASK(1, 0)
 
 /* get_feature_link_desc */
-#define ENA_ADMIN_GET_FEATURE_LINK_DESC_AUTONEG_MASK BIT(0)
-#define ENA_ADMIN_GET_FEATURE_LINK_DESC_DUPLEX_SHIFT 1
-#define ENA_ADMIN_GET_FEATURE_LINK_DESC_DUPLEX_MASK BIT(1)
+#define ENA_ADMIN_GET_FEATURE_LINK_DESC_AUTONEG_MASK        BIT(0)
+#define ENA_ADMIN_GET_FEATURE_LINK_DESC_DUPLEX_SHIFT        1
+#define ENA_ADMIN_GET_FEATURE_LINK_DESC_DUPLEX_MASK         BIT(1)
 
 /* feature_offload_desc */
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L3_CSUM_IPV4_MASK BIT(0)
@@ -976,19 +1113,19 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV6_CSUM_PART_MASK BIT(3)
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV6_CSUM_FULL_SHIFT 4
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV6_CSUM_FULL_MASK BIT(4)
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV4_SHIFT 5
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV4_MASK BIT(5)
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV6_SHIFT 6
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV6_MASK BIT(6)
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_ECN_SHIFT 7
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_ECN_MASK BIT(7)
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV4_SHIFT       5
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV4_MASK        BIT(5)
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV6_SHIFT       6
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV6_MASK        BIT(6)
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_ECN_SHIFT        7
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_ECN_MASK         BIT(7)
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L3_CSUM_IPV4_MASK BIT(0)
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV4_CSUM_SHIFT 1
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV4_CSUM_MASK BIT(1)
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV6_CSUM_SHIFT 2
 #define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV6_CSUM_MASK BIT(2)
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_HASH_SHIFT 3
-#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_HASH_MASK BIT(3)
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_HASH_SHIFT        3
+#define ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_HASH_MASK         BIT(3)
 
 /* feature_rss_flow_hash_function */
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_FUNCTION_FUNCS_MASK GENMASK(7, 0)
@@ -996,28 +1133,45 @@ struct ena_admin_ena_mmio_req_read_less_resp {
 
 /* feature_rss_flow_hash_input */
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L3_SORT_SHIFT 1
-#define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L3_SORT_MASK BIT(1)
+#define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L3_SORT_MASK  BIT(1)
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L4_SORT_SHIFT 2
-#define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L4_SORT_MASK BIT(2)
+#define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_L4_SORT_MASK  BIT(2)
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_ENABLE_L3_SORT_SHIFT 1
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_ENABLE_L3_SORT_MASK BIT(1)
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_ENABLE_L4_SORT_SHIFT 2
 #define ENA_ADMIN_FEATURE_RSS_FLOW_HASH_INPUT_ENABLE_L4_SORT_MASK BIT(2)
 
 /* host_info */
-#define ENA_ADMIN_HOST_INFO_MAJOR_MASK GENMASK(7, 0)
-#define ENA_ADMIN_HOST_INFO_MINOR_SHIFT 8
-#define ENA_ADMIN_HOST_INFO_MINOR_MASK GENMASK(15, 8)
-#define ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT 16
-#define ENA_ADMIN_HOST_INFO_SUB_MINOR_MASK GENMASK(23, 16)
+#define ENA_ADMIN_HOST_INFO_MAJOR_MASK                      GENMASK(7, 0)
+#define ENA_ADMIN_HOST_INFO_MINOR_SHIFT                     8
+#define ENA_ADMIN_HOST_INFO_MINOR_MASK                      GENMASK(15, 8)
+#define ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT                 16
+#define ENA_ADMIN_HOST_INFO_SUB_MINOR_MASK                  GENMASK(23, 16)
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_SHIFT               24
+#define ENA_ADMIN_HOST_INFO_MODULE_TYPE_MASK                GENMASK(31, 24)
+#define ENA_ADMIN_HOST_INFO_FUNCTION_MASK                   GENMASK(2, 0)
+#define ENA_ADMIN_HOST_INFO_DEVICE_SHIFT                    3
+#define ENA_ADMIN_HOST_INFO_DEVICE_MASK                     GENMASK(7, 3)
+#define ENA_ADMIN_HOST_INFO_BUS_SHIFT                       8
+#define ENA_ADMIN_HOST_INFO_BUS_MASK                        GENMASK(15, 8)
+#define ENA_ADMIN_HOST_INFO_MUTABLE_RSS_TABLE_SIZE_MASK     BIT(0)
+#define ENA_ADMIN_HOST_INFO_RX_OFFSET_SHIFT                 1
+#define ENA_ADMIN_HOST_INFO_RX_OFFSET_MASK                  BIT(1)
+#define ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_SHIFT      2
+#define ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK       BIT(2)
+#define ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_SHIFT  3
+#define ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_MASK   BIT(3)
+
+/* feature_rss_ind_table */
+#define ENA_ADMIN_FEATURE_RSS_IND_TABLE_ONE_ENTRY_UPDATE_MASK BIT(0)
 
 /* aenq_common_desc */
-#define ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK BIT(0)
+#define ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK               BIT(0)
 
 /* aenq_link_change_desc */
-#define ENA_ADMIN_AENQ_LINK_CHANGE_DESC_LINK_STATUS_MASK BIT(0)
+#define ENA_ADMIN_AENQ_LINK_CHANGE_DESC_LINK_STATUS_MASK    BIT(0)
 
-#if !defined(ENA_DEFS_LINUX_MAINLINE)
+#if !defined(DEFS_LINUX_MAINLINE)
 static inline uint16_t get_ena_admin_aq_common_desc_command_id(const struct ena_admin_aq_common_desc *p)
 {
        return p->command_id & ENA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK;
@@ -1388,6 +1542,96 @@ static inline void set_ena_admin_host_info_sub_minor(struct ena_admin_host_info
        p->driver_version |= (val << ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT) & ENA_ADMIN_HOST_INFO_SUB_MINOR_MASK;
 }
 
+static inline uint32_t get_ena_admin_host_info_module_type(const struct ena_admin_host_info *p)
+{
+       return (p->driver_version & ENA_ADMIN_HOST_INFO_MODULE_TYPE_MASK) >> ENA_ADMIN_HOST_INFO_MODULE_TYPE_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_module_type(struct ena_admin_host_info *p, uint32_t val)
+{
+       p->driver_version |= (val << ENA_ADMIN_HOST_INFO_MODULE_TYPE_SHIFT) & ENA_ADMIN_HOST_INFO_MODULE_TYPE_MASK;
+}
+
+static inline uint16_t get_ena_admin_host_info_function(const struct ena_admin_host_info *p)
+{
+       return p->bdf & ENA_ADMIN_HOST_INFO_FUNCTION_MASK;
+}
+
+static inline void set_ena_admin_host_info_function(struct ena_admin_host_info *p, uint16_t val)
+{
+       p->bdf |= val & ENA_ADMIN_HOST_INFO_FUNCTION_MASK;
+}
+
+static inline uint16_t get_ena_admin_host_info_device(const struct ena_admin_host_info *p)
+{
+       return (p->bdf & ENA_ADMIN_HOST_INFO_DEVICE_MASK) >> ENA_ADMIN_HOST_INFO_DEVICE_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_device(struct ena_admin_host_info *p, uint16_t val)
+{
+       p->bdf |= (val << ENA_ADMIN_HOST_INFO_DEVICE_SHIFT) & ENA_ADMIN_HOST_INFO_DEVICE_MASK;
+}
+
+static inline uint16_t get_ena_admin_host_info_bus(const struct ena_admin_host_info *p)
+{
+       return (p->bdf & ENA_ADMIN_HOST_INFO_BUS_MASK) >> ENA_ADMIN_HOST_INFO_BUS_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_bus(struct ena_admin_host_info *p, uint16_t val)
+{
+       p->bdf |= (val << ENA_ADMIN_HOST_INFO_BUS_SHIFT) & ENA_ADMIN_HOST_INFO_BUS_MASK;
+}
+
+static inline uint32_t get_ena_admin_host_info_mutable_rss_table_size(const struct ena_admin_host_info *p)
+{
+       return p->driver_supported_features & ENA_ADMIN_HOST_INFO_MUTABLE_RSS_TABLE_SIZE_MASK;
+}
+
+static inline void set_ena_admin_host_info_mutable_rss_table_size(struct ena_admin_host_info *p, uint32_t val)
+{
+       p->driver_supported_features |= val & ENA_ADMIN_HOST_INFO_MUTABLE_RSS_TABLE_SIZE_MASK;
+}
+
+static inline uint32_t get_ena_admin_host_info_rx_offset(const struct ena_admin_host_info *p)
+{
+       return (p->driver_supported_features & ENA_ADMIN_HOST_INFO_RX_OFFSET_MASK) >> ENA_ADMIN_HOST_INFO_RX_OFFSET_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_rx_offset(struct ena_admin_host_info *p, uint32_t val)
+{
+       p->driver_supported_features |= (val << ENA_ADMIN_HOST_INFO_RX_OFFSET_SHIFT) & ENA_ADMIN_HOST_INFO_RX_OFFSET_MASK;
+}
+
+static inline uint32_t get_ena_admin_host_info_interrupt_moderation(const struct ena_admin_host_info *p)
+{
+       return (p->driver_supported_features & ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK) >> ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_interrupt_moderation(struct ena_admin_host_info *p, uint32_t val)
+{
+       p->driver_supported_features |= (val << ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_SHIFT) & ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK;
+}
+
+static inline uint32_t get_ena_admin_host_info_map_rx_buf_bidirectional(const struct ena_admin_host_info *p)
+{
+       return (p->driver_supported_features & ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_MASK) >> ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_SHIFT;
+}
+
+static inline void set_ena_admin_host_info_map_rx_buf_bidirectional(struct ena_admin_host_info *p, uint32_t val)
+{
+       p->driver_supported_features |= (val << ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_SHIFT) & ENA_ADMIN_HOST_INFO_MAP_RX_BUF_BIDIRECTIONAL_MASK;
+}
+
+static inline uint8_t get_ena_admin_feature_rss_ind_table_one_entry_update(const struct ena_admin_feature_rss_ind_table *p)
+{
+       return p->flags & ENA_ADMIN_FEATURE_RSS_IND_TABLE_ONE_ENTRY_UPDATE_MASK;
+}
+
+static inline void set_ena_admin_feature_rss_ind_table_one_entry_update(struct ena_admin_feature_rss_ind_table *p, uint8_t val)
+{
+       p->flags |= val & ENA_ADMIN_FEATURE_RSS_IND_TABLE_ONE_ENTRY_UPDATE_MASK;
+}
+
 static inline uint8_t get_ena_admin_aenq_common_desc_phase(const struct ena_admin_aenq_common_desc *p)
 {
        return p->flags & ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK;
@@ -1408,5 +1652,5 @@ static inline void set_ena_admin_aenq_link_change_desc_link_status(struct ena_ad
        p->flags |= val & ENA_ADMIN_AENQ_LINK_CHANGE_DESC_LINK_STATUS_MASK;
 }
 
-#endif /* !defined(ENA_DEFS_LINUX_MAINLINE) */
-#endif /*_ENA_ADMIN_H_ */
+#endif /* !defined(DEFS_LINUX_MAINLINE) */
+#endif /* _ENA_ADMIN_H_ */