if_enavar.h revision 1.2.2.3 1 1.2.2.3 pgoyette /* $NetBSD: if_enavar.h,v 1.2.2.3 2018/06/25 07:25:51 pgoyette Exp $ */
2 1.2.2.2 pgoyette
3 1.2.2.2 pgoyette /*-
4 1.2.2.2 pgoyette * BSD LICENSE
5 1.2.2.2 pgoyette *
6 1.2.2.2 pgoyette * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates.
7 1.2.2.2 pgoyette * All rights reserved.
8 1.2.2.2 pgoyette *
9 1.2.2.2 pgoyette * Redistribution and use in source and binary forms, with or without
10 1.2.2.2 pgoyette * modification, are permitted provided that the following conditions
11 1.2.2.2 pgoyette * are met:
12 1.2.2.2 pgoyette *
13 1.2.2.2 pgoyette * 1. Redistributions of source code must retain the above copyright
14 1.2.2.2 pgoyette * notice, this list of conditions and the following disclaimer.
15 1.2.2.2 pgoyette *
16 1.2.2.2 pgoyette * 2. Redistributions in binary form must reproduce the above copyright
17 1.2.2.2 pgoyette * notice, this list of conditions and the following disclaimer in the
18 1.2.2.2 pgoyette * documentation and/or other materials provided with the distribution.
19 1.2.2.2 pgoyette *
20 1.2.2.2 pgoyette * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 1.2.2.2 pgoyette * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 1.2.2.2 pgoyette * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 1.2.2.2 pgoyette * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 1.2.2.2 pgoyette * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 1.2.2.2 pgoyette * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 1.2.2.2 pgoyette * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 1.2.2.2 pgoyette * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 1.2.2.2 pgoyette * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 1.2.2.2 pgoyette * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 1.2.2.2 pgoyette * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 1.2.2.2 pgoyette *
32 1.2.2.2 pgoyette * $FreeBSD: head/sys/dev/ena/ena.h 333450 2018-05-10 09:06:21Z mw $
33 1.2.2.2 pgoyette *
34 1.2.2.2 pgoyette */
35 1.2.2.2 pgoyette
36 1.2.2.2 pgoyette #ifndef ENA_H
37 1.2.2.2 pgoyette #define ENA_H
38 1.2.2.2 pgoyette
39 1.2.2.2 pgoyette #include <sys/types.h>
40 1.2.2.2 pgoyette
41 1.2.2.2 pgoyette #include "external/bsd/ena-com/ena_com.h"
42 1.2.2.2 pgoyette #include "external/bsd/ena-com/ena_eth_com.h"
43 1.2.2.2 pgoyette
44 1.2.2.2 pgoyette #define DRV_MODULE_VER_MAJOR 0
45 1.2.2.2 pgoyette #define DRV_MODULE_VER_MINOR 8
46 1.2.2.2 pgoyette #define DRV_MODULE_VER_SUBMINOR 1
47 1.2.2.2 pgoyette
48 1.2.2.2 pgoyette #define DRV_MODULE_NAME "ena"
49 1.2.2.2 pgoyette
50 1.2.2.2 pgoyette #ifndef DRV_MODULE_VERSION
51 1.2.2.2 pgoyette #define DRV_MODULE_VERSION \
52 1.2.2.2 pgoyette __STRING(DRV_MODULE_VER_MAJOR) "." \
53 1.2.2.2 pgoyette __STRING(DRV_MODULE_VER_MINOR) "." \
54 1.2.2.2 pgoyette __STRING(DRV_MODULE_VER_SUBMINOR)
55 1.2.2.2 pgoyette #endif
56 1.2.2.2 pgoyette #define DEVICE_NAME "Elastic Network Adapter (ENA)"
57 1.2.2.2 pgoyette #define DEVICE_DESC "ENA adapter"
58 1.2.2.2 pgoyette
59 1.2.2.2 pgoyette /* Calculate DMA mask - width for ena cannot exceed 48, so it is safe */
60 1.2.2.2 pgoyette #define ENA_DMA_BIT_MASK(x) ((1ULL << (x)) - 1ULL)
61 1.2.2.2 pgoyette
62 1.2.2.2 pgoyette /* 1 for AENQ + ADMIN */
63 1.2.2.2 pgoyette #define ENA_ADMIN_MSIX_VEC 1
64 1.2.2.2 pgoyette #define ENA_MAX_MSIX_VEC(io_queues) (ENA_ADMIN_MSIX_VEC + (io_queues))
65 1.2.2.2 pgoyette
66 1.2.2.2 pgoyette #define ENA_REG_BAR 0
67 1.2.2.2 pgoyette #define ENA_MEM_BAR 2
68 1.2.2.2 pgoyette
69 1.2.2.2 pgoyette #define ENA_BUS_DMA_SEGS 32
70 1.2.2.2 pgoyette
71 1.2.2.2 pgoyette #define ENA_DEFAULT_RING_SIZE 1024
72 1.2.2.2 pgoyette
73 1.2.2.2 pgoyette #define ENA_RX_REFILL_THRESH_DIVIDER 8
74 1.2.2.2 pgoyette
75 1.2.2.2 pgoyette #define ENA_IRQNAME_SIZE 40
76 1.2.2.2 pgoyette
77 1.2.2.2 pgoyette #define ENA_PKT_MAX_BUFS 19
78 1.2.2.2 pgoyette
79 1.2.2.2 pgoyette #define ENA_RX_RSS_TABLE_LOG_SIZE 7
80 1.2.2.2 pgoyette #define ENA_RX_RSS_TABLE_SIZE (1 << ENA_RX_RSS_TABLE_LOG_SIZE)
81 1.2.2.2 pgoyette
82 1.2.2.2 pgoyette #define ENA_HASH_KEY_SIZE 40
83 1.2.2.2 pgoyette
84 1.2.2.2 pgoyette #define ENA_MAX_FRAME_LEN 10000
85 1.2.2.2 pgoyette #define ENA_MIN_FRAME_LEN 60
86 1.2.2.2 pgoyette
87 1.2.2.2 pgoyette #define ENA_TX_CLEANUP_THRESHOLD 128
88 1.2.2.2 pgoyette
89 1.2.2.2 pgoyette #define DB_THRESHOLD 64
90 1.2.2.2 pgoyette
91 1.2.2.2 pgoyette #define TX_COMMIT 32
92 1.2.2.2 pgoyette /*
93 1.2.2.2 pgoyette * TX budget for cleaning. It should be half of the RX budget to reduce amount
94 1.2.2.2 pgoyette * of TCP retransmissions.
95 1.2.2.2 pgoyette */
96 1.2.2.2 pgoyette #define TX_BUDGET 128
97 1.2.2.2 pgoyette /* RX cleanup budget. -1 stands for infinity. */
98 1.2.2.2 pgoyette #define RX_BUDGET 256
99 1.2.2.2 pgoyette /*
100 1.2.2.2 pgoyette * How many times we can repeat cleanup in the io irq handling routine if the
101 1.2.2.2 pgoyette * RX or TX budget was depleted.
102 1.2.2.2 pgoyette */
103 1.2.2.2 pgoyette #define CLEAN_BUDGET 8
104 1.2.2.2 pgoyette
105 1.2.2.2 pgoyette #define RX_IRQ_INTERVAL 20
106 1.2.2.2 pgoyette #define TX_IRQ_INTERVAL 50
107 1.2.2.2 pgoyette
108 1.2.2.2 pgoyette #define ENA_MIN_MTU 128
109 1.2.2.2 pgoyette
110 1.2.2.2 pgoyette #define ENA_TSO_MAXSIZE 65536
111 1.2.2.2 pgoyette
112 1.2.2.2 pgoyette #define ENA_MMIO_DISABLE_REG_READ BIT(0)
113 1.2.2.2 pgoyette
114 1.2.2.2 pgoyette #define ENA_TX_RING_IDX_NEXT(idx, ring_size) (((idx) + 1) & ((ring_size) - 1))
115 1.2.2.2 pgoyette
116 1.2.2.2 pgoyette #define ENA_RX_RING_IDX_NEXT(idx, ring_size) (((idx) + 1) & ((ring_size) - 1))
117 1.2.2.2 pgoyette
118 1.2.2.2 pgoyette #define ENA_IO_TXQ_IDX(q) (2 * (q))
119 1.2.2.2 pgoyette #define ENA_IO_RXQ_IDX(q) (2 * (q) + 1)
120 1.2.2.2 pgoyette
121 1.2.2.2 pgoyette #define ENA_MGMNT_IRQ_IDX 0
122 1.2.2.2 pgoyette #define ENA_IO_IRQ_FIRST_IDX 1
123 1.2.2.2 pgoyette #define ENA_IO_IRQ_IDX(q) (ENA_IO_IRQ_FIRST_IDX + (q))
124 1.2.2.2 pgoyette
125 1.2.2.2 pgoyette /*
126 1.2.2.2 pgoyette * ENA device should send keep alive msg every 1 sec.
127 1.2.2.2 pgoyette * We wait for 6 sec just to be on the safe side.
128 1.2.2.2 pgoyette */
129 1.2.2.2 pgoyette #define DEFAULT_KEEP_ALIVE_TO (SBT_1S * 6)
130 1.2.2.2 pgoyette
131 1.2.2.2 pgoyette /* Time in jiffies before concluding the transmitter is hung. */
132 1.2.2.2 pgoyette #define DEFAULT_TX_CMP_TO (SBT_1S * 5)
133 1.2.2.2 pgoyette
134 1.2.2.2 pgoyette /* Number of queues to check for missing queues per timer tick */
135 1.2.2.2 pgoyette #define DEFAULT_TX_MONITORED_QUEUES (4)
136 1.2.2.2 pgoyette
137 1.2.2.2 pgoyette /* Max number of timeouted packets before device reset */
138 1.2.2.2 pgoyette #define DEFAULT_TX_CMP_THRESHOLD (128)
139 1.2.2.2 pgoyette
140 1.2.2.2 pgoyette /*
141 1.2.2.2 pgoyette * Supported PCI vendor and devices IDs
142 1.2.2.2 pgoyette */
143 1.2.2.2 pgoyette #define PCI_VENDOR_ID_AMAZON 0x1d0f
144 1.2.2.2 pgoyette
145 1.2.2.2 pgoyette #define PCI_DEV_ID_ENA_PF 0x0ec2
146 1.2.2.2 pgoyette #define PCI_DEV_ID_ENA_LLQ_PF 0x1ec2
147 1.2.2.2 pgoyette #define PCI_DEV_ID_ENA_VF 0xec20
148 1.2.2.2 pgoyette #define PCI_DEV_ID_ENA_LLQ_VF 0xec21
149 1.2.2.2 pgoyette
150 1.2.2.3 pgoyette typedef __int64_t sbintime_t;
151 1.2.2.3 pgoyette
152 1.2.2.2 pgoyette struct msix_entry {
153 1.2.2.2 pgoyette int entry;
154 1.2.2.2 pgoyette int vector;
155 1.2.2.2 pgoyette };
156 1.2.2.2 pgoyette
157 1.2.2.2 pgoyette typedef struct _ena_vendor_info_t {
158 1.2.2.2 pgoyette unsigned int vendor_id;
159 1.2.2.2 pgoyette unsigned int device_id;
160 1.2.2.2 pgoyette unsigned int index;
161 1.2.2.2 pgoyette } ena_vendor_info_t;
162 1.2.2.2 pgoyette
163 1.2.2.2 pgoyette struct ena_que {
164 1.2.2.2 pgoyette struct ena_adapter *adapter;
165 1.2.2.2 pgoyette struct ena_ring *tx_ring;
166 1.2.2.2 pgoyette struct ena_ring *rx_ring;
167 1.2.2.2 pgoyette uint32_t id;
168 1.2.2.2 pgoyette int cpu;
169 1.2.2.2 pgoyette };
170 1.2.2.2 pgoyette
171 1.2.2.2 pgoyette struct ena_tx_buffer {
172 1.2.2.2 pgoyette struct mbuf *mbuf;
173 1.2.2.2 pgoyette /* # of ena desc for this specific mbuf
174 1.2.2.2 pgoyette * (includes data desc and metadata desc) */
175 1.2.2.2 pgoyette unsigned int tx_descs;
176 1.2.2.2 pgoyette /* # of buffers used by this mbuf */
177 1.2.2.2 pgoyette unsigned int num_of_bufs;
178 1.2.2.2 pgoyette bus_dmamap_t map;
179 1.2.2.2 pgoyette
180 1.2.2.2 pgoyette /* Used to detect missing tx packets */
181 1.2.2.2 pgoyette struct bintime timestamp;
182 1.2.2.2 pgoyette bool print_once;
183 1.2.2.2 pgoyette
184 1.2.2.2 pgoyette struct ena_com_buf bufs[ENA_PKT_MAX_BUFS];
185 1.2.2.2 pgoyette } __aligned(CACHE_LINE_SIZE);
186 1.2.2.2 pgoyette
187 1.2.2.2 pgoyette struct ena_rx_buffer {
188 1.2.2.2 pgoyette struct mbuf *mbuf;
189 1.2.2.2 pgoyette bus_dmamap_t map;
190 1.2.2.2 pgoyette struct ena_com_buf ena_buf;
191 1.2.2.2 pgoyette } __aligned(CACHE_LINE_SIZE);
192 1.2.2.2 pgoyette
193 1.2.2.2 pgoyette struct ena_stats_tx {
194 1.2.2.3 pgoyette char name[16];
195 1.2.2.2 pgoyette struct evcnt cnt;
196 1.2.2.2 pgoyette struct evcnt bytes;
197 1.2.2.2 pgoyette struct evcnt prepare_ctx_err;
198 1.2.2.2 pgoyette struct evcnt dma_mapping_err;
199 1.2.2.2 pgoyette struct evcnt doorbells;
200 1.2.2.2 pgoyette struct evcnt missing_tx_comp;
201 1.2.2.2 pgoyette struct evcnt bad_req_id;
202 1.2.2.2 pgoyette struct evcnt collapse;
203 1.2.2.2 pgoyette struct evcnt collapse_err;
204 1.2.2.2 pgoyette };
205 1.2.2.2 pgoyette
206 1.2.2.2 pgoyette struct ena_stats_rx {
207 1.2.2.3 pgoyette char name[16];
208 1.2.2.2 pgoyette struct evcnt cnt;
209 1.2.2.2 pgoyette struct evcnt bytes;
210 1.2.2.2 pgoyette struct evcnt refil_partial;
211 1.2.2.2 pgoyette struct evcnt bad_csum;
212 1.2.2.2 pgoyette struct evcnt mjum_alloc_fail;
213 1.2.2.2 pgoyette struct evcnt mbuf_alloc_fail;
214 1.2.2.2 pgoyette struct evcnt dma_mapping_err;
215 1.2.2.2 pgoyette struct evcnt bad_desc_num;
216 1.2.2.2 pgoyette struct evcnt bad_req_id;
217 1.2.2.2 pgoyette struct evcnt empty_rx_ring;
218 1.2.2.2 pgoyette };
219 1.2.2.2 pgoyette
220 1.2.2.2 pgoyette struct ena_ring {
221 1.2.2.2 pgoyette /* Holds the empty requests for TX/RX out of order completions */
222 1.2.2.2 pgoyette union {
223 1.2.2.2 pgoyette uint16_t *free_tx_ids;
224 1.2.2.2 pgoyette uint16_t *free_rx_ids;
225 1.2.2.2 pgoyette };
226 1.2.2.2 pgoyette struct ena_com_dev *ena_dev;
227 1.2.2.2 pgoyette struct ena_adapter *adapter;
228 1.2.2.2 pgoyette struct ena_com_io_cq *ena_com_io_cq;
229 1.2.2.2 pgoyette struct ena_com_io_sq *ena_com_io_sq;
230 1.2.2.2 pgoyette
231 1.2.2.2 pgoyette uint16_t qid;
232 1.2.2.2 pgoyette
233 1.2.2.2 pgoyette /* Determines if device will use LLQ or normal mode for TX */
234 1.2.2.2 pgoyette enum ena_admin_placement_policy_type tx_mem_queue_type;
235 1.2.2.2 pgoyette /* The maximum length the driver can push to the device (For LLQ) */
236 1.2.2.2 pgoyette uint8_t tx_max_header_size;
237 1.2.2.2 pgoyette
238 1.2.2.2 pgoyette struct ena_com_rx_buf_info ena_bufs[ENA_PKT_MAX_BUFS];
239 1.2.2.2 pgoyette
240 1.2.2.2 pgoyette /*
241 1.2.2.2 pgoyette * Fields used for Adaptive Interrupt Modulation - to be implemented in
242 1.2.2.2 pgoyette * the future releases
243 1.2.2.2 pgoyette */
244 1.2.2.2 pgoyette uint32_t smoothed_interval;
245 1.2.2.2 pgoyette enum ena_intr_moder_level moder_tbl_idx;
246 1.2.2.2 pgoyette
247 1.2.2.2 pgoyette struct ena_que *que;
248 1.2.2.2 pgoyette #ifdef LRO
249 1.2.2.2 pgoyette struct lro_ctrl lro;
250 1.2.2.2 pgoyette #endif
251 1.2.2.2 pgoyette
252 1.2.2.2 pgoyette uint16_t next_to_use;
253 1.2.2.2 pgoyette uint16_t next_to_clean;
254 1.2.2.2 pgoyette
255 1.2.2.2 pgoyette union {
256 1.2.2.2 pgoyette struct ena_tx_buffer *tx_buffer_info; /* contex of tx packet */
257 1.2.2.2 pgoyette struct ena_rx_buffer *rx_buffer_info; /* contex of rx packet */
258 1.2.2.2 pgoyette };
259 1.2.2.2 pgoyette int ring_size; /* number of tx/rx_buffer_info's entries */
260 1.2.2.2 pgoyette
261 1.2.2.2 pgoyette struct buf_ring *br; /* only for TX */
262 1.2.2.2 pgoyette
263 1.2.2.2 pgoyette kmutex_t ring_mtx;
264 1.2.2.2 pgoyette char mtx_name[16];
265 1.2.2.2 pgoyette
266 1.2.2.2 pgoyette union {
267 1.2.2.2 pgoyette struct {
268 1.2.2.2 pgoyette struct work enqueue_task;
269 1.2.2.2 pgoyette struct workqueue *enqueue_tq;
270 1.2.2.2 pgoyette };
271 1.2.2.2 pgoyette struct {
272 1.2.2.2 pgoyette struct work cmpl_task;
273 1.2.2.2 pgoyette struct workqueue *cmpl_tq;
274 1.2.2.2 pgoyette };
275 1.2.2.2 pgoyette };
276 1.2.2.2 pgoyette
277 1.2.2.2 pgoyette union {
278 1.2.2.2 pgoyette struct ena_stats_tx tx_stats;
279 1.2.2.2 pgoyette struct ena_stats_rx rx_stats;
280 1.2.2.2 pgoyette };
281 1.2.2.2 pgoyette
282 1.2.2.2 pgoyette int empty_rx_queue;
283 1.2.2.2 pgoyette } __aligned(CACHE_LINE_SIZE);
284 1.2.2.2 pgoyette
285 1.2.2.2 pgoyette struct ena_stats_dev {
286 1.2.2.3 pgoyette char name[16];
287 1.2.2.2 pgoyette struct evcnt wd_expired;
288 1.2.2.2 pgoyette struct evcnt interface_up;
289 1.2.2.2 pgoyette struct evcnt interface_down;
290 1.2.2.2 pgoyette struct evcnt admin_q_pause;
291 1.2.2.2 pgoyette };
292 1.2.2.2 pgoyette
293 1.2.2.2 pgoyette struct ena_hw_stats {
294 1.2.2.3 pgoyette char name[16];
295 1.2.2.2 pgoyette struct evcnt rx_packets;
296 1.2.2.2 pgoyette struct evcnt tx_packets;
297 1.2.2.2 pgoyette
298 1.2.2.2 pgoyette struct evcnt rx_bytes;
299 1.2.2.2 pgoyette struct evcnt tx_bytes;
300 1.2.2.2 pgoyette
301 1.2.2.2 pgoyette struct evcnt rx_drops;
302 1.2.2.2 pgoyette };
303 1.2.2.2 pgoyette
304 1.2.2.2 pgoyette /* Board specific private data structure */
305 1.2.2.2 pgoyette struct ena_adapter {
306 1.2.2.2 pgoyette struct ena_com_dev *ena_dev;
307 1.2.2.2 pgoyette
308 1.2.2.2 pgoyette /* OS defined structs */
309 1.2.2.2 pgoyette device_t pdev;
310 1.2.2.2 pgoyette struct ethercom sc_ec;
311 1.2.2.2 pgoyette struct ifnet *ifp; /* set to point to sc_ec */
312 1.2.2.2 pgoyette struct ifmedia media;
313 1.2.2.2 pgoyette
314 1.2.2.2 pgoyette /* OS resources */
315 1.2.2.2 pgoyette kmutex_t global_mtx;
316 1.2.2.2 pgoyette krwlock_t ioctl_sx;
317 1.2.2.2 pgoyette
318 1.2.2.3 pgoyette void *sc_ihs[ENA_MAX_MSIX_VEC(ENA_MAX_NUM_IO_QUEUES)];
319 1.2.2.3 pgoyette pci_intr_handle_t *sc_intrs;
320 1.2.2.3 pgoyette int sc_nintrs;
321 1.2.2.3 pgoyette struct pci_attach_args sc_pa;
322 1.2.2.3 pgoyette
323 1.2.2.3 pgoyette /* Registers */
324 1.2.2.3 pgoyette bus_space_handle_t sc_bhandle;
325 1.2.2.3 pgoyette bus_space_tag_t sc_btag;
326 1.2.2.2 pgoyette
327 1.2.2.2 pgoyette /* DMA tag used throughout the driver adapter for Tx and Rx */
328 1.2.2.2 pgoyette bus_dma_tag_t sc_dmat;
329 1.2.2.2 pgoyette int dma_width;
330 1.2.2.2 pgoyette
331 1.2.2.2 pgoyette uint32_t max_mtu;
332 1.2.2.2 pgoyette
333 1.2.2.2 pgoyette uint16_t max_tx_sgl_size;
334 1.2.2.2 pgoyette uint16_t max_rx_sgl_size;
335 1.2.2.2 pgoyette
336 1.2.2.2 pgoyette uint32_t tx_offload_cap;
337 1.2.2.2 pgoyette
338 1.2.2.2 pgoyette /* Tx fast path data */
339 1.2.2.2 pgoyette int num_queues;
340 1.2.2.2 pgoyette
341 1.2.2.2 pgoyette unsigned int tx_ring_size;
342 1.2.2.2 pgoyette unsigned int rx_ring_size;
343 1.2.2.2 pgoyette
344 1.2.2.2 pgoyette /* RSS*/
345 1.2.2.2 pgoyette uint8_t rss_ind_tbl[ENA_RX_RSS_TABLE_SIZE];
346 1.2.2.2 pgoyette bool rss_support;
347 1.2.2.2 pgoyette
348 1.2.2.2 pgoyette uint8_t mac_addr[ETHER_ADDR_LEN];
349 1.2.2.2 pgoyette /* mdio and phy*/
350 1.2.2.2 pgoyette
351 1.2.2.2 pgoyette bool link_status;
352 1.2.2.2 pgoyette bool trigger_reset;
353 1.2.2.2 pgoyette bool up;
354 1.2.2.2 pgoyette bool running;
355 1.2.2.2 pgoyette
356 1.2.2.2 pgoyette /* Queue will represent one TX and one RX ring */
357 1.2.2.2 pgoyette struct ena_que que[ENA_MAX_NUM_IO_QUEUES]
358 1.2.2.2 pgoyette __aligned(CACHE_LINE_SIZE);
359 1.2.2.2 pgoyette
360 1.2.2.2 pgoyette /* TX */
361 1.2.2.2 pgoyette struct ena_ring tx_ring[ENA_MAX_NUM_IO_QUEUES]
362 1.2.2.2 pgoyette __aligned(CACHE_LINE_SIZE);
363 1.2.2.2 pgoyette
364 1.2.2.2 pgoyette /* RX */
365 1.2.2.2 pgoyette struct ena_ring rx_ring[ENA_MAX_NUM_IO_QUEUES]
366 1.2.2.2 pgoyette __aligned(CACHE_LINE_SIZE);
367 1.2.2.2 pgoyette
368 1.2.2.2 pgoyette /* Timer service */
369 1.2.2.2 pgoyette struct callout timer_service;
370 1.2.2.3 pgoyette sbintime_t keep_alive_timestamp;
371 1.2.2.2 pgoyette uint32_t next_monitored_tx_qid;
372 1.2.2.2 pgoyette struct work reset_task;
373 1.2.2.2 pgoyette struct workqueue *reset_tq;
374 1.2.2.2 pgoyette int wd_active;
375 1.2.2.3 pgoyette sbintime_t keep_alive_timeout;
376 1.2.2.3 pgoyette sbintime_t missing_tx_timeout;
377 1.2.2.2 pgoyette uint32_t missing_tx_max_queues;
378 1.2.2.2 pgoyette uint32_t missing_tx_threshold;
379 1.2.2.2 pgoyette
380 1.2.2.2 pgoyette /* Statistics */
381 1.2.2.2 pgoyette struct ena_stats_dev dev_stats;
382 1.2.2.2 pgoyette struct ena_hw_stats hw_stats;
383 1.2.2.2 pgoyette
384 1.2.2.2 pgoyette enum ena_regs_reset_reason_types reset_reason;
385 1.2.2.2 pgoyette };
386 1.2.2.2 pgoyette
387 1.2.2.2 pgoyette #define ENA_RING_MTX_LOCK(_ring) mutex_enter(&(_ring)->ring_mtx)
388 1.2.2.2 pgoyette #define ENA_RING_MTX_TRYLOCK(_ring) mutex_tryenter(&(_ring)->ring_mtx)
389 1.2.2.2 pgoyette #define ENA_RING_MTX_UNLOCK(_ring) mutex_exit(&(_ring)->ring_mtx)
390 1.2.2.2 pgoyette
391 1.2.2.2 pgoyette static inline int ena_mbuf_count(struct mbuf *mbuf)
392 1.2.2.2 pgoyette {
393 1.2.2.2 pgoyette int count = 1;
394 1.2.2.2 pgoyette
395 1.2.2.2 pgoyette while ((mbuf = mbuf->m_next) != NULL)
396 1.2.2.2 pgoyette ++count;
397 1.2.2.2 pgoyette
398 1.2.2.2 pgoyette return count;
399 1.2.2.2 pgoyette }
400 1.2.2.2 pgoyette
401 1.2.2.3 pgoyette /* provide FreeBSD-compatible macros */
402 1.2.2.3 pgoyette #define if_getcapenable(ifp) (ifp)->if_capenable
403 1.2.2.3 pgoyette #define if_setcapenable(ifp, s) SET((ifp)->if_capenable, s)
404 1.2.2.3 pgoyette #define if_getcapabilities(ifp) (ifp)->if_capabilities
405 1.2.2.3 pgoyette #define if_setcapabilities(ifp, s) SET((ifp)->if_capabilities, s)
406 1.2.2.3 pgoyette #define if_setcapabilitiesbit(ifp, s, c) do { \
407 1.2.2.3 pgoyette CLR((ifp)->if_capabilities, c); \
408 1.2.2.3 pgoyette SET((ifp)->if_capabilities, s); \
409 1.2.2.3 pgoyette } while (0)
410 1.2.2.3 pgoyette #define if_getsoftc(ifp) (ifp)->if_softc
411 1.2.2.3 pgoyette #define if_setmtu(ifp, new_mtu) (ifp)->if_mtu = (new_mtu)
412 1.2.2.3 pgoyette #define if_getdrvflags(ifp) (ifp)->if_flags
413 1.2.2.3 pgoyette #define if_setdrvflagbits(ifp, s, c) do { \
414 1.2.2.3 pgoyette CLR((ifp)->if_flags, c); \
415 1.2.2.3 pgoyette SET((ifp)->if_flags, s); \
416 1.2.2.3 pgoyette } while (0)
417 1.2.2.3 pgoyette #define if_setflags(ifp, s) SET((ifp)->if_flags, s)
418 1.2.2.3 pgoyette #define if_sethwassistbits(ifp, s, c) do { \
419 1.2.2.3 pgoyette CLR((ifp)->if_csum_flags_rx, c); \
420 1.2.2.3 pgoyette SET((ifp)->if_csum_flags_rx, s); \
421 1.2.2.3 pgoyette } while (0)
422 1.2.2.3 pgoyette #define if_clearhwassist(ifp) (ifp)->if_csum_flags_rx = 0
423 1.2.2.3 pgoyette #define if_setbaudrate(ifp, r) (ifp)->if_baudrate = (r)
424 1.2.2.3 pgoyette #define if_setdev(ifp, dev) do { } while (0)
425 1.2.2.3 pgoyette #define if_setsoftc(ifp, softc) (ifp)->if_softc = (softc)
426 1.2.2.3 pgoyette #define if_setinitfn(ifp, initfn) (ifp)->if_init = (initfn)
427 1.2.2.3 pgoyette #define if_settransmitfn(ifp, txfn) (ifp)->if_transmit = (txfn)
428 1.2.2.3 pgoyette #define if_setioctlfn(ifp, ioctlfn) (ifp)->if_ioctl = (ioctlfn)
429 1.2.2.3 pgoyette #define if_setsendqlen(ifp, sqlen) \
430 1.2.2.3 pgoyette IFQ_SET_MAXLEN(&(ifp)->if_snd, max(sqlen, IFQ_MAXLEN))
431 1.2.2.3 pgoyette #define if_setsendqready(ifp) IFQ_SET_READY(&(ifp)->if_snd)
432 1.2.2.3 pgoyette #define if_setifheaderlen(ifp, len) (ifp)->if_hdrlen = (len)
433 1.2.2.3 pgoyette
434 1.2.2.3 pgoyette #define SBT_1S ((sbintime_t)1 << 32)
435 1.2.2.3 pgoyette #define bintime_clear(a) ((a)->sec = (a)->frac = 0)
436 1.2.2.3 pgoyette #define bintime_isset(a) ((a)->sec || (a)->frac)
437 1.2.2.3 pgoyette
438 1.2.2.3 pgoyette static __inline sbintime_t
439 1.2.2.3 pgoyette bttosbt(const struct bintime _bt)
440 1.2.2.3 pgoyette {
441 1.2.2.3 pgoyette return (((sbintime_t)_bt.sec << 32) + (_bt.frac >> 32));
442 1.2.2.3 pgoyette }
443 1.2.2.3 pgoyette
444 1.2.2.3 pgoyette static __inline sbintime_t
445 1.2.2.3 pgoyette getsbinuptime(void)
446 1.2.2.3 pgoyette {
447 1.2.2.3 pgoyette struct bintime _bt;
448 1.2.2.3 pgoyette
449 1.2.2.3 pgoyette getbinuptime(&_bt);
450 1.2.2.3 pgoyette return (bttosbt(_bt));
451 1.2.2.3 pgoyette }
452 1.2.2.3 pgoyette
453 1.2.2.3 pgoyette /* Intentionally non-atomic, it's just unnecessary overhead */
454 1.2.2.3 pgoyette #define counter_u64_add(x, cnt) (x).ev_count += (cnt)
455 1.2.2.3 pgoyette #define counter_u64_zero(x) (x).ev_count = 0
456 1.2.2.3 pgoyette #define counter_u64_free(x) evcnt_detach(&(x))
457 1.2.2.3 pgoyette
458 1.2.2.3 pgoyette #define counter_u64_add_protected(x, cnt) (x).ev_count += (cnt)
459 1.2.2.3 pgoyette #define counter_enter() do {} while (0)
460 1.2.2.3 pgoyette #define counter_exit() do {} while (0)
461 1.2.2.3 pgoyette
462 1.2.2.3 pgoyette /* Misc other constants */
463 1.2.2.3 pgoyette #define mp_ncpus ncpu
464 1.2.2.3 pgoyette #define osreldate __NetBSD_Version__
465 1.2.2.3 pgoyette
466 1.2.2.3 pgoyette /*
467 1.2.2.3 pgoyette * XXX XXX XXX just to make compile, must provide replacement XXX XXX XXX
468 1.2.2.3 pgoyette * Other than that, TODO:
469 1.2.2.3 pgoyette * - decide whether to import <sys/buf_ring.h>
470 1.2.2.3 pgoyette * - recheck the M_CSUM/IPCAP mapping
471 1.2.2.3 pgoyette * - recheck workqueue use - FreeBSD taskqueues might have different semantics
472 1.2.2.3 pgoyette */
473 1.2.2.3 pgoyette #define buf_ring_alloc(a, b, c, d) (void *)&a
474 1.2.2.3 pgoyette #define drbr_free(ifp, b) do { } while (0)
475 1.2.2.3 pgoyette #define drbr_flush(ifp, b) do { } while (0)
476 1.2.2.3 pgoyette #define drbr_advance(ifp, b) do { } while (0)
477 1.2.2.3 pgoyette #define drbr_putback(ifp, b, m) do { } while (0)
478 1.2.2.3 pgoyette #define drbr_empty(ifp, b) false
479 1.2.2.3 pgoyette #define drbr_peek(ifp, b) NULL
480 1.2.2.3 pgoyette #define drbr_enqueue(ifp, b, m) 0
481 1.2.2.3 pgoyette #define m_getjcl(a, b, c, d) NULL
482 1.2.2.3 pgoyette #define MJUM16BYTES MCLBYTES
483 1.2.2.3 pgoyette #define m_append(m, len, cp) 0
484 1.2.2.3 pgoyette #define m_collapse(m, how, maxfrags) NULL
485 1.2.2.3 pgoyette /* XXX XXX XXX */
486 1.2.2.3 pgoyette
487 1.2.2.2 pgoyette #endif /* !(ENA_H) */
488