| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | | - * Copyright 2015 Amazon.com, Inc. or its affiliates. |
|---|
| 3 | | - * |
|---|
| 4 | | - * This software is available to you under a choice of one of two |
|---|
| 5 | | - * licenses. You may choose to be licensed under the terms of the GNU |
|---|
| 6 | | - * General Public License (GPL) Version 2, available from the file |
|---|
| 7 | | - * COPYING in the main directory of this source tree, or the |
|---|
| 8 | | - * BSD license below: |
|---|
| 9 | | - * |
|---|
| 10 | | - * Redistribution and use in source and binary forms, with or |
|---|
| 11 | | - * without modification, are permitted provided that the following |
|---|
| 12 | | - * conditions are met: |
|---|
| 13 | | - * |
|---|
| 14 | | - * - Redistributions of source code must retain the above |
|---|
| 15 | | - * copyright notice, this list of conditions and the following |
|---|
| 16 | | - * disclaimer. |
|---|
| 17 | | - * |
|---|
| 18 | | - * - Redistributions in binary form must reproduce the above |
|---|
| 19 | | - * copyright notice, this list of conditions and the following |
|---|
| 20 | | - * disclaimer in the documentation and/or other materials |
|---|
| 21 | | - * provided with the distribution. |
|---|
| 22 | | - * |
|---|
| 23 | | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|---|
| 24 | | - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|---|
| 25 | | - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|---|
| 26 | | - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|---|
| 27 | | - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|---|
| 28 | | - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|---|
| 29 | | - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|---|
| 30 | | - * SOFTWARE. |
|---|
| 3 | + * Copyright 2015-2020 Amazon.com, Inc. or its affiliates. All rights reserved. |
|---|
| 31 | 4 | */ |
|---|
| 32 | 5 | |
|---|
| 33 | 6 | #ifndef ENA_H |
|---|
| 34 | 7 | #define ENA_H |
|---|
| 35 | 8 | |
|---|
| 36 | 9 | #include <linux/bitops.h> |
|---|
| 10 | +#include <linux/dim.h> |
|---|
| 37 | 11 | #include <linux/etherdevice.h> |
|---|
| 12 | +#include <linux/if_vlan.h> |
|---|
| 38 | 13 | #include <linux/inetdevice.h> |
|---|
| 39 | 14 | #include <linux/interrupt.h> |
|---|
| 40 | 15 | #include <linux/netdevice.h> |
|---|
| .. | .. |
|---|
| 43 | 18 | #include "ena_com.h" |
|---|
| 44 | 19 | #include "ena_eth_com.h" |
|---|
| 45 | 20 | |
|---|
| 46 | | -#define DRV_MODULE_VER_MAJOR 1 |
|---|
| 47 | | -#define DRV_MODULE_VER_MINOR 5 |
|---|
| 48 | | -#define DRV_MODULE_VER_SUBMINOR 0 |
|---|
| 21 | +#define DRV_MODULE_GEN_MAJOR 2 |
|---|
| 22 | +#define DRV_MODULE_GEN_MINOR 1 |
|---|
| 23 | +#define DRV_MODULE_GEN_SUBMINOR 0 |
|---|
| 49 | 24 | |
|---|
| 50 | 25 | #define DRV_MODULE_NAME "ena" |
|---|
| 51 | | -#ifndef DRV_MODULE_VERSION |
|---|
| 52 | | -#define DRV_MODULE_VERSION \ |
|---|
| 53 | | - __stringify(DRV_MODULE_VER_MAJOR) "." \ |
|---|
| 54 | | - __stringify(DRV_MODULE_VER_MINOR) "." \ |
|---|
| 55 | | - __stringify(DRV_MODULE_VER_SUBMINOR) "K" |
|---|
| 56 | | -#endif |
|---|
| 57 | 26 | |
|---|
| 58 | 27 | #define DEVICE_NAME "Elastic Network Adapter (ENA)" |
|---|
| 59 | 28 | |
|---|
| 60 | 29 | /* 1 for AENQ + ADMIN */ |
|---|
| 61 | 30 | #define ENA_ADMIN_MSIX_VEC 1 |
|---|
| 62 | 31 | #define ENA_MAX_MSIX_VEC(io_queues) (ENA_ADMIN_MSIX_VEC + (io_queues)) |
|---|
| 32 | + |
|---|
| 33 | +/* The ENA buffer length fields is 16 bit long. So when PAGE_SIZE == 64kB the |
|---|
| 34 | + * driver passes 0. |
|---|
| 35 | + * Since the max packet size the ENA handles is ~9kB limit the buffer length to |
|---|
| 36 | + * 16kB. |
|---|
| 37 | + */ |
|---|
| 38 | +#if PAGE_SIZE > SZ_16K |
|---|
| 39 | +#define ENA_PAGE_SIZE (_AC(SZ_16K, UL)) |
|---|
| 40 | +#else |
|---|
| 41 | +#define ENA_PAGE_SIZE PAGE_SIZE |
|---|
| 42 | +#endif |
|---|
| 63 | 43 | |
|---|
| 64 | 44 | #define ENA_MIN_MSIX_VEC 2 |
|---|
| 65 | 45 | |
|---|
| .. | .. |
|---|
| 68 | 48 | #define ENA_BAR_MASK (BIT(ENA_REG_BAR) | BIT(ENA_MEM_BAR)) |
|---|
| 69 | 49 | |
|---|
| 70 | 50 | #define ENA_DEFAULT_RING_SIZE (1024) |
|---|
| 51 | +#define ENA_MIN_RING_SIZE (256) |
|---|
| 52 | + |
|---|
| 53 | +#define ENA_MIN_NUM_IO_QUEUES (1) |
|---|
| 71 | 54 | |
|---|
| 72 | 55 | #define ENA_TX_WAKEUP_THRESH (MAX_SKB_FRAGS + 2) |
|---|
| 73 | | -#define ENA_DEFAULT_RX_COPYBREAK (128 - NET_IP_ALIGN) |
|---|
| 56 | +#define ENA_DEFAULT_RX_COPYBREAK (256 - NET_IP_ALIGN) |
|---|
| 74 | 57 | |
|---|
| 75 | 58 | /* limit the buffer size to 600 bytes to handle MTU changes from very |
|---|
| 76 | 59 | * small to very large, in which case the number of buffers per packet |
|---|
| .. | .. |
|---|
| 88 | 71 | #define ENA_RX_RSS_TABLE_LOG_SIZE 7 |
|---|
| 89 | 72 | #define ENA_RX_RSS_TABLE_SIZE (1 << ENA_RX_RSS_TABLE_LOG_SIZE) |
|---|
| 90 | 73 | |
|---|
| 91 | | -#define ENA_HASH_KEY_SIZE 40 |
|---|
| 92 | | - |
|---|
| 93 | 74 | /* The number of tx packet completions that will be handled each NAPI poll |
|---|
| 94 | 75 | * cycle is ring_size / ENA_TX_POLL_BUDGET_DIVIDER. |
|---|
| 95 | 76 | */ |
|---|
| 96 | 77 | #define ENA_TX_POLL_BUDGET_DIVIDER 4 |
|---|
| 97 | 78 | |
|---|
| 98 | | -/* Refill Rx queue when number of available descriptors is below |
|---|
| 99 | | - * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER |
|---|
| 79 | +/* Refill Rx queue when number of required descriptors is above |
|---|
| 80 | + * QUEUE_SIZE / ENA_RX_REFILL_THRESH_DIVIDER or ENA_RX_REFILL_THRESH_PACKET |
|---|
| 100 | 81 | */ |
|---|
| 101 | 82 | #define ENA_RX_REFILL_THRESH_DIVIDER 8 |
|---|
| 83 | +#define ENA_RX_REFILL_THRESH_PACKET 256 |
|---|
| 102 | 84 | |
|---|
| 103 | 85 | /* Number of queues to check for missing queues per timer service */ |
|---|
| 104 | 86 | #define ENA_MONITORED_TX_QUEUES 4 |
|---|
| .. | .. |
|---|
| 120 | 102 | #define ENA_IO_IRQ_FIRST_IDX 1 |
|---|
| 121 | 103 | #define ENA_IO_IRQ_IDX(q) (ENA_IO_IRQ_FIRST_IDX + (q)) |
|---|
| 122 | 104 | |
|---|
| 105 | +#define ENA_ADMIN_POLL_DELAY_US 100 |
|---|
| 106 | + |
|---|
| 123 | 107 | /* ENA device should send keep alive msg every 1 sec. |
|---|
| 124 | 108 | * We wait for 6 sec just to be on the safe side. |
|---|
| 125 | 109 | */ |
|---|
| .. | .. |
|---|
| 127 | 111 | #define ENA_MAX_NO_INTERRUPT_ITERATIONS 3 |
|---|
| 128 | 112 | |
|---|
| 129 | 113 | #define ENA_MMIO_DISABLE_REG_READ BIT(0) |
|---|
| 114 | + |
|---|
| 115 | +/* The max MTU size is configured to be the ethernet frame size without |
|---|
| 116 | + * the overhead of the ethernet header, which can have a VLAN header, and |
|---|
| 117 | + * a frame check sequence (FCS). |
|---|
| 118 | + * The buffer size we share with the device is defined to be ENA_PAGE_SIZE |
|---|
| 119 | + */ |
|---|
| 120 | + |
|---|
| 121 | +#define ENA_XDP_MAX_MTU (ENA_PAGE_SIZE - ETH_HLEN - ETH_FCS_LEN - \ |
|---|
| 122 | + VLAN_HLEN - XDP_PACKET_HEADROOM - \ |
|---|
| 123 | + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) |
|---|
| 124 | + |
|---|
| 125 | +#define ENA_IS_XDP_INDEX(adapter, index) (((index) >= (adapter)->xdp_first_ring) && \ |
|---|
| 126 | + ((index) < (adapter)->xdp_first_ring + (adapter)->xdp_num_queues)) |
|---|
| 130 | 127 | |
|---|
| 131 | 128 | struct ena_irq { |
|---|
| 132 | 129 | irq_handler_t handler; |
|---|
| .. | .. |
|---|
| 141 | 138 | struct napi_struct napi ____cacheline_aligned; |
|---|
| 142 | 139 | struct ena_ring *tx_ring; |
|---|
| 143 | 140 | struct ena_ring *rx_ring; |
|---|
| 141 | + struct ena_ring *xdp_ring; |
|---|
| 142 | + bool first_interrupt; |
|---|
| 143 | + bool interrupts_masked; |
|---|
| 144 | 144 | u32 qid; |
|---|
| 145 | + struct dim dim; |
|---|
| 146 | +}; |
|---|
| 147 | + |
|---|
| 148 | +struct ena_calc_queue_size_ctx { |
|---|
| 149 | + struct ena_com_dev_get_features_ctx *get_feat_ctx; |
|---|
| 150 | + struct ena_com_dev *ena_dev; |
|---|
| 151 | + struct pci_dev *pdev; |
|---|
| 152 | + u32 tx_queue_size; |
|---|
| 153 | + u32 rx_queue_size; |
|---|
| 154 | + u32 max_tx_queue_size; |
|---|
| 155 | + u32 max_rx_queue_size; |
|---|
| 156 | + u16 max_tx_sgl_size; |
|---|
| 157 | + u16 max_rx_sgl_size; |
|---|
| 145 | 158 | }; |
|---|
| 146 | 159 | |
|---|
| 147 | 160 | struct ena_tx_buffer { |
|---|
| .. | .. |
|---|
| 152 | 165 | u32 tx_descs; |
|---|
| 153 | 166 | /* num of buffers used by this skb */ |
|---|
| 154 | 167 | u32 num_of_bufs; |
|---|
| 168 | + |
|---|
| 169 | + /* XDP buffer structure which is used for sending packets in |
|---|
| 170 | + * the xdp queues |
|---|
| 171 | + */ |
|---|
| 172 | + struct xdp_frame *xdpf; |
|---|
| 173 | + /* The rx page for the rx buffer that was received in rx and |
|---|
| 174 | + * re transmitted on xdp tx queues as a result of XDP_TX action. |
|---|
| 175 | + * We need to free the page once we finished cleaning the buffer in |
|---|
| 176 | + * clean_xdp_irq() |
|---|
| 177 | + */ |
|---|
| 178 | + struct page *xdp_rx_page; |
|---|
| 179 | + |
|---|
| 180 | + /* Indicate if bufs[0] map the linear data of the skb. */ |
|---|
| 181 | + u8 map_linear_data; |
|---|
| 155 | 182 | |
|---|
| 156 | 183 | /* Used for detect missing tx packets to limit the number of prints */ |
|---|
| 157 | 184 | u32 print_once; |
|---|
| .. | .. |
|---|
| 188 | 215 | u64 tx_poll; |
|---|
| 189 | 216 | u64 doorbells; |
|---|
| 190 | 217 | u64 bad_req_id; |
|---|
| 218 | + u64 llq_buffer_copy; |
|---|
| 191 | 219 | u64 missed_tx; |
|---|
| 220 | + u64 unmask_interrupt; |
|---|
| 192 | 221 | }; |
|---|
| 193 | 222 | |
|---|
| 194 | 223 | struct ena_stats_rx { |
|---|
| 195 | 224 | u64 cnt; |
|---|
| 196 | 225 | u64 bytes; |
|---|
| 226 | + u64 rx_copybreak_pkt; |
|---|
| 227 | + u64 csum_good; |
|---|
| 197 | 228 | u64 refil_partial; |
|---|
| 198 | 229 | u64 bad_csum; |
|---|
| 199 | 230 | u64 page_alloc_fail; |
|---|
| 200 | 231 | u64 skb_alloc_fail; |
|---|
| 201 | 232 | u64 dma_mapping_err; |
|---|
| 202 | 233 | u64 bad_desc_num; |
|---|
| 203 | | - u64 rx_copybreak_pkt; |
|---|
| 204 | 234 | u64 bad_req_id; |
|---|
| 205 | 235 | u64 empty_rx_ring; |
|---|
| 236 | + u64 csum_unchecked; |
|---|
| 237 | + u64 xdp_aborted; |
|---|
| 238 | + u64 xdp_drop; |
|---|
| 239 | + u64 xdp_pass; |
|---|
| 240 | + u64 xdp_tx; |
|---|
| 241 | + u64 xdp_invalid; |
|---|
| 206 | 242 | }; |
|---|
| 207 | 243 | |
|---|
| 208 | 244 | struct ena_ring { |
|---|
| 209 | | - union { |
|---|
| 210 | | - /* Holds the empty requests for TX/RX |
|---|
| 211 | | - * out of order completions |
|---|
| 212 | | - */ |
|---|
| 213 | | - u16 *free_tx_ids; |
|---|
| 214 | | - u16 *free_rx_ids; |
|---|
| 215 | | - }; |
|---|
| 245 | + /* Holds the empty requests for TX/RX |
|---|
| 246 | + * out of order completions |
|---|
| 247 | + */ |
|---|
| 248 | + u16 *free_ids; |
|---|
| 216 | 249 | |
|---|
| 217 | 250 | union { |
|---|
| 218 | 251 | struct ena_tx_buffer *tx_buffer_info; |
|---|
| .. | .. |
|---|
| 228 | 261 | struct ena_adapter *adapter; |
|---|
| 229 | 262 | struct ena_com_io_cq *ena_com_io_cq; |
|---|
| 230 | 263 | struct ena_com_io_sq *ena_com_io_sq; |
|---|
| 264 | + struct bpf_prog *xdp_bpf_prog; |
|---|
| 265 | + struct xdp_rxq_info xdp_rxq; |
|---|
| 231 | 266 | |
|---|
| 232 | 267 | u16 next_to_use; |
|---|
| 233 | 268 | u16 next_to_clean; |
|---|
| 234 | 269 | u16 rx_copybreak; |
|---|
| 270 | + u16 rx_headroom; |
|---|
| 235 | 271 | u16 qid; |
|---|
| 236 | 272 | u16 mtu; |
|---|
| 237 | 273 | u16 sgl_size; |
|---|
| .. | .. |
|---|
| 240 | 276 | u8 tx_max_header_size; |
|---|
| 241 | 277 | |
|---|
| 242 | 278 | bool first_interrupt; |
|---|
| 279 | + bool disable_meta_caching; |
|---|
| 243 | 280 | u16 no_interrupt_event_cnt; |
|---|
| 244 | 281 | |
|---|
| 245 | 282 | /* cpu for TPH */ |
|---|
| .. | .. |
|---|
| 252 | 289 | struct ena_com_rx_buf_info ena_bufs[ENA_PKT_MAX_BUFS]; |
|---|
| 253 | 290 | u32 smoothed_interval; |
|---|
| 254 | 291 | u32 per_napi_packets; |
|---|
| 255 | | - u32 per_napi_bytes; |
|---|
| 256 | | - enum ena_intr_moder_level moder_tbl_idx; |
|---|
| 292 | + u16 non_empty_napi_events; |
|---|
| 257 | 293 | struct u64_stats_sync syncp; |
|---|
| 258 | 294 | union { |
|---|
| 259 | 295 | struct ena_stats_tx tx_stats; |
|---|
| 260 | 296 | struct ena_stats_rx rx_stats; |
|---|
| 261 | 297 | }; |
|---|
| 298 | + |
|---|
| 299 | + u8 *push_buf_intermediate_buf; |
|---|
| 262 | 300 | int empty_rx_queue; |
|---|
| 263 | 301 | } ____cacheline_aligned; |
|---|
| 264 | 302 | |
|---|
| .. | .. |
|---|
| 271 | 309 | u64 interface_down; |
|---|
| 272 | 310 | u64 admin_q_pause; |
|---|
| 273 | 311 | u64 rx_drops; |
|---|
| 312 | + u64 tx_drops; |
|---|
| 274 | 313 | }; |
|---|
| 275 | 314 | |
|---|
| 276 | 315 | enum ena_flags_t { |
|---|
| .. | .. |
|---|
| 295 | 334 | u32 rx_copybreak; |
|---|
| 296 | 335 | u32 max_mtu; |
|---|
| 297 | 336 | |
|---|
| 298 | | - int num_queues; |
|---|
| 337 | + u32 num_io_queues; |
|---|
| 338 | + u32 max_num_io_queues; |
|---|
| 299 | 339 | |
|---|
| 300 | 340 | int msix_vecs; |
|---|
| 301 | 341 | |
|---|
| 302 | 342 | u32 missing_tx_completion_threshold; |
|---|
| 303 | 343 | |
|---|
| 304 | | - u32 tx_usecs, rx_usecs; /* interrupt moderation */ |
|---|
| 305 | | - u32 tx_frames, rx_frames; /* interrupt moderation */ |
|---|
| 344 | + u32 requested_tx_ring_size; |
|---|
| 345 | + u32 requested_rx_ring_size; |
|---|
| 306 | 346 | |
|---|
| 307 | | - u32 tx_ring_size; |
|---|
| 308 | | - u32 rx_ring_size; |
|---|
| 347 | + u32 max_tx_ring_size; |
|---|
| 348 | + u32 max_rx_ring_size; |
|---|
| 309 | 349 | |
|---|
| 310 | 350 | u32 msg_enable; |
|---|
| 311 | 351 | |
|---|
| .. | .. |
|---|
| 338 | 378 | |
|---|
| 339 | 379 | bool wd_state; |
|---|
| 340 | 380 | bool dev_up_before_reset; |
|---|
| 381 | + bool disable_meta_caching; |
|---|
| 341 | 382 | unsigned long last_keep_alive_jiffies; |
|---|
| 342 | 383 | |
|---|
| 343 | 384 | struct u64_stats_sync syncp; |
|---|
| 344 | 385 | struct ena_stats_dev dev_stats; |
|---|
| 386 | + struct ena_admin_eni_stats eni_stats; |
|---|
| 387 | + bool eni_stats_supported; |
|---|
| 345 | 388 | |
|---|
| 346 | 389 | /* last queue index that was checked for uncompleted tx packets */ |
|---|
| 347 | 390 | u32 last_monitored_tx_qid; |
|---|
| 348 | 391 | |
|---|
| 349 | 392 | enum ena_regs_reset_reason_types reset_reason; |
|---|
| 393 | + |
|---|
| 394 | + struct bpf_prog *xdp_bpf_prog; |
|---|
| 395 | + u32 xdp_first_ring; |
|---|
| 396 | + u32 xdp_num_queues; |
|---|
| 350 | 397 | }; |
|---|
| 351 | 398 | |
|---|
| 352 | 399 | void ena_set_ethtool_ops(struct net_device *netdev); |
|---|
| .. | .. |
|---|
| 355 | 402 | |
|---|
| 356 | 403 | void ena_dump_stats_to_buf(struct ena_adapter *adapter, u8 *buf); |
|---|
| 357 | 404 | |
|---|
| 405 | +int ena_update_hw_stats(struct ena_adapter *adapter); |
|---|
| 406 | + |
|---|
| 407 | +int ena_update_queue_sizes(struct ena_adapter *adapter, |
|---|
| 408 | + u32 new_tx_size, |
|---|
| 409 | + u32 new_rx_size); |
|---|
| 410 | + |
|---|
| 411 | +int ena_update_queue_count(struct ena_adapter *adapter, u32 new_channel_count); |
|---|
| 412 | + |
|---|
| 358 | 413 | int ena_get_sset_count(struct net_device *netdev, int sset); |
|---|
| 359 | 414 | |
|---|
| 360 | | -/* The ENA buffer length fields is 16 bit long. So when PAGE_SIZE == 64kB the |
|---|
| 361 | | - * driver passas 0. |
|---|
| 362 | | - * Since the max packet size the ENA handles is ~9kB limit the buffer length to |
|---|
| 363 | | - * 16kB. |
|---|
| 364 | | - */ |
|---|
| 365 | | -#if PAGE_SIZE > SZ_16K |
|---|
| 366 | | -#define ENA_PAGE_SIZE SZ_16K |
|---|
| 367 | | -#else |
|---|
| 368 | | -#define ENA_PAGE_SIZE PAGE_SIZE |
|---|
| 369 | | -#endif |
|---|
| 415 | +enum ena_xdp_errors_t { |
|---|
| 416 | + ENA_XDP_ALLOWED = 0, |
|---|
| 417 | + ENA_XDP_CURRENT_MTU_TOO_LARGE, |
|---|
| 418 | + ENA_XDP_NO_ENOUGH_QUEUES, |
|---|
| 419 | +}; |
|---|
| 420 | + |
|---|
| 421 | +static inline bool ena_xdp_queues_present(struct ena_adapter *adapter) |
|---|
| 422 | +{ |
|---|
| 423 | + return adapter->xdp_first_ring != 0; |
|---|
| 424 | +} |
|---|
| 425 | + |
|---|
| 426 | +static inline bool ena_xdp_present(struct ena_adapter *adapter) |
|---|
| 427 | +{ |
|---|
| 428 | + return !!adapter->xdp_bpf_prog; |
|---|
| 429 | +} |
|---|
| 430 | + |
|---|
| 431 | +static inline bool ena_xdp_present_ring(struct ena_ring *ring) |
|---|
| 432 | +{ |
|---|
| 433 | + return !!ring->xdp_bpf_prog; |
|---|
| 434 | +} |
|---|
| 435 | + |
|---|
| 436 | +static inline int ena_xdp_legal_queue_count(struct ena_adapter *adapter, |
|---|
| 437 | + u32 queues) |
|---|
| 438 | +{ |
|---|
| 439 | + return 2 * queues <= adapter->max_num_io_queues; |
|---|
| 440 | +} |
|---|
| 441 | + |
|---|
| 442 | +static inline enum ena_xdp_errors_t ena_xdp_allowed(struct ena_adapter *adapter) |
|---|
| 443 | +{ |
|---|
| 444 | + enum ena_xdp_errors_t rc = ENA_XDP_ALLOWED; |
|---|
| 445 | + |
|---|
| 446 | + if (adapter->netdev->mtu > ENA_XDP_MAX_MTU) |
|---|
| 447 | + rc = ENA_XDP_CURRENT_MTU_TOO_LARGE; |
|---|
| 448 | + else if (!ena_xdp_legal_queue_count(adapter, adapter->num_io_queues)) |
|---|
| 449 | + rc = ENA_XDP_NO_ENOUGH_QUEUES; |
|---|
| 450 | + |
|---|
| 451 | + return rc; |
|---|
| 452 | +} |
|---|
| 370 | 453 | |
|---|
| 371 | 454 | #endif /* !(ENA_H) */ |
|---|