if_ena.c revision 1.37 1 /*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifdef _KERNEL_OPT
32 #include "opt_net_mpsafe.h"
33 #endif
34
35 #include <sys/cdefs.h>
36 #if 0
37 __FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $");
38 #endif
39 __KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.37 2023/11/05 18:18:56 jdolecek Exp $");
40
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/bus.h>
44 #include <sys/endian.h>
45 #include <sys/kernel.h>
46 #include <sys/kmem.h>
47 #include <sys/kthread.h>
48 #include <sys/mbuf.h>
49 #include <sys/module.h>
50 #include <sys/socket.h>
51 #include <sys/sockio.h>
52 #include <sys/sysctl.h>
53 #include <sys/time.h>
54 #include <sys/workqueue.h>
55 #include <sys/callout.h>
56 #include <sys/interrupt.h>
57 #include <sys/cpu.h>
58
59 #include <net/if_ether.h>
60 #include <net/if_vlanvar.h>
61
62 #include <dev/pci/if_enavar.h>
63
64 /*********************************************************
65 * Function prototypes
66 *********************************************************/
67 /* cfattach interface functions */
68 static int ena_probe(device_t, cfdata_t, void *);
69 static void ena_attach(device_t, device_t, void *);
70 static int ena_detach(device_t, int);
71
72 /* ifnet interface functions */
73 static int ena_init(struct ifnet *);
74 static void ena_stop(struct ifnet *, int);
75 static int ena_ioctl(struct ifnet *, u_long, void *);
76 static int ena_media_change(struct ifnet *);
77 static void ena_media_status(struct ifnet *, struct ifmediareq *);
78 static int ena_mq_start(struct ifnet *, struct mbuf *);
79
80 /* attach or detach */
81 static int ena_calc_io_queue_num(struct pci_attach_args *,
82 struct ena_adapter *,
83 struct ena_com_dev_get_features_ctx *);
84 static int ena_calc_queue_size(struct ena_adapter *, uint16_t *,
85 uint16_t *, struct ena_com_dev_get_features_ctx *);
86
87 static int ena_allocate_pci_resources(struct pci_attach_args *,
88 struct ena_adapter *);
89 static void ena_free_pci_resources(struct ena_adapter *);
90 static void ena_free_irqs(struct ena_adapter*);
91
92 static void ena_init_io_rings_common(struct ena_adapter *,
93 struct ena_ring *, uint16_t);
94 static void ena_init_io_rings(struct ena_adapter *);
95 static void ena_free_io_ring_resources(struct ena_adapter *, unsigned int);
96 static void ena_free_all_io_rings_resources(struct ena_adapter *);
97
98 static int ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *);
99 static int ena_setup_ifnet(device_t, struct ena_adapter *,
100 struct ena_com_dev_get_features_ctx *);
101 static void ena_rss_init_default(device_t);
102
103 static inline void ena_alloc_counters_rx(struct ena_adapter *,
104 struct ena_stats_rx *, int);
105 static inline void ena_alloc_counters_tx(struct ena_adapter *,
106 struct ena_stats_tx *, int);
107 static inline void ena_alloc_counters_dev(struct ena_adapter *,
108 struct ena_stats_dev *, int);
109 static inline void ena_alloc_counters_hwstats(struct ena_adapter *,
110 struct ena_hw_stats *, int);
111 static inline void ena_free_counters(struct evcnt *, int, int);
112
113 /* attach or detach or ena_reset_task() */
114 static void ena_reset_task(struct work *, void *);
115
116 static void ena_free_mgmnt_irq(struct ena_adapter *);
117 static void ena_disable_msix(struct ena_adapter *);
118 static void ena_config_host_info(struct ena_com_dev *);
119 static int ena_device_init(struct ena_adapter *, device_t,
120 struct ena_com_dev_get_features_ctx *, int *);
121 static int ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *,
122 int);
123 static int ena_enable_msix(struct ena_adapter *);
124 static int ena_request_mgmnt_irq(struct ena_adapter *);
125
126 /* I/F up or down */
127 static int ena_up_complete(struct ena_adapter *);
128 static int ena_up(struct ena_adapter *);
129 static void ena_down(struct ena_adapter *);
130 static void ena_set_stopping_flag(struct ena_adapter *, bool);
131
132 static int ena_setup_rx_resources(struct ena_adapter *, unsigned int);
133 static int ena_setup_all_rx_resources(struct ena_adapter *);
134 static void ena_free_rx_resources(struct ena_adapter *, unsigned int);
135 static void ena_free_all_rx_resources(struct ena_adapter *);
136 static void ena_free_rx_mbuf(struct ena_adapter *, struct ena_ring *,
137 struct ena_rx_buffer *);
138 static void ena_free_rx_bufs(struct ena_adapter *, unsigned int);
139 static void ena_free_all_rx_bufs(struct ena_adapter *);
140
141 static int ena_setup_tx_resources(struct ena_adapter *, int);
142 static int ena_setup_all_tx_resources(struct ena_adapter *);
143 static void ena_free_tx_resources(struct ena_adapter *, int);
144 static void ena_free_all_tx_resources(struct ena_adapter *);
145 static void ena_free_tx_bufs(struct ena_adapter *, unsigned int);
146 static void ena_free_all_tx_bufs(struct ena_adapter *);
147
148 static int ena_request_io_irq(struct ena_adapter *);
149 static void ena_free_io_irq(struct ena_adapter *);
150 static int ena_create_io_queues(struct ena_adapter *);
151 static void ena_destroy_all_tx_queues(struct ena_adapter *);
152 static void ena_destroy_all_rx_queues(struct ena_adapter *);
153 static void ena_destroy_all_io_queues(struct ena_adapter *);
154
155 static void ena_update_hwassist(struct ena_adapter *);
156 static int ena_rss_configure(struct ena_adapter *);
157 static void ena_unmask_all_io_irqs(struct ena_adapter *);
158 static inline void ena_reset_counters(struct evcnt *, int, int);
159
160 /* other hardware interrupt, workqueue, softint context */
161 static int ena_intr_msix_mgmnt(void *);
162 static void ena_update_on_link_change(void *,
163 struct ena_admin_aenq_entry *);
164 static void ena_keep_alive_wd(void *,
165 struct ena_admin_aenq_entry *);
166 static void unimplemented_aenq_handler(void *,
167 struct ena_admin_aenq_entry *);
168
169 static int ena_handle_msix(void *);
170 static void ena_cleanup(struct work *, void *);
171 static inline int validate_rx_req_id(struct ena_ring *, uint16_t);
172 static inline int ena_alloc_rx_mbuf(struct ena_adapter *,
173 struct ena_ring *, struct ena_rx_buffer *);
174 static int ena_refill_rx_bufs(struct ena_ring *, uint32_t);
175 static void ena_refill_all_rx_bufs(struct ena_adapter *);
176 static int ena_rx_cleanup(struct ena_ring *);
177 static struct mbuf* ena_rx_mbuf(struct ena_ring *,
178 struct ena_com_rx_buf_info *,
179 struct ena_com_rx_ctx *, uint16_t *);
180 static inline void ena_rx_checksum(struct ena_ring *,
181 struct ena_com_rx_ctx *, struct mbuf *);
182
183 static int ena_check_and_collapse_mbuf(struct ena_ring *tx_ring,
184 struct mbuf **mbuf);
185 static int ena_xmit_mbuf(struct ena_ring *, struct mbuf **);
186 static void ena_start_xmit(struct ena_ring *);
187 static void ena_deferred_mq_start(struct work *, void *);
188 static int ena_tx_cleanup(struct ena_ring *);
189 static void ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *);
190 static inline int validate_tx_req_id(struct ena_ring *, uint16_t);
191
192 /* other */
193 static int ena_change_mtu(struct ifnet *, int);
194
195 static void ena_timer_service(void *);
196 static void check_for_missing_keep_alive(struct ena_adapter *);
197 static void check_for_admin_com_state(struct ena_adapter *);
198 static int check_missing_comp_in_queue(struct ena_adapter *, struct ena_ring*);
199 static void check_for_missing_tx_completions(struct ena_adapter *);
200 static void check_for_empty_rx_ring(struct ena_adapter *);
201 static void ena_update_host_info(struct ena_admin_host_info *,
202 struct ifnet *);
203
204 #if 0
205 static int ena_setup_tx_dma_tag(struct ena_adapter *);
206 static int ena_free_tx_dma_tag(struct ena_adapter *);
207 static int ena_setup_rx_dma_tag(struct ena_adapter *);
208 static int ena_free_rx_dma_tag(struct ena_adapter *);
209 static void ena_rx_hash_mbuf(struct ena_ring *, struct ena_com_rx_ctx *,
210 struct mbuf *);
211 static uint64_t ena_get_counter(struct ifnet *, ift_counter);
212 static void ena_qflush(struct ifnet *);
213 #endif
214
215 static const char ena_version[] =
216 DEVICE_NAME DRV_MODULE_NAME " v" DRV_MODULE_VERSION;
217
218 #if 0
219 static SYSCTL_NODE(_hw, OID_AUTO, ena, CTLFLAG_RD, 0, "ENA driver parameters");
220 #endif
221
222 /*
223 * Tuneable number of buffers in the buf-ring (drbr)
224 */
225 static int ena_buf_ring_size = 4096;
226 #if 0
227 SYSCTL_INT(_hw_ena, OID_AUTO, buf_ring_size, CTLFLAG_RWTUN,
228 &ena_buf_ring_size, 0, "Size of the bufring");
229 #endif
230
231 /*
232 * Logging level for changing verbosity of the output
233 */
234 int ena_log_level = ENA_ALERT | ENA_WARNING;
235 #if 0
236 SYSCTL_INT(_hw_ena, OID_AUTO, log_level, CTLFLAG_RWTUN,
237 &ena_log_level, 0, "Logging level indicating verbosity of the logs");
238 #endif
239
240 static const ena_vendor_info_t ena_vendor_info_array[] = {
241 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF, 0},
242 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_LLQ_PF, 0},
243 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF, 0},
244 { PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_LLQ_VF, 0},
245 /* Last entry */
246 { 0, 0, 0 }
247 };
248
249 /*
250 * Contains pointers to event handlers, e.g. link state change.
251 */
252 static struct ena_aenq_handlers aenq_handlers;
253
254 int
255 ena_dma_alloc(device_t dmadev, bus_size_t size,
256 ena_mem_handle_t *dma , int mapflags)
257 {
258 struct ena_adapter *adapter = device_private(dmadev);
259 bus_size_t maxsize;
260 int error;
261
262 maxsize = ((size - 1) / PAGE_SIZE + 1) * PAGE_SIZE;
263
264 #if 0
265 /* XXX what is this needed for ? */
266 dma_space_addr = ENA_DMA_BIT_MASK(adapter->dma_width);
267 if (unlikely(dma_space_addr == 0))
268 dma_space_addr = BUS_SPACE_MAXADDR;
269 #endif
270
271 dma->tag = adapter->sc_dmat;
272
273 if ((error = bus_dmamap_create(dma->tag, maxsize, 1, maxsize, 0,
274 BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &dma->map)) != 0) {
275 ena_trace(ENA_ALERT, "bus_dmamap_create(%ju) failed: %d\n",
276 (uintmax_t)maxsize, error);
277 goto fail_create;
278 }
279
280 error = bus_dmamem_alloc(dma->tag, maxsize, 8, 0, &dma->seg, 1, &dma->nseg,
281 BUS_DMA_ALLOCNOW);
282 if (error) {
283 ena_trace(ENA_ALERT, "bus_dmamem_alloc(%ju) failed: %d\n",
284 (uintmax_t)maxsize, error);
285 goto fail_alloc;
286 }
287
288 error = bus_dmamem_map(dma->tag, &dma->seg, dma->nseg, maxsize,
289 &dma->vaddr, BUS_DMA_COHERENT);
290 if (error) {
291 ena_trace(ENA_ALERT, "bus_dmamem_map(%ju) failed: %d\n",
292 (uintmax_t)maxsize, error);
293 goto fail_map;
294 }
295 memset(dma->vaddr, 0, maxsize);
296
297 error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr,
298 maxsize, NULL, mapflags);
299 if (error) {
300 ena_trace(ENA_ALERT, ": bus_dmamap_load failed: %d\n", error);
301 goto fail_load;
302 }
303 dma->paddr = dma->map->dm_segs[0].ds_addr;
304
305 return (0);
306
307 fail_load:
308 bus_dmamem_unmap(dma->tag, dma->vaddr, maxsize);
309 fail_map:
310 bus_dmamem_free(dma->tag, &dma->seg, dma->nseg);
311 fail_alloc:
312 bus_dmamap_destroy(adapter->sc_dmat, dma->map);
313 fail_create:
314 return (error);
315 }
316
317 static int
318 ena_allocate_pci_resources(struct pci_attach_args *pa,
319 struct ena_adapter *adapter)
320 {
321 pcireg_t memtype, reg;
322 int flags, error;
323 int msixoff;
324
325 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, ENA_REG_BAR);
326 if (PCI_MAPREG_TYPE(memtype) != PCI_MAPREG_TYPE_MEM) {
327 aprint_error_dev(adapter->pdev, "invalid type (type=0x%x)\n",
328 memtype);
329 return ENXIO;
330 }
331 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
332 if (((reg & PCI_COMMAND_MASTER_ENABLE) == 0) ||
333 ((reg & PCI_COMMAND_MEM_ENABLE) == 0)) {
334 /*
335 * Enable address decoding for memory range in case BIOS or
336 * UEFI didn't set it.
337 */
338 reg |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_MEM_ENABLE;
339 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
340 reg);
341 }
342
343 adapter->sc_btag = pa->pa_memt;
344 error = pci_mapreg_info(pa->pa_pc, pa->pa_tag, ENA_REG_BAR,
345 memtype, &adapter->sc_memaddr, &adapter->sc_mapsize, &flags);
346 if (error) {
347 aprint_error_dev(adapter->pdev, "can't get map info\n");
348 return ENXIO;
349 }
350
351 if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_MSIX, &msixoff,
352 NULL)) {
353 pcireg_t msixtbl;
354 bus_size_t table_offset;
355 int bir;
356
357 msixtbl = pci_conf_read(pa->pa_pc, pa->pa_tag,
358 msixoff + PCI_MSIX_TBLOFFSET);
359 table_offset = msixtbl & PCI_MSIX_TBLOFFSET_MASK;
360 bir = msixtbl & PCI_MSIX_TBLBIR_MASK;
361 if (bir == PCI_MAPREG_NUM(ENA_REG_BAR))
362 adapter->sc_mapsize = table_offset;
363 }
364
365 error = bus_space_map(adapter->sc_btag, adapter->sc_memaddr,
366 adapter->sc_mapsize, flags, &adapter->sc_bhandle);
367 if (error != 0) {
368 aprint_error_dev(adapter->pdev,
369 "can't map mem space (error=%d)\n", error);
370 return ENXIO;
371 }
372
373 return (0);
374 }
375
376 static void
377 ena_free_pci_resources(struct ena_adapter *adapter)
378 {
379 if (adapter->sc_mapsize != 0) {
380 bus_space_unmap(adapter->sc_btag, adapter->sc_bhandle,
381 adapter->sc_mapsize);
382 }
383 }
384
385 static int
386 ena_probe(device_t parent, cfdata_t match, void *aux)
387 {
388 struct pci_attach_args *pa = aux;
389 const ena_vendor_info_t *ent;
390
391 for (int i = 0; i < __arraycount(ena_vendor_info_array); i++) {
392 ent = &ena_vendor_info_array[i];
393
394 if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
395 (PCI_PRODUCT(pa->pa_id) == ent->device_id)) {
396 return 1;
397 }
398 }
399
400 return 0;
401 }
402
403 static int
404 ena_change_mtu(struct ifnet *ifp, int new_mtu)
405 {
406 struct ena_adapter *adapter = if_getsoftc(ifp);
407 int rc;
408
409 if ((new_mtu > adapter->max_mtu) || (new_mtu < ENA_MIN_MTU)) {
410 device_printf(adapter->pdev, "Invalid MTU setting. "
411 "new_mtu: %d max mtu: %d min mtu: %d\n",
412 new_mtu, adapter->max_mtu, ENA_MIN_MTU);
413 return (EINVAL);
414 }
415
416 rc = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu);
417 if (likely(rc == 0)) {
418 ena_trace(ENA_DBG, "set MTU to %d\n", new_mtu);
419 if_setmtu(ifp, new_mtu);
420 } else {
421 device_printf(adapter->pdev, "Failed to set MTU to %d\n",
422 new_mtu);
423 }
424
425 return (rc);
426 }
427
428 #define EVCNT_INIT(st, f) \
429 do { \
430 evcnt_attach_dynamic(&st->f, EVCNT_TYPE_MISC, NULL, \
431 st->name, #f); \
432 } while (0)
433
434 static inline void
435 ena_alloc_counters_rx(struct ena_adapter *adapter, struct ena_stats_rx *st, int queue)
436 {
437 snprintf(st->name, sizeof(st->name), "%s rxq%d",
438 device_xname(adapter->pdev), queue);
439
440 EVCNT_INIT(st, cnt);
441 EVCNT_INIT(st, bytes);
442 EVCNT_INIT(st, refil_partial);
443 EVCNT_INIT(st, bad_csum);
444 EVCNT_INIT(st, mbuf_alloc_fail);
445 EVCNT_INIT(st, dma_mapping_err);
446 EVCNT_INIT(st, bad_desc_num);
447 EVCNT_INIT(st, bad_req_id);
448 EVCNT_INIT(st, empty_rx_ring);
449
450 /* Make sure all code is updated when new fields added */
451 CTASSERT(offsetof(struct ena_stats_rx, empty_rx_ring)
452 + sizeof(st->empty_rx_ring) == sizeof(*st));
453 }
454
455 static inline void
456 ena_alloc_counters_tx(struct ena_adapter *adapter, struct ena_stats_tx *st, int queue)
457 {
458 snprintf(st->name, sizeof(st->name), "%s txq%d",
459 device_xname(adapter->pdev), queue);
460
461 EVCNT_INIT(st, cnt);
462 EVCNT_INIT(st, bytes);
463 EVCNT_INIT(st, prepare_ctx_err);
464 EVCNT_INIT(st, dma_mapping_err);
465 EVCNT_INIT(st, doorbells);
466 EVCNT_INIT(st, missing_tx_comp);
467 EVCNT_INIT(st, bad_req_id);
468 EVCNT_INIT(st, collapse);
469 EVCNT_INIT(st, collapse_err);
470 EVCNT_INIT(st, pcq_drops);
471
472 /* Make sure all code is updated when new fields added */
473 CTASSERT(offsetof(struct ena_stats_tx, pcq_drops)
474 + sizeof(st->pcq_drops) == sizeof(*st));
475 }
476
477 static inline void
478 ena_alloc_counters_dev(struct ena_adapter *adapter, struct ena_stats_dev *st, int queue)
479 {
480 snprintf(st->name, sizeof(st->name), "%s dev ioq%d",
481 device_xname(adapter->pdev), queue);
482
483 EVCNT_INIT(st, wd_expired);
484 EVCNT_INIT(st, interface_up);
485 EVCNT_INIT(st, interface_down);
486 EVCNT_INIT(st, admin_q_pause);
487
488 /* Make sure all code is updated when new fields added */
489 CTASSERT(offsetof(struct ena_stats_dev, admin_q_pause)
490 + sizeof(st->admin_q_pause) == sizeof(*st));
491 }
492
493 static inline void
494 ena_alloc_counters_hwstats(struct ena_adapter *adapter, struct ena_hw_stats *st, int queue)
495 {
496 snprintf(st->name, sizeof(st->name), "%s hw ioq%d",
497 device_xname(adapter->pdev), queue);
498
499 EVCNT_INIT(st, rx_packets);
500 EVCNT_INIT(st, tx_packets);
501 EVCNT_INIT(st, rx_bytes);
502 EVCNT_INIT(st, tx_bytes);
503 EVCNT_INIT(st, rx_drops);
504
505 /* Make sure all code is updated when new fields added */
506 CTASSERT(offsetof(struct ena_hw_stats, rx_drops)
507 + sizeof(st->rx_drops) == sizeof(*st));
508 }
509 static inline void
510 ena_free_counters(struct evcnt *begin, int size, int offset)
511 {
512 struct evcnt *end = (struct evcnt *)((char *)begin + size);
513 begin = (struct evcnt *)((char *)begin + offset);
514
515 for (; begin < end; ++begin)
516 counter_u64_free(*begin);
517 }
518
519 static inline void
520 ena_reset_counters(struct evcnt *begin, int size, int offset)
521 {
522 struct evcnt *end = (struct evcnt *)((char *)begin + size);
523 begin = (struct evcnt *)((char *)begin + offset);
524
525 for (; begin < end; ++begin)
526 counter_u64_zero(*begin);
527 }
528
529 static void
530 ena_init_io_rings_common(struct ena_adapter *adapter, struct ena_ring *ring,
531 uint16_t qid)
532 {
533
534 ring->qid = qid;
535 ring->adapter = adapter;
536 ring->ena_dev = adapter->ena_dev;
537 }
538
539 static void
540 ena_init_io_rings(struct ena_adapter *adapter)
541 {
542 struct ena_com_dev *ena_dev;
543 struct ena_ring *txr, *rxr;
544 struct ena_que *que;
545 int i;
546
547 ena_dev = adapter->ena_dev;
548
549 for (i = 0; i < adapter->num_queues; i++) {
550 txr = &adapter->tx_ring[i];
551 rxr = &adapter->rx_ring[i];
552
553 /* TX/RX common ring state */
554 ena_init_io_rings_common(adapter, txr, i);
555 ena_init_io_rings_common(adapter, rxr, i);
556
557 /* TX specific ring state */
558 txr->ring_size = adapter->tx_ring_size;
559 txr->tx_max_header_size = ena_dev->tx_max_header_size;
560 txr->tx_mem_queue_type = ena_dev->tx_mem_queue_type;
561 txr->smoothed_interval =
562 ena_com_get_nonadaptive_moderation_interval_tx(ena_dev);
563
564 /* Allocate a buf ring */
565 txr->br = buf_ring_alloc(ena_buf_ring_size, M_DEVBUF,
566 M_WAITOK, &txr->ring_mtx);
567
568 /* Alloc TX statistics. */
569 ena_alloc_counters_tx(adapter, &txr->tx_stats, i);
570
571 /* RX specific ring state */
572 rxr->ring_size = adapter->rx_ring_size;
573 rxr->smoothed_interval =
574 ena_com_get_nonadaptive_moderation_interval_rx(ena_dev);
575
576 /* Alloc RX statistics. */
577 ena_alloc_counters_rx(adapter, &rxr->rx_stats, i);
578
579 /* Initialize locks */
580 snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)",
581 device_xname(adapter->pdev), i);
582 snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)",
583 device_xname(adapter->pdev), i);
584
585 mutex_init(&txr->ring_mtx, MUTEX_DEFAULT, IPL_NET);
586 mutex_init(&rxr->ring_mtx, MUTEX_DEFAULT, IPL_NET);
587
588 que = &adapter->que[i];
589 que->adapter = adapter;
590 que->id = i;
591 que->tx_ring = txr;
592 que->rx_ring = rxr;
593
594 txr->que = que;
595 rxr->que = que;
596
597 rxr->empty_rx_queue = 0;
598 }
599 }
600
601 static void
602 ena_free_io_ring_resources(struct ena_adapter *adapter, unsigned int qid)
603 {
604 struct ena_ring *txr = &adapter->tx_ring[qid];
605 struct ena_ring *rxr = &adapter->rx_ring[qid];
606
607 ena_free_counters((struct evcnt *)&txr->tx_stats,
608 sizeof(txr->tx_stats), offsetof(struct ena_stats_tx, cnt));
609 ena_free_counters((struct evcnt *)&rxr->rx_stats,
610 sizeof(rxr->rx_stats), offsetof(struct ena_stats_rx, cnt));
611
612 mutex_destroy(&txr->ring_mtx);
613 mutex_destroy(&rxr->ring_mtx);
614 }
615
616 static void
617 ena_free_all_io_rings_resources(struct ena_adapter *adapter)
618 {
619 int i;
620
621 for (i = 0; i < adapter->num_queues; i++)
622 ena_free_io_ring_resources(adapter, i);
623
624 }
625
626 #if 0
627 static int
628 ena_setup_tx_dma_tag(struct ena_adapter *adapter)
629 {
630 int ret;
631
632 /* Create DMA tag for Tx buffers */
633 ret = bus_dma_tag_create(bus_get_dma_tag(adapter->pdev),
634 1, 0, /* alignment, bounds */
635 ENA_DMA_BIT_MASK(adapter->dma_width), /* lowaddr of excl window */
636 BUS_SPACE_MAXADDR, /* highaddr of excl window */
637 NULL, NULL, /* filter, filterarg */
638 ENA_TSO_MAXSIZE, /* maxsize */
639 adapter->max_tx_sgl_size - 1, /* nsegments */
640 ENA_TSO_MAXSIZE, /* maxsegsize */
641 0, /* flags */
642 NULL, /* lockfunc */
643 NULL, /* lockfuncarg */
644 &adapter->tx_buf_tag);
645
646 return (ret);
647 }
648 #endif
649
650 #if 0
651 static int
652 ena_setup_rx_dma_tag(struct ena_adapter *adapter)
653 {
654 int ret;
655
656 /* Create DMA tag for Rx buffers*/
657 ret = bus_dma_tag_create(bus_get_dma_tag(adapter->pdev), /* parent */
658 1, 0, /* alignment, bounds */
659 ENA_DMA_BIT_MASK(adapter->dma_width), /* lowaddr of excl window */
660 BUS_SPACE_MAXADDR, /* highaddr of excl window */
661 NULL, NULL, /* filter, filterarg */
662 MJUM16BYTES, /* maxsize */
663 adapter->max_rx_sgl_size, /* nsegments */
664 MJUM16BYTES, /* maxsegsize */
665 0, /* flags */
666 NULL, /* lockfunc */
667 NULL, /* lockarg */
668 &adapter->rx_buf_tag);
669
670 return (ret);
671 }
672 #endif
673
674 /**
675 * ena_setup_tx_resources - allocate Tx resources (Descriptors)
676 * @adapter: network interface device structure
677 * @qid: queue index
678 *
679 * Returns 0 on success, otherwise on failure.
680 **/
681 static int
682 ena_setup_tx_resources(struct ena_adapter *adapter, int qid)
683 {
684 struct ena_que *que = &adapter->que[qid];
685 struct ena_ring *tx_ring = que->tx_ring;
686 int size, i, err;
687
688 size = sizeof(struct ena_tx_buffer) * tx_ring->ring_size;
689 tx_ring->tx_buffer_info = kmem_zalloc(size, KM_SLEEP);
690
691 size = sizeof(uint16_t) * tx_ring->ring_size;
692 tx_ring->free_tx_ids = kmem_zalloc(size, KM_SLEEP);
693
694 /* Req id stack for TX OOO completions */
695 for (i = 0; i < tx_ring->ring_size; i++)
696 tx_ring->free_tx_ids[i] = i;
697
698 /* Reset TX statistics. */
699 ena_reset_counters((struct evcnt *)&tx_ring->tx_stats,
700 sizeof(tx_ring->tx_stats),
701 offsetof(struct ena_stats_tx, cnt));
702
703 tx_ring->next_to_use = 0;
704 tx_ring->next_to_clean = 0;
705
706 tx_ring->br = pcq_create(ENA_DEFAULT_RING_SIZE, KM_SLEEP);
707
708 /* ... and create the buffer DMA maps */
709 for (i = 0; i < tx_ring->ring_size; i++) {
710 err = bus_dmamap_create(adapter->sc_dmat,
711 ENA_TSO_MAXSIZE, adapter->max_tx_sgl_size - 1,
712 ENA_TSO_MAXSIZE, 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW,
713 &tx_ring->tx_buffer_info[i].map);
714 if (unlikely(err != 0)) {
715 ena_trace(ENA_ALERT,
716 "Unable to create Tx DMA map for buffer %d\n", i);
717 goto err_buf_info_unmap;
718 }
719 }
720
721 /* Allocate workqueues */
722 int rc = workqueue_create(&tx_ring->enqueue_tq, "ena_tx_enq",
723 ena_deferred_mq_start, tx_ring, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
724 if (unlikely(rc != 0)) {
725 ena_trace(ENA_ALERT,
726 "Unable to create workqueue for enqueue task\n");
727 i = tx_ring->ring_size;
728 goto err_buf_info_unmap;
729 }
730 return (0);
731
732 err_buf_info_unmap:
733 while (i--) {
734 bus_dmamap_destroy(adapter->sc_dmat,
735 tx_ring->tx_buffer_info[i].map);
736 }
737 size = sizeof(uint16_t) * tx_ring->ring_size;
738 kmem_free(tx_ring->free_tx_ids, size);
739 tx_ring->free_tx_ids = NULL;
740 size = sizeof(struct ena_tx_buffer) * tx_ring->ring_size;
741 kmem_free(tx_ring->tx_buffer_info, size);
742 tx_ring->tx_buffer_info = NULL;
743
744 return (ENOMEM);
745 }
746
747 /**
748 * ena_free_tx_resources - Free Tx Resources per Queue
749 * @adapter: network interface device structure
750 * @qid: queue index
751 *
752 * Free all transmit software resources
753 **/
754 static void
755 ena_free_tx_resources(struct ena_adapter *adapter, int qid)
756 {
757 struct ena_ring *tx_ring = &adapter->tx_ring[qid];
758 struct mbuf *m;
759
760 workqueue_wait(tx_ring->enqueue_tq, &tx_ring->enqueue_task);
761 workqueue_destroy(tx_ring->enqueue_tq);
762 tx_ring->enqueue_tq = NULL;
763
764 /* Flush buffer ring, */
765 while ((m = pcq_get(tx_ring->br)) != NULL)
766 m_freem(m);
767 pcq_destroy(tx_ring->br);
768 tx_ring->br = NULL;
769
770 /* Free buffer DMA maps, */
771 for (int i = 0; i < tx_ring->ring_size; i++) {
772 bus_dmamap_unload(adapter->sc_dmat,
773 tx_ring->tx_buffer_info[i].map);
774 bus_dmamap_destroy(adapter->sc_dmat,
775 tx_ring->tx_buffer_info[i].map);
776 m_freem(tx_ring->tx_buffer_info[i].mbuf);
777 tx_ring->tx_buffer_info[i].mbuf = NULL;
778 }
779
780 /* And free allocated memory. */
781 kmem_free(tx_ring->tx_buffer_info,
782 sizeof(struct ena_tx_buffer) * tx_ring->ring_size);
783 tx_ring->tx_buffer_info = NULL;
784
785 kmem_free(tx_ring->free_tx_ids, sizeof(uint16_t) * tx_ring->ring_size);
786 tx_ring->free_tx_ids = NULL;
787 }
788
789 /**
790 * ena_setup_all_tx_resources - allocate all queues Tx resources
791 * @adapter: network interface device structure
792 *
793 * Returns 0 on success, otherwise on failure.
794 **/
795 static int
796 ena_setup_all_tx_resources(struct ena_adapter *adapter)
797 {
798 int i, rc;
799
800 for (i = 0; i < adapter->num_queues; i++) {
801 rc = ena_setup_tx_resources(adapter, i);
802 if (rc != 0) {
803 device_printf(adapter->pdev,
804 "Allocation for Tx Queue %u failed\n", i);
805 goto err_setup_tx;
806 }
807 }
808
809 return (0);
810
811 err_setup_tx:
812 /* Rewind the index freeing the rings as we go */
813 while (i--)
814 ena_free_tx_resources(adapter, i);
815 return (rc);
816 }
817
818 /**
819 * ena_free_all_tx_resources - Free Tx Resources for All Queues
820 * @adapter: network interface device structure
821 *
822 * Free all transmit software resources
823 **/
824 static void
825 ena_free_all_tx_resources(struct ena_adapter *adapter)
826 {
827 int i;
828
829 for (i = 0; i < adapter->num_queues; i++)
830 ena_free_tx_resources(adapter, i);
831 }
832
833 static inline int
834 validate_rx_req_id(struct ena_ring *rx_ring, uint16_t req_id)
835 {
836 if (likely(req_id < rx_ring->ring_size))
837 return (0);
838
839 device_printf(rx_ring->adapter->pdev, "Invalid rx req_id: %hu\n",
840 req_id);
841 counter_u64_add(rx_ring->rx_stats.bad_req_id, 1);
842
843 /* Trigger device reset */
844 rx_ring->adapter->reset_reason = ENA_REGS_RESET_INV_RX_REQ_ID;
845 ENA_FLAG_SET_ATOMIC(ENA_FLAG_TRIGGER_RESET, rx_ring->adapter);
846
847 return (EFAULT);
848 }
849
850 /**
851 * ena_setup_rx_resources - allocate Rx resources (Descriptors)
852 * @adapter: network interface device structure
853 * @qid: queue index
854 *
855 * Returns 0 on success, otherwise on failure.
856 **/
857 static int
858 ena_setup_rx_resources(struct ena_adapter *adapter, unsigned int qid)
859 {
860 struct ena_que *que = &adapter->que[qid];
861 struct ena_ring *rx_ring = que->rx_ring;
862 int size, err, i;
863
864 size = sizeof(struct ena_rx_buffer) * rx_ring->ring_size;
865
866 /*
867 * Alloc extra element so in rx path
868 * we can always prefetch rx_info + 1
869 */
870 size += sizeof(struct ena_rx_buffer);
871
872 rx_ring->rx_buffer_info = kmem_zalloc(size, KM_SLEEP);
873
874 size = sizeof(uint16_t) * rx_ring->ring_size;
875 rx_ring->free_rx_ids = kmem_zalloc(size, KM_SLEEP);
876
877 for (i = 0; i < rx_ring->ring_size; i++)
878 rx_ring->free_rx_ids[i] = i;
879
880 /* Reset RX statistics. */
881 ena_reset_counters((struct evcnt *)&rx_ring->rx_stats,
882 sizeof(rx_ring->rx_stats),
883 offsetof(struct ena_stats_rx, cnt));
884
885 rx_ring->next_to_clean = 0;
886 rx_ring->next_to_use = 0;
887
888 /* ... and create the buffer DMA maps */
889 for (i = 0; i < rx_ring->ring_size; i++) {
890 err = bus_dmamap_create(adapter->sc_dmat,
891 MJUM16BYTES, adapter->max_rx_sgl_size, MJUM16BYTES,
892 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW,
893 &(rx_ring->rx_buffer_info[i].map));
894 if (err != 0) {
895 ena_trace(ENA_ALERT,
896 "Unable to create Rx DMA map for buffer %d\n", i);
897 goto err_buf_info_unmap;
898 }
899 }
900
901 #ifdef LRO
902 /* Create LRO for the ring */
903 if ((adapter->ifp->if_capenable & IFCAP_LRO) != 0) {
904 int err = tcp_lro_init(&rx_ring->lro);
905 if (err != 0) {
906 device_printf(adapter->pdev,
907 "LRO[%d] Initialization failed!\n", qid);
908 } else {
909 ena_trace(ENA_INFO,
910 "RX Soft LRO[%d] Initialized\n", qid);
911 rx_ring->lro.ifp = adapter->ifp;
912 }
913 }
914 #endif
915
916 /* Allocate workqueues */
917 int rc = workqueue_create(&rx_ring->cleanup_tq, "ena_rx_comp",
918 ena_cleanup, que, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
919 if (unlikely(rc != 0)) {
920 ena_trace(ENA_ALERT,
921 "Unable to create workqueue for RX completion task\n");
922 goto err_buf_info_unmap;
923 }
924
925 return (0);
926
927 err_buf_info_unmap:
928 while (i--) {
929 bus_dmamap_destroy(adapter->sc_dmat,
930 rx_ring->rx_buffer_info[i].map);
931 }
932
933 size = sizeof(uint16_t) * rx_ring->ring_size;
934 kmem_free(rx_ring->free_rx_ids, size);
935 rx_ring->free_rx_ids = NULL;
936 size = sizeof(struct ena_rx_buffer) * (rx_ring->ring_size + 1);
937 kmem_free(rx_ring->rx_buffer_info, size);
938 rx_ring->rx_buffer_info = NULL;
939 return (ENOMEM);
940 }
941
942 /**
943 * ena_free_rx_resources - Free Rx Resources
944 * @adapter: network interface device structure
945 * @qid: queue index
946 *
947 * Free all receive software resources
948 **/
949 static void
950 ena_free_rx_resources(struct ena_adapter *adapter, unsigned int qid)
951 {
952 struct ena_ring *rx_ring = &adapter->rx_ring[qid];
953
954 workqueue_wait(rx_ring->cleanup_tq, &rx_ring->cleanup_task);
955 workqueue_destroy(rx_ring->cleanup_tq);
956 rx_ring->cleanup_tq = NULL;
957
958 /* Free buffer DMA maps, */
959 for (int i = 0; i < rx_ring->ring_size; i++) {
960 bus_dmamap_unload(adapter->sc_dmat,
961 rx_ring->rx_buffer_info[i].map);
962 bus_dmamap_destroy(adapter->sc_dmat,
963 rx_ring->rx_buffer_info[i].map);
964 m_freem(rx_ring->rx_buffer_info[i].mbuf);
965 rx_ring->rx_buffer_info[i].mbuf = NULL;
966 }
967
968 #ifdef LRO
969 /* free LRO resources, */
970 tcp_lro_free(&rx_ring->lro);
971 #endif
972
973 /* free allocated memory */
974 kmem_free(rx_ring->rx_buffer_info,
975 sizeof(struct ena_rx_buffer) * (rx_ring->ring_size + 1));
976 rx_ring->rx_buffer_info = NULL;
977
978 kmem_free(rx_ring->free_rx_ids, sizeof(uint16_t) * rx_ring->ring_size);
979 rx_ring->free_rx_ids = NULL;
980 }
981
982 /**
983 * ena_setup_all_rx_resources - allocate all queues Rx resources
984 * @adapter: network interface device structure
985 *
986 * Returns 0 on success, otherwise on failure.
987 **/
988 static int
989 ena_setup_all_rx_resources(struct ena_adapter *adapter)
990 {
991 int i, rc = 0;
992
993 for (i = 0; i < adapter->num_queues; i++) {
994 rc = ena_setup_rx_resources(adapter, i);
995 if (rc != 0) {
996 device_printf(adapter->pdev,
997 "Allocation for Rx Queue %u failed\n", i);
998 goto err_setup_rx;
999 }
1000 }
1001 return (0);
1002
1003 err_setup_rx:
1004 /* rewind the index freeing the rings as we go */
1005 while (i--)
1006 ena_free_rx_resources(adapter, i);
1007 return (rc);
1008 }
1009
1010 /**
1011 * ena_free_all_rx_resources - Free Rx resources for all queues
1012 * @adapter: network interface device structure
1013 *
1014 * Free all receive software resources
1015 **/
1016 static void
1017 ena_free_all_rx_resources(struct ena_adapter *adapter)
1018 {
1019 int i;
1020
1021 for (i = 0; i < adapter->num_queues; i++)
1022 ena_free_rx_resources(adapter, i);
1023 }
1024
1025 static inline int
1026 ena_alloc_rx_mbuf(struct ena_adapter *adapter,
1027 struct ena_ring *rx_ring, struct ena_rx_buffer *rx_info)
1028 {
1029 struct ena_com_buf *ena_buf;
1030 int error;
1031 int mlen;
1032
1033 /* if previous allocated frag is not used */
1034 if (unlikely(rx_info->mbuf != NULL))
1035 return (0);
1036
1037 rx_info->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1038 if (unlikely(rx_info->mbuf == NULL)) {
1039 counter_u64_add(rx_ring->rx_stats.mbuf_alloc_fail, 1);
1040 return (ENOMEM);
1041 }
1042 mlen = MCLBYTES;
1043
1044 /* Set mbuf length*/
1045 rx_info->mbuf->m_pkthdr.len = rx_info->mbuf->m_len = mlen;
1046
1047 /* Map packets for DMA */
1048 ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
1049 "Using tag %p for buffers' DMA mapping, mbuf %p len: %d",
1050 adapter->sc_dmat,rx_info->mbuf, rx_info->mbuf->m_len);
1051 error = bus_dmamap_load_mbuf(adapter->sc_dmat, rx_info->map,
1052 rx_info->mbuf, BUS_DMA_NOWAIT);
1053 if (unlikely((error != 0) || (rx_info->map->dm_nsegs != 1))) {
1054 ena_trace(ENA_WARNING, "failed to map mbuf, error: %d, "
1055 "nsegs: %d\n", error, rx_info->map->dm_nsegs);
1056 counter_u64_add(rx_ring->rx_stats.dma_mapping_err, 1);
1057 goto exit;
1058
1059 }
1060
1061 bus_dmamap_sync(adapter->sc_dmat, rx_info->map, 0,
1062 rx_info->map->dm_mapsize, BUS_DMASYNC_PREREAD);
1063
1064 ena_buf = &rx_info->ena_buf;
1065 ena_buf->paddr = rx_info->map->dm_segs[0].ds_addr;
1066 ena_buf->len = mlen;
1067
1068 ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
1069 "ALLOC RX BUF: mbuf %p, rx_info %p, len %d, paddr %#jx\n",
1070 rx_info->mbuf, rx_info,ena_buf->len, (uintmax_t)ena_buf->paddr);
1071
1072 return (0);
1073
1074 exit:
1075 m_freem(rx_info->mbuf);
1076 rx_info->mbuf = NULL;
1077 return (EFAULT);
1078 }
1079
1080 static void
1081 ena_free_rx_mbuf(struct ena_adapter *adapter, struct ena_ring *rx_ring,
1082 struct ena_rx_buffer *rx_info)
1083 {
1084
1085 if (rx_info->mbuf == NULL) {
1086 ena_trace(ENA_WARNING, "Trying to free unallocated buffer\n");
1087 return;
1088 }
1089
1090 bus_dmamap_unload(adapter->sc_dmat, rx_info->map);
1091 m_freem(rx_info->mbuf);
1092 rx_info->mbuf = NULL;
1093 }
1094
1095 /**
1096 * ena_refill_rx_bufs - Refills ring with descriptors
1097 * @rx_ring: the ring which we want to feed with free descriptors
1098 * @num: number of descriptors to refill
1099 * Refills the ring with newly allocated DMA-mapped mbufs for receiving
1100 **/
1101 static int
1102 ena_refill_rx_bufs(struct ena_ring *rx_ring, uint32_t num)
1103 {
1104 struct ena_adapter *adapter = rx_ring->adapter;
1105 uint16_t next_to_use, req_id;
1106 uint32_t i;
1107 int rc;
1108
1109 ena_trace(ENA_DBG | ENA_RXPTH | ENA_RSC, "refill qid: %d",
1110 rx_ring->qid);
1111
1112 next_to_use = rx_ring->next_to_use;
1113
1114 for (i = 0; i < num; i++) {
1115 struct ena_rx_buffer *rx_info;
1116
1117 ena_trace(ENA_DBG | ENA_RXPTH | ENA_RSC,
1118 "RX buffer - next to use: %d", next_to_use);
1119
1120 req_id = rx_ring->free_rx_ids[next_to_use];
1121 rc = validate_rx_req_id(rx_ring, req_id);
1122 if (unlikely(rc != 0))
1123 break;
1124
1125 rx_info = &rx_ring->rx_buffer_info[req_id];
1126
1127 rc = ena_alloc_rx_mbuf(adapter, rx_ring, rx_info);
1128 if (unlikely(rc != 0)) {
1129 ena_trace(ENA_WARNING,
1130 "failed to alloc buffer for rx queue %d\n",
1131 rx_ring->qid);
1132 break;
1133 }
1134 rc = ena_com_add_single_rx_desc(rx_ring->ena_com_io_sq,
1135 &rx_info->ena_buf, req_id);
1136 if (unlikely(rc != 0)) {
1137 ena_trace(ENA_WARNING,
1138 "failed to add buffer for rx queue %d\n",
1139 rx_ring->qid);
1140 break;
1141 }
1142 next_to_use = ENA_RX_RING_IDX_NEXT(next_to_use,
1143 rx_ring->ring_size);
1144 }
1145
1146 if (unlikely(i < num)) {
1147 counter_u64_add(rx_ring->rx_stats.refil_partial, 1);
1148 ena_trace(ENA_WARNING,
1149 "refilled rx qid %d with only %d mbufs (from %d)\n",
1150 rx_ring->qid, i, num);
1151 }
1152
1153 if (likely(i != 0)) {
1154 wmb();
1155 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1156 }
1157 rx_ring->next_to_use = next_to_use;
1158 return (i);
1159 }
1160
1161 static void
1162 ena_free_rx_bufs(struct ena_adapter *adapter, unsigned int qid)
1163 {
1164 struct ena_ring *rx_ring = &adapter->rx_ring[qid];
1165 unsigned int i;
1166
1167 for (i = 0; i < rx_ring->ring_size; i++) {
1168 struct ena_rx_buffer *rx_info = &rx_ring->rx_buffer_info[i];
1169
1170 if (rx_info->mbuf != NULL)
1171 ena_free_rx_mbuf(adapter, rx_ring, rx_info);
1172 }
1173 }
1174
1175 /**
1176 * ena_refill_all_rx_bufs - allocate all queues Rx buffers
1177 * @adapter: network interface device structure
1178 *
1179 */
1180 static void
1181 ena_refill_all_rx_bufs(struct ena_adapter *adapter)
1182 {
1183 struct ena_ring *rx_ring;
1184 int i, rc, bufs_num;
1185
1186 for (i = 0; i < adapter->num_queues; i++) {
1187 rx_ring = &adapter->rx_ring[i];
1188 bufs_num = rx_ring->ring_size - 1;
1189 rc = ena_refill_rx_bufs(rx_ring, bufs_num);
1190
1191 if (unlikely(rc != bufs_num))
1192 ena_trace(ENA_WARNING, "refilling Queue %d failed. "
1193 "Allocated %d buffers from: %d\n", i, rc, bufs_num);
1194 }
1195 }
1196
1197 static void
1198 ena_free_all_rx_bufs(struct ena_adapter *adapter)
1199 {
1200 int i;
1201
1202 for (i = 0; i < adapter->num_queues; i++)
1203 ena_free_rx_bufs(adapter, i);
1204 }
1205
1206 /**
1207 * ena_free_tx_bufs - Free Tx Buffers per Queue
1208 * @adapter: network interface device structure
1209 * @qid: queue index
1210 **/
1211 static void
1212 ena_free_tx_bufs(struct ena_adapter *adapter, unsigned int qid)
1213 {
1214 bool print_once = true;
1215 struct ena_ring *tx_ring = &adapter->tx_ring[qid];
1216
1217 for (int i = 0; i < tx_ring->ring_size; i++) {
1218 struct ena_tx_buffer *tx_info = &tx_ring->tx_buffer_info[i];
1219
1220 if (tx_info->mbuf == NULL)
1221 continue;
1222
1223 if (print_once) {
1224 device_printf(adapter->pdev,
1225 "free uncompleted tx mbuf qid %d idx 0x%x",
1226 qid, i);
1227 print_once = false;
1228 } else {
1229 ena_trace(ENA_DBG,
1230 "free uncompleted tx mbuf qid %d idx 0x%x",
1231 qid, i);
1232 }
1233
1234 bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
1235 m_free(tx_info->mbuf);
1236 tx_info->mbuf = NULL;
1237 }
1238 }
1239
1240 static void
1241 ena_free_all_tx_bufs(struct ena_adapter *adapter)
1242 {
1243
1244 for (int i = 0; i < adapter->num_queues; i++)
1245 ena_free_tx_bufs(adapter, i);
1246 }
1247
1248 static void
1249 ena_destroy_all_tx_queues(struct ena_adapter *adapter)
1250 {
1251 uint16_t ena_qid;
1252 int i;
1253
1254 for (i = 0; i < adapter->num_queues; i++) {
1255 ena_qid = ENA_IO_TXQ_IDX(i);
1256 ena_com_destroy_io_queue(adapter->ena_dev, ena_qid);
1257 }
1258 }
1259
1260 static void
1261 ena_destroy_all_rx_queues(struct ena_adapter *adapter)
1262 {
1263 uint16_t ena_qid;
1264 int i;
1265
1266 for (i = 0; i < adapter->num_queues; i++) {
1267 ena_qid = ENA_IO_RXQ_IDX(i);
1268 ena_com_destroy_io_queue(adapter->ena_dev, ena_qid);
1269 }
1270 }
1271
1272 static void
1273 ena_destroy_all_io_queues(struct ena_adapter *adapter)
1274 {
1275 ena_destroy_all_tx_queues(adapter);
1276 ena_destroy_all_rx_queues(adapter);
1277 }
1278
1279 static inline int
1280 validate_tx_req_id(struct ena_ring *tx_ring, uint16_t req_id)
1281 {
1282 struct ena_adapter *adapter = tx_ring->adapter;
1283 struct ena_tx_buffer *tx_info = NULL;
1284 KASSERT(ENA_RING_MTX_OWNED(tx_ring));
1285
1286 if (likely(req_id < tx_ring->ring_size)) {
1287 tx_info = &tx_ring->tx_buffer_info[req_id];
1288 if (tx_info->mbuf != NULL)
1289 return (0);
1290 }
1291
1292 if (tx_info->mbuf == NULL)
1293 device_printf(adapter->pdev,
1294 "tx_info doesn't have valid mbuf\n");
1295 else
1296 device_printf(adapter->pdev, "Invalid req_id: %hu\n", req_id);
1297
1298 counter_u64_add(tx_ring->tx_stats.bad_req_id, 1);
1299
1300 return (EFAULT);
1301 }
1302
1303 static int
1304 ena_create_io_queues(struct ena_adapter *adapter)
1305 {
1306 struct ena_com_dev *ena_dev = adapter->ena_dev;
1307 struct ena_com_create_io_ctx ctx;
1308 struct ena_ring *ring;
1309 uint16_t ena_qid;
1310 uint32_t msix_vector;
1311 int rc, i;
1312
1313 /* Create TX queues */
1314 for (i = 0; i < adapter->num_queues; i++) {
1315 msix_vector = ENA_IO_IRQ_IDX(i);
1316 ena_qid = ENA_IO_TXQ_IDX(i);
1317 ctx.mem_queue_type = ena_dev->tx_mem_queue_type;
1318 ctx.direction = ENA_COM_IO_QUEUE_DIRECTION_TX;
1319 ctx.queue_size = adapter->tx_ring_size;
1320 ctx.msix_vector = msix_vector;
1321 ctx.qid = ena_qid;
1322 rc = ena_com_create_io_queue(ena_dev, &ctx);
1323 if (rc != 0) {
1324 device_printf(adapter->pdev,
1325 "Failed to create io TX queue #%d rc: %d\n", i, rc);
1326 goto err_tx;
1327 }
1328 ring = &adapter->tx_ring[i];
1329 rc = ena_com_get_io_handlers(ena_dev, ena_qid,
1330 &ring->ena_com_io_sq,
1331 &ring->ena_com_io_cq);
1332 if (rc != 0) {
1333 device_printf(adapter->pdev,
1334 "Failed to get TX queue handlers. TX queue num"
1335 " %d rc: %d\n", i, rc);
1336 ena_com_destroy_io_queue(ena_dev, ena_qid);
1337 goto err_tx;
1338 }
1339 }
1340
1341 /* Create RX queues */
1342 for (i = 0; i < adapter->num_queues; i++) {
1343 msix_vector = ENA_IO_IRQ_IDX(i);
1344 ena_qid = ENA_IO_RXQ_IDX(i);
1345 ctx.mem_queue_type = ENA_ADMIN_PLACEMENT_POLICY_HOST;
1346 ctx.direction = ENA_COM_IO_QUEUE_DIRECTION_RX;
1347 ctx.queue_size = adapter->rx_ring_size;
1348 ctx.msix_vector = msix_vector;
1349 ctx.qid = ena_qid;
1350 rc = ena_com_create_io_queue(ena_dev, &ctx);
1351 if (unlikely(rc != 0)) {
1352 device_printf(adapter->pdev,
1353 "Failed to create io RX queue[%d] rc: %d\n", i, rc);
1354 goto err_rx;
1355 }
1356
1357 ring = &adapter->rx_ring[i];
1358 rc = ena_com_get_io_handlers(ena_dev, ena_qid,
1359 &ring->ena_com_io_sq,
1360 &ring->ena_com_io_cq);
1361 if (unlikely(rc != 0)) {
1362 device_printf(adapter->pdev,
1363 "Failed to get RX queue handlers. RX queue num"
1364 " %d rc: %d\n", i, rc);
1365 ena_com_destroy_io_queue(ena_dev, ena_qid);
1366 goto err_rx;
1367 }
1368 }
1369
1370 return (0);
1371
1372 err_rx:
1373 while (i--)
1374 ena_com_destroy_io_queue(ena_dev, ENA_IO_RXQ_IDX(i));
1375 i = adapter->num_queues;
1376 err_tx:
1377 while (i--)
1378 ena_com_destroy_io_queue(ena_dev, ENA_IO_TXQ_IDX(i));
1379
1380 return (ENXIO);
1381 }
1382
1383 /**
1384 * ena_tx_cleanup - clear sent packets and corresponding descriptors
1385 * @tx_ring: ring for which we want to clean packets
1386 *
1387 * Once packets are sent, we ask the device in a loop for no longer used
1388 * descriptors. We find the related mbuf chain in a map (index in an array)
1389 * and free it, then update ring state.
1390 * This is performed in "endless" loop, updating ring pointers every
1391 * TX_COMMIT. The first check of free descriptor is performed before the actual
1392 * loop, then repeated at the loop end.
1393 **/
1394 static int
1395 ena_tx_cleanup(struct ena_ring *tx_ring)
1396 {
1397 struct ena_adapter *adapter;
1398 struct ena_com_io_cq* io_cq;
1399 uint16_t next_to_clean;
1400 uint16_t req_id;
1401 uint16_t ena_qid;
1402 unsigned int total_done = 0;
1403 int rc;
1404 int commit = TX_COMMIT;
1405 int budget = TX_BUDGET;
1406 int work_done;
1407
1408 KASSERT(ENA_RING_MTX_OWNED(tx_ring));
1409
1410 adapter = tx_ring->que->adapter;
1411 ena_qid = ENA_IO_TXQ_IDX(tx_ring->que->id);
1412 io_cq = &adapter->ena_dev->io_cq_queues[ena_qid];
1413 next_to_clean = tx_ring->next_to_clean;
1414
1415 do {
1416 struct ena_tx_buffer *tx_info;
1417 struct mbuf *mbuf;
1418
1419 rc = ena_com_tx_comp_req_id_get(io_cq, &req_id);
1420 if (unlikely(rc != 0))
1421 break;
1422
1423 rc = validate_tx_req_id(tx_ring, req_id);
1424 if (unlikely(rc != 0))
1425 break;
1426
1427 tx_info = &tx_ring->tx_buffer_info[req_id];
1428
1429 mbuf = tx_info->mbuf;
1430
1431 tx_info->mbuf = NULL;
1432 bintime_clear(&tx_info->timestamp);
1433
1434 if (likely(tx_info->num_of_bufs != 0)) {
1435 /* Map is no longer required */
1436 bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
1437 }
1438
1439 ena_trace(ENA_DBG | ENA_TXPTH, "tx: q %d mbuf %p completed",
1440 tx_ring->qid, mbuf);
1441
1442 m_freem(mbuf);
1443
1444 total_done += tx_info->tx_descs;
1445
1446 tx_ring->free_tx_ids[next_to_clean] = req_id;
1447 next_to_clean = ENA_TX_RING_IDX_NEXT(next_to_clean,
1448 tx_ring->ring_size);
1449
1450 if (unlikely(--commit == 0)) {
1451 commit = TX_COMMIT;
1452 /* update ring state every TX_COMMIT descriptor */
1453 tx_ring->next_to_clean = next_to_clean;
1454 ena_com_comp_ack(
1455 &adapter->ena_dev->io_sq_queues[ena_qid],
1456 total_done);
1457 ena_com_update_dev_comp_head(io_cq);
1458 total_done = 0;
1459 }
1460 } while (likely(--budget));
1461
1462 work_done = TX_BUDGET - budget;
1463
1464 ena_trace(ENA_DBG | ENA_TXPTH, "tx: q %d done. total pkts: %d",
1465 tx_ring->qid, work_done);
1466
1467 /* If there is still something to commit update ring state */
1468 if (likely(commit != TX_COMMIT)) {
1469 tx_ring->next_to_clean = next_to_clean;
1470 ena_com_comp_ack(&adapter->ena_dev->io_sq_queues[ena_qid],
1471 total_done);
1472 ena_com_update_dev_comp_head(io_cq);
1473 }
1474
1475 if (atomic_cas_uint(&tx_ring->task_pending, 0, 1) == 0)
1476 workqueue_enqueue(tx_ring->enqueue_tq, &tx_ring->enqueue_task, NULL);
1477
1478 return (work_done);
1479 }
1480
1481 #if 0
1482 static void
1483 ena_rx_hash_mbuf(struct ena_ring *rx_ring, struct ena_com_rx_ctx *ena_rx_ctx,
1484 struct mbuf *mbuf)
1485 {
1486 struct ena_adapter *adapter = rx_ring->adapter;
1487
1488 if (likely(adapter->rss_support)) {
1489 mbuf->m_pkthdr.flowid = ena_rx_ctx->hash;
1490
1491 if (ena_rx_ctx->frag &&
1492 (ena_rx_ctx->l3_proto != ENA_ETH_IO_L3_PROTO_UNKNOWN)) {
1493 M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE_HASH);
1494 return;
1495 }
1496
1497 switch (ena_rx_ctx->l3_proto) {
1498 case ENA_ETH_IO_L3_PROTO_IPV4:
1499 switch (ena_rx_ctx->l4_proto) {
1500 case ENA_ETH_IO_L4_PROTO_TCP:
1501 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_TCP_IPV4);
1502 break;
1503 case ENA_ETH_IO_L4_PROTO_UDP:
1504 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_UDP_IPV4);
1505 break;
1506 default:
1507 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_IPV4);
1508 }
1509 break;
1510 case ENA_ETH_IO_L3_PROTO_IPV6:
1511 switch (ena_rx_ctx->l4_proto) {
1512 case ENA_ETH_IO_L4_PROTO_TCP:
1513 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_TCP_IPV6);
1514 break;
1515 case ENA_ETH_IO_L4_PROTO_UDP:
1516 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_UDP_IPV6);
1517 break;
1518 default:
1519 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_IPV6);
1520 }
1521 break;
1522 case ENA_ETH_IO_L3_PROTO_UNKNOWN:
1523 M_HASHTYPE_SET(mbuf, M_HASHTYPE_NONE);
1524 break;
1525 default:
1526 M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE_HASH);
1527 }
1528 } else {
1529 mbuf->m_pkthdr.flowid = rx_ring->qid;
1530 M_HASHTYPE_SET(mbuf, M_HASHTYPE_NONE);
1531 }
1532 }
1533 #endif
1534
1535 /**
1536 * ena_rx_mbuf - assemble mbuf from descriptors
1537 * @rx_ring: ring for which we want to clean packets
1538 * @ena_bufs: buffer info
1539 * @ena_rx_ctx: metadata for this packet(s)
1540 * @next_to_clean: ring pointer, will be updated only upon success
1541 *
1542 **/
1543 static struct mbuf*
1544 ena_rx_mbuf(struct ena_ring *rx_ring, struct ena_com_rx_buf_info *ena_bufs,
1545 struct ena_com_rx_ctx *ena_rx_ctx, uint16_t *next_to_clean)
1546 {
1547 struct mbuf *mbuf;
1548 struct ena_rx_buffer *rx_info;
1549 struct ena_adapter *adapter;
1550 unsigned int descs = ena_rx_ctx->descs;
1551 uint16_t ntc, len, req_id, buf = 0;
1552
1553 ntc = *next_to_clean;
1554 adapter = rx_ring->adapter;
1555
1556 len = ena_bufs[buf].len;
1557 req_id = ena_bufs[buf].req_id;
1558 rx_info = &rx_ring->rx_buffer_info[req_id];
1559 if (unlikely(rx_info->mbuf == NULL)) {
1560 device_printf(adapter->pdev, "NULL mbuf in rx_info");
1561 return (NULL);
1562 }
1563
1564 ena_trace(ENA_DBG | ENA_RXPTH, "rx_info %p, mbuf %p, paddr %jx",
1565 rx_info, rx_info->mbuf, (uintmax_t)rx_info->ena_buf.paddr);
1566
1567 mbuf = rx_info->mbuf;
1568 KASSERT(mbuf->m_flags & M_PKTHDR);
1569 mbuf->m_pkthdr.len = len;
1570 mbuf->m_len = len;
1571 m_set_rcvif(mbuf, rx_ring->que->adapter->ifp);
1572
1573 /* Fill mbuf with hash key and it's interpretation for optimization */
1574 #if 0
1575 ena_rx_hash_mbuf(rx_ring, ena_rx_ctx, mbuf);
1576 #endif
1577
1578 ena_trace(ENA_DBG | ENA_RXPTH, "rx mbuf %p, flags=0x%x, len: %d",
1579 mbuf, mbuf->m_flags, mbuf->m_pkthdr.len);
1580
1581 /* DMA address is not needed anymore, unmap it */
1582 bus_dmamap_unload(rx_ring->adapter->sc_dmat, rx_info->map);
1583
1584 rx_info->mbuf = NULL;
1585 rx_ring->free_rx_ids[ntc] = req_id;
1586 ntc = ENA_RX_RING_IDX_NEXT(ntc, rx_ring->ring_size);
1587
1588 /*
1589 * While we have more than 1 descriptors for one rcvd packet, append
1590 * other mbufs to the main one
1591 */
1592 while (--descs) {
1593 ++buf;
1594 len = ena_bufs[buf].len;
1595 req_id = ena_bufs[buf].req_id;
1596 rx_info = &rx_ring->rx_buffer_info[req_id];
1597
1598 if (unlikely(rx_info->mbuf == NULL)) {
1599 device_printf(adapter->pdev, "NULL mbuf in rx_info");
1600 /*
1601 * If one of the required mbufs was not allocated yet,
1602 * we can break there.
1603 * All earlier used descriptors will be reallocated
1604 * later and not used mbufs can be reused.
1605 * The next_to_clean pointer will not be updated in case
1606 * of an error, so caller should advance it manually
1607 * in error handling routine to keep it up to date
1608 * with hw ring.
1609 */
1610 m_freem(mbuf);
1611 return (NULL);
1612 }
1613
1614 if (unlikely(m_append(mbuf, len, rx_info->mbuf->m_data) == 0)) {
1615 counter_u64_add(rx_ring->rx_stats.mbuf_alloc_fail, 1);
1616 ena_trace(ENA_WARNING, "Failed to append Rx mbuf %p",
1617 mbuf);
1618 }
1619
1620 ena_trace(ENA_DBG | ENA_RXPTH,
1621 "rx mbuf updated. len %d", mbuf->m_pkthdr.len);
1622
1623 /* Free already appended mbuf, it won't be useful anymore */
1624 bus_dmamap_unload(rx_ring->adapter->sc_dmat, rx_info->map);
1625 m_freem(rx_info->mbuf);
1626 rx_info->mbuf = NULL;
1627
1628 rx_ring->free_rx_ids[ntc] = req_id;
1629 ntc = ENA_RX_RING_IDX_NEXT(ntc, rx_ring->ring_size);
1630 }
1631
1632 *next_to_clean = ntc;
1633
1634 return (mbuf);
1635 }
1636
1637 /**
1638 * ena_rx_checksum - indicate in mbuf if hw indicated a good cksum
1639 **/
1640 static inline void
1641 ena_rx_checksum(struct ena_ring *rx_ring, struct ena_com_rx_ctx *ena_rx_ctx,
1642 struct mbuf *mbuf)
1643 {
1644
1645 /* IPv4 */
1646 if (ena_rx_ctx->l3_proto == ENA_ETH_IO_L3_PROTO_IPV4) {
1647 mbuf->m_pkthdr.csum_flags |= M_CSUM_IPv4;
1648 if (ena_rx_ctx->l3_csum_err) {
1649 /* ipv4 checksum error */
1650 mbuf->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
1651 counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
1652 ena_trace(ENA_DBG, "RX IPv4 header checksum error");
1653 return;
1654 }
1655
1656 /* TCP/UDP */
1657 if ((ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ||
1658 (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_UDP)) {
1659 mbuf->m_pkthdr.csum_flags |= (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ? M_CSUM_TCPv4 : M_CSUM_UDPv4;
1660 if (ena_rx_ctx->l4_csum_err) {
1661 /* TCP/UDP checksum error */
1662 mbuf->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
1663 counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
1664 ena_trace(ENA_DBG, "RX L4 checksum error");
1665 }
1666 }
1667 }
1668 /* IPv6 */
1669 else if (ena_rx_ctx->l3_proto == ENA_ETH_IO_L3_PROTO_IPV6) {
1670 /* TCP/UDP */
1671 if ((ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ||
1672 (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_UDP)) {
1673 mbuf->m_pkthdr.csum_flags |= (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ? M_CSUM_TCPv6 : M_CSUM_UDPv6;
1674 if (ena_rx_ctx->l4_csum_err) {
1675 /* TCP/UDP checksum error */
1676 mbuf->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
1677 counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
1678 ena_trace(ENA_DBG, "RX L4 checksum error");
1679 }
1680 }
1681 }
1682 }
1683
1684 /**
1685 * ena_rx_cleanup - handle rx irq
1686 * @arg: ring for which irq is being handled
1687 **/
1688 static int
1689 ena_rx_cleanup(struct ena_ring *rx_ring)
1690 {
1691 struct ena_adapter *adapter;
1692 struct mbuf *mbuf;
1693 struct ena_com_rx_ctx ena_rx_ctx;
1694 struct ena_com_io_cq* io_cq;
1695 struct ena_com_io_sq* io_sq;
1696 struct ifnet *ifp;
1697 uint16_t ena_qid;
1698 uint16_t next_to_clean;
1699 uint32_t refill_required;
1700 uint32_t refill_threshold;
1701 uint32_t do_if_input = 0;
1702 unsigned int qid;
1703 int rc, i;
1704 int budget = RX_BUDGET;
1705
1706 adapter = rx_ring->que->adapter;
1707 ifp = adapter->ifp;
1708 qid = rx_ring->que->id;
1709 ena_qid = ENA_IO_RXQ_IDX(qid);
1710 io_cq = &adapter->ena_dev->io_cq_queues[ena_qid];
1711 io_sq = &adapter->ena_dev->io_sq_queues[ena_qid];
1712 next_to_clean = rx_ring->next_to_clean;
1713
1714 ena_trace(ENA_DBG, "rx: qid %d", qid);
1715
1716 do {
1717 ena_rx_ctx.ena_bufs = rx_ring->ena_bufs;
1718 ena_rx_ctx.max_bufs = adapter->max_rx_sgl_size;
1719 ena_rx_ctx.descs = 0;
1720 rc = ena_com_rx_pkt(io_cq, io_sq, &ena_rx_ctx);
1721
1722 if (unlikely(rc != 0))
1723 goto error;
1724
1725 if (unlikely(ena_rx_ctx.descs == 0))
1726 break;
1727
1728 ena_trace(ENA_DBG | ENA_RXPTH, "rx: q %d got packet from ena. "
1729 "descs #: %d l3 proto %d l4 proto %d hash: %x",
1730 rx_ring->qid, ena_rx_ctx.descs, ena_rx_ctx.l3_proto,
1731 ena_rx_ctx.l4_proto, ena_rx_ctx.hash);
1732
1733 /* Receive mbuf from the ring */
1734 mbuf = ena_rx_mbuf(rx_ring, rx_ring->ena_bufs,
1735 &ena_rx_ctx, &next_to_clean);
1736
1737 /* Exit if we failed to retrieve a buffer */
1738 if (unlikely(mbuf == NULL)) {
1739 for (i = 0; i < ena_rx_ctx.descs; ++i) {
1740 rx_ring->free_rx_ids[next_to_clean] =
1741 rx_ring->ena_bufs[i].req_id;
1742 next_to_clean =
1743 ENA_RX_RING_IDX_NEXT(next_to_clean,
1744 rx_ring->ring_size);
1745
1746 }
1747 if_statinc(ifp, if_ierrors);
1748 break;
1749 }
1750
1751 if (((ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) != 0) ||
1752 ((ifp->if_capenable & IFCAP_CSUM_TCPv4_Rx) != 0) ||
1753 ((ifp->if_capenable & IFCAP_CSUM_UDPv4_Rx) != 0) ||
1754 ((ifp->if_capenable & IFCAP_CSUM_TCPv6_Rx) != 0) ||
1755 ((ifp->if_capenable & IFCAP_CSUM_UDPv6_Rx) != 0)) {
1756 ena_rx_checksum(rx_ring, &ena_rx_ctx, mbuf);
1757 }
1758
1759 counter_enter();
1760 counter_u64_add_protected(rx_ring->rx_stats.bytes,
1761 mbuf->m_pkthdr.len);
1762 counter_u64_add_protected(adapter->hw_stats.rx_bytes,
1763 mbuf->m_pkthdr.len);
1764 counter_exit();
1765 /*
1766 * LRO is only for IP/TCP packets and TCP checksum of the packet
1767 * should be computed by hardware.
1768 */
1769 do_if_input = 1;
1770 #ifdef LRO
1771 if (((ifp->if_capenable & IFCAP_LRO) != 0) &&
1772 ((mbuf->m_pkthdr.csum_flags & CSUM_IP_VALID) != 0) &&
1773 (ena_rx_ctx.l4_proto == ENA_ETH_IO_L4_PROTO_TCP)) {
1774 /*
1775 * Send to the stack if:
1776 * - LRO not enabled, or
1777 * - no LRO resources, or
1778 * - lro enqueue fails
1779 */
1780 if ((rx_ring->lro.lro_cnt != 0) &&
1781 (tcp_lro_rx(&rx_ring->lro, mbuf, 0) == 0))
1782 do_if_input = 0;
1783 }
1784 #endif
1785 if (do_if_input != 0) {
1786 ena_trace(ENA_DBG | ENA_RXPTH,
1787 "calling if_input() with mbuf %p", mbuf);
1788 if_percpuq_enqueue(ifp->if_percpuq, mbuf);
1789 }
1790
1791 counter_enter();
1792 counter_u64_add_protected(rx_ring->rx_stats.cnt, 1);
1793 counter_u64_add_protected(adapter->hw_stats.rx_packets, 1);
1794 counter_exit();
1795 } while (--budget);
1796
1797 rx_ring->next_to_clean = next_to_clean;
1798
1799 refill_required = ena_com_free_desc(io_sq);
1800 refill_threshold = rx_ring->ring_size / ENA_RX_REFILL_THRESH_DIVIDER;
1801
1802 if (refill_required > refill_threshold) {
1803 ena_com_update_dev_comp_head(rx_ring->ena_com_io_cq);
1804 ena_refill_rx_bufs(rx_ring, refill_required);
1805 }
1806
1807 #ifdef LRO
1808 tcp_lro_flush_all(&rx_ring->lro);
1809 #endif
1810
1811 return (RX_BUDGET - budget);
1812
1813 error:
1814 counter_u64_add(rx_ring->rx_stats.bad_desc_num, 1);
1815 return (RX_BUDGET - budget);
1816 }
1817
1818 /*********************************************************************
1819 *
1820 * MSIX & Interrupt Service routine
1821 *
1822 **********************************************************************/
1823
1824 /**
1825 * ena_handle_msix - MSIX Interrupt Handler for admin/async queue
1826 * @arg: interrupt number
1827 **/
1828 static int
1829 ena_intr_msix_mgmnt(void *arg)
1830 {
1831 struct ena_adapter *adapter = (struct ena_adapter *)arg;
1832
1833 ena_com_admin_q_comp_intr_handler(adapter->ena_dev);
1834 if (likely(ENA_FLAG_ISSET(ENA_FLAG_DEVICE_RUNNING, adapter)))
1835 ena_com_aenq_intr_handler(adapter->ena_dev, arg);
1836
1837 return 1;
1838 }
1839
1840 /**
1841 * ena_handle_msix - MSIX Interrupt Handler for Tx/Rx
1842 * @arg: interrupt number
1843 **/
1844 static int
1845 ena_handle_msix(void *arg)
1846 {
1847 struct ena_que *queue = arg;
1848 struct ena_ring *rx_ring = queue->rx_ring;
1849
1850 ENA_RING_MTX_LOCK(rx_ring);
1851 if (unlikely(rx_ring->stopping)) {
1852 ENA_RING_MTX_UNLOCK(rx_ring);
1853 return 0;
1854 }
1855
1856 if (atomic_cas_uint(&rx_ring->task_pending, 0, 1) == 0)
1857 workqueue_enqueue(rx_ring->cleanup_tq, &rx_ring->cleanup_task,
1858 curcpu());
1859
1860 ENA_RING_MTX_UNLOCK(rx_ring);
1861 return 1;
1862 }
1863
1864 static void
1865 ena_cleanup(struct work *wk, void *arg)
1866 {
1867 struct ena_que *que = arg;
1868 struct ena_adapter *adapter = que->adapter;
1869 struct ifnet *ifp = adapter->ifp;
1870 struct ena_ring *tx_ring = que->tx_ring;
1871 struct ena_ring *rx_ring = que->rx_ring;
1872 struct ena_com_io_cq* io_cq;
1873 struct ena_eth_io_intr_reg intr_reg;
1874 int qid, ena_qid;
1875 int txc, rxc, i;
1876
1877 atomic_swap_uint(&rx_ring->task_pending, 0);
1878
1879 if (unlikely((if_getdrvflags(ifp) & IFF_RUNNING) == 0))
1880 return;
1881
1882 ena_trace(ENA_DBG, "MSI-X TX/RX routine");
1883
1884 qid = que->id;
1885 ena_qid = ENA_IO_TXQ_IDX(qid);
1886 io_cq = &adapter->ena_dev->io_cq_queues[ena_qid];
1887
1888 for (i = 0; i < CLEAN_BUDGET; ++i) {
1889 /*
1890 * If lock cannot be acquired, then deferred cleanup task was
1891 * being executed and rx ring is being cleaned up in
1892 * another thread.
1893 */
1894 ENA_RING_MTX_LOCK(rx_ring);
1895 if (rx_ring->stopping) {
1896 ENA_RING_MTX_UNLOCK(rx_ring);
1897 return;
1898 }
1899 ENA_RING_MTX_UNLOCK(rx_ring);
1900 rxc = ena_rx_cleanup(rx_ring);
1901
1902 /* Protection from calling ena_tx_cleanup from ena_start_xmit */
1903 ENA_RING_MTX_LOCK(tx_ring);
1904 if (tx_ring->stopping) {
1905 ENA_RING_MTX_UNLOCK(tx_ring);
1906 return;
1907 }
1908 txc = ena_tx_cleanup(tx_ring);
1909 ENA_RING_MTX_UNLOCK(tx_ring);
1910
1911 if (unlikely((if_getdrvflags(ifp) & IFF_RUNNING) == 0))
1912 return;
1913
1914 if ((txc != TX_BUDGET) && (rxc != RX_BUDGET))
1915 break;
1916 }
1917
1918 /* Signal that work is done and unmask interrupt */
1919 ena_com_update_intr_reg(&intr_reg,
1920 RX_IRQ_INTERVAL,
1921 TX_IRQ_INTERVAL,
1922 true);
1923 ena_com_unmask_intr(io_cq, &intr_reg);
1924 }
1925
1926 static int
1927 ena_enable_msix(struct ena_adapter *adapter)
1928 {
1929 int msix_req;
1930 int counts[PCI_INTR_TYPE_SIZE];
1931 int max_type;
1932
1933 /* Reserved the max msix vectors we might need */
1934 msix_req = ENA_MAX_MSIX_VEC(adapter->num_queues);
1935
1936 counts[PCI_INTR_TYPE_INTX] = 0;
1937 counts[PCI_INTR_TYPE_MSI] = 0;
1938 counts[PCI_INTR_TYPE_MSIX] = msix_req;
1939 max_type = PCI_INTR_TYPE_MSIX;
1940
1941 if (pci_intr_alloc(&adapter->sc_pa, &adapter->sc_intrs, counts,
1942 max_type) != 0) {
1943 aprint_error_dev(adapter->pdev,
1944 "failed to allocate interrupt\n");
1945 return ENOSPC;
1946 }
1947
1948 adapter->sc_nintrs = counts[PCI_INTR_TYPE_MSIX];
1949
1950 if (counts[PCI_INTR_TYPE_MSIX] != msix_req) {
1951 device_printf(adapter->pdev,
1952 "Enable only %d MSI-x (out of %d), reduce "
1953 "the number of queues\n", adapter->sc_nintrs, msix_req);
1954 adapter->num_queues = adapter->sc_nintrs - ENA_ADMIN_MSIX_VEC;
1955 }
1956
1957 return 0;
1958 }
1959
1960 #if 0
1961 static void
1962 ena_setup_io_intr(struct ena_adapter *adapter)
1963 {
1964 static int last_bind_cpu = -1;
1965 int irq_idx;
1966
1967 for (int i = 0; i < adapter->num_queues; i++) {
1968 irq_idx = ENA_IO_IRQ_IDX(i);
1969
1970 snprintf(adapter->irq_tbl[irq_idx].name, ENA_IRQNAME_SIZE,
1971 "%s-TxRx-%d", device_xname(adapter->pdev), i);
1972 adapter->irq_tbl[irq_idx].handler = ena_handle_msix;
1973 adapter->irq_tbl[irq_idx].data = &adapter->que[i];
1974 adapter->irq_tbl[irq_idx].vector =
1975 adapter->msix_entries[irq_idx].vector;
1976 ena_trace(ENA_INFO | ENA_IOQ, "ena_setup_io_intr vector: %d\n",
1977 adapter->msix_entries[irq_idx].vector);
1978 #ifdef RSS
1979 adapter->que[i].cpu = adapter->irq_tbl[irq_idx].cpu =
1980 rss_getcpu(i % rss_getnumbuckets());
1981 #else
1982 /*
1983 * We still want to bind rings to the corresponding cpu
1984 * using something similar to the RSS round-robin technique.
1985 */
1986 if (unlikely(last_bind_cpu < 0))
1987 last_bind_cpu = CPU_FIRST();
1988 adapter->que[i].cpu = adapter->irq_tbl[irq_idx].cpu =
1989 last_bind_cpu;
1990 last_bind_cpu = CPU_NEXT(last_bind_cpu);
1991 #endif
1992 }
1993 }
1994 #endif
1995
1996 static int
1997 ena_request_mgmnt_irq(struct ena_adapter *adapter)
1998 {
1999 const char *intrstr;
2000 char intrbuf[PCI_INTRSTR_LEN];
2001 char intr_xname[INTRDEVNAMEBUF];
2002 pci_chipset_tag_t pc = adapter->sc_pa.pa_pc;
2003 const int irq_slot = ENA_MGMNT_IRQ_IDX;
2004
2005 KASSERT(adapter->sc_intrs != NULL);
2006 KASSERT(adapter->sc_ihs[irq_slot] == NULL);
2007
2008 pci_intr_setattr(pc, &adapter->sc_intrs[irq_slot],
2009 PCI_INTR_MPSAFE, true);
2010
2011 snprintf(intr_xname, sizeof(intr_xname), "%s mgmnt",
2012 device_xname(adapter->pdev));
2013 intrstr = pci_intr_string(pc, adapter->sc_intrs[irq_slot],
2014 intrbuf, sizeof(intrbuf));
2015
2016 adapter->sc_ihs[irq_slot] = pci_intr_establish_xname(
2017 pc, adapter->sc_intrs[irq_slot],
2018 IPL_NET, ena_intr_msix_mgmnt, adapter, intr_xname);
2019
2020 if (adapter->sc_ihs[irq_slot] == NULL) {
2021 device_printf(adapter->pdev, "failed to register "
2022 "interrupt handler for MGMNT irq %s\n",
2023 intrstr);
2024 return ENOMEM;
2025 }
2026
2027 aprint_normal_dev(adapter->pdev,
2028 "for MGMNT interrupting at %s\n", intrstr);
2029
2030 return 0;
2031 }
2032
2033 static int
2034 ena_request_io_irq(struct ena_adapter *adapter)
2035 {
2036 const char *intrstr;
2037 char intrbuf[PCI_INTRSTR_LEN];
2038 char intr_xname[INTRDEVNAMEBUF];
2039 pci_chipset_tag_t pc = adapter->sc_pa.pa_pc;
2040 const int irq_off = ENA_IO_IRQ_FIRST_IDX;
2041 void *vih;
2042 kcpuset_t *affinity;
2043 int i;
2044
2045 KASSERT(adapter->sc_intrs != NULL);
2046
2047 kcpuset_create(&affinity, false);
2048
2049 for (i = 0; i < adapter->num_queues; i++) {
2050 int irq_slot = i + irq_off;
2051 int affinity_to = (irq_slot) % ncpu;
2052
2053 KASSERT((void *)adapter->sc_intrs[irq_slot] != NULL);
2054 KASSERT(adapter->sc_ihs[irq_slot] == NULL);
2055
2056 pci_intr_setattr(pc, &adapter->sc_intrs[irq_slot],
2057 PCI_INTR_MPSAFE, true);
2058
2059 snprintf(intr_xname, sizeof(intr_xname), "%s ioq%d",
2060 device_xname(adapter->pdev), i);
2061 intrstr = pci_intr_string(pc, adapter->sc_intrs[irq_slot],
2062 intrbuf, sizeof(intrbuf));
2063
2064 vih = pci_intr_establish_xname(adapter->sc_pa.pa_pc,
2065 adapter->sc_intrs[irq_slot], IPL_NET,
2066 ena_handle_msix, &adapter->que[i], intr_xname);
2067
2068 if (vih == NULL) {
2069 device_printf(adapter->pdev, "failed to register "
2070 "interrupt handler for IO queue %d irq %s\n",
2071 i, intrstr);
2072 goto err;
2073 }
2074
2075 kcpuset_zero(affinity);
2076 /* Round-robin affinity */
2077 kcpuset_set(affinity, affinity_to);
2078 int error = interrupt_distribute(vih, affinity, NULL);
2079 if (error == 0) {
2080 aprint_normal_dev(adapter->pdev,
2081 "for IO queue %d interrupting at %s"
2082 " affinity to %u\n", i, intrstr, affinity_to);
2083 } else {
2084 aprint_normal_dev(adapter->pdev,
2085 "for IO queue %d interrupting at %s\n", i, intrstr);
2086 }
2087
2088 adapter->sc_ihs[irq_slot] = vih;
2089
2090 #ifdef RSS
2091 ena_trace(ENA_INFO, "queue %d - RSS bucket %d\n",
2092 i - ENA_IO_IRQ_FIRST_IDX, irq->cpu);
2093 #else
2094 ena_trace(ENA_INFO, "queue %d - cpu %d\n",
2095 i - ENA_IO_IRQ_FIRST_IDX, affinity_to);
2096 #endif
2097 }
2098
2099 kcpuset_destroy(affinity);
2100 return 0;
2101
2102 err:
2103 kcpuset_destroy(affinity);
2104
2105 for (i--; i >= 0; i--) {
2106 int irq_slot __diagused = i + irq_off;
2107 KASSERT(adapter->sc_ihs[irq_slot] != NULL);
2108 pci_intr_disestablish(adapter->sc_pa.pa_pc, adapter->sc_ihs[irq_slot]);
2109 adapter->sc_ihs[irq_slot] = NULL;
2110 }
2111
2112 return ENOSPC;
2113 }
2114
2115 static void
2116 ena_free_mgmnt_irq(struct ena_adapter *adapter)
2117 {
2118 const int irq_slot = ENA_MGMNT_IRQ_IDX;
2119
2120 if (adapter->sc_ihs[irq_slot]) {
2121 pci_intr_disestablish(adapter->sc_pa.pa_pc,
2122 adapter->sc_ihs[irq_slot]);
2123 adapter->sc_ihs[irq_slot] = NULL;
2124 }
2125 }
2126
2127 static void
2128 ena_free_io_irq(struct ena_adapter *adapter)
2129 {
2130 const int irq_off = ENA_IO_IRQ_FIRST_IDX;
2131
2132 for (int i = 0; i < adapter->num_queues; i++) {
2133 int irq_slot = i + irq_off;
2134
2135 if (adapter->sc_ihs[irq_slot]) {
2136 pci_intr_disestablish(adapter->sc_pa.pa_pc,
2137 adapter->sc_ihs[irq_slot]);
2138 adapter->sc_ihs[irq_slot] = NULL;
2139 }
2140 }
2141 }
2142
2143 static void
2144 ena_free_irqs(struct ena_adapter* adapter)
2145 {
2146
2147 ena_free_io_irq(adapter);
2148 ena_free_mgmnt_irq(adapter);
2149 ena_disable_msix(adapter);
2150 }
2151
2152 static void
2153 ena_disable_msix(struct ena_adapter *adapter)
2154 {
2155 pci_intr_release(adapter->sc_pa.pa_pc, adapter->sc_intrs,
2156 adapter->sc_nintrs);
2157 }
2158
2159 static void
2160 ena_unmask_all_io_irqs(struct ena_adapter *adapter)
2161 {
2162 struct ena_com_io_cq* io_cq;
2163 struct ena_eth_io_intr_reg intr_reg;
2164 uint16_t ena_qid;
2165 int i;
2166
2167 /* Unmask interrupts for all queues */
2168 for (i = 0; i < adapter->num_queues; i++) {
2169 ena_qid = ENA_IO_TXQ_IDX(i);
2170 io_cq = &adapter->ena_dev->io_cq_queues[ena_qid];
2171 ena_com_update_intr_reg(&intr_reg, 0, 0, true);
2172 ena_com_unmask_intr(io_cq, &intr_reg);
2173 }
2174 }
2175
2176 /* Configure the Rx forwarding */
2177 static int
2178 ena_rss_configure(struct ena_adapter *adapter)
2179 {
2180 struct ena_com_dev *ena_dev = adapter->ena_dev;
2181 int rc;
2182
2183 /* Set indirect table */
2184 rc = ena_com_indirect_table_set(ena_dev);
2185 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))
2186 return (rc);
2187
2188 /* Configure hash function (if supported) */
2189 rc = ena_com_set_hash_function(ena_dev);
2190 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))
2191 return (rc);
2192
2193 /* Configure hash inputs (if supported) */
2194 rc = ena_com_set_hash_ctrl(ena_dev);
2195 if (unlikely((rc != 0) && (rc != EOPNOTSUPP)))
2196 return (rc);
2197
2198 return (0);
2199 }
2200
2201 static int
2202 ena_up_complete(struct ena_adapter *adapter)
2203 {
2204 int rc;
2205
2206 if (likely(adapter->rss_support)) {
2207 rc = ena_rss_configure(adapter);
2208 if (rc != 0)
2209 return (rc);
2210 }
2211
2212 rc = ena_change_mtu(adapter->ifp, adapter->ifp->if_mtu);
2213 if (unlikely(rc != 0))
2214 return (rc);
2215
2216 ena_refill_all_rx_bufs(adapter);
2217 ena_reset_counters((struct evcnt *)&adapter->hw_stats,
2218 sizeof(adapter->hw_stats),
2219 offsetof(struct ena_hw_stats, rx_packets));
2220
2221 return (0);
2222 }
2223
2224 static int
2225 ena_up(struct ena_adapter *adapter)
2226 {
2227 int rc = 0;
2228
2229 KASSERT(ENA_CORE_MTX_OWNED(adapter));
2230
2231 #if 0
2232 if (unlikely(device_is_attached(adapter->pdev) == 0)) {
2233 device_printf(adapter->pdev, "device is not attached!\n");
2234 return (ENXIO);
2235 }
2236 #endif
2237
2238 if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_DEVICE_RUNNING, adapter))) {
2239 device_printf(adapter->pdev, "device is not running!\n");
2240 return (ENXIO);
2241 }
2242
2243 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
2244 device_printf(adapter->pdev, "device is going UP\n");
2245
2246 /* setup interrupts for IO queues */
2247 rc = ena_request_io_irq(adapter);
2248 if (unlikely(rc != 0)) {
2249 ena_trace(ENA_ALERT, "err_req_irq");
2250 goto err_req_irq;
2251 }
2252
2253 /* allocate transmit descriptors */
2254 rc = ena_setup_all_tx_resources(adapter);
2255 if (unlikely(rc != 0)) {
2256 ena_trace(ENA_ALERT, "err_setup_tx");
2257 goto err_setup_tx;
2258 }
2259
2260 /* allocate receive descriptors */
2261 rc = ena_setup_all_rx_resources(adapter);
2262 if (unlikely(rc != 0)) {
2263 ena_trace(ENA_ALERT, "err_setup_rx");
2264 goto err_setup_rx;
2265 }
2266
2267 /* create IO queues for Rx & Tx */
2268 rc = ena_create_io_queues(adapter);
2269 if (unlikely(rc != 0)) {
2270 ena_trace(ENA_ALERT,
2271 "create IO queues failed");
2272 goto err_io_que;
2273 }
2274
2275 if (unlikely(ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)))
2276 if_link_state_change(adapter->ifp, LINK_STATE_UP);
2277
2278 rc = ena_up_complete(adapter);
2279 if (unlikely(rc != 0))
2280 goto err_up_complete;
2281
2282 counter_u64_add(adapter->dev_stats.interface_up, 1);
2283
2284 ena_update_hwassist(adapter);
2285
2286 if_setdrvflagbits(adapter->ifp, IFF_RUNNING,
2287 IFF_OACTIVE);
2288 ena_set_stopping_flag(adapter, false);
2289
2290 callout_schedule(&adapter->timer_service, hz);
2291
2292 ENA_FLAG_SET_ATOMIC(ENA_FLAG_DEV_UP, adapter);
2293
2294 ena_unmask_all_io_irqs(adapter);
2295 }
2296
2297 return (0);
2298
2299 err_up_complete:
2300 ena_destroy_all_io_queues(adapter);
2301 err_io_que:
2302 ena_free_all_rx_resources(adapter);
2303 err_setup_rx:
2304 ena_free_all_tx_resources(adapter);
2305 err_setup_tx:
2306 ena_free_io_irq(adapter);
2307 err_req_irq:
2308 return (rc);
2309 }
2310
2311 #if 0
2312 static uint64_t
2313 ena_get_counter(struct ifnet *ifp, ift_counter cnt)
2314 {
2315 struct ena_adapter *adapter;
2316 struct ena_hw_stats *stats;
2317
2318 adapter = if_getsoftc(ifp);
2319 stats = &adapter->hw_stats;
2320
2321 switch (cnt) {
2322 case IFCOUNTER_IPACKETS:
2323 return (counter_u64_fetch(stats->rx_packets));
2324 case IFCOUNTER_OPACKETS:
2325 return (counter_u64_fetch(stats->tx_packets));
2326 case IFCOUNTER_IBYTES:
2327 return (counter_u64_fetch(stats->rx_bytes));
2328 case IFCOUNTER_OBYTES:
2329 return (counter_u64_fetch(stats->tx_bytes));
2330 case IFCOUNTER_IQDROPS:
2331 return (counter_u64_fetch(stats->rx_drops));
2332 default:
2333 return (if_get_counter_default(ifp, cnt));
2334 }
2335 }
2336 #endif
2337
2338 static int
2339 ena_media_change(struct ifnet *ifp)
2340 {
2341 /* Media Change is not supported by firmware */
2342 return (0);
2343 }
2344
2345 static void
2346 ena_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2347 {
2348 struct ena_adapter *adapter = if_getsoftc(ifp);
2349 ena_trace(ENA_DBG, "enter");
2350
2351 KASSERT(ENA_CORE_MTX_OWNED(adapter));
2352
2353 ifmr->ifm_status = IFM_AVALID;
2354 ifmr->ifm_active = IFM_ETHER;
2355
2356 if (!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)) {
2357 ena_trace(ENA_INFO, "Link is down");
2358 return;
2359 }
2360
2361 ifmr->ifm_status |= IFM_ACTIVE;
2362 }
2363
2364 static int
2365 ena_init(struct ifnet *ifp)
2366 {
2367 struct ena_adapter *adapter = if_getsoftc(ifp);
2368
2369 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
2370 ENA_CORE_MTX_LOCK(adapter);
2371 ena_up(adapter);
2372 ENA_CORE_MTX_UNLOCK(adapter);
2373 }
2374
2375 return 0;
2376 }
2377
2378 static void
2379 ena_stop(struct ifnet *ifp, int disable){
2380 struct ena_adapter *adapter;
2381
2382 adapter = ifp->if_softc;
2383
2384 if (ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
2385 ENA_CORE_MTX_LOCK(adapter);
2386 ena_down(adapter);
2387 ENA_CORE_MTX_UNLOCK(adapter);
2388 }
2389 }
2390
2391
2392 static int
2393 ena_ioctl(struct ifnet *ifp, u_long command, void *data)
2394 {
2395 struct ena_adapter *adapter;
2396 struct ifreq *ifr;
2397 int rc;
2398
2399 adapter = ifp->if_softc;
2400 ifr = (struct ifreq *)data;
2401
2402 /*
2403 * Acquiring lock to prevent from running up and down routines parallel.
2404 */
2405 rc = 0;
2406 switch (command) {
2407 case SIOCSIFMTU:
2408 if (ifp->if_mtu == ifr->ifr_mtu)
2409 break;
2410 ENA_CORE_MTX_LOCK(adapter);
2411 ena_down(adapter);
2412
2413 ena_change_mtu(ifp, ifr->ifr_mtu);
2414
2415 rc = ena_up(adapter);
2416 ENA_CORE_MTX_UNLOCK(adapter);
2417 break;
2418
2419 case SIOCADDMULTI:
2420 case SIOCDELMULTI:
2421 break;
2422
2423 case SIOCSIFCAP:
2424 {
2425 struct ifcapreq *ifcr = data;
2426 int reinit = 0;
2427
2428 if (ifcr->ifcr_capenable != ifp->if_capenable) {
2429 ifp->if_capenable = ifcr->ifcr_capenable;
2430 reinit = 1;
2431 }
2432
2433 if ((reinit != 0) &&
2434 ((if_getdrvflags(ifp) & IFF_RUNNING) != 0)) {
2435 ENA_CORE_MTX_LOCK(adapter);
2436 ena_down(adapter);
2437 rc = ena_up(adapter);
2438 ENA_CORE_MTX_UNLOCK(adapter);
2439 }
2440 }
2441
2442 break;
2443 default:
2444 rc = ether_ioctl(ifp, command, data);
2445 break;
2446 }
2447
2448 return (rc);
2449 }
2450
2451 static int
2452 ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *feat)
2453 {
2454 int caps = 0;
2455
2456 if ((feat->offload.tx &
2457 (ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV4_CSUM_FULL_MASK |
2458 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV4_CSUM_PART_MASK |
2459 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L3_CSUM_IPV4_MASK)) != 0)
2460 caps |= IFCAP_CSUM_IPv4_Tx;
2461
2462 if ((feat->offload.tx &
2463 (ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV6_CSUM_FULL_MASK |
2464 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV6_CSUM_PART_MASK)) != 0)
2465 caps |= IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_UDPv6_Tx;
2466
2467 if ((feat->offload.tx &
2468 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV4_MASK) != 0)
2469 caps |= IFCAP_TSOv4;
2470
2471 if ((feat->offload.tx &
2472 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TSO_IPV6_MASK) != 0)
2473 caps |= IFCAP_TSOv6;
2474
2475 if ((feat->offload.rx_supported &
2476 (ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV4_CSUM_MASK |
2477 ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L3_CSUM_IPV4_MASK)) != 0)
2478 caps |= IFCAP_CSUM_IPv4_Rx;
2479
2480 if ((feat->offload.rx_supported &
2481 ENA_ADMIN_FEATURE_OFFLOAD_DESC_RX_L4_IPV6_CSUM_MASK) != 0)
2482 caps |= IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
2483
2484 #ifdef LRO
2485 caps |= IFCAP_LRO;
2486 #endif
2487
2488 return (caps);
2489 }
2490
2491 static void
2492 ena_update_host_info(struct ena_admin_host_info *host_info, struct ifnet *ifp)
2493 {
2494
2495 host_info->supported_network_features[0] =
2496 (uint32_t)if_getcapabilities(ifp);
2497 }
2498
2499 static void
2500 ena_update_hwassist(struct ena_adapter *adapter)
2501 {
2502 struct ifnet *ifp = adapter->ifp;
2503 uint32_t feat = adapter->tx_offload_cap;
2504 int cap = if_getcapenable(ifp);
2505 int flags = 0;
2506
2507 if_clearhwassist(ifp);
2508
2509 if ((cap & (IFCAP_CSUM_IPv4_Tx|IFCAP_CSUM_TCPv4_Tx|IFCAP_CSUM_UDPv4_Tx))
2510 != 0) {
2511 if ((feat &
2512 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L3_CSUM_IPV4_MASK) != 0)
2513 flags |= M_CSUM_IPv4;
2514 if ((feat &
2515 (ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV4_CSUM_FULL_MASK |
2516 ENA_ADMIN_FEATURE_OFFLOAD_DESC_TX_L4_IPV4_CSUM_PART_MASK)) != 0)
2517 flags |= M_CSUM_TCPv4 | M_CSUM_UDPv4;
2518 }
2519
2520 if ((cap & IFCAP_CSUM_TCPv6_Tx) != 0)
2521 flags |= M_CSUM_TCPv6;
2522
2523 if ((cap & IFCAP_CSUM_UDPv6_Tx) != 0)
2524 flags |= M_CSUM_UDPv6;
2525
2526 if ((cap & IFCAP_TSOv4) != 0)
2527 flags |= M_CSUM_TSOv4;
2528
2529 if ((cap & IFCAP_TSOv6) != 0)
2530 flags |= M_CSUM_TSOv6;
2531
2532 if_sethwassistbits(ifp, flags, 0);
2533 }
2534
2535 static int
2536 ena_setup_ifnet(device_t pdev, struct ena_adapter *adapter,
2537 struct ena_com_dev_get_features_ctx *feat)
2538 {
2539 struct ifnet *ifp;
2540 int caps = 0;
2541
2542 ifp = adapter->ifp = &adapter->sc_ec.ec_if;
2543 if (unlikely(ifp == NULL)) {
2544 ena_trace(ENA_ALERT, "can not allocate ifnet structure\n");
2545 return (ENXIO);
2546 }
2547 if_initialize(ifp);
2548 if_initname(ifp, "ena", device_unit(pdev));
2549 if_setdev(ifp, pdev);
2550 if_setsoftc(ifp, adapter);
2551
2552 if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
2553 ifp->if_extflags = IFEF_MPSAFE;
2554 if_setinitfn(ifp, ena_init);
2555 ifp->if_stop = ena_stop;
2556 if_settransmitfn(ifp, ena_mq_start);
2557 #if 0
2558 if_setqflushfn(ifp, ena_qflush);
2559 #endif
2560 if_setioctlfn(ifp, ena_ioctl);
2561 #if 0
2562 if_setgetcounterfn(ifp, ena_get_counter);
2563 #endif
2564
2565 if_setsendqlen(ifp, adapter->tx_ring_size);
2566 if_setsendqready(ifp);
2567 if_setmtu(ifp, ETHERMTU);
2568 if_setbaudrate(ifp, 0);
2569 /* Zeroize capabilities... */
2570 if_setcapabilities(ifp, 0);
2571 if_setcapenable(ifp, 0);
2572 /* check hardware support */
2573 caps = ena_get_dev_offloads(feat);
2574 /* ... and set them */
2575 if_setcapabilitiesbit(ifp, caps, 0);
2576 adapter->sc_ec.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2577
2578 #if 0
2579 /* TSO parameters */
2580 /* XXX no limits on NetBSD, guarded by virtue of dmamap load failing */
2581 ifp->if_hw_tsomax = ENA_TSO_MAXSIZE -
2582 (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
2583 ifp->if_hw_tsomaxsegcount = adapter->max_tx_sgl_size - 1;
2584 ifp->if_hw_tsomaxsegsize = ENA_TSO_MAXSIZE;
2585 #endif
2586
2587 if_setifheaderlen(ifp, sizeof(struct ether_vlan_header));
2588 if_setcapenable(ifp, if_getcapabilities(ifp));
2589
2590 /*
2591 * Specify the media types supported by this adapter and register
2592 * callbacks to update media and link information
2593 */
2594 adapter->sc_ec.ec_ifmedia = &adapter->media;
2595 ifmedia_init_with_lock(&adapter->media, IFM_IMASK,
2596 ena_media_change, ena_media_status, &adapter->global_mtx);
2597 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2598 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2599
2600 ifp->if_percpuq = if_percpuq_create(ifp);
2601 if_deferred_start_init(ifp, NULL);
2602 ether_ifattach(ifp, adapter->mac_addr);
2603 if_register(ifp);
2604
2605 return (0);
2606 }
2607
2608 static void
2609 ena_set_stopping_flag(struct ena_adapter *adapter, bool value)
2610 {
2611 struct ena_ring *ring;
2612 int i;
2613
2614 for (i = 0; i < adapter->num_queues; i++) {
2615 /* TX */
2616 ring = adapter->que[i].tx_ring;
2617 ENA_RING_MTX_LOCK(ring);
2618 ring->stopping = value;
2619 ENA_RING_MTX_UNLOCK(ring);
2620
2621 /* RX */
2622 ring = adapter->que[i].rx_ring;
2623 ENA_RING_MTX_LOCK(ring);
2624 ring->stopping = value;
2625 ENA_RING_MTX_UNLOCK(ring);
2626 }
2627 }
2628
2629 static void
2630 ena_down(struct ena_adapter *adapter)
2631 {
2632 int rc, i;
2633
2634 KASSERT(ENA_CORE_MTX_OWNED(adapter));
2635
2636 if (ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
2637 device_printf(adapter->pdev, "device is going DOWN\n");
2638 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_DEV_UP, adapter);
2639 if_setdrvflagbits(adapter->ifp, IFF_OACTIVE,
2640 IFF_RUNNING);
2641
2642 ena_set_stopping_flag(adapter, true);
2643
2644 callout_halt(&adapter->timer_service, NULL);
2645 for (i = 0; i < adapter->num_queues; i++) {
2646 struct ena_ring *rx_ring = adapter->que[i].rx_ring;
2647 workqueue_wait(rx_ring->cleanup_tq,
2648 &rx_ring->cleanup_task);
2649 }
2650
2651 if (ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter)) {
2652 rc = ena_com_dev_reset(adapter->ena_dev,
2653 adapter->reset_reason);
2654 if (unlikely(rc != 0))
2655 device_printf(adapter->pdev,
2656 "Device reset failed\n");
2657 }
2658
2659 ena_destroy_all_io_queues(adapter);
2660
2661 ena_free_all_tx_bufs(adapter);
2662 ena_free_all_rx_bufs(adapter);
2663 ena_free_all_tx_resources(adapter);
2664 ena_free_all_rx_resources(adapter);
2665
2666 ena_free_io_irq(adapter);
2667
2668 counter_u64_add(adapter->dev_stats.interface_down, 1);
2669 }
2670 }
2671
2672 static void
2673 ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct mbuf *mbuf)
2674 {
2675 struct ena_com_tx_meta *ena_meta;
2676 struct ether_vlan_header *eh;
2677 u32 mss;
2678 bool offload;
2679 uint16_t etype;
2680 int ehdrlen;
2681 struct ip *ip;
2682 int iphlen;
2683 struct tcphdr *th;
2684
2685 offload = false;
2686 ena_meta = &ena_tx_ctx->ena_meta;
2687
2688 #if 0
2689 u32 mss = mbuf->m_pkthdr.tso_segsz;
2690
2691 if (mss != 0)
2692 offload = true;
2693 #else
2694 mss = mbuf->m_pkthdr.len; /* XXX don't have tso_segsz */
2695 #endif
2696
2697 if ((mbuf->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0)
2698 offload = true;
2699
2700 if ((mbuf->m_pkthdr.csum_flags & CSUM_OFFLOAD) != 0)
2701 offload = true;
2702
2703 if (!offload) {
2704 ena_tx_ctx->meta_valid = 0;
2705 return;
2706 }
2707
2708 /* Determine where frame payload starts. */
2709 eh = mtod(mbuf, struct ether_vlan_header *);
2710 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
2711 etype = ntohs(eh->evl_proto);
2712 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
2713 } else {
2714 etype = htons(eh->evl_encap_proto);
2715 ehdrlen = ETHER_HDR_LEN;
2716 }
2717
2718 ip = (struct ip *)(mbuf->m_data + ehdrlen);
2719 iphlen = ip->ip_hl << 2;
2720 th = (struct tcphdr *)((vaddr_t)ip + iphlen);
2721
2722 if ((mbuf->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0) {
2723 ena_tx_ctx->l3_csum_enable = 1;
2724 }
2725 if ((mbuf->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
2726 ena_tx_ctx->tso_enable = 1;
2727 ena_meta->l4_hdr_len = (th->th_off);
2728 }
2729
2730 switch (etype) {
2731 case ETHERTYPE_IP:
2732 ena_tx_ctx->l3_proto = ENA_ETH_IO_L3_PROTO_IPV4;
2733 if ((ip->ip_off & htons(IP_DF)) != 0)
2734 ena_tx_ctx->df = 1;
2735 break;
2736 case ETHERTYPE_IPV6:
2737 ena_tx_ctx->l3_proto = ENA_ETH_IO_L3_PROTO_IPV6;
2738
2739 default:
2740 break;
2741 }
2742
2743 if (ip->ip_p == IPPROTO_TCP) {
2744 ena_tx_ctx->l4_proto = ENA_ETH_IO_L4_PROTO_TCP;
2745 if ((mbuf->m_pkthdr.csum_flags &
2746 (M_CSUM_TCPv4 | M_CSUM_TCPv6)) != 0)
2747 ena_tx_ctx->l4_csum_enable = 1;
2748 else
2749 ena_tx_ctx->l4_csum_enable = 0;
2750 } else if (ip->ip_p == IPPROTO_UDP) {
2751 ena_tx_ctx->l4_proto = ENA_ETH_IO_L4_PROTO_UDP;
2752 if ((mbuf->m_pkthdr.csum_flags &
2753 (M_CSUM_UDPv4 | M_CSUM_UDPv6)) != 0)
2754 ena_tx_ctx->l4_csum_enable = 1;
2755 else
2756 ena_tx_ctx->l4_csum_enable = 0;
2757 } else {
2758 ena_tx_ctx->l4_proto = ENA_ETH_IO_L4_PROTO_UNKNOWN;
2759 ena_tx_ctx->l4_csum_enable = 0;
2760 }
2761
2762 ena_meta->mss = mss;
2763 ena_meta->l3_hdr_len = iphlen;
2764 ena_meta->l3_hdr_offset = ehdrlen;
2765 ena_tx_ctx->meta_valid = 1;
2766 }
2767
2768 static int
2769 ena_check_and_collapse_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf)
2770 {
2771 struct ena_adapter *adapter;
2772 struct mbuf *collapsed_mbuf;
2773 int num_frags;
2774
2775 adapter = tx_ring->adapter;
2776 num_frags = ena_mbuf_count(*mbuf);
2777
2778 /* One segment must be reserved for configuration descriptor. */
2779 if (num_frags < adapter->max_tx_sgl_size)
2780 return (0);
2781 counter_u64_add(tx_ring->tx_stats.collapse, 1);
2782
2783 collapsed_mbuf = m_collapse(*mbuf, M_NOWAIT,
2784 adapter->max_tx_sgl_size - 1);
2785 if (unlikely(collapsed_mbuf == NULL)) {
2786 counter_u64_add(tx_ring->tx_stats.collapse_err, 1);
2787 return (ENOMEM);
2788 }
2789
2790 /* If mbuf was collapsed successfully, original mbuf is released. */
2791 *mbuf = collapsed_mbuf;
2792
2793 return (0);
2794 }
2795
2796 static int
2797 ena_xmit_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf)
2798 {
2799 struct ena_adapter *adapter;
2800 struct ena_tx_buffer *tx_info;
2801 struct ena_com_tx_ctx ena_tx_ctx;
2802 struct ena_com_dev *ena_dev;
2803 struct ena_com_buf *ena_buf;
2804 struct ena_com_io_sq* io_sq;
2805 void *push_hdr;
2806 uint16_t next_to_use;
2807 uint16_t req_id;
2808 uint16_t ena_qid;
2809 uint32_t header_len;
2810 int i, rc;
2811 int nb_hw_desc;
2812
2813 KASSERT(ENA_RING_MTX_OWNED(tx_ring));
2814
2815 ena_qid = ENA_IO_TXQ_IDX(tx_ring->que->id);
2816 adapter = tx_ring->que->adapter;
2817 ena_dev = adapter->ena_dev;
2818 io_sq = &ena_dev->io_sq_queues[ena_qid];
2819
2820 rc = ena_check_and_collapse_mbuf(tx_ring, mbuf);
2821 if (unlikely(rc != 0)) {
2822 ena_trace(ENA_WARNING,
2823 "Failed to collapse mbuf! err: %d", rc);
2824 return (rc);
2825 }
2826
2827 next_to_use = tx_ring->next_to_use;
2828 req_id = tx_ring->free_tx_ids[next_to_use];
2829 tx_info = &tx_ring->tx_buffer_info[req_id];
2830
2831 tx_info->mbuf = *mbuf;
2832 tx_info->num_of_bufs = 0;
2833
2834 ena_buf = tx_info->bufs;
2835
2836 ena_trace(ENA_DBG | ENA_TXPTH, "Tx: %d bytes", (*mbuf)->m_pkthdr.len);
2837
2838 /*
2839 * header_len is just a hint for the device. Because FreeBSD is not
2840 * giving us information about packet header length and it is not
2841 * guaranteed that all packet headers will be in the 1st mbuf, setting
2842 * header_len to 0 is making the device ignore this value and resolve
2843 * header on it's own.
2844 */
2845 header_len = 0;
2846 push_hdr = NULL;
2847
2848 rc = bus_dmamap_load_mbuf(adapter->sc_dmat, tx_info->map,
2849 *mbuf, BUS_DMA_NOWAIT);
2850
2851 if (unlikely((rc != 0) || (tx_info->map->dm_nsegs == 0))) {
2852 ena_trace(ENA_WARNING,
2853 "dmamap load failed! err: %d nsegs: %d", rc,
2854 tx_info->map->dm_nsegs);
2855 counter_u64_add(tx_ring->tx_stats.dma_mapping_err, 1);
2856 tx_info->mbuf = NULL;
2857 if (rc == ENOMEM)
2858 return (ENA_COM_NO_MEM);
2859 else
2860 return (ENA_COM_INVAL);
2861 }
2862
2863 for (i = 0; i < tx_info->map->dm_nsegs; i++) {
2864 ena_buf->len = tx_info->map->dm_segs[i].ds_len;
2865 ena_buf->paddr = tx_info->map->dm_segs[i].ds_addr;
2866 ena_buf++;
2867 }
2868 tx_info->num_of_bufs = tx_info->map->dm_nsegs;
2869
2870 memset(&ena_tx_ctx, 0x0, sizeof(struct ena_com_tx_ctx));
2871 ena_tx_ctx.ena_bufs = tx_info->bufs;
2872 ena_tx_ctx.push_header = push_hdr;
2873 ena_tx_ctx.num_bufs = tx_info->num_of_bufs;
2874 ena_tx_ctx.req_id = req_id;
2875 ena_tx_ctx.header_len = header_len;
2876
2877 /* Set flags and meta data */
2878 ena_tx_csum(&ena_tx_ctx, *mbuf);
2879 /* Prepare the packet's descriptors and send them to device */
2880 rc = ena_com_prepare_tx(io_sq, &ena_tx_ctx, &nb_hw_desc);
2881 if (unlikely(rc != 0)) {
2882 device_printf(adapter->pdev, "failed to prepare tx bufs\n");
2883 counter_u64_add(tx_ring->tx_stats.prepare_ctx_err, 1);
2884 goto dma_error;
2885 }
2886
2887 counter_enter();
2888 counter_u64_add_protected(tx_ring->tx_stats.cnt, 1);
2889 counter_u64_add_protected(tx_ring->tx_stats.bytes,
2890 (*mbuf)->m_pkthdr.len);
2891
2892 counter_u64_add_protected(adapter->hw_stats.tx_packets, 1);
2893 counter_u64_add_protected(adapter->hw_stats.tx_bytes,
2894 (*mbuf)->m_pkthdr.len);
2895 counter_exit();
2896
2897 tx_info->tx_descs = nb_hw_desc;
2898 getbinuptime(&tx_info->timestamp);
2899 tx_info->print_once = true;
2900
2901 tx_ring->next_to_use = ENA_TX_RING_IDX_NEXT(next_to_use,
2902 tx_ring->ring_size);
2903
2904 bus_dmamap_sync(adapter->sc_dmat, tx_info->map, 0,
2905 tx_info->map->dm_mapsize, BUS_DMASYNC_PREWRITE);
2906
2907 return (0);
2908
2909 dma_error:
2910 tx_info->mbuf = NULL;
2911 bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
2912
2913 return (rc);
2914 }
2915
2916 static void
2917 ena_start_xmit(struct ena_ring *tx_ring)
2918 {
2919 struct mbuf *mbuf;
2920 struct ena_adapter *adapter = tx_ring->adapter;
2921 struct ena_com_io_sq* io_sq;
2922 int ena_qid;
2923 int acum_pkts = 0;
2924 int ret = 0;
2925 net_stat_ref_t nsr;
2926
2927 KASSERT(ENA_RING_MTX_OWNED(tx_ring));
2928
2929 /* ena_down() is waiting for completing */
2930 if (unlikely((if_getdrvflags(adapter->ifp) & IFF_RUNNING) == 0))
2931 return;
2932
2933 if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)))
2934 return;
2935
2936 ena_qid = ENA_IO_TXQ_IDX(tx_ring->que->id);
2937 io_sq = &adapter->ena_dev->io_sq_queues[ena_qid];
2938
2939 nsr = IF_STAT_GETREF(adapter->ifp);
2940
2941 for (;;) {
2942 if (unlikely(!ena_com_sq_have_enough_space(io_sq, adapter->max_tx_sgl_size)))
2943 break;
2944
2945 if ((mbuf = pcq_get(tx_ring->br)) == NULL)
2946 break;
2947
2948 ena_trace(ENA_DBG | ENA_TXPTH, "\ndequeued mbuf %p with flags %#x and"
2949 " header csum flags %#jx",
2950 mbuf, mbuf->m_flags, (uint64_t)mbuf->m_pkthdr.csum_flags);
2951
2952 if (likely((ret = ena_xmit_mbuf(tx_ring, &mbuf)) == 0)) {
2953 if_statinc_ref(nsr, if_opackets);
2954 if_statadd_ref(nsr, if_obytes, mbuf->m_pkthdr.len);
2955 if (ISSET(mbuf->m_flags, M_MCAST))
2956 if_statinc_ref(nsr, if_omcasts);
2957 } else {
2958 if_statinc_ref(nsr, if_oerrors);
2959 m_freem(mbuf);
2960 break;
2961 }
2962
2963 /* ena_down is waiting for completing */
2964 if (unlikely((if_getdrvflags(adapter->ifp) &
2965 IFF_RUNNING) == 0)) {
2966 IF_STAT_PUTREF(adapter->ifp);
2967 return;
2968 }
2969
2970 acum_pkts++;
2971
2972 /*
2973 * If there's a BPF listener, bounce a copy of this frame
2974 * to him.
2975 */
2976 bpf_mtap(adapter->ifp, mbuf, BPF_D_OUT);
2977
2978 if (unlikely(acum_pkts == DB_THRESHOLD)) {
2979 acum_pkts = 0;
2980 wmb();
2981 /* Trigger the dma engine */
2982 ena_com_write_sq_doorbell(io_sq);
2983 counter_u64_add(tx_ring->tx_stats.doorbells, 1);
2984 }
2985
2986 }
2987
2988 IF_STAT_PUTREF(adapter->ifp);
2989
2990 if (likely(acum_pkts != 0)) {
2991 wmb();
2992 /* Trigger the dma engine */
2993 ena_com_write_sq_doorbell(io_sq);
2994 counter_u64_add(tx_ring->tx_stats.doorbells, 1);
2995 }
2996
2997 if (!ena_com_sq_have_enough_space(io_sq, ENA_TX_CLEANUP_THRESHOLD))
2998 ena_tx_cleanup(tx_ring);
2999 }
3000
3001 static void
3002 ena_deferred_mq_start(struct work *wk, void *arg)
3003 {
3004 struct ena_ring *tx_ring = (struct ena_ring *)arg;
3005 struct ifnet *ifp = tx_ring->adapter->ifp;
3006
3007 atomic_swap_uint(&tx_ring->task_pending, 0);
3008
3009 while (pcq_peek(tx_ring->br) != NULL &&
3010 (if_getdrvflags(ifp) & IFF_RUNNING) != 0) {
3011 ENA_RING_MTX_LOCK(tx_ring);
3012 if (tx_ring->stopping) {
3013 ENA_RING_MTX_UNLOCK(tx_ring);
3014 return;
3015 }
3016 ena_start_xmit(tx_ring);
3017 ENA_RING_MTX_UNLOCK(tx_ring);
3018 }
3019 }
3020
3021 static int
3022 ena_mq_start(struct ifnet *ifp, struct mbuf *m)
3023 {
3024 struct ena_adapter *adapter = ifp->if_softc;
3025 struct ena_ring *tx_ring;
3026 struct mbuf *is_drbr_empty;
3027 bool ret;
3028 uint32_t i;
3029
3030 if (unlikely((if_getdrvflags(adapter->ifp) & IFF_RUNNING) == 0))
3031 return (ENODEV);
3032
3033 /* Which queue to use */
3034 /*
3035 * If everything is setup correctly, it should be the
3036 * same bucket that the current CPU we're on is.
3037 * It should improve performance.
3038 */
3039 i = cpu_index(curcpu()) % adapter->num_queues;
3040
3041 tx_ring = &adapter->tx_ring[i];
3042
3043 /* Check if drbr is empty before putting packet */
3044 is_drbr_empty = pcq_peek(tx_ring->br);
3045 ret = pcq_put(tx_ring->br, m);
3046 if (unlikely(ret == false)) {
3047 m_freem(m);
3048 counter_u64_add(tx_ring->tx_stats.pcq_drops, 1);
3049 if (atomic_cas_uint(&tx_ring->task_pending, 0, 1) == 0)
3050 workqueue_enqueue(tx_ring->enqueue_tq, &tx_ring->enqueue_task,
3051 curcpu());
3052 return (ENOBUFS);
3053 }
3054
3055 if ((is_drbr_empty != NULL) && (ENA_RING_MTX_TRYLOCK(tx_ring) != 0)) {
3056 if (!tx_ring->stopping)
3057 ena_start_xmit(tx_ring);
3058 ENA_RING_MTX_UNLOCK(tx_ring);
3059 } else {
3060 if (atomic_cas_uint(&tx_ring->task_pending, 0, 1) == 0)
3061 workqueue_enqueue(tx_ring->enqueue_tq, &tx_ring->enqueue_task,
3062 curcpu());
3063 }
3064
3065 return (0);
3066 }
3067
3068 #if 0
3069 static void
3070 ena_qflush(struct ifnet *ifp)
3071 {
3072 struct ena_adapter *adapter = ifp->if_softc;
3073 struct ena_ring *tx_ring = adapter->tx_ring;
3074 int i;
3075
3076 for(i = 0; i < adapter->num_queues; ++i, ++tx_ring)
3077 if (!drbr_empty(ifp, tx_ring->br)) {
3078 ENA_RING_MTX_LOCK(tx_ring);
3079 drbr_flush(ifp, tx_ring->br);
3080 ENA_RING_MTX_UNLOCK(tx_ring);
3081 }
3082
3083 if_qflush(ifp);
3084 }
3085 #endif
3086
3087 static int
3088 ena_calc_io_queue_num(struct pci_attach_args *pa,
3089 struct ena_adapter *adapter,
3090 struct ena_com_dev_get_features_ctx *get_feat_ctx)
3091 {
3092 int io_sq_num, io_cq_num, io_queue_num;
3093
3094 io_sq_num = get_feat_ctx->max_queues.max_sq_num;
3095 io_cq_num = get_feat_ctx->max_queues.max_cq_num;
3096
3097 io_queue_num = min_t(int, mp_ncpus, ENA_MAX_NUM_IO_QUEUES);
3098 io_queue_num = min_t(int, io_queue_num, io_sq_num);
3099 io_queue_num = min_t(int, io_queue_num, io_cq_num);
3100 /* 1 IRQ for mgmnt and 1 IRQ for each TX/RX pair */
3101 io_queue_num = min_t(int, io_queue_num,
3102 pci_msix_count(pa->pa_pc, pa->pa_tag) - 1);
3103
3104 return (io_queue_num);
3105 }
3106
3107 static int
3108 ena_calc_queue_size(struct ena_adapter *adapter, uint16_t *max_tx_sgl_size,
3109 uint16_t *max_rx_sgl_size, struct ena_com_dev_get_features_ctx *feat)
3110 {
3111 uint32_t queue_size = ENA_DEFAULT_RING_SIZE;
3112 uint32_t v;
3113 uint32_t q;
3114
3115 queue_size = min_t(uint32_t, queue_size,
3116 feat->max_queues.max_cq_depth);
3117 queue_size = min_t(uint32_t, queue_size,
3118 feat->max_queues.max_sq_depth);
3119
3120 /* round down to the nearest power of 2 */
3121 v = queue_size;
3122 while (v != 0) {
3123 if (powerof2(queue_size) != 0)
3124 break;
3125 v /= 2;
3126 q = rounddown2(queue_size, v);
3127 if (q != 0) {
3128 queue_size = q;
3129 break;
3130 }
3131 }
3132
3133 if (unlikely(queue_size == 0)) {
3134 device_printf(adapter->pdev, "Invalid queue size\n");
3135 return (ENA_COM_FAULT);
3136 }
3137
3138 *max_tx_sgl_size = min_t(uint16_t, ENA_PKT_MAX_BUFS,
3139 feat->max_queues.max_packet_tx_descs);
3140 *max_rx_sgl_size = min_t(uint16_t, ENA_PKT_MAX_BUFS,
3141 feat->max_queues.max_packet_rx_descs);
3142
3143 return (queue_size);
3144 }
3145
3146 static void
3147 ena_rss_init_default(device_t self)
3148 {
3149 struct ena_adapter *adapter = device_private(self);
3150 struct ena_com_dev *ena_dev = adapter->ena_dev;
3151 device_t dev = adapter->pdev;
3152 int qid, rc, i;
3153
3154 rc = ena_com_rss_init(ena_dev, ENA_RX_RSS_TABLE_LOG_SIZE);
3155 if (unlikely(rc != 0)) {
3156 device_printf(dev, "Cannot init indirect table\n");
3157 return;
3158 }
3159
3160 for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) {
3161 qid = i % adapter->num_queues;
3162 rc = ena_com_indirect_table_fill_entry(ena_dev, i,
3163 ENA_IO_RXQ_IDX(qid));
3164 if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) {
3165 device_printf(dev, "Cannot fill indirect table\n");
3166 goto err_rss_destroy;
3167 }
3168 }
3169
3170 rc = ena_com_fill_hash_function(ena_dev, ENA_ADMIN_CRC32, NULL,
3171 ENA_HASH_KEY_SIZE, 0xFFFFFFFF);
3172 if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) {
3173 device_printf(dev, "Cannot fill hash function\n");
3174 goto err_rss_destroy;
3175 }
3176
3177 rc = ena_com_set_default_hash_ctrl(ena_dev);
3178 if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) {
3179 device_printf(dev, "Cannot fill hash control\n");
3180 goto err_rss_destroy;
3181 }
3182
3183 adapter->rss_support = true;
3184 return;
3185
3186 err_rss_destroy:
3187 ena_com_rss_destroy(ena_dev);
3188 adapter->rss_support = false;
3189 return;
3190 }
3191
3192 static void
3193 ena_config_host_info(struct ena_com_dev *ena_dev)
3194 {
3195 struct ena_admin_host_info *host_info;
3196 int rc;
3197
3198 /* Allocate only the host info */
3199 rc = ena_com_allocate_host_info(ena_dev);
3200 if (unlikely(rc != 0)) {
3201 ena_trace(ENA_ALERT, "Cannot allocate host info\n");
3202 return;
3203 }
3204
3205 host_info = ena_dev->host_attr.host_info;
3206
3207 host_info->os_type = ENA_ADMIN_OS_FREEBSD;
3208 host_info->kernel_ver = osreldate;
3209
3210 snprintf(host_info->kernel_ver_str, sizeof(host_info->kernel_ver_str),
3211 "%d", osreldate);
3212 host_info->os_dist = 0;
3213 strncpy(host_info->os_dist_str, osrelease,
3214 sizeof(host_info->os_dist_str) - 1);
3215
3216 host_info->driver_version =
3217 (DRV_MODULE_VER_MAJOR) |
3218 (DRV_MODULE_VER_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT) |
3219 (DRV_MODULE_VER_SUBMINOR << ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT);
3220
3221 rc = ena_com_set_host_attributes(ena_dev);
3222 if (unlikely(rc != 0)) {
3223 if (rc == EOPNOTSUPP)
3224 ena_trace(ENA_WARNING, "Cannot set host attributes\n");
3225 else
3226 ena_trace(ENA_ALERT, "Cannot set host attributes\n");
3227
3228 goto err;
3229 }
3230
3231 return;
3232
3233 err:
3234 ena_com_delete_host_info(ena_dev);
3235 }
3236
3237 static int
3238 ena_device_init(struct ena_adapter *adapter, device_t pdev,
3239 struct ena_com_dev_get_features_ctx *get_feat_ctx, int *wd_active)
3240 {
3241 struct ena_com_dev* ena_dev = adapter->ena_dev;
3242 bool readless_supported;
3243 uint32_t aenq_groups;
3244 int dma_width;
3245 int rc;
3246
3247 rc = ena_com_mmio_reg_read_request_init(ena_dev);
3248 if (unlikely(rc != 0)) {
3249 device_printf(pdev, "failed to init mmio read less\n");
3250 return (rc);
3251 }
3252
3253 /*
3254 * The PCIe configuration space revision id indicate if mmio reg
3255 * read is disabled
3256 */
3257 const int rev = PCI_REVISION(adapter->sc_pa.pa_class);
3258 readless_supported = ((rev & ENA_MMIO_DISABLE_REG_READ) == 0);
3259 ena_com_set_mmio_read_mode(ena_dev, readless_supported);
3260
3261 rc = ena_com_dev_reset(ena_dev, ENA_REGS_RESET_NORMAL);
3262 if (unlikely(rc != 0)) {
3263 device_printf(pdev, "Can not reset device\n");
3264 goto err_mmio_read_less;
3265 }
3266
3267 rc = ena_com_validate_version(ena_dev);
3268 if (unlikely(rc != 0)) {
3269 device_printf(pdev, "device version is too low\n");
3270 goto err_mmio_read_less;
3271 }
3272
3273 dma_width = ena_com_get_dma_width(ena_dev);
3274 if (unlikely(dma_width < 0)) {
3275 device_printf(pdev, "Invalid dma width value %d", dma_width);
3276 rc = dma_width;
3277 goto err_mmio_read_less;
3278 }
3279 adapter->dma_width = dma_width;
3280
3281 /* ENA admin level init */
3282 rc = ena_com_admin_init(ena_dev, &aenq_handlers, true);
3283 if (unlikely(rc != 0)) {
3284 device_printf(pdev,
3285 "Can not initialize ena admin queue with device\n");
3286 goto err_mmio_read_less;
3287 }
3288
3289 /*
3290 * To enable the msix interrupts the driver needs to know the number
3291 * of queues. So the driver uses polling mode to retrieve this
3292 * information
3293 */
3294 ena_com_set_admin_polling_mode(ena_dev, true);
3295
3296 ena_config_host_info(ena_dev);
3297
3298 /* Get Device Attributes */
3299 rc = ena_com_get_dev_attr_feat(ena_dev, get_feat_ctx);
3300 if (unlikely(rc != 0)) {
3301 device_printf(pdev,
3302 "Cannot get attribute for ena device rc: %d\n", rc);
3303 goto err_admin_init;
3304 }
3305
3306 aenq_groups = BIT(ENA_ADMIN_LINK_CHANGE) | BIT(ENA_ADMIN_KEEP_ALIVE);
3307
3308 aenq_groups &= get_feat_ctx->aenq.supported_groups;
3309 rc = ena_com_set_aenq_config(ena_dev, aenq_groups);
3310 if (unlikely(rc != 0)) {
3311 device_printf(pdev, "Cannot configure aenq groups rc: %d\n", rc);
3312 goto err_admin_init;
3313 }
3314
3315 *wd_active = !!(aenq_groups & BIT(ENA_ADMIN_KEEP_ALIVE));
3316
3317 return (0);
3318
3319 err_admin_init:
3320 ena_com_delete_host_info(ena_dev);
3321 ena_com_admin_destroy(ena_dev);
3322 err_mmio_read_less:
3323 ena_com_mmio_reg_read_request_destroy(ena_dev);
3324
3325 return (rc);
3326 }
3327
3328 static int ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *adapter,
3329 int io_vectors)
3330 {
3331 struct ena_com_dev *ena_dev = adapter->ena_dev;
3332 int rc;
3333
3334 rc = ena_enable_msix(adapter);
3335 if (unlikely(rc != 0)) {
3336 device_printf(adapter->pdev, "Error with MSI-X enablement\n");
3337 return (rc);
3338 }
3339
3340 rc = ena_request_mgmnt_irq(adapter);
3341 if (unlikely(rc != 0)) {
3342 device_printf(adapter->pdev, "Cannot setup mgmnt queue intr\n");
3343 goto err_disable_msix;
3344 }
3345
3346 ena_com_set_admin_polling_mode(ena_dev, false);
3347
3348 ena_com_admin_aenq_enable(ena_dev);
3349
3350 return (0);
3351
3352 err_disable_msix:
3353 ena_disable_msix(adapter);
3354
3355 return (rc);
3356 }
3357
3358 /* Function called on ENA_ADMIN_KEEP_ALIVE event */
3359 static void ena_keep_alive_wd(void *adapter_data,
3360 struct ena_admin_aenq_entry *aenq_e)
3361 {
3362 struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
3363 struct ena_admin_aenq_keep_alive_desc *desc;
3364 uint64_t rx_drops, old;
3365
3366 desc = (struct ena_admin_aenq_keep_alive_desc *)aenq_e;
3367
3368 rx_drops = ((uint64_t)desc->rx_drops_high << 32) | desc->rx_drops_low;
3369 old = adapter->hw_stats.rx_drops.ev_count;
3370 if (rx_drops > old) {
3371 counter_u64_add(adapter->hw_stats.rx_drops, rx_drops - old);
3372 if_statadd(adapter->ifp, if_iqdrops, rx_drops - old);
3373 }
3374
3375 atomic_store_release(&adapter->keep_alive_timestamp, getsbinuptime());
3376 }
3377
3378 /* Check for keep alive expiration */
3379 static void check_for_missing_keep_alive(struct ena_adapter *adapter)
3380 {
3381 sbintime_t timestamp, time;
3382
3383 if (adapter->wd_active == 0)
3384 return;
3385
3386 if (likely(adapter->keep_alive_timeout == 0))
3387 return;
3388
3389 timestamp = atomic_load_acquire(&adapter->keep_alive_timestamp);
3390
3391 time = getsbinuptime() - timestamp;
3392 if (unlikely(time > adapter->keep_alive_timeout)) {
3393 device_printf(adapter->pdev,
3394 "Keep alive watchdog timeout.\n");
3395 counter_u64_add(adapter->dev_stats.wd_expired, 1);
3396 adapter->reset_reason = ENA_REGS_RESET_KEEP_ALIVE_TO;
3397 ENA_FLAG_SET_ATOMIC(ENA_FLAG_TRIGGER_RESET, adapter);
3398 }
3399 }
3400
3401 /* Check if admin queue is enabled */
3402 static void check_for_admin_com_state(struct ena_adapter *adapter)
3403 {
3404 if (unlikely(ena_com_get_admin_running_state(adapter->ena_dev) ==
3405 false)) {
3406 device_printf(adapter->pdev,
3407 "ENA admin queue is not in running state!\n");
3408 counter_u64_add(adapter->dev_stats.admin_q_pause, 1);
3409 adapter->reset_reason = ENA_REGS_RESET_ADMIN_TO;
3410 ENA_FLAG_SET_ATOMIC(ENA_FLAG_TRIGGER_RESET, adapter);
3411 }
3412 }
3413
3414 static int
3415 check_missing_comp_in_queue(struct ena_adapter *adapter,
3416 struct ena_ring *tx_ring)
3417 {
3418 struct bintime curtime, time;
3419 struct ena_tx_buffer *tx_buf;
3420 uint32_t missed_tx = 0;
3421 int i;
3422
3423 getbinuptime(&curtime);
3424
3425 for (i = 0; i < tx_ring->ring_size; i++) {
3426 tx_buf = &tx_ring->tx_buffer_info[i];
3427
3428 if (bintime_isset(&tx_buf->timestamp) == 0)
3429 continue;
3430
3431 time = curtime;
3432 bintime_sub(&time, &tx_buf->timestamp);
3433
3434 /* Check again if packet is still waiting */
3435 if (unlikely(bttosbt(time) > adapter->missing_tx_timeout)) {
3436
3437 if (!tx_buf->print_once)
3438 ena_trace(ENA_WARNING, "Found a Tx that wasn't "
3439 "completed on time, qid %d, index %d.\n",
3440 tx_ring->qid, i);
3441
3442 tx_buf->print_once = true;
3443 missed_tx++;
3444 counter_u64_add(tx_ring->tx_stats.missing_tx_comp, 1);
3445
3446 if (unlikely(missed_tx >
3447 adapter->missing_tx_threshold)) {
3448 device_printf(adapter->pdev,
3449 "The number of lost tx completion "
3450 "is above the threshold (%d > %d). "
3451 "Reset the device\n",
3452 missed_tx, adapter->missing_tx_threshold);
3453 adapter->reset_reason =
3454 ENA_REGS_RESET_MISS_TX_CMPL;
3455 ENA_FLAG_SET_ATOMIC(ENA_FLAG_TRIGGER_RESET,
3456 adapter);
3457 return (EIO);
3458 }
3459 }
3460 }
3461
3462 return (0);
3463 }
3464
3465 /*
3466 * Check for TX which were not completed on time.
3467 * Timeout is defined by "missing_tx_timeout".
3468 * Reset will be performed if number of incompleted
3469 * transactions exceeds "missing_tx_threshold".
3470 */
3471 static void
3472 check_for_missing_tx_completions(struct ena_adapter *adapter)
3473 {
3474 struct ena_ring *tx_ring;
3475 int i, budget, rc;
3476
3477 /* Make sure the driver doesn't turn the device in other process */
3478 rmb();
3479
3480 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter))
3481 return;
3482
3483 if (ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))
3484 return;
3485
3486 if (adapter->missing_tx_timeout == 0)
3487 return;
3488
3489 budget = adapter->missing_tx_max_queues;
3490
3491 for (i = adapter->next_monitored_tx_qid; i < adapter->num_queues; i++) {
3492 tx_ring = &adapter->tx_ring[i];
3493
3494 rc = check_missing_comp_in_queue(adapter, tx_ring);
3495 if (unlikely(rc != 0))
3496 return;
3497
3498 budget--;
3499 if (budget == 0) {
3500 i++;
3501 break;
3502 }
3503 }
3504
3505 adapter->next_monitored_tx_qid = i % adapter->num_queues;
3506 }
3507
3508 /* trigger deferred rx cleanup after 2 consecutive detections */
3509 #define EMPTY_RX_REFILL 2
3510 /* For the rare case where the device runs out of Rx descriptors and the
3511 * msix handler failed to refill new Rx descriptors (due to a lack of memory
3512 * for example).
3513 * This case will lead to a deadlock:
3514 * The device won't send interrupts since all the new Rx packets will be dropped
3515 * The msix handler won't allocate new Rx descriptors so the device won't be
3516 * able to send new packets.
3517 *
3518 * When such a situation is detected - execute rx cleanup task in another thread
3519 */
3520 static void
3521 check_for_empty_rx_ring(struct ena_adapter *adapter)
3522 {
3523 struct ena_ring *rx_ring;
3524 int i, refill_required;
3525
3526 if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter))
3527 return;
3528
3529 if (ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))
3530 return;
3531
3532 for (i = 0; i < adapter->num_queues; i++) {
3533 rx_ring = &adapter->rx_ring[i];
3534
3535 refill_required = ena_com_free_desc(rx_ring->ena_com_io_sq);
3536 if (unlikely(refill_required == (rx_ring->ring_size - 1))) {
3537 rx_ring->empty_rx_queue++;
3538
3539 if (rx_ring->empty_rx_queue >= EMPTY_RX_REFILL) {
3540 counter_u64_add(rx_ring->rx_stats.empty_rx_ring,
3541 1);
3542
3543 device_printf(adapter->pdev,
3544 "trigger refill for ring %d\n", i);
3545
3546 ENA_RING_MTX_LOCK(rx_ring);
3547 if (rx_ring->stopping) {
3548 ENA_RING_MTX_UNLOCK(rx_ring);
3549 return;
3550 }
3551 if (atomic_cas_uint(&rx_ring->task_pending, 0, 1) == 0)
3552 workqueue_enqueue(rx_ring->cleanup_tq,
3553 &rx_ring->cleanup_task, curcpu());
3554 ENA_RING_MTX_UNLOCK(rx_ring);
3555 rx_ring->empty_rx_queue = 0;
3556 }
3557 } else {
3558 rx_ring->empty_rx_queue = 0;
3559 }
3560 }
3561 }
3562
3563 static void
3564 ena_timer_service(void *data)
3565 {
3566 struct ena_adapter *adapter = (struct ena_adapter *)data;
3567 struct ena_admin_host_info *host_info =
3568 adapter->ena_dev->host_attr.host_info;
3569
3570 check_for_missing_keep_alive(adapter);
3571
3572 check_for_admin_com_state(adapter);
3573
3574 check_for_missing_tx_completions(adapter);
3575
3576 check_for_empty_rx_ring(adapter);
3577
3578 if (host_info != NULL)
3579 ena_update_host_info(host_info, adapter->ifp);
3580
3581 if (unlikely(ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
3582 device_printf(adapter->pdev, "Trigger reset is on\n");
3583 workqueue_enqueue(adapter->reset_tq, &adapter->reset_task,
3584 curcpu());
3585 return;
3586 }
3587
3588 /*
3589 * Schedule another timeout one second from now.
3590 */
3591 if (likely(ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)))
3592 callout_schedule(&adapter->timer_service, hz);
3593 }
3594
3595 static void
3596 ena_reset_task(struct work *wk, void *arg)
3597 {
3598 struct ena_com_dev_get_features_ctx get_feat_ctx;
3599 struct ena_adapter *adapter = (struct ena_adapter *)arg;
3600 struct ena_com_dev *ena_dev = adapter->ena_dev;
3601 bool dev_up;
3602 int rc;
3603
3604 if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
3605 device_printf(adapter->pdev,
3606 "device reset scheduled but trigger_reset is off\n");
3607 return;
3608 }
3609
3610 ENA_CORE_MTX_LOCK(adapter);
3611
3612 callout_halt(&adapter->timer_service, NULL);
3613
3614 dev_up = ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter);
3615
3616 ena_com_set_admin_running_state(ena_dev, false);
3617 ena_down(adapter);
3618 ena_free_mgmnt_irq(adapter);
3619 ena_disable_msix(adapter);
3620 ena_com_abort_admin_commands(ena_dev);
3621 ena_com_wait_for_abort_completion(ena_dev);
3622 ena_com_admin_destroy(ena_dev);
3623 ena_com_mmio_reg_read_request_destroy(ena_dev);
3624
3625 adapter->reset_reason = ENA_REGS_RESET_NORMAL;
3626 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_TRIGGER_RESET, adapter);
3627
3628 /* Finished destroy part. Restart the device */
3629 rc = ena_device_init(adapter, adapter->pdev, &get_feat_ctx,
3630 &adapter->wd_active);
3631 if (unlikely(rc != 0)) {
3632 device_printf(adapter->pdev,
3633 "ENA device init failed! (err: %d)\n", rc);
3634 goto err_dev_free;
3635 }
3636
3637 /* XXX dealloc and realloc MSI-X, probably a waste */
3638 rc = ena_enable_msix_and_set_admin_interrupts(adapter,
3639 adapter->num_queues);
3640 if (unlikely(rc != 0)) {
3641 device_printf(adapter->pdev, "Enable MSI-X failed\n");
3642 goto err_com_free;
3643 }
3644
3645 /* If the interface was up before the reset bring it up */
3646 if (dev_up) {
3647 rc = ena_up(adapter);
3648 if (unlikely(rc != 0)) {
3649 device_printf(adapter->pdev,
3650 "Failed to create I/O queues\n");
3651 goto err_msix_free;
3652 }
3653 }
3654
3655 ENA_CORE_MTX_UNLOCK(adapter);
3656
3657 return;
3658
3659 err_msix_free:
3660 ena_free_mgmnt_irq(adapter);
3661 ena_disable_msix(adapter);
3662 err_com_free:
3663 ena_com_admin_destroy(ena_dev);
3664 err_dev_free:
3665 device_printf(adapter->pdev, "ENA reset failed!\n");
3666 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_DEVICE_RUNNING, adapter);
3667 ENA_CORE_MTX_UNLOCK(adapter);
3668 }
3669
3670 /**
3671 * ena_attach - Device Initialization Routine
3672 * @pdev: device information struct
3673 *
3674 * Returns 0 on success, otherwise on failure.
3675 *
3676 * ena_attach initializes an adapter identified by a device structure.
3677 * The OS initialization, configuring of the adapter private structure,
3678 * and a hardware reset occur.
3679 **/
3680 static void
3681 ena_attach(device_t parent, device_t self, void *aux)
3682 {
3683 struct pci_attach_args *pa = aux;
3684 struct ena_com_dev_get_features_ctx get_feat_ctx;
3685 static int version_printed;
3686 struct ena_adapter *adapter = device_private(self);
3687 struct ena_com_dev *ena_dev = NULL;
3688 uint16_t tx_sgl_size = 0;
3689 uint16_t rx_sgl_size = 0;
3690 pcireg_t reg;
3691 int io_queue_num;
3692 int queue_size;
3693 int rc;
3694
3695 adapter->pdev = self;
3696 adapter->ifp = &adapter->sc_ec.ec_if;
3697 adapter->sc_pa = *pa; /* used after attach for adapter reset too */
3698
3699 if (pci_dma64_available(pa))
3700 adapter->sc_dmat = pa->pa_dmat64;
3701 else
3702 adapter->sc_dmat = pa->pa_dmat;
3703
3704 pci_aprint_devinfo(pa, NULL);
3705
3706 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
3707 if ((reg & PCI_COMMAND_MASTER_ENABLE) == 0) {
3708 reg |= PCI_COMMAND_MASTER_ENABLE;
3709 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, reg);
3710 }
3711
3712 mutex_init(&adapter->global_mtx, MUTEX_DEFAULT, IPL_SOFTNET);
3713
3714 /* Set up the timer service */
3715 adapter->keep_alive_timeout = DEFAULT_KEEP_ALIVE_TO;
3716 adapter->missing_tx_timeout = DEFAULT_TX_CMP_TO;
3717 adapter->missing_tx_max_queues = DEFAULT_TX_MONITORED_QUEUES;
3718 adapter->missing_tx_threshold = DEFAULT_TX_CMP_THRESHOLD;
3719
3720 if (version_printed++ == 0)
3721 device_printf(parent, "%s\n", ena_version);
3722
3723 rc = ena_allocate_pci_resources(pa, adapter);
3724 if (unlikely(rc != 0)) {
3725 device_printf(parent, "PCI resource allocation failed!\n");
3726 ena_free_pci_resources(adapter);
3727 return;
3728 }
3729
3730 /* Allocate memory for ena_dev structure */
3731 ena_dev = kmem_zalloc(sizeof(struct ena_com_dev), KM_SLEEP);
3732
3733 adapter->ena_dev = ena_dev;
3734 ena_dev->dmadev = self;
3735 ena_dev->bus = kmem_zalloc(sizeof(struct ena_bus), KM_SLEEP);
3736
3737 /* Store register resources */
3738 ((struct ena_bus*)(ena_dev->bus))->reg_bar_t = adapter->sc_btag;
3739 ((struct ena_bus*)(ena_dev->bus))->reg_bar_h = adapter->sc_bhandle;
3740
3741 ena_dev->tx_mem_queue_type = ENA_ADMIN_PLACEMENT_POLICY_HOST;
3742
3743 /* Device initialization */
3744 rc = ena_device_init(adapter, self, &get_feat_ctx, &adapter->wd_active);
3745 if (unlikely(rc != 0)) {
3746 device_printf(self, "ENA device init failed! (err: %d)\n", rc);
3747 rc = ENXIO;
3748 goto err_bus_free;
3749 }
3750
3751 adapter->keep_alive_timestamp = getsbinuptime();
3752
3753 adapter->tx_offload_cap = get_feat_ctx.offload.tx;
3754
3755 /* Set for sure that interface is not up */
3756 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_DEV_UP, adapter);
3757
3758 memcpy(adapter->mac_addr, get_feat_ctx.dev_attr.mac_addr,
3759 ETHER_ADDR_LEN);
3760
3761 /* calculate IO queue number to create */
3762 io_queue_num = ena_calc_io_queue_num(pa, adapter, &get_feat_ctx);
3763
3764 ENA_ASSERT(io_queue_num > 0, "Invalid queue number: %d\n",
3765 io_queue_num);
3766 adapter->num_queues = io_queue_num;
3767
3768 adapter->max_mtu = get_feat_ctx.dev_attr.max_mtu;
3769
3770 /* calculatre ring sizes */
3771 queue_size = ena_calc_queue_size(adapter,&tx_sgl_size,
3772 &rx_sgl_size, &get_feat_ctx);
3773 if (unlikely((queue_size <= 0) || (io_queue_num <= 0))) {
3774 rc = ENA_COM_FAULT;
3775 goto err_com_free;
3776 }
3777
3778 adapter->reset_reason = ENA_REGS_RESET_NORMAL;
3779
3780 adapter->tx_ring_size = queue_size;
3781 adapter->rx_ring_size = queue_size;
3782
3783 adapter->max_tx_sgl_size = tx_sgl_size;
3784 adapter->max_rx_sgl_size = rx_sgl_size;
3785
3786 #if 0
3787 /* set up dma tags for rx and tx buffers */
3788 rc = ena_setup_tx_dma_tag(adapter);
3789 if (unlikely(rc != 0)) {
3790 device_printf(self, "Failed to create TX DMA tag\n");
3791 goto err_com_free;
3792 }
3793
3794 rc = ena_setup_rx_dma_tag(adapter);
3795 if (unlikely(rc != 0)) {
3796 device_printf(self, "Failed to create RX DMA tag\n");
3797 goto err_tx_tag_free;
3798 }
3799 #endif
3800
3801 /* initialize rings basic information */
3802 device_printf(self, "initialize %d io queues\n", io_queue_num);
3803 ena_init_io_rings(adapter);
3804
3805 /* setup network interface */
3806 rc = ena_setup_ifnet(self, adapter, &get_feat_ctx);
3807 if (unlikely(rc != 0)) {
3808 device_printf(self, "Error with network interface setup\n");
3809 goto err_io_free;
3810 }
3811
3812 rc = ena_enable_msix_and_set_admin_interrupts(adapter, io_queue_num);
3813 if (unlikely(rc != 0)) {
3814 device_printf(self,
3815 "Failed to enable and set the admin interrupts\n");
3816 goto err_ifp_free;
3817 }
3818
3819 callout_init(&adapter->timer_service, CALLOUT_MPSAFE);
3820 callout_setfunc(&adapter->timer_service, ena_timer_service, adapter);
3821
3822 /* Initialize reset task queue */
3823 rc = workqueue_create(&adapter->reset_tq, "ena_reset_enq",
3824 ena_reset_task, adapter, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
3825 if (unlikely(rc != 0)) {
3826 ena_trace(ENA_ALERT,
3827 "Unable to create workqueue for reset task\n");
3828 goto err_ifp_free;
3829 }
3830
3831 /* Initialize statistics */
3832 ena_alloc_counters_dev(adapter, &adapter->dev_stats, io_queue_num);
3833 ena_alloc_counters_hwstats(adapter, &adapter->hw_stats, io_queue_num);
3834 #if 0
3835 ena_sysctl_add_nodes(adapter);
3836 #endif
3837
3838 config_interrupts(self, ena_rss_init_default);
3839
3840 /* Tell the stack that the interface is not active */
3841 if_setdrvflagbits(adapter->ifp, IFF_OACTIVE, IFF_RUNNING);
3842 ena_set_stopping_flag(adapter, false);
3843
3844 ENA_FLAG_SET_ATOMIC(ENA_FLAG_DEVICE_RUNNING, adapter);
3845 return;
3846
3847 err_ifp_free:
3848 if_detach(adapter->ifp);
3849 err_io_free:
3850 ena_free_all_io_rings_resources(adapter);
3851 #if 0
3852 ena_free_rx_dma_tag(adapter);
3853 err_tx_tag_free:
3854 ena_free_tx_dma_tag(adapter);
3855 #endif
3856 err_com_free:
3857 ena_com_admin_destroy(ena_dev);
3858 ena_com_delete_host_info(ena_dev);
3859 ena_com_mmio_reg_read_request_destroy(ena_dev);
3860 err_bus_free:
3861 kmem_free(ena_dev->bus, sizeof(struct ena_bus));
3862 kmem_free(ena_dev, sizeof(struct ena_com_dev));
3863 ena_free_pci_resources(adapter);
3864 }
3865
3866 /**
3867 * ena_detach - Device Removal Routine
3868 * @pdev: device information struct
3869 *
3870 * ena_detach is called by the device subsystem to alert the driver
3871 * that it should release a PCI device.
3872 **/
3873 static int
3874 ena_detach(device_t pdev, int flags)
3875 {
3876 struct ena_adapter *adapter = device_private(pdev);
3877 struct ena_com_dev *ena_dev = adapter->ena_dev;
3878 #if 0
3879 int rc;
3880 #endif
3881
3882 /* Make sure VLANS are not using driver */
3883 if (VLAN_ATTACHED(&adapter->sc_ec)) {
3884 device_printf(adapter->pdev ,"VLAN is in use, detach first\n");
3885 return (EBUSY);
3886 }
3887
3888 ENA_CORE_MTX_LOCK(adapter);
3889 ena_down(adapter);
3890 ENA_CORE_MTX_UNLOCK(adapter);
3891
3892 /* Free reset task and callout */
3893 callout_halt(&adapter->timer_service, NULL);
3894 callout_destroy(&adapter->timer_service);
3895 workqueue_wait(adapter->reset_tq, &adapter->reset_task);
3896 workqueue_destroy(adapter->reset_tq);
3897 adapter->reset_tq = NULL;
3898
3899 if (adapter->ifp != NULL) {
3900 ether_ifdetach(adapter->ifp);
3901 if_detach(adapter->ifp);
3902 }
3903 ifmedia_fini(&adapter->media);
3904
3905 ena_free_all_io_rings_resources(adapter);
3906
3907 ena_free_counters((struct evcnt *)&adapter->hw_stats,
3908 sizeof(struct ena_hw_stats),
3909 offsetof(struct ena_hw_stats, rx_packets));
3910 ena_free_counters((struct evcnt *)&adapter->dev_stats,
3911 sizeof(struct ena_stats_dev),
3912 offsetof(struct ena_stats_dev, wd_expired));
3913
3914 if (likely(adapter->rss_support))
3915 ena_com_rss_destroy(ena_dev);
3916
3917 #if 0
3918 rc = ena_free_rx_dma_tag(adapter);
3919 if (unlikely(rc != 0))
3920 device_printf(adapter->pdev,
3921 "Unmapped RX DMA tag associations\n");
3922
3923 rc = ena_free_tx_dma_tag(adapter);
3924 if (unlikely(rc != 0))
3925 device_printf(adapter->pdev,
3926 "Unmapped TX DMA tag associations\n");
3927 #endif
3928
3929 /* Reset the device only if the device is running. */
3930 if (ENA_FLAG_ISSET(ENA_FLAG_DEVICE_RUNNING, adapter))
3931 ena_com_dev_reset(ena_dev, adapter->reset_reason);
3932
3933 ena_com_delete_host_info(ena_dev);
3934
3935 ena_free_irqs(adapter);
3936
3937 ena_com_abort_admin_commands(ena_dev);
3938
3939 ena_com_wait_for_abort_completion(ena_dev);
3940
3941 ena_com_admin_destroy(ena_dev);
3942
3943 ena_com_mmio_reg_read_request_destroy(ena_dev);
3944
3945 ena_free_pci_resources(adapter);
3946
3947 mutex_destroy(&adapter->global_mtx);
3948
3949 if (ena_dev->bus != NULL)
3950 kmem_free(ena_dev->bus, sizeof(struct ena_bus));
3951
3952 if (ena_dev != NULL)
3953 kmem_free(ena_dev, sizeof(struct ena_com_dev));
3954
3955 return 0;
3956 }
3957
3958 /******************************************************************************
3959 ******************************** AENQ Handlers *******************************
3960 *****************************************************************************/
3961 /**
3962 * ena_update_on_link_change:
3963 * Notify the network interface about the change in link status
3964 **/
3965 static void
3966 ena_update_on_link_change(void *adapter_data,
3967 struct ena_admin_aenq_entry *aenq_e)
3968 {
3969 struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
3970 struct ena_admin_aenq_link_change_desc *aenq_desc;
3971 int status;
3972 struct ifnet *ifp;
3973
3974 aenq_desc = (struct ena_admin_aenq_link_change_desc *)aenq_e;
3975 ifp = adapter->ifp;
3976 status = aenq_desc->flags &
3977 ENA_ADMIN_AENQ_LINK_CHANGE_DESC_LINK_STATUS_MASK;
3978
3979 if (status != 0) {
3980 device_printf(adapter->pdev, "link is UP\n");
3981 ENA_FLAG_SET_ATOMIC(ENA_FLAG_LINK_UP, adapter);
3982 if_link_state_change(ifp, LINK_STATE_UP);
3983 } else {
3984 device_printf(adapter->pdev, "link is DOWN\n");
3985 ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_LINK_UP, adapter);
3986 if_link_state_change(ifp, LINK_STATE_DOWN);
3987 }
3988 }
3989
3990 /**
3991 * This handler will called for unknown event group or unimplemented handlers
3992 **/
3993 static void
3994 unimplemented_aenq_handler(void *data,
3995 struct ena_admin_aenq_entry *aenq_e)
3996 {
3997 return;
3998 }
3999
4000 static struct ena_aenq_handlers aenq_handlers = {
4001 .handlers = {
4002 [ENA_ADMIN_LINK_CHANGE] = ena_update_on_link_change,
4003 [ENA_ADMIN_KEEP_ALIVE] = ena_keep_alive_wd,
4004 },
4005 .unimplemented_handler = unimplemented_aenq_handler
4006 };
4007
4008 #ifdef __FreeBSD__
4009 /*********************************************************************
4010 * FreeBSD Device Interface Entry Points
4011 *********************************************************************/
4012
4013 static device_method_t ena_methods[] = {
4014 /* Device interface */
4015 DEVMETHOD(device_probe, ena_probe),
4016 DEVMETHOD(device_attach, ena_attach),
4017 DEVMETHOD(device_detach, ena_detach),
4018 DEVMETHOD_END
4019 };
4020
4021 static driver_t ena_driver = {
4022 "ena", ena_methods, sizeof(struct ena_adapter),
4023 };
4024
4025 devclass_t ena_devclass;
4026 DRIVER_MODULE(ena, pci, ena_driver, ena_devclass, 0, 0);
4027 MODULE_DEPEND(ena, pci, 1, 1, 1);
4028 MODULE_DEPEND(ena, ether, 1, 1, 1);
4029
4030 /*********************************************************************/
4031 #endif /* __FreeBSD__ */
4032
4033 #ifdef __NetBSD__
4034 CFATTACH_DECL_NEW(ena, sizeof(struct ena_adapter), ena_probe, ena_attach,
4035 ena_detach, NULL);
4036 #endif /* __NetBSD */
4037