if_vmx.c revision 1.11.4.1 1 /* $NetBSD: if_vmx.c,v 1.11.4.1 2024/05/11 14:49:51 martin Exp $ */
2 /* $OpenBSD: if_vmx.c,v 1.16 2014/01/22 06:04:17 brad Exp $ */
3
4 /*
5 * Copyright (c) 2013 Tsubai Masanari
6 * Copyright (c) 2013 Bryan Venteicher <bryanv (at) FreeBSD.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21 #include <sys/cdefs.h>
22 __KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.11.4.1 2024/05/11 14:49:51 martin Exp $");
23
24 #ifdef _KERNEL_OPT
25 #include "opt_if_vmx.h"
26 #endif
27
28 #include <sys/param.h>
29 #include <sys/cpu.h>
30 #include <sys/kernel.h>
31 #include <sys/kmem.h>
32 #include <sys/bitops.h>
33 #include <sys/bus.h>
34 #include <sys/device.h>
35 #include <sys/mbuf.h>
36 #include <sys/module.h>
37 #include <sys/sockio.h>
38 #include <sys/pcq.h>
39 #include <sys/workqueue.h>
40 #include <sys/interrupt.h>
41
42 #include <net/bpf.h>
43 #include <net/if.h>
44 #include <net/if_ether.h>
45 #include <net/if_media.h>
46
47 #include <netinet/if_inarp.h>
48 #include <netinet/in_systm.h> /* for <netinet/ip.h> */
49 #include <netinet/in.h> /* for <netinet/ip.h> */
50 #include <netinet/ip.h> /* for struct ip */
51 #include <netinet/ip6.h> /* for struct ip6_hdr */
52 #include <netinet/tcp.h> /* for struct tcphdr */
53 #include <netinet/udp.h> /* for struct udphdr */
54
55 #include <dev/pci/pcivar.h>
56 #include <dev/pci/pcireg.h>
57 #include <dev/pci/pcidevs.h>
58
59 #include <dev/pci/if_vmxreg.h>
60
61 #define VMXNET3_DRIVER_VERSION 0x00010000
62
63 /*
64 * Max descriptors per Tx packet. We must limit the size of the
65 * any TSO packets based on the number of segments.
66 */
67 #define VMXNET3_TX_MAXSEGS 32
68 #define VMXNET3_TX_MAXSIZE (VMXNET3_TX_MAXSEGS * MCLBYTES)
69
70 /*
71 * Maximum support Tx segments size. The length field in the
72 * Tx descriptor is 14 bits.
73 */
74 #define VMXNET3_TX_MAXSEGSIZE (1 << 14)
75
76 /*
77 * The maximum number of Rx segments we accept.
78 */
79 #define VMXNET3_MAX_RX_SEGS 0 /* no segments */
80
81 /*
82 * Predetermined size of the multicast MACs filter table. If the
83 * number of multicast addresses exceeds this size, then the
84 * ALL_MULTI mode is use instead.
85 */
86 #define VMXNET3_MULTICAST_MAX 32
87
88 /*
89 * Our Tx watchdog timeout.
90 */
91 #define VMXNET3_WATCHDOG_TIMEOUT 5
92
93 /*
94 * Default value for vmx_intr_{rx,tx}_process_limit which is used for
95 * max number of packets to process for interrupt handler
96 */
97 #define VMXNET3_RX_INTR_PROCESS_LIMIT 0U
98 #define VMXNET3_TX_INTR_PROCESS_LIMIT 256
99
100 /*
101 * Default value for vmx_{rx,tx}_process_limit which is used for
102 * max number of packets to process for deferred processing
103 */
104 #define VMXNET3_RX_PROCESS_LIMIT 256
105 #define VMXNET3_TX_PROCESS_LIMIT 256
106
107 #define VMXNET3_WORKQUEUE_PRI PRI_SOFTNET
108
109 /*
110 * IP protocols that we can perform Tx checksum offloading of.
111 */
112 #define VMXNET3_CSUM_OFFLOAD \
113 (M_CSUM_TCPv4 | M_CSUM_UDPv4)
114 #define VMXNET3_CSUM_OFFLOAD_IPV6 \
115 (M_CSUM_TCPv6 | M_CSUM_UDPv6)
116
117 #define VMXNET3_CSUM_ALL_OFFLOAD \
118 (VMXNET3_CSUM_OFFLOAD | VMXNET3_CSUM_OFFLOAD_IPV6 | M_CSUM_TSOv4 | M_CSUM_TSOv6)
119
120 #define VMXNET3_RXRINGS_PERQ 2
121
122 #define VMXNET3_CORE_LOCK(_sc) mutex_enter((_sc)->vmx_mtx)
123 #define VMXNET3_CORE_UNLOCK(_sc) mutex_exit((_sc)->vmx_mtx)
124 #define VMXNET3_CORE_LOCK_ASSERT(_sc) mutex_owned((_sc)->vmx_mtx)
125
126 #define VMXNET3_RXQ_LOCK(_rxq) mutex_enter((_rxq)->vxrxq_mtx)
127 #define VMXNET3_RXQ_UNLOCK(_rxq) mutex_exit((_rxq)->vxrxq_mtx)
128 #define VMXNET3_RXQ_LOCK_ASSERT(_rxq) \
129 mutex_owned((_rxq)->vxrxq_mtx)
130
131 #define VMXNET3_TXQ_LOCK(_txq) mutex_enter((_txq)->vxtxq_mtx)
132 #define VMXNET3_TXQ_TRYLOCK(_txq) mutex_tryenter((_txq)->vxtxq_mtx)
133 #define VMXNET3_TXQ_UNLOCK(_txq) mutex_exit((_txq)->vxtxq_mtx)
134 #define VMXNET3_TXQ_LOCK_ASSERT(_txq) \
135 mutex_owned((_txq)->vxtxq_mtx)
136
137 struct vmxnet3_dma_alloc {
138 bus_addr_t dma_paddr;
139 void *dma_vaddr;
140 bus_dmamap_t dma_map;
141 bus_size_t dma_size;
142 bus_dma_segment_t dma_segs[1];
143 };
144
145 struct vmxnet3_txbuf {
146 bus_dmamap_t vtxb_dmamap;
147 struct mbuf *vtxb_m;
148 };
149
150 struct vmxnet3_txring {
151 struct vmxnet3_txbuf *vxtxr_txbuf;
152 struct vmxnet3_txdesc *vxtxr_txd;
153 u_int vxtxr_head;
154 u_int vxtxr_next;
155 u_int vxtxr_ndesc;
156 int vxtxr_gen;
157 struct vmxnet3_dma_alloc vxtxr_dma;
158 };
159
160 struct vmxnet3_rxbuf {
161 bus_dmamap_t vrxb_dmamap;
162 struct mbuf *vrxb_m;
163 };
164
165 struct vmxnet3_rxring {
166 struct vmxnet3_rxbuf *vxrxr_rxbuf;
167 struct vmxnet3_rxdesc *vxrxr_rxd;
168 u_int vxrxr_fill;
169 u_int vxrxr_ndesc;
170 int vxrxr_gen;
171 int vxrxr_rid;
172 struct vmxnet3_dma_alloc vxrxr_dma;
173 bus_dmamap_t vxrxr_spare_dmap;
174 };
175
176 struct vmxnet3_comp_ring {
177 union {
178 struct vmxnet3_txcompdesc *txcd;
179 struct vmxnet3_rxcompdesc *rxcd;
180 } vxcr_u;
181 u_int vxcr_next;
182 u_int vxcr_ndesc;
183 int vxcr_gen;
184 struct vmxnet3_dma_alloc vxcr_dma;
185 };
186
187 struct vmxnet3_txq_stats {
188 uint64_t vmtxs_csum;
189 uint64_t vmtxs_tso;
190 uint64_t vmtxs_full;
191 uint64_t vmtxs_offload_failed;
192 };
193
194 struct vmxnet3_txqueue {
195 kmutex_t *vxtxq_mtx;
196 struct vmxnet3_softc *vxtxq_sc;
197 int vxtxq_watchdog;
198 pcq_t *vxtxq_interq;
199 struct vmxnet3_txring vxtxq_cmd_ring;
200 struct vmxnet3_comp_ring vxtxq_comp_ring;
201 struct vmxnet3_txq_stats vxtxq_stats;
202 struct vmxnet3_txq_shared *vxtxq_ts;
203 char vxtxq_name[16];
204
205 void *vxtxq_si;
206
207 struct evcnt vxtxq_intr;
208 struct evcnt vxtxq_defer;
209 struct evcnt vxtxq_deferreq;
210 struct evcnt vxtxq_pcqdrop;
211 struct evcnt vxtxq_transmitdef;
212 struct evcnt vxtxq_watchdogto;
213 struct evcnt vxtxq_defragged;
214 struct evcnt vxtxq_defrag_failed;
215 };
216
217
218 struct vmxnet3_rxqueue {
219 kmutex_t *vxrxq_mtx;
220 struct vmxnet3_softc *vxrxq_sc;
221 struct mbuf *vxrxq_mhead;
222 struct mbuf *vxrxq_mtail;
223 struct vmxnet3_rxring vxrxq_cmd_ring[VMXNET3_RXRINGS_PERQ];
224 struct vmxnet3_comp_ring vxrxq_comp_ring;
225 struct vmxnet3_rxq_shared *vxrxq_rs;
226 char vxrxq_name[16];
227
228 struct evcnt vxrxq_intr;
229 struct evcnt vxrxq_defer;
230 struct evcnt vxrxq_deferreq;
231 struct evcnt vxrxq_mgetcl_failed;
232 struct evcnt vxrxq_mbuf_load_failed;
233 };
234
235 struct vmxnet3_queue {
236 int vxq_id;
237 int vxq_intr_idx;
238
239 struct vmxnet3_txqueue vxq_txqueue;
240 struct vmxnet3_rxqueue vxq_rxqueue;
241
242 void *vxq_si;
243 bool vxq_workqueue;
244 bool vxq_wq_enqueued;
245 struct work vxq_wq_cookie;
246 };
247
248 struct vmxnet3_softc {
249 device_t vmx_dev;
250 struct ethercom vmx_ethercom;
251 struct ifmedia vmx_media;
252 struct vmxnet3_driver_shared *vmx_ds;
253 int vmx_flags;
254 #define VMXNET3_FLAG_NO_MSIX (1 << 0)
255 #define VMXNET3_FLAG_RSS (1 << 1)
256 #define VMXNET3_FLAG_ATTACHED (1 << 2)
257
258 struct vmxnet3_queue *vmx_queue;
259
260 struct pci_attach_args *vmx_pa;
261 pci_chipset_tag_t vmx_pc;
262
263 bus_space_tag_t vmx_iot0;
264 bus_space_tag_t vmx_iot1;
265 bus_space_handle_t vmx_ioh0;
266 bus_space_handle_t vmx_ioh1;
267 bus_size_t vmx_ios0;
268 bus_size_t vmx_ios1;
269 bus_dma_tag_t vmx_dmat;
270
271 int vmx_link_active;
272 int vmx_ntxqueues;
273 int vmx_nrxqueues;
274 int vmx_ntxdescs;
275 int vmx_nrxdescs;
276 int vmx_max_rxsegs;
277
278 struct evcnt vmx_event_intr;
279 struct evcnt vmx_event_link;
280 struct evcnt vmx_event_txqerror;
281 struct evcnt vmx_event_rxqerror;
282 struct evcnt vmx_event_dic;
283 struct evcnt vmx_event_debug;
284
285 int vmx_intr_type;
286 int vmx_intr_mask_mode;
287 int vmx_event_intr_idx;
288 int vmx_nintrs;
289 pci_intr_handle_t *vmx_intrs; /* legacy use vmx_intrs[0] */
290 void *vmx_ihs[VMXNET3_MAX_INTRS];
291
292 kmutex_t *vmx_mtx;
293
294 uint8_t *vmx_mcast;
295 void *vmx_qs;
296 struct vmxnet3_rss_shared *vmx_rss;
297 callout_t vmx_tick;
298 struct vmxnet3_dma_alloc vmx_ds_dma;
299 struct vmxnet3_dma_alloc vmx_qs_dma;
300 struct vmxnet3_dma_alloc vmx_mcast_dma;
301 struct vmxnet3_dma_alloc vmx_rss_dma;
302 int vmx_max_ntxqueues;
303 int vmx_max_nrxqueues;
304 uint8_t vmx_lladdr[ETHER_ADDR_LEN];
305
306 u_int vmx_rx_intr_process_limit;
307 u_int vmx_tx_intr_process_limit;
308 u_int vmx_rx_process_limit;
309 u_int vmx_tx_process_limit;
310 struct sysctllog *vmx_sysctllog;
311
312 bool vmx_txrx_workqueue;
313 struct workqueue *vmx_queue_wq;
314 };
315
316 #define VMXNET3_STAT
317
318 #ifdef VMXNET3_STAT
319 struct {
320 u_int txhead;
321 u_int txdone;
322 u_int maxtxlen;
323 u_int rxdone;
324 u_int rxfill;
325 u_int intr;
326 } vmxstat;
327 #endif
328
329 typedef enum {
330 VMXNET3_BARRIER_RD,
331 VMXNET3_BARRIER_WR,
332 } vmxnet3_barrier_t;
333
334 #define JUMBO_LEN (MCLBYTES - ETHER_ALIGN) /* XXX */
335 #define DMAADDR(map) ((map)->dm_segs[0].ds_addr)
336
337 #define vtophys(va) 0 /* XXX ok? */
338
339 static int vmxnet3_match(device_t, cfdata_t, void *);
340 static void vmxnet3_attach(device_t, device_t, void *);
341 static int vmxnet3_detach(device_t, int);
342
343 static int vmxnet3_alloc_pci_resources(struct vmxnet3_softc *);
344 static void vmxnet3_free_pci_resources(struct vmxnet3_softc *);
345 static int vmxnet3_check_version(struct vmxnet3_softc *);
346 static void vmxnet3_check_multiqueue(struct vmxnet3_softc *);
347
348 static int vmxnet3_alloc_msix_interrupts(struct vmxnet3_softc *);
349 static int vmxnet3_alloc_msi_interrupts(struct vmxnet3_softc *);
350 static int vmxnet3_alloc_legacy_interrupts(struct vmxnet3_softc *);
351 static int vmxnet3_alloc_interrupts(struct vmxnet3_softc *);
352 static void vmxnet3_free_interrupts(struct vmxnet3_softc *);
353
354 static int vmxnet3_setup_msix_interrupts(struct vmxnet3_softc *);
355 static int vmxnet3_setup_msi_interrupt(struct vmxnet3_softc *);
356 static int vmxnet3_setup_legacy_interrupt(struct vmxnet3_softc *);
357 static void vmxnet3_set_interrupt_idx(struct vmxnet3_softc *);
358 static int vmxnet3_setup_interrupts(struct vmxnet3_softc *);
359 static int vmxnet3_setup_sysctl(struct vmxnet3_softc *);
360
361 static int vmxnet3_setup_stats(struct vmxnet3_softc *);
362 static void vmxnet3_teardown_stats(struct vmxnet3_softc *);
363
364 static int vmxnet3_init_rxq(struct vmxnet3_softc *, int);
365 static int vmxnet3_init_txq(struct vmxnet3_softc *, int);
366 static int vmxnet3_alloc_rxtx_queues(struct vmxnet3_softc *);
367 static void vmxnet3_destroy_rxq(struct vmxnet3_rxqueue *);
368 static void vmxnet3_destroy_txq(struct vmxnet3_txqueue *);
369 static void vmxnet3_free_rxtx_queues(struct vmxnet3_softc *);
370
371 static int vmxnet3_alloc_shared_data(struct vmxnet3_softc *);
372 static void vmxnet3_free_shared_data(struct vmxnet3_softc *);
373 static int vmxnet3_alloc_txq_data(struct vmxnet3_softc *);
374 static void vmxnet3_free_txq_data(struct vmxnet3_softc *);
375 static int vmxnet3_alloc_rxq_data(struct vmxnet3_softc *);
376 static void vmxnet3_free_rxq_data(struct vmxnet3_softc *);
377 static int vmxnet3_alloc_queue_data(struct vmxnet3_softc *);
378 static void vmxnet3_free_queue_data(struct vmxnet3_softc *);
379 static int vmxnet3_alloc_mcast_table(struct vmxnet3_softc *);
380 static void vmxnet3_free_mcast_table(struct vmxnet3_softc *);
381 static void vmxnet3_init_shared_data(struct vmxnet3_softc *);
382 static void vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *);
383 static void vmxnet3_reinit_shared_data(struct vmxnet3_softc *);
384 static int vmxnet3_alloc_data(struct vmxnet3_softc *);
385 static void vmxnet3_free_data(struct vmxnet3_softc *);
386 static int vmxnet3_setup_interface(struct vmxnet3_softc *);
387
388 static void vmxnet3_evintr(struct vmxnet3_softc *);
389 static bool vmxnet3_txq_eof(struct vmxnet3_txqueue *, u_int);
390 static int vmxnet3_newbuf(struct vmxnet3_softc *, struct vmxnet3_rxqueue *,
391 struct vmxnet3_rxring *);
392 static void vmxnet3_rxq_eof_discard(struct vmxnet3_rxqueue *,
393 struct vmxnet3_rxring *, int);
394 static void vmxnet3_rxq_discard_chain(struct vmxnet3_rxqueue *);
395 static void vmxnet3_rx_csum(struct vmxnet3_rxcompdesc *, struct mbuf *);
396 static void vmxnet3_rxq_input(struct vmxnet3_rxqueue *,
397 struct vmxnet3_rxcompdesc *, struct mbuf *);
398 static bool vmxnet3_rxq_eof(struct vmxnet3_rxqueue *, u_int);
399 static int vmxnet3_legacy_intr(void *);
400 static int vmxnet3_txrxq_intr(void *);
401 static void vmxnet3_handle_queue(void *);
402 static void vmxnet3_handle_queue_work(struct work *, void *);
403 static int vmxnet3_event_intr(void *);
404
405 static void vmxnet3_txstop(struct vmxnet3_softc *, struct vmxnet3_txqueue *);
406 static void vmxnet3_rxstop(struct vmxnet3_softc *, struct vmxnet3_rxqueue *);
407 static void vmxnet3_stop_locked(struct vmxnet3_softc *);
408 static void vmxnet3_stop_rendezvous(struct vmxnet3_softc *);
409 static void vmxnet3_stop(struct ifnet *, int);
410
411 static void vmxnet3_txinit(struct vmxnet3_softc *, struct vmxnet3_txqueue *);
412 static int vmxnet3_rxinit(struct vmxnet3_softc *, struct vmxnet3_rxqueue *);
413 static int vmxnet3_reinit_queues(struct vmxnet3_softc *);
414 static int vmxnet3_enable_device(struct vmxnet3_softc *);
415 static void vmxnet3_reinit_rxfilters(struct vmxnet3_softc *);
416 static int vmxnet3_reinit(struct vmxnet3_softc *);
417
418 static int vmxnet3_init_locked(struct vmxnet3_softc *);
419 static int vmxnet3_init(struct ifnet *);
420
421 static int vmxnet3_txq_offload_ctx(struct vmxnet3_txqueue *, struct mbuf *, int *, int *);
422 static int vmxnet3_txq_load_mbuf(struct vmxnet3_txqueue *, struct mbuf **, bus_dmamap_t);
423 static void vmxnet3_txq_unload_mbuf(struct vmxnet3_txqueue *, bus_dmamap_t);
424 static int vmxnet3_txq_encap(struct vmxnet3_txqueue *, struct mbuf **);
425 static void vmxnet3_start_locked(struct ifnet *);
426 static void vmxnet3_start(struct ifnet *);
427 static void vmxnet3_transmit_locked(struct ifnet *, struct vmxnet3_txqueue *);
428 static int vmxnet3_transmit(struct ifnet *, struct mbuf *);
429 static void vmxnet3_deferred_transmit(void *);
430
431 static void vmxnet3_set_rxfilter(struct vmxnet3_softc *);
432 static int vmxnet3_ioctl(struct ifnet *, u_long, void *);
433 static int vmxnet3_ifflags_cb(struct ethercom *);
434
435 static int vmxnet3_watchdog(struct vmxnet3_txqueue *);
436 static void vmxnet3_refresh_host_stats(struct vmxnet3_softc *);
437 static void vmxnet3_tick(void *);
438 static void vmxnet3_if_link_status(struct vmxnet3_softc *);
439 static bool vmxnet3_cmd_link_status(struct ifnet *);
440 static void vmxnet3_ifmedia_status(struct ifnet *, struct ifmediareq *);
441 static int vmxnet3_ifmedia_change(struct ifnet *);
442 static void vmxnet3_set_lladdr(struct vmxnet3_softc *);
443 static void vmxnet3_get_lladdr(struct vmxnet3_softc *);
444
445 static void vmxnet3_enable_all_intrs(struct vmxnet3_softc *);
446 static void vmxnet3_disable_all_intrs(struct vmxnet3_softc *);
447
448 static int vmxnet3_dma_malloc(struct vmxnet3_softc *, bus_size_t, bus_size_t,
449 struct vmxnet3_dma_alloc *);
450 static void vmxnet3_dma_free(struct vmxnet3_softc *, struct vmxnet3_dma_alloc *);
451
452 CFATTACH_DECL3_NEW(vmx, sizeof(struct vmxnet3_softc),
453 vmxnet3_match, vmxnet3_attach, vmxnet3_detach, NULL, NULL, NULL, 0);
454
455 /* round down to the nearest power of 2 */
456 static int
457 vmxnet3_calc_queue_size(int n)
458 {
459
460 if (__predict_false(n <= 0))
461 return 1;
462
463 return (1U << (fls32(n) - 1));
464 }
465
466 static inline void
467 vmxnet3_write_bar0(struct vmxnet3_softc *sc, bus_size_t r, uint32_t v)
468 {
469
470 bus_space_write_4(sc->vmx_iot0, sc->vmx_ioh0, r, v);
471 }
472
473 static inline uint32_t
474 vmxnet3_read_bar1(struct vmxnet3_softc *sc, bus_size_t r)
475 {
476
477 return (bus_space_read_4(sc->vmx_iot1, sc->vmx_ioh1, r));
478 }
479
480 static inline void
481 vmxnet3_write_bar1(struct vmxnet3_softc *sc, bus_size_t r, uint32_t v)
482 {
483
484 bus_space_write_4(sc->vmx_iot1, sc->vmx_ioh1, r, v);
485 }
486
487 static inline void
488 vmxnet3_write_cmd(struct vmxnet3_softc *sc, uint32_t cmd)
489 {
490
491 vmxnet3_write_bar1(sc, VMXNET3_BAR1_CMD, cmd);
492 }
493
494 static inline uint32_t
495 vmxnet3_read_cmd(struct vmxnet3_softc *sc, uint32_t cmd)
496 {
497
498 vmxnet3_write_cmd(sc, cmd);
499 return (vmxnet3_read_bar1(sc, VMXNET3_BAR1_CMD));
500 }
501
502 static inline void
503 vmxnet3_enable_intr(struct vmxnet3_softc *sc, int irq)
504 {
505 vmxnet3_write_bar0(sc, VMXNET3_BAR0_IMASK(irq), 0);
506 }
507
508 static inline void
509 vmxnet3_disable_intr(struct vmxnet3_softc *sc, int irq)
510 {
511 vmxnet3_write_bar0(sc, VMXNET3_BAR0_IMASK(irq), 1);
512 }
513
514 static inline void
515 vmxnet3_rxr_increment_fill(struct vmxnet3_rxring *rxr)
516 {
517
518 if (++rxr->vxrxr_fill == rxr->vxrxr_ndesc) {
519 rxr->vxrxr_fill = 0;
520 rxr->vxrxr_gen ^= 1;
521 }
522 }
523
524 static inline int
525 vmxnet3_txring_avail(struct vmxnet3_txring *txr)
526 {
527 int avail = txr->vxtxr_next - txr->vxtxr_head - 1;
528 return (avail < 0 ? (int)txr->vxtxr_ndesc + avail : avail);
529 }
530
531 /*
532 * Since this is a purely paravirtualized device, we do not have
533 * to worry about DMA coherency. But at times, we must make sure
534 * both the compiler and CPU do not reorder memory operations.
535 */
536 static inline void
537 vmxnet3_barrier(struct vmxnet3_softc *sc, vmxnet3_barrier_t type)
538 {
539
540 switch (type) {
541 case VMXNET3_BARRIER_RD:
542 membar_consumer();
543 break;
544 case VMXNET3_BARRIER_WR:
545 membar_producer();
546 break;
547 default:
548 panic("%s: bad barrier type %d", __func__, type);
549 }
550 }
551
552 static int
553 vmxnet3_match(device_t parent, cfdata_t match, void *aux)
554 {
555 struct pci_attach_args *pa = (struct pci_attach_args *)aux;
556
557 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_VMWARE &&
558 PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VMWARE_VMXNET3)
559 return 1;
560
561 return 0;
562 }
563
564 static void
565 vmxnet3_attach(device_t parent, device_t self, void *aux)
566 {
567 struct vmxnet3_softc *sc = device_private(self);
568 struct pci_attach_args *pa = aux;
569 pcireg_t preg;
570 int error;
571 int candidate;
572
573 sc->vmx_dev = self;
574 sc->vmx_pa = pa;
575 sc->vmx_pc = pa->pa_pc;
576 if (pci_dma64_available(pa))
577 sc->vmx_dmat = pa->pa_dmat64;
578 else
579 sc->vmx_dmat = pa->pa_dmat;
580
581 pci_aprint_devinfo_fancy(pa, "Ethernet controller", "vmxnet3", 1);
582
583 preg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
584 preg |= PCI_COMMAND_MASTER_ENABLE;
585 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
586
587 sc->vmx_mtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
588 callout_init(&sc->vmx_tick, CALLOUT_MPSAFE);
589
590 candidate = MIN(MIN(VMXNET3_MAX_TX_QUEUES, VMXNET3_MAX_RX_QUEUES),
591 ncpu);
592 sc->vmx_max_ntxqueues = sc->vmx_max_nrxqueues =
593 vmxnet3_calc_queue_size(candidate);
594 sc->vmx_ntxdescs = 512;
595 sc->vmx_nrxdescs = 256;
596 sc->vmx_max_rxsegs = VMXNET3_MAX_RX_SEGS;
597
598 error = vmxnet3_alloc_pci_resources(sc);
599 if (error)
600 return;
601
602 error = vmxnet3_check_version(sc);
603 if (error)
604 return;
605
606 error = vmxnet3_alloc_rxtx_queues(sc);
607 if (error)
608 return;
609
610 error = vmxnet3_alloc_interrupts(sc);
611 if (error)
612 return;
613
614 vmxnet3_check_multiqueue(sc);
615
616 error = vmxnet3_alloc_data(sc);
617 if (error)
618 return;
619
620 error = vmxnet3_setup_interface(sc);
621 if (error)
622 return;
623
624 error = vmxnet3_setup_interrupts(sc);
625 if (error)
626 return;
627
628 error = vmxnet3_setup_sysctl(sc);
629 if (error)
630 return;
631
632 error = vmxnet3_setup_stats(sc);
633 if (error)
634 return;
635
636 sc->vmx_flags |= VMXNET3_FLAG_ATTACHED;
637 }
638
639 static int
640 vmxnet3_detach(device_t self, int flags)
641 {
642 struct vmxnet3_softc *sc;
643 struct ifnet *ifp;
644
645 sc = device_private(self);
646 ifp = &sc->vmx_ethercom.ec_if;
647
648 if (sc->vmx_flags & VMXNET3_FLAG_ATTACHED) {
649 VMXNET3_CORE_LOCK(sc);
650 vmxnet3_stop_locked(sc);
651 callout_halt(&sc->vmx_tick, sc->vmx_mtx);
652 callout_destroy(&sc->vmx_tick);
653 VMXNET3_CORE_UNLOCK(sc);
654
655 ether_ifdetach(ifp);
656 if_detach(ifp);
657 ifmedia_fini(&sc->vmx_media);
658 }
659
660 vmxnet3_teardown_stats(sc);
661 sysctl_teardown(&sc->vmx_sysctllog);
662
663 vmxnet3_free_interrupts(sc);
664
665 vmxnet3_free_data(sc);
666 vmxnet3_free_pci_resources(sc);
667 vmxnet3_free_rxtx_queues(sc);
668
669 if (sc->vmx_mtx)
670 mutex_obj_free(sc->vmx_mtx);
671
672 return (0);
673 }
674
675 static int
676 vmxnet3_alloc_pci_resources(struct vmxnet3_softc *sc)
677 {
678 struct pci_attach_args *pa = sc->vmx_pa;
679 pcireg_t memtype;
680
681 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
682 if (pci_mapreg_map(pa, PCI_BAR(0), memtype, 0, &sc->vmx_iot0, &sc->vmx_ioh0,
683 NULL, &sc->vmx_ios0)) {
684 aprint_error_dev(sc->vmx_dev, "failed to map BAR0\n");
685 return (ENXIO);
686 }
687 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(1));
688 if (pci_mapreg_map(pa, PCI_BAR(1), memtype, 0, &sc->vmx_iot1, &sc->vmx_ioh1,
689 NULL, &sc->vmx_ios1)) {
690 aprint_error_dev(sc->vmx_dev, "failed to map BAR1\n");
691 return (ENXIO);
692 }
693
694 if (!pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_MSIX, NULL, NULL)) {
695 sc->vmx_flags |= VMXNET3_FLAG_NO_MSIX;
696 return (0);
697 }
698
699 return (0);
700 }
701
702 static void
703 vmxnet3_free_pci_resources(struct vmxnet3_softc *sc)
704 {
705
706 if (sc->vmx_ios0) {
707 bus_space_unmap(sc->vmx_iot0, sc->vmx_ioh0, sc->vmx_ios0);
708 sc->vmx_ios0 = 0;
709 }
710
711 if (sc->vmx_ios1) {
712 bus_space_unmap(sc->vmx_iot1, sc->vmx_ioh1, sc->vmx_ios1);
713 sc->vmx_ios1 = 0;
714 }
715 }
716
717 static int
718 vmxnet3_check_version(struct vmxnet3_softc *sc)
719 {
720 u_int ver;
721
722 ver = vmxnet3_read_bar1(sc, VMXNET3_BAR1_VRRS);
723 if ((ver & 0x1) == 0) {
724 aprint_error_dev(sc->vmx_dev,
725 "unsupported hardware version 0x%x\n", ver);
726 return (ENOTSUP);
727 }
728 vmxnet3_write_bar1(sc, VMXNET3_BAR1_VRRS, 1);
729
730 ver = vmxnet3_read_bar1(sc, VMXNET3_BAR1_UVRS);
731 if ((ver & 0x1) == 0) {
732 aprint_error_dev(sc->vmx_dev,
733 "incompatiable UPT version 0x%x\n", ver);
734 return (ENOTSUP);
735 }
736 vmxnet3_write_bar1(sc, VMXNET3_BAR1_UVRS, 1);
737
738 return (0);
739 }
740
741 static void
742 vmxnet3_check_multiqueue(struct vmxnet3_softc *sc)
743 {
744
745 if (sc->vmx_intr_type != VMXNET3_IT_MSIX)
746 goto out;
747
748 /* Just use the maximum configured for now. */
749 sc->vmx_nrxqueues = sc->vmx_max_nrxqueues;
750 sc->vmx_ntxqueues = sc->vmx_max_ntxqueues;
751
752 if (sc->vmx_nrxqueues > 1)
753 sc->vmx_flags |= VMXNET3_FLAG_RSS;
754
755 return;
756
757 out:
758 sc->vmx_ntxqueues = 1;
759 sc->vmx_nrxqueues = 1;
760 }
761
762 static int
763 vmxnet3_alloc_msix_interrupts(struct vmxnet3_softc *sc)
764 {
765 int required;
766 struct pci_attach_args *pa = sc->vmx_pa;
767
768 if (sc->vmx_flags & VMXNET3_FLAG_NO_MSIX)
769 return (1);
770
771 /* Allocate an additional vector for the events interrupt. */
772 required = MIN(sc->vmx_max_ntxqueues, sc->vmx_max_nrxqueues) + 1;
773
774 if (pci_msix_count(pa->pa_pc, pa->pa_tag) < required)
775 return (1);
776
777 if (pci_msix_alloc_exact(pa, &sc->vmx_intrs, required) == 0) {
778 sc->vmx_nintrs = required;
779 return (0);
780 }
781
782 return (1);
783 }
784
785 static int
786 vmxnet3_alloc_msi_interrupts(struct vmxnet3_softc *sc)
787 {
788 int nmsi, required;
789 struct pci_attach_args *pa = sc->vmx_pa;
790
791 required = 1;
792
793 nmsi = pci_msi_count(pa->pa_pc, pa->pa_tag);
794 if (nmsi < required)
795 return (1);
796
797 if (pci_msi_alloc_exact(pa, &sc->vmx_intrs, required) == 0) {
798 sc->vmx_nintrs = required;
799 return (0);
800 }
801
802 return (1);
803 }
804
805 static int
806 vmxnet3_alloc_legacy_interrupts(struct vmxnet3_softc *sc)
807 {
808
809 if (pci_intx_alloc(sc->vmx_pa, &sc->vmx_intrs) == 0) {
810 sc->vmx_nintrs = 1;
811 return (0);
812 }
813
814 return (1);
815 }
816
817 static int
818 vmxnet3_alloc_interrupts(struct vmxnet3_softc *sc)
819 {
820 u_int config;
821 int error;
822
823 config = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_INTRCFG);
824
825 sc->vmx_intr_type = config & 0x03;
826 sc->vmx_intr_mask_mode = (config >> 2) & 0x03;
827
828 switch (sc->vmx_intr_type) {
829 case VMXNET3_IT_AUTO:
830 sc->vmx_intr_type = VMXNET3_IT_MSIX;
831 /* FALLTHROUGH */
832 case VMXNET3_IT_MSIX:
833 error = vmxnet3_alloc_msix_interrupts(sc);
834 if (error == 0)
835 break;
836 sc->vmx_intr_type = VMXNET3_IT_MSI;
837 /* FALLTHROUGH */
838 case VMXNET3_IT_MSI:
839 error = vmxnet3_alloc_msi_interrupts(sc);
840 if (error == 0)
841 break;
842 sc->vmx_intr_type = VMXNET3_IT_LEGACY;
843 /* FALLTHROUGH */
844 case VMXNET3_IT_LEGACY:
845 error = vmxnet3_alloc_legacy_interrupts(sc);
846 if (error == 0)
847 break;
848 /* FALLTHROUGH */
849 default:
850 sc->vmx_intr_type = -1;
851 aprint_error_dev(sc->vmx_dev, "cannot allocate any interrupt resources\n");
852 return (ENXIO);
853 }
854
855 return (error);
856 }
857
858 static void
859 vmxnet3_free_interrupts(struct vmxnet3_softc *sc)
860 {
861 pci_chipset_tag_t pc = sc->vmx_pc;
862 int i;
863
864 workqueue_destroy(sc->vmx_queue_wq);
865 for (i = 0; i < sc->vmx_ntxqueues; i++) {
866 struct vmxnet3_queue *vmxq = &sc->vmx_queue[i];
867
868 softint_disestablish(vmxq->vxq_si);
869 vmxq->vxq_si = NULL;
870 }
871 for (i = 0; i < sc->vmx_nintrs; i++) {
872 pci_intr_disestablish(pc, sc->vmx_ihs[i]);
873 }
874 pci_intr_release(pc, sc->vmx_intrs, sc->vmx_nintrs);
875 }
876
877 static int
878 vmxnet3_setup_msix_interrupts(struct vmxnet3_softc *sc)
879 {
880 pci_chipset_tag_t pc = sc->vmx_pa->pa_pc;
881 struct vmxnet3_queue *vmxq;
882 pci_intr_handle_t *intr;
883 void **ihs;
884 int intr_idx, i, use_queues, error;
885 kcpuset_t *affinity;
886 const char *intrstr;
887 char intrbuf[PCI_INTRSTR_LEN];
888 char xnamebuf[32];
889
890 intr = sc->vmx_intrs;
891 intr_idx = 0;
892 ihs = sc->vmx_ihs;
893
894 /* See vmxnet3_alloc_msix_interrupts() */
895 use_queues = MIN(sc->vmx_max_ntxqueues, sc->vmx_max_nrxqueues);
896 for (i = 0; i < use_queues; i++, intr++, ihs++, intr_idx++) {
897 snprintf(xnamebuf, 32, "%s: txrx %d", device_xname(sc->vmx_dev), i);
898
899 vmxq = &sc->vmx_queue[i];
900
901 intrstr = pci_intr_string(pc, *intr, intrbuf, sizeof(intrbuf));
902
903 pci_intr_setattr(pc, intr, PCI_INTR_MPSAFE, true);
904 *ihs = pci_intr_establish_xname(pc, *intr, IPL_NET,
905 vmxnet3_txrxq_intr, vmxq, xnamebuf);
906 if (*ihs == NULL) {
907 aprint_error_dev(sc->vmx_dev,
908 "unable to establish txrx interrupt at %s\n", intrstr);
909 return (-1);
910 }
911 aprint_normal_dev(sc->vmx_dev, "txrx interrupting at %s\n", intrstr);
912
913 kcpuset_create(&affinity, true);
914 kcpuset_set(affinity, intr_idx % ncpu);
915 error = interrupt_distribute(*ihs, affinity, NULL);
916 if (error) {
917 aprint_normal_dev(sc->vmx_dev,
918 "%s cannot be changed affinity, use default CPU\n",
919 intrstr);
920 }
921 kcpuset_destroy(affinity);
922
923 vmxq->vxq_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
924 vmxnet3_handle_queue, vmxq);
925 if (vmxq->vxq_si == NULL) {
926 aprint_error_dev(sc->vmx_dev,
927 "softint_establish for vxq_si failed\n");
928 return (-1);
929 }
930
931 vmxq->vxq_intr_idx = intr_idx;
932 }
933 snprintf(xnamebuf, MAXCOMLEN, "%s_tx_rx", device_xname(sc->vmx_dev));
934 error = workqueue_create(&sc->vmx_queue_wq, xnamebuf,
935 vmxnet3_handle_queue_work, sc, VMXNET3_WORKQUEUE_PRI, IPL_NET,
936 WQ_PERCPU | WQ_MPSAFE);
937 if (error) {
938 aprint_error_dev(sc->vmx_dev, "workqueue_create failed\n");
939 return (-1);
940 }
941 sc->vmx_txrx_workqueue = false;
942
943 intrstr = pci_intr_string(pc, *intr, intrbuf, sizeof(intrbuf));
944
945 snprintf(xnamebuf, 32, "%s: link", device_xname(sc->vmx_dev));
946 pci_intr_setattr(pc, intr, PCI_INTR_MPSAFE, true);
947 *ihs = pci_intr_establish_xname(pc, *intr, IPL_NET,
948 vmxnet3_event_intr, sc, xnamebuf);
949 if (*ihs == NULL) {
950 aprint_error_dev(sc->vmx_dev,
951 "unable to establish event interrupt at %s\n", intrstr);
952 return (-1);
953 }
954 aprint_normal_dev(sc->vmx_dev, "event interrupting at %s\n", intrstr);
955
956 sc->vmx_event_intr_idx = intr_idx;
957
958 return (0);
959 }
960
961 static int
962 vmxnet3_setup_msi_interrupt(struct vmxnet3_softc *sc)
963 {
964 pci_chipset_tag_t pc = sc->vmx_pa->pa_pc;
965 pci_intr_handle_t *intr;
966 void **ihs;
967 struct vmxnet3_queue *vmxq;
968 int i;
969 const char *intrstr;
970 char intrbuf[PCI_INTRSTR_LEN];
971 char xnamebuf[32];
972
973 intr = &sc->vmx_intrs[0];
974 ihs = sc->vmx_ihs;
975 vmxq = &sc->vmx_queue[0];
976
977 intrstr = pci_intr_string(pc, *intr, intrbuf, sizeof(intrbuf));
978
979 snprintf(xnamebuf, 32, "%s: msi", device_xname(sc->vmx_dev));
980 pci_intr_setattr(pc, intr, PCI_INTR_MPSAFE, true);
981 *ihs = pci_intr_establish_xname(pc, *intr, IPL_NET,
982 vmxnet3_legacy_intr, sc, xnamebuf);
983 if (*ihs == NULL) {
984 aprint_error_dev(sc->vmx_dev,
985 "unable to establish interrupt at %s\n", intrstr);
986 return (-1);
987 }
988 aprint_normal_dev(sc->vmx_dev, "interrupting at %s\n", intrstr);
989
990 vmxq->vxq_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
991 vmxnet3_handle_queue, vmxq);
992 if (vmxq->vxq_si == NULL) {
993 aprint_error_dev(sc->vmx_dev,
994 "softint_establish for vxq_si failed\n");
995 return (-1);
996 }
997
998 for (i = 0; i < MIN(sc->vmx_nrxqueues, sc->vmx_nrxqueues); i++)
999 sc->vmx_queue[i].vxq_intr_idx = 0;
1000 sc->vmx_event_intr_idx = 0;
1001
1002 return (0);
1003 }
1004
1005 static int
1006 vmxnet3_setup_legacy_interrupt(struct vmxnet3_softc *sc)
1007 {
1008 pci_chipset_tag_t pc = sc->vmx_pa->pa_pc;
1009 pci_intr_handle_t *intr;
1010 void **ihs;
1011 struct vmxnet3_queue *vmxq;
1012 int i;
1013 const char *intrstr;
1014 char intrbuf[PCI_INTRSTR_LEN];
1015 char xnamebuf[32];
1016
1017 intr = &sc->vmx_intrs[0];
1018 ihs = sc->vmx_ihs;
1019 vmxq = &sc->vmx_queue[0];
1020
1021 intrstr = pci_intr_string(pc, *intr, intrbuf, sizeof(intrbuf));
1022
1023 snprintf(xnamebuf, 32, "%s:legacy", device_xname(sc->vmx_dev));
1024 pci_intr_setattr(pc, intr, PCI_INTR_MPSAFE, true);
1025 *ihs = pci_intr_establish_xname(pc, *intr, IPL_NET,
1026 vmxnet3_legacy_intr, sc, xnamebuf);
1027 if (*ihs == NULL) {
1028 aprint_error_dev(sc->vmx_dev,
1029 "unable to establish interrupt at %s\n", intrstr);
1030 return (-1);
1031 }
1032 aprint_normal_dev(sc->vmx_dev, "interrupting at %s\n", intrstr);
1033
1034 vmxq->vxq_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
1035 vmxnet3_handle_queue, vmxq);
1036 if (vmxq->vxq_si == NULL) {
1037 aprint_error_dev(sc->vmx_dev,
1038 "softint_establish for vxq_si failed\n");
1039 return (-1);
1040 }
1041
1042 for (i = 0; i < MIN(sc->vmx_nrxqueues, sc->vmx_nrxqueues); i++)
1043 sc->vmx_queue[i].vxq_intr_idx = 0;
1044 sc->vmx_event_intr_idx = 0;
1045
1046 return (0);
1047 }
1048
1049 static void
1050 vmxnet3_set_interrupt_idx(struct vmxnet3_softc *sc)
1051 {
1052 struct vmxnet3_queue *vmxq;
1053 struct vmxnet3_txqueue *txq;
1054 struct vmxnet3_txq_shared *txs;
1055 struct vmxnet3_rxqueue *rxq;
1056 struct vmxnet3_rxq_shared *rxs;
1057 int i;
1058
1059 sc->vmx_ds->evintr = sc->vmx_event_intr_idx;
1060
1061 for (i = 0; i < sc->vmx_ntxqueues; i++) {
1062 vmxq = &sc->vmx_queue[i];
1063 txq = &vmxq->vxq_txqueue;
1064 txs = txq->vxtxq_ts;
1065 txs->intr_idx = vmxq->vxq_intr_idx;
1066 }
1067
1068 for (i = 0; i < sc->vmx_nrxqueues; i++) {
1069 vmxq = &sc->vmx_queue[i];
1070 rxq = &vmxq->vxq_rxqueue;
1071 rxs = rxq->vxrxq_rs;
1072 rxs->intr_idx = vmxq->vxq_intr_idx;
1073 }
1074 }
1075
1076 static int
1077 vmxnet3_setup_interrupts(struct vmxnet3_softc *sc)
1078 {
1079 int error;
1080
1081 switch (sc->vmx_intr_type) {
1082 case VMXNET3_IT_MSIX:
1083 error = vmxnet3_setup_msix_interrupts(sc);
1084 break;
1085 case VMXNET3_IT_MSI:
1086 error = vmxnet3_setup_msi_interrupt(sc);
1087 break;
1088 case VMXNET3_IT_LEGACY:
1089 error = vmxnet3_setup_legacy_interrupt(sc);
1090 break;
1091 default:
1092 panic("%s: invalid interrupt type %d", __func__,
1093 sc->vmx_intr_type);
1094 }
1095
1096 if (error == 0)
1097 vmxnet3_set_interrupt_idx(sc);
1098
1099 return (error);
1100 }
1101
1102 static int
1103 vmxnet3_init_rxq(struct vmxnet3_softc *sc, int q)
1104 {
1105 struct vmxnet3_rxqueue *rxq;
1106 struct vmxnet3_rxring *rxr;
1107 int i;
1108
1109 rxq = &sc->vmx_queue[q].vxq_rxqueue;
1110
1111 snprintf(rxq->vxrxq_name, sizeof(rxq->vxrxq_name), "%s-rx%d",
1112 device_xname(sc->vmx_dev), q);
1113 rxq->vxrxq_mtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET /* XXX */);
1114
1115 rxq->vxrxq_sc = sc;
1116
1117 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1118 rxr = &rxq->vxrxq_cmd_ring[i];
1119 rxr->vxrxr_rid = i;
1120 rxr->vxrxr_ndesc = sc->vmx_nrxdescs;
1121 rxr->vxrxr_rxbuf = kmem_zalloc(rxr->vxrxr_ndesc *
1122 sizeof(struct vmxnet3_rxbuf), KM_SLEEP);
1123
1124 rxq->vxrxq_comp_ring.vxcr_ndesc += sc->vmx_nrxdescs;
1125 }
1126
1127 return (0);
1128 }
1129
1130 static int
1131 vmxnet3_init_txq(struct vmxnet3_softc *sc, int q)
1132 {
1133 struct vmxnet3_txqueue *txq;
1134 struct vmxnet3_txring *txr;
1135
1136 txq = &sc->vmx_queue[q].vxq_txqueue;
1137 txr = &txq->vxtxq_cmd_ring;
1138
1139 snprintf(txq->vxtxq_name, sizeof(txq->vxtxq_name), "%s-tx%d",
1140 device_xname(sc->vmx_dev), q);
1141 txq->vxtxq_mtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET /* XXX */);
1142
1143 txq->vxtxq_sc = sc;
1144
1145 txq->vxtxq_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
1146 vmxnet3_deferred_transmit, txq);
1147 if (txq->vxtxq_si == NULL) {
1148 mutex_obj_free(txq->vxtxq_mtx);
1149 aprint_error_dev(sc->vmx_dev,
1150 "softint_establish for vxtxq_si failed\n");
1151 return ENOMEM;
1152 }
1153
1154 txr->vxtxr_ndesc = sc->vmx_ntxdescs;
1155 txr->vxtxr_txbuf = kmem_zalloc(txr->vxtxr_ndesc *
1156 sizeof(struct vmxnet3_txbuf), KM_SLEEP);
1157
1158 txq->vxtxq_comp_ring.vxcr_ndesc = sc->vmx_ntxdescs;
1159
1160 txq->vxtxq_interq = pcq_create(sc->vmx_ntxdescs, KM_SLEEP);
1161
1162 return (0);
1163 }
1164
1165 static int
1166 vmxnet3_alloc_rxtx_queues(struct vmxnet3_softc *sc)
1167 {
1168 int i, error, max_nqueues;
1169
1170 KASSERT(!cpu_intr_p());
1171 KASSERT(!cpu_softintr_p());
1172
1173 /*
1174 * Only attempt to create multiple queues if MSIX is available.
1175 * This check prevents us from allocating queue structures that
1176 * we will not use.
1177 *
1178 * FreeBSD:
1179 * MSIX is disabled by default because its apparently broken for
1180 * devices passed through by at least ESXi 5.1.
1181 * The hw.pci.honor_msi_blacklist tunable must be set to zero for MSIX.
1182 */
1183 if (sc->vmx_flags & VMXNET3_FLAG_NO_MSIX) {
1184 sc->vmx_max_nrxqueues = 1;
1185 sc->vmx_max_ntxqueues = 1;
1186 }
1187
1188 max_nqueues = MAX(sc->vmx_max_ntxqueues, sc->vmx_max_nrxqueues);
1189 sc->vmx_queue = kmem_zalloc(sizeof(struct vmxnet3_queue) * max_nqueues,
1190 KM_SLEEP);
1191
1192 for (i = 0; i < max_nqueues; i++) {
1193 struct vmxnet3_queue *vmxq = &sc->vmx_queue[i];
1194 vmxq->vxq_id = i;
1195 }
1196
1197 for (i = 0; i < sc->vmx_max_nrxqueues; i++) {
1198 error = vmxnet3_init_rxq(sc, i);
1199 if (error)
1200 return (error);
1201 }
1202
1203 for (i = 0; i < sc->vmx_max_ntxqueues; i++) {
1204 error = vmxnet3_init_txq(sc, i);
1205 if (error)
1206 return (error);
1207 }
1208
1209 return (0);
1210 }
1211
1212 static void
1213 vmxnet3_destroy_rxq(struct vmxnet3_rxqueue *rxq)
1214 {
1215 struct vmxnet3_rxring *rxr;
1216 int i;
1217
1218 rxq->vxrxq_sc = NULL;
1219
1220 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1221 rxr = &rxq->vxrxq_cmd_ring[i];
1222
1223 if (rxr->vxrxr_rxbuf != NULL) {
1224 kmem_free(rxr->vxrxr_rxbuf,
1225 rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxbuf));
1226 rxr->vxrxr_rxbuf = NULL;
1227 }
1228 }
1229
1230 if (rxq->vxrxq_mtx != NULL)
1231 mutex_obj_free(rxq->vxrxq_mtx);
1232 }
1233
1234 static void
1235 vmxnet3_destroy_txq(struct vmxnet3_txqueue *txq)
1236 {
1237 struct vmxnet3_txring *txr;
1238 struct mbuf *m;
1239
1240 txr = &txq->vxtxq_cmd_ring;
1241
1242 txq->vxtxq_sc = NULL;
1243
1244 softint_disestablish(txq->vxtxq_si);
1245
1246 while ((m = pcq_get(txq->vxtxq_interq)) != NULL)
1247 m_freem(m);
1248 pcq_destroy(txq->vxtxq_interq);
1249
1250 if (txr->vxtxr_txbuf != NULL) {
1251 kmem_free(txr->vxtxr_txbuf,
1252 txr->vxtxr_ndesc * sizeof(struct vmxnet3_txbuf));
1253 txr->vxtxr_txbuf = NULL;
1254 }
1255
1256 if (txq->vxtxq_mtx != NULL)
1257 mutex_obj_free(txq->vxtxq_mtx);
1258 }
1259
1260 static void
1261 vmxnet3_free_rxtx_queues(struct vmxnet3_softc *sc)
1262 {
1263 int i;
1264
1265 if (sc->vmx_queue != NULL) {
1266 int max_nqueues;
1267
1268 for (i = 0; i < sc->vmx_max_nrxqueues; i++)
1269 vmxnet3_destroy_rxq(&sc->vmx_queue[i].vxq_rxqueue);
1270
1271 for (i = 0; i < sc->vmx_max_ntxqueues; i++)
1272 vmxnet3_destroy_txq(&sc->vmx_queue[i].vxq_txqueue);
1273
1274 max_nqueues = MAX(sc->vmx_max_nrxqueues, sc->vmx_max_ntxqueues);
1275 kmem_free(sc->vmx_queue,
1276 sizeof(struct vmxnet3_queue) * max_nqueues);
1277 }
1278 }
1279
1280 static int
1281 vmxnet3_alloc_shared_data(struct vmxnet3_softc *sc)
1282 {
1283 device_t dev;
1284 uint8_t *kva;
1285 size_t size;
1286 int i, error;
1287
1288 dev = sc->vmx_dev;
1289
1290 size = sizeof(struct vmxnet3_driver_shared);
1291 error = vmxnet3_dma_malloc(sc, size, 1, &sc->vmx_ds_dma);
1292 if (error) {
1293 device_printf(dev, "cannot alloc shared memory\n");
1294 return (error);
1295 }
1296 sc->vmx_ds = (struct vmxnet3_driver_shared *) sc->vmx_ds_dma.dma_vaddr;
1297
1298 size = sc->vmx_ntxqueues * sizeof(struct vmxnet3_txq_shared) +
1299 sc->vmx_nrxqueues * sizeof(struct vmxnet3_rxq_shared);
1300 error = vmxnet3_dma_malloc(sc, size, 128, &sc->vmx_qs_dma);
1301 if (error) {
1302 device_printf(dev, "cannot alloc queue shared memory\n");
1303 return (error);
1304 }
1305 sc->vmx_qs = (void *) sc->vmx_qs_dma.dma_vaddr;
1306 kva = sc->vmx_qs;
1307
1308 for (i = 0; i < sc->vmx_ntxqueues; i++) {
1309 sc->vmx_queue[i].vxq_txqueue.vxtxq_ts =
1310 (struct vmxnet3_txq_shared *) kva;
1311 kva += sizeof(struct vmxnet3_txq_shared);
1312 }
1313 for (i = 0; i < sc->vmx_nrxqueues; i++) {
1314 sc->vmx_queue[i].vxq_rxqueue.vxrxq_rs =
1315 (struct vmxnet3_rxq_shared *) kva;
1316 kva += sizeof(struct vmxnet3_rxq_shared);
1317 }
1318
1319 if (sc->vmx_flags & VMXNET3_FLAG_RSS) {
1320 size = sizeof(struct vmxnet3_rss_shared);
1321 error = vmxnet3_dma_malloc(sc, size, 128, &sc->vmx_rss_dma);
1322 if (error) {
1323 device_printf(dev, "cannot alloc rss shared memory\n");
1324 return (error);
1325 }
1326 sc->vmx_rss =
1327 (struct vmxnet3_rss_shared *) sc->vmx_rss_dma.dma_vaddr;
1328 }
1329
1330 return (0);
1331 }
1332
1333 static void
1334 vmxnet3_free_shared_data(struct vmxnet3_softc *sc)
1335 {
1336
1337 if (sc->vmx_rss != NULL) {
1338 vmxnet3_dma_free(sc, &sc->vmx_rss_dma);
1339 sc->vmx_rss = NULL;
1340 }
1341
1342 if (sc->vmx_qs != NULL) {
1343 vmxnet3_dma_free(sc, &sc->vmx_qs_dma);
1344 sc->vmx_qs = NULL;
1345 }
1346
1347 if (sc->vmx_ds != NULL) {
1348 vmxnet3_dma_free(sc, &sc->vmx_ds_dma);
1349 sc->vmx_ds = NULL;
1350 }
1351 }
1352
1353 static int
1354 vmxnet3_alloc_txq_data(struct vmxnet3_softc *sc)
1355 {
1356 device_t dev;
1357 struct vmxnet3_txqueue *txq;
1358 struct vmxnet3_txring *txr;
1359 struct vmxnet3_comp_ring *txc;
1360 size_t descsz, compsz;
1361 u_int i;
1362 int q, error;
1363
1364 dev = sc->vmx_dev;
1365
1366 for (q = 0; q < sc->vmx_ntxqueues; q++) {
1367 txq = &sc->vmx_queue[q].vxq_txqueue;
1368 txr = &txq->vxtxq_cmd_ring;
1369 txc = &txq->vxtxq_comp_ring;
1370
1371 descsz = txr->vxtxr_ndesc * sizeof(struct vmxnet3_txdesc);
1372 compsz = txr->vxtxr_ndesc * sizeof(struct vmxnet3_txcompdesc);
1373
1374 error = vmxnet3_dma_malloc(sc, descsz, 512, &txr->vxtxr_dma);
1375 if (error) {
1376 device_printf(dev, "cannot alloc Tx descriptors for "
1377 "queue %d error %d\n", q, error);
1378 return (error);
1379 }
1380 txr->vxtxr_txd =
1381 (struct vmxnet3_txdesc *) txr->vxtxr_dma.dma_vaddr;
1382
1383 error = vmxnet3_dma_malloc(sc, compsz, 512, &txc->vxcr_dma);
1384 if (error) {
1385 device_printf(dev, "cannot alloc Tx comp descriptors "
1386 "for queue %d error %d\n", q, error);
1387 return (error);
1388 }
1389 txc->vxcr_u.txcd =
1390 (struct vmxnet3_txcompdesc *) txc->vxcr_dma.dma_vaddr;
1391
1392 for (i = 0; i < txr->vxtxr_ndesc; i++) {
1393 error = bus_dmamap_create(sc->vmx_dmat, VMXNET3_TX_MAXSIZE,
1394 VMXNET3_TX_MAXSEGS, VMXNET3_TX_MAXSEGSIZE, 0, BUS_DMA_NOWAIT,
1395 &txr->vxtxr_txbuf[i].vtxb_dmamap);
1396 if (error) {
1397 device_printf(dev, "unable to create Tx buf "
1398 "dmamap for queue %d idx %d\n", q, i);
1399 return (error);
1400 }
1401 }
1402 }
1403
1404 return (0);
1405 }
1406
1407 static void
1408 vmxnet3_free_txq_data(struct vmxnet3_softc *sc)
1409 {
1410 struct vmxnet3_txqueue *txq;
1411 struct vmxnet3_txring *txr;
1412 struct vmxnet3_comp_ring *txc;
1413 struct vmxnet3_txbuf *txb;
1414 u_int i;
1415 int q;
1416
1417 for (q = 0; q < sc->vmx_ntxqueues; q++) {
1418 txq = &sc->vmx_queue[q].vxq_txqueue;
1419 txr = &txq->vxtxq_cmd_ring;
1420 txc = &txq->vxtxq_comp_ring;
1421
1422 for (i = 0; i < txr->vxtxr_ndesc; i++) {
1423 txb = &txr->vxtxr_txbuf[i];
1424 if (txb->vtxb_dmamap != NULL) {
1425 bus_dmamap_destroy(sc->vmx_dmat,
1426 txb->vtxb_dmamap);
1427 txb->vtxb_dmamap = NULL;
1428 }
1429 }
1430
1431 if (txc->vxcr_u.txcd != NULL) {
1432 vmxnet3_dma_free(sc, &txc->vxcr_dma);
1433 txc->vxcr_u.txcd = NULL;
1434 }
1435
1436 if (txr->vxtxr_txd != NULL) {
1437 vmxnet3_dma_free(sc, &txr->vxtxr_dma);
1438 txr->vxtxr_txd = NULL;
1439 }
1440 }
1441 }
1442
1443 static int
1444 vmxnet3_alloc_rxq_data(struct vmxnet3_softc *sc)
1445 {
1446 device_t dev;
1447 struct vmxnet3_rxqueue *rxq;
1448 struct vmxnet3_rxring *rxr;
1449 struct vmxnet3_comp_ring *rxc;
1450 int descsz, compsz;
1451 u_int i, j;
1452 int q, error;
1453
1454 dev = sc->vmx_dev;
1455
1456 for (q = 0; q < sc->vmx_nrxqueues; q++) {
1457 rxq = &sc->vmx_queue[q].vxq_rxqueue;
1458 rxc = &rxq->vxrxq_comp_ring;
1459 compsz = 0;
1460
1461 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1462 rxr = &rxq->vxrxq_cmd_ring[i];
1463
1464 descsz = rxr->vxrxr_ndesc *
1465 sizeof(struct vmxnet3_rxdesc);
1466 compsz += rxr->vxrxr_ndesc *
1467 sizeof(struct vmxnet3_rxcompdesc);
1468
1469 error = vmxnet3_dma_malloc(sc, descsz, 512,
1470 &rxr->vxrxr_dma);
1471 if (error) {
1472 device_printf(dev, "cannot allocate Rx "
1473 "descriptors for queue %d/%d error %d\n",
1474 i, q, error);
1475 return (error);
1476 }
1477 rxr->vxrxr_rxd =
1478 (struct vmxnet3_rxdesc *) rxr->vxrxr_dma.dma_vaddr;
1479 }
1480
1481 error = vmxnet3_dma_malloc(sc, compsz, 512, &rxc->vxcr_dma);
1482 if (error) {
1483 device_printf(dev, "cannot alloc Rx comp descriptors "
1484 "for queue %d error %d\n", q, error);
1485 return (error);
1486 }
1487 rxc->vxcr_u.rxcd =
1488 (struct vmxnet3_rxcompdesc *) rxc->vxcr_dma.dma_vaddr;
1489
1490 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1491 rxr = &rxq->vxrxq_cmd_ring[i];
1492
1493 error = bus_dmamap_create(sc->vmx_dmat, JUMBO_LEN, 1,
1494 JUMBO_LEN, 0, BUS_DMA_NOWAIT,
1495 &rxr->vxrxr_spare_dmap);
1496 if (error) {
1497 device_printf(dev, "unable to create spare "
1498 "dmamap for queue %d/%d error %d\n",
1499 q, i, error);
1500 return (error);
1501 }
1502
1503 for (j = 0; j < rxr->vxrxr_ndesc; j++) {
1504 error = bus_dmamap_create(sc->vmx_dmat, JUMBO_LEN, 1,
1505 JUMBO_LEN, 0, BUS_DMA_NOWAIT,
1506 &rxr->vxrxr_rxbuf[j].vrxb_dmamap);
1507 if (error) {
1508 device_printf(dev, "unable to create "
1509 "dmamap for queue %d/%d slot %d "
1510 "error %d\n",
1511 q, i, j, error);
1512 return (error);
1513 }
1514 }
1515 }
1516 }
1517
1518 return (0);
1519 }
1520
1521 static void
1522 vmxnet3_free_rxq_data(struct vmxnet3_softc *sc)
1523 {
1524 struct vmxnet3_rxqueue *rxq;
1525 struct vmxnet3_rxring *rxr;
1526 struct vmxnet3_comp_ring *rxc;
1527 struct vmxnet3_rxbuf *rxb;
1528 u_int i, j;
1529 int q;
1530
1531 for (q = 0; q < sc->vmx_nrxqueues; q++) {
1532 rxq = &sc->vmx_queue[q].vxq_rxqueue;
1533 rxc = &rxq->vxrxq_comp_ring;
1534
1535 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1536 rxr = &rxq->vxrxq_cmd_ring[i];
1537
1538 if (rxr->vxrxr_spare_dmap != NULL) {
1539 bus_dmamap_destroy(sc->vmx_dmat,
1540 rxr->vxrxr_spare_dmap);
1541 rxr->vxrxr_spare_dmap = NULL;
1542 }
1543
1544 for (j = 0; j < rxr->vxrxr_ndesc; j++) {
1545 rxb = &rxr->vxrxr_rxbuf[j];
1546 if (rxb->vrxb_dmamap != NULL) {
1547 bus_dmamap_destroy(sc->vmx_dmat,
1548 rxb->vrxb_dmamap);
1549 rxb->vrxb_dmamap = NULL;
1550 }
1551 }
1552 }
1553
1554 if (rxc->vxcr_u.rxcd != NULL) {
1555 vmxnet3_dma_free(sc, &rxc->vxcr_dma);
1556 rxc->vxcr_u.rxcd = NULL;
1557 }
1558
1559 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
1560 rxr = &rxq->vxrxq_cmd_ring[i];
1561
1562 if (rxr->vxrxr_rxd != NULL) {
1563 vmxnet3_dma_free(sc, &rxr->vxrxr_dma);
1564 rxr->vxrxr_rxd = NULL;
1565 }
1566 }
1567 }
1568 }
1569
1570 static int
1571 vmxnet3_alloc_queue_data(struct vmxnet3_softc *sc)
1572 {
1573 int error;
1574
1575 error = vmxnet3_alloc_txq_data(sc);
1576 if (error)
1577 return (error);
1578
1579 error = vmxnet3_alloc_rxq_data(sc);
1580 if (error)
1581 return (error);
1582
1583 return (0);
1584 }
1585
1586 static void
1587 vmxnet3_free_queue_data(struct vmxnet3_softc *sc)
1588 {
1589
1590 if (sc->vmx_queue != NULL) {
1591 vmxnet3_free_rxq_data(sc);
1592 vmxnet3_free_txq_data(sc);
1593 }
1594 }
1595
1596 static int
1597 vmxnet3_alloc_mcast_table(struct vmxnet3_softc *sc)
1598 {
1599 int error;
1600
1601 error = vmxnet3_dma_malloc(sc, VMXNET3_MULTICAST_MAX * ETHER_ADDR_LEN,
1602 32, &sc->vmx_mcast_dma);
1603 if (error)
1604 device_printf(sc->vmx_dev, "unable to alloc multicast table\n");
1605 else
1606 sc->vmx_mcast = sc->vmx_mcast_dma.dma_vaddr;
1607
1608 return (error);
1609 }
1610
1611 static void
1612 vmxnet3_free_mcast_table(struct vmxnet3_softc *sc)
1613 {
1614
1615 if (sc->vmx_mcast != NULL) {
1616 vmxnet3_dma_free(sc, &sc->vmx_mcast_dma);
1617 sc->vmx_mcast = NULL;
1618 }
1619 }
1620
1621 static void
1622 vmxnet3_init_shared_data(struct vmxnet3_softc *sc)
1623 {
1624 struct vmxnet3_driver_shared *ds;
1625 struct vmxnet3_txqueue *txq;
1626 struct vmxnet3_txq_shared *txs;
1627 struct vmxnet3_rxqueue *rxq;
1628 struct vmxnet3_rxq_shared *rxs;
1629 int i;
1630
1631 ds = sc->vmx_ds;
1632
1633 /*
1634 * Initialize fields of the shared data that remains the same across
1635 * reinits. Note the shared data is zero'd when allocated.
1636 */
1637
1638 ds->magic = VMXNET3_REV1_MAGIC;
1639
1640 /* DriverInfo */
1641 ds->version = VMXNET3_DRIVER_VERSION;
1642 ds->guest = VMXNET3_GOS_FREEBSD |
1643 #ifdef __LP64__
1644 VMXNET3_GOS_64BIT;
1645 #else
1646 VMXNET3_GOS_32BIT;
1647 #endif
1648 ds->vmxnet3_revision = 1;
1649 ds->upt_version = 1;
1650
1651 /* Misc. conf */
1652 ds->driver_data = vtophys(sc);
1653 ds->driver_data_len = sizeof(struct vmxnet3_softc);
1654 ds->queue_shared = sc->vmx_qs_dma.dma_paddr;
1655 ds->queue_shared_len = sc->vmx_qs_dma.dma_size;
1656 ds->nrxsg_max = sc->vmx_max_rxsegs;
1657
1658 /* RSS conf */
1659 if (sc->vmx_flags & VMXNET3_FLAG_RSS) {
1660 ds->rss.version = 1;
1661 ds->rss.paddr = sc->vmx_rss_dma.dma_paddr;
1662 ds->rss.len = sc->vmx_rss_dma.dma_size;
1663 }
1664
1665 /* Interrupt control. */
1666 ds->automask = sc->vmx_intr_mask_mode == VMXNET3_IMM_AUTO;
1667 ds->nintr = sc->vmx_nintrs;
1668 ds->evintr = sc->vmx_event_intr_idx;
1669 ds->ictrl = VMXNET3_ICTRL_DISABLE_ALL;
1670
1671 for (i = 0; i < sc->vmx_nintrs; i++)
1672 ds->modlevel[i] = UPT1_IMOD_ADAPTIVE;
1673
1674 /* Receive filter. */
1675 ds->mcast_table = sc->vmx_mcast_dma.dma_paddr;
1676 ds->mcast_tablelen = sc->vmx_mcast_dma.dma_size;
1677
1678 /* Tx queues */
1679 for (i = 0; i < sc->vmx_ntxqueues; i++) {
1680 txq = &sc->vmx_queue[i].vxq_txqueue;
1681 txs = txq->vxtxq_ts;
1682
1683 txs->cmd_ring = txq->vxtxq_cmd_ring.vxtxr_dma.dma_paddr;
1684 txs->cmd_ring_len = txq->vxtxq_cmd_ring.vxtxr_ndesc;
1685 txs->comp_ring = txq->vxtxq_comp_ring.vxcr_dma.dma_paddr;
1686 txs->comp_ring_len = txq->vxtxq_comp_ring.vxcr_ndesc;
1687 txs->driver_data = vtophys(txq);
1688 txs->driver_data_len = sizeof(struct vmxnet3_txqueue);
1689 }
1690
1691 /* Rx queues */
1692 for (i = 0; i < sc->vmx_nrxqueues; i++) {
1693 rxq = &sc->vmx_queue[i].vxq_rxqueue;
1694 rxs = rxq->vxrxq_rs;
1695
1696 rxs->cmd_ring[0] = rxq->vxrxq_cmd_ring[0].vxrxr_dma.dma_paddr;
1697 rxs->cmd_ring_len[0] = rxq->vxrxq_cmd_ring[0].vxrxr_ndesc;
1698 rxs->cmd_ring[1] = rxq->vxrxq_cmd_ring[1].vxrxr_dma.dma_paddr;
1699 rxs->cmd_ring_len[1] = rxq->vxrxq_cmd_ring[1].vxrxr_ndesc;
1700 rxs->comp_ring = rxq->vxrxq_comp_ring.vxcr_dma.dma_paddr;
1701 rxs->comp_ring_len = rxq->vxrxq_comp_ring.vxcr_ndesc;
1702 rxs->driver_data = vtophys(rxq);
1703 rxs->driver_data_len = sizeof(struct vmxnet3_rxqueue);
1704 }
1705 }
1706
1707 static void
1708 vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc)
1709 {
1710 /*
1711 * Use the same key as the Linux driver until FreeBSD can do
1712 * RSS (presumably Toeplitz) in software.
1713 */
1714 static const uint8_t rss_key[UPT1_RSS_MAX_KEY_SIZE] = {
1715 0x3b, 0x56, 0xd1, 0x56, 0x13, 0x4a, 0xe7, 0xac,
1716 0xe8, 0x79, 0x09, 0x75, 0xe8, 0x65, 0x79, 0x28,
1717 0x35, 0x12, 0xb9, 0x56, 0x7c, 0x76, 0x4b, 0x70,
1718 0xd8, 0x56, 0xa3, 0x18, 0x9b, 0x0a, 0xee, 0xf3,
1719 0x96, 0xa6, 0x9f, 0x8f, 0x9e, 0x8c, 0x90, 0xc9,
1720 };
1721
1722 struct vmxnet3_rss_shared *rss;
1723 int i;
1724
1725 rss = sc->vmx_rss;
1726
1727 rss->hash_type =
1728 UPT1_RSS_HASH_TYPE_IPV4 | UPT1_RSS_HASH_TYPE_TCP_IPV4 |
1729 UPT1_RSS_HASH_TYPE_IPV6 | UPT1_RSS_HASH_TYPE_TCP_IPV6;
1730 rss->hash_func = UPT1_RSS_HASH_FUNC_TOEPLITZ;
1731 rss->hash_key_size = UPT1_RSS_MAX_KEY_SIZE;
1732 rss->ind_table_size = UPT1_RSS_MAX_IND_TABLE_SIZE;
1733 memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE);
1734
1735 for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++)
1736 rss->ind_table[i] = i % sc->vmx_nrxqueues;
1737 }
1738
1739 static void
1740 vmxnet3_reinit_shared_data(struct vmxnet3_softc *sc)
1741 {
1742 struct ifnet *ifp;
1743 struct vmxnet3_driver_shared *ds;
1744
1745 ifp = &sc->vmx_ethercom.ec_if;
1746 ds = sc->vmx_ds;
1747
1748 ds->mtu = ifp->if_mtu;
1749 ds->ntxqueue = sc->vmx_ntxqueues;
1750 ds->nrxqueue = sc->vmx_nrxqueues;
1751
1752 ds->upt_features = 0;
1753 if (ifp->if_capenable &
1754 (IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
1755 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
1756 ds->upt_features |= UPT1_F_CSUM;
1757 if (sc->vmx_ethercom.ec_capenable & ETHERCAP_VLAN_HWTAGGING)
1758 ds->upt_features |= UPT1_F_VLAN;
1759
1760 if (sc->vmx_flags & VMXNET3_FLAG_RSS) {
1761 ds->upt_features |= UPT1_F_RSS;
1762 vmxnet3_reinit_rss_shared_data(sc);
1763 }
1764
1765 vmxnet3_write_bar1(sc, VMXNET3_BAR1_DSL, sc->vmx_ds_dma.dma_paddr);
1766 vmxnet3_write_bar1(sc, VMXNET3_BAR1_DSH,
1767 (uint64_t) sc->vmx_ds_dma.dma_paddr >> 32);
1768 }
1769
1770 static int
1771 vmxnet3_alloc_data(struct vmxnet3_softc *sc)
1772 {
1773 int error;
1774
1775 error = vmxnet3_alloc_shared_data(sc);
1776 if (error)
1777 return (error);
1778
1779 error = vmxnet3_alloc_queue_data(sc);
1780 if (error)
1781 return (error);
1782
1783 error = vmxnet3_alloc_mcast_table(sc);
1784 if (error)
1785 return (error);
1786
1787 vmxnet3_init_shared_data(sc);
1788
1789 return (0);
1790 }
1791
1792 static void
1793 vmxnet3_free_data(struct vmxnet3_softc *sc)
1794 {
1795
1796 vmxnet3_free_mcast_table(sc);
1797 vmxnet3_free_queue_data(sc);
1798 vmxnet3_free_shared_data(sc);
1799 }
1800
1801 static int
1802 vmxnet3_setup_interface(struct vmxnet3_softc *sc)
1803 {
1804 struct ifnet *ifp = &sc->vmx_ethercom.ec_if;
1805
1806 vmxnet3_get_lladdr(sc);
1807 aprint_normal_dev(sc->vmx_dev, "Ethernet address %s\n",
1808 ether_sprintf(sc->vmx_lladdr));
1809 vmxnet3_set_lladdr(sc);
1810
1811 strlcpy(ifp->if_xname, device_xname(sc->vmx_dev), IFNAMSIZ);
1812 ifp->if_softc = sc;
1813 ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST | IFF_SIMPLEX;
1814 ifp->if_extflags = IFEF_MPSAFE;
1815 ifp->if_ioctl = vmxnet3_ioctl;
1816 ifp->if_start = vmxnet3_start;
1817 ifp->if_transmit = vmxnet3_transmit;
1818 ifp->if_watchdog = NULL;
1819 ifp->if_init = vmxnet3_init;
1820 ifp->if_stop = vmxnet3_stop;
1821 sc->vmx_ethercom.ec_if.if_capabilities |=IFCAP_CSUM_IPv4_Rx |
1822 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
1823 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
1824 IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_TCPv6_Rx |
1825 IFCAP_CSUM_UDPv6_Tx | IFCAP_CSUM_UDPv6_Rx;
1826
1827 ifp->if_capenable = ifp->if_capabilities;
1828
1829 sc->vmx_ethercom.ec_if.if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
1830
1831 sc->vmx_ethercom.ec_capabilities |=
1832 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING | ETHERCAP_JUMBO_MTU;
1833 sc->vmx_ethercom.ec_capenable |= ETHERCAP_VLAN_HWTAGGING;
1834
1835 IFQ_SET_MAXLEN(&ifp->if_snd, sc->vmx_ntxdescs);
1836 IFQ_SET_READY(&ifp->if_snd);
1837
1838 /* Initialize ifmedia structures. */
1839 sc->vmx_ethercom.ec_ifmedia = &sc->vmx_media;
1840 ifmedia_init_with_lock(&sc->vmx_media, IFM_IMASK, vmxnet3_ifmedia_change,
1841 vmxnet3_ifmedia_status, sc->vmx_mtx);
1842 ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_AUTO, 0, NULL);
1843 ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_10G_T | IFM_FDX, 0, NULL);
1844 ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_10G_T, 0, NULL);
1845 ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
1846 ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_1000_T, 0, NULL);
1847 ifmedia_set(&sc->vmx_media, IFM_ETHER | IFM_AUTO);
1848
1849 if_attach(ifp);
1850 if_deferred_start_init(ifp, NULL);
1851 ether_ifattach(ifp, sc->vmx_lladdr);
1852 ether_set_ifflags_cb(&sc->vmx_ethercom, vmxnet3_ifflags_cb);
1853 vmxnet3_cmd_link_status(ifp);
1854
1855 /* should set before setting interrupts */
1856 sc->vmx_rx_intr_process_limit = VMXNET3_RX_INTR_PROCESS_LIMIT;
1857 sc->vmx_rx_process_limit = VMXNET3_RX_PROCESS_LIMIT;
1858 sc->vmx_tx_intr_process_limit = VMXNET3_TX_INTR_PROCESS_LIMIT;
1859 sc->vmx_tx_process_limit = VMXNET3_TX_PROCESS_LIMIT;
1860
1861 return (0);
1862 }
1863
1864 static int
1865 vmxnet3_setup_sysctl(struct vmxnet3_softc *sc)
1866 {
1867 const char *devname;
1868 struct sysctllog **log;
1869 const struct sysctlnode *rnode, *rxnode, *txnode;
1870 int error;
1871
1872 log = &sc->vmx_sysctllog;
1873 devname = device_xname(sc->vmx_dev);
1874
1875 error = sysctl_createv(log, 0, NULL, &rnode,
1876 0, CTLTYPE_NODE, devname,
1877 SYSCTL_DESCR("vmxnet3 information and settings"),
1878 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
1879 if (error)
1880 goto out;
1881 error = sysctl_createv(log, 0, &rnode, NULL,
1882 CTLFLAG_READWRITE, CTLTYPE_BOOL, "txrx_workqueue",
1883 SYSCTL_DESCR("Use workqueue for packet processing"),
1884 NULL, 0, &sc->vmx_txrx_workqueue, 0, CTL_CREATE, CTL_EOL);
1885 if (error)
1886 goto out;
1887
1888 error = sysctl_createv(log, 0, &rnode, &rxnode,
1889 0, CTLTYPE_NODE, "rx",
1890 SYSCTL_DESCR("vmxnet3 information and settings for Rx"),
1891 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL);
1892 if (error)
1893 goto out;
1894 error = sysctl_createv(log, 0, &rxnode, NULL,
1895 CTLFLAG_READWRITE, CTLTYPE_INT, "intr_process_limit",
1896 SYSCTL_DESCR("max number of Rx packets to process for interrupt processing"),
1897 NULL, 0, &sc->vmx_rx_intr_process_limit, 0, CTL_CREATE, CTL_EOL);
1898 if (error)
1899 goto out;
1900 error = sysctl_createv(log, 0, &rxnode, NULL,
1901 CTLFLAG_READWRITE, CTLTYPE_INT, "process_limit",
1902 SYSCTL_DESCR("max number of Rx packets to process for deferred processing"),
1903 NULL, 0, &sc->vmx_rx_process_limit, 0, CTL_CREATE, CTL_EOL);
1904 if (error)
1905 goto out;
1906
1907 error = sysctl_createv(log, 0, &rnode, &txnode,
1908 0, CTLTYPE_NODE, "tx",
1909 SYSCTL_DESCR("vmxnet3 information and settings for Tx"),
1910 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL);
1911 if (error)
1912 goto out;
1913 error = sysctl_createv(log, 0, &txnode, NULL,
1914 CTLFLAG_READWRITE, CTLTYPE_INT, "intr_process_limit",
1915 SYSCTL_DESCR("max number of Tx packets to process for interrupt processing"),
1916 NULL, 0, &sc->vmx_tx_intr_process_limit, 0, CTL_CREATE, CTL_EOL);
1917 if (error)
1918 goto out;
1919 error = sysctl_createv(log, 0, &txnode, NULL,
1920 CTLFLAG_READWRITE, CTLTYPE_INT, "process_limit",
1921 SYSCTL_DESCR("max number of Tx packets to process for deferred processing"),
1922 NULL, 0, &sc->vmx_tx_process_limit, 0, CTL_CREATE, CTL_EOL);
1923
1924 out:
1925 if (error) {
1926 aprint_error_dev(sc->vmx_dev,
1927 "unable to create sysctl node\n");
1928 sysctl_teardown(log);
1929 }
1930 return error;
1931 }
1932
1933 static int
1934 vmxnet3_setup_stats(struct vmxnet3_softc *sc)
1935 {
1936 struct vmxnet3_queue *vmxq;
1937 struct vmxnet3_txqueue *txq;
1938 struct vmxnet3_rxqueue *rxq;
1939 int i;
1940
1941 for (i = 0; i < sc->vmx_ntxqueues; i++) {
1942 vmxq = &sc->vmx_queue[i];
1943 txq = &vmxq->vxq_txqueue;
1944 evcnt_attach_dynamic(&txq->vxtxq_intr, EVCNT_TYPE_INTR,
1945 NULL, txq->vxtxq_name, "Interrupt on queue");
1946 evcnt_attach_dynamic(&txq->vxtxq_defer, EVCNT_TYPE_MISC,
1947 NULL, txq->vxtxq_name, "Handled queue in softint/workqueue");
1948 evcnt_attach_dynamic(&txq->vxtxq_deferreq, EVCNT_TYPE_MISC,
1949 NULL, txq->vxtxq_name, "Requested in softint/workqueue");
1950 evcnt_attach_dynamic(&txq->vxtxq_pcqdrop, EVCNT_TYPE_MISC,
1951 NULL, txq->vxtxq_name, "Dropped in pcq");
1952 evcnt_attach_dynamic(&txq->vxtxq_transmitdef, EVCNT_TYPE_MISC,
1953 NULL, txq->vxtxq_name, "Deferred transmit");
1954 evcnt_attach_dynamic(&txq->vxtxq_watchdogto, EVCNT_TYPE_MISC,
1955 NULL, txq->vxtxq_name, "Watchdog timeout");
1956 evcnt_attach_dynamic(&txq->vxtxq_defragged, EVCNT_TYPE_MISC,
1957 NULL, txq->vxtxq_name, "m_defrag successed");
1958 evcnt_attach_dynamic(&txq->vxtxq_defrag_failed, EVCNT_TYPE_MISC,
1959 NULL, txq->vxtxq_name, "m_defrag failed");
1960 }
1961
1962 for (i = 0; i < sc->vmx_nrxqueues; i++) {
1963 vmxq = &sc->vmx_queue[i];
1964 rxq = &vmxq->vxq_rxqueue;
1965 evcnt_attach_dynamic(&rxq->vxrxq_intr, EVCNT_TYPE_INTR,
1966 NULL, rxq->vxrxq_name, "Interrupt on queue");
1967 evcnt_attach_dynamic(&rxq->vxrxq_defer, EVCNT_TYPE_MISC,
1968 NULL, rxq->vxrxq_name, "Handled queue in softint/workqueue");
1969 evcnt_attach_dynamic(&rxq->vxrxq_deferreq, EVCNT_TYPE_MISC,
1970 NULL, rxq->vxrxq_name, "Requested in softint/workqueue");
1971 evcnt_attach_dynamic(&rxq->vxrxq_mgetcl_failed, EVCNT_TYPE_MISC,
1972 NULL, rxq->vxrxq_name, "MCLGET failed");
1973 evcnt_attach_dynamic(&rxq->vxrxq_mbuf_load_failed, EVCNT_TYPE_MISC,
1974 NULL, rxq->vxrxq_name, "bus_dmamap_load_mbuf failed");
1975 }
1976
1977 evcnt_attach_dynamic(&sc->vmx_event_intr, EVCNT_TYPE_INTR,
1978 NULL, device_xname(sc->vmx_dev), "Interrupt for other events");
1979 evcnt_attach_dynamic(&sc->vmx_event_link, EVCNT_TYPE_MISC,
1980 NULL, device_xname(sc->vmx_dev), "Link status event");
1981 evcnt_attach_dynamic(&sc->vmx_event_txqerror, EVCNT_TYPE_MISC,
1982 NULL, device_xname(sc->vmx_dev), "Tx queue error event");
1983 evcnt_attach_dynamic(&sc->vmx_event_rxqerror, EVCNT_TYPE_MISC,
1984 NULL, device_xname(sc->vmx_dev), "Rx queue error event");
1985 evcnt_attach_dynamic(&sc->vmx_event_dic, EVCNT_TYPE_MISC,
1986 NULL, device_xname(sc->vmx_dev), "Device impl change event");
1987 evcnt_attach_dynamic(&sc->vmx_event_debug, EVCNT_TYPE_MISC,
1988 NULL, device_xname(sc->vmx_dev), "Debug event");
1989
1990 return 0;
1991 }
1992
1993 static void
1994 vmxnet3_teardown_stats(struct vmxnet3_softc *sc)
1995 {
1996 struct vmxnet3_queue *vmxq;
1997 struct vmxnet3_txqueue *txq;
1998 struct vmxnet3_rxqueue *rxq;
1999 int i;
2000
2001 for (i = 0; i < sc->vmx_ntxqueues; i++) {
2002 vmxq = &sc->vmx_queue[i];
2003 txq = &vmxq->vxq_txqueue;
2004 evcnt_detach(&txq->vxtxq_intr);
2005 evcnt_detach(&txq->vxtxq_defer);
2006 evcnt_detach(&txq->vxtxq_deferreq);
2007 evcnt_detach(&txq->vxtxq_pcqdrop);
2008 evcnt_detach(&txq->vxtxq_transmitdef);
2009 evcnt_detach(&txq->vxtxq_watchdogto);
2010 evcnt_detach(&txq->vxtxq_defragged);
2011 evcnt_detach(&txq->vxtxq_defrag_failed);
2012 }
2013
2014 for (i = 0; i < sc->vmx_nrxqueues; i++) {
2015 vmxq = &sc->vmx_queue[i];
2016 rxq = &vmxq->vxq_rxqueue;
2017 evcnt_detach(&rxq->vxrxq_intr);
2018 evcnt_detach(&rxq->vxrxq_defer);
2019 evcnt_detach(&rxq->vxrxq_deferreq);
2020 evcnt_detach(&rxq->vxrxq_mgetcl_failed);
2021 evcnt_detach(&rxq->vxrxq_mbuf_load_failed);
2022 }
2023
2024 evcnt_detach(&sc->vmx_event_intr);
2025 evcnt_detach(&sc->vmx_event_link);
2026 evcnt_detach(&sc->vmx_event_txqerror);
2027 evcnt_detach(&sc->vmx_event_rxqerror);
2028 evcnt_detach(&sc->vmx_event_dic);
2029 evcnt_detach(&sc->vmx_event_debug);
2030 }
2031
2032 static void
2033 vmxnet3_evintr(struct vmxnet3_softc *sc)
2034 {
2035 device_t dev;
2036 struct vmxnet3_txq_shared *ts;
2037 struct vmxnet3_rxq_shared *rs;
2038 uint32_t event;
2039 int reset;
2040
2041 dev = sc->vmx_dev;
2042 reset = 0;
2043
2044 VMXNET3_CORE_LOCK(sc);
2045
2046 /* Clear events. */
2047 event = sc->vmx_ds->event;
2048 vmxnet3_write_bar1(sc, VMXNET3_BAR1_EVENT, event);
2049
2050 if (event & VMXNET3_EVENT_LINK) {
2051 sc->vmx_event_link.ev_count++;
2052 vmxnet3_if_link_status(sc);
2053 if (sc->vmx_link_active != 0)
2054 if_schedule_deferred_start(&sc->vmx_ethercom.ec_if);
2055 }
2056
2057 if (event & (VMXNET3_EVENT_TQERROR | VMXNET3_EVENT_RQERROR)) {
2058 if (event & VMXNET3_EVENT_TQERROR)
2059 sc->vmx_event_txqerror.ev_count++;
2060 if (event & VMXNET3_EVENT_RQERROR)
2061 sc->vmx_event_rxqerror.ev_count++;
2062
2063 reset = 1;
2064 vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_STATUS);
2065 ts = sc->vmx_queue[0].vxq_txqueue.vxtxq_ts;
2066 if (ts->stopped != 0)
2067 device_printf(dev, "Tx queue error %#x\n", ts->error);
2068 rs = sc->vmx_queue[0].vxq_rxqueue.vxrxq_rs;
2069 if (rs->stopped != 0)
2070 device_printf(dev, "Rx queue error %#x\n", rs->error);
2071 device_printf(dev, "Rx/Tx queue error event ... resetting\n");
2072 }
2073
2074 if (event & VMXNET3_EVENT_DIC) {
2075 sc->vmx_event_dic.ev_count++;
2076 device_printf(dev, "device implementation change event\n");
2077 }
2078 if (event & VMXNET3_EVENT_DEBUG) {
2079 sc->vmx_event_debug.ev_count++;
2080 device_printf(dev, "debug event\n");
2081 }
2082
2083 if (reset != 0)
2084 vmxnet3_init_locked(sc);
2085
2086 VMXNET3_CORE_UNLOCK(sc);
2087 }
2088
2089 static bool
2090 vmxnet3_txq_eof(struct vmxnet3_txqueue *txq, u_int limit)
2091 {
2092 struct vmxnet3_softc *sc;
2093 struct vmxnet3_txring *txr;
2094 struct vmxnet3_comp_ring *txc;
2095 struct vmxnet3_txcompdesc *txcd;
2096 struct vmxnet3_txbuf *txb;
2097 struct ifnet *ifp;
2098 struct mbuf *m;
2099 u_int sop;
2100 bool more = false;
2101
2102 sc = txq->vxtxq_sc;
2103 txr = &txq->vxtxq_cmd_ring;
2104 txc = &txq->vxtxq_comp_ring;
2105 ifp = &sc->vmx_ethercom.ec_if;
2106
2107 VMXNET3_TXQ_LOCK_ASSERT(txq);
2108
2109 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
2110 for (;;) {
2111 if (limit-- == 0) {
2112 more = true;
2113 break;
2114 }
2115
2116 txcd = &txc->vxcr_u.txcd[txc->vxcr_next];
2117 if (txcd->gen != txc->vxcr_gen)
2118 break;
2119 vmxnet3_barrier(sc, VMXNET3_BARRIER_RD);
2120
2121 if (++txc->vxcr_next == txc->vxcr_ndesc) {
2122 txc->vxcr_next = 0;
2123 txc->vxcr_gen ^= 1;
2124 }
2125
2126 sop = txr->vxtxr_next;
2127 txb = &txr->vxtxr_txbuf[sop];
2128
2129 if ((m = txb->vtxb_m) != NULL) {
2130 bus_dmamap_sync(sc->vmx_dmat, txb->vtxb_dmamap,
2131 0, txb->vtxb_dmamap->dm_mapsize,
2132 BUS_DMASYNC_POSTWRITE);
2133 bus_dmamap_unload(sc->vmx_dmat, txb->vtxb_dmamap);
2134
2135 if_statinc_ref(nsr, if_opackets);
2136 if_statadd_ref(nsr, if_obytes, m->m_pkthdr.len);
2137 if (m->m_flags & M_MCAST)
2138 if_statinc_ref(nsr, if_omcasts);
2139
2140 m_freem(m);
2141 txb->vtxb_m = NULL;
2142 }
2143
2144 txr->vxtxr_next = (txcd->eop_idx + 1) % txr->vxtxr_ndesc;
2145 }
2146 IF_STAT_PUTREF(ifp);
2147
2148 if (txr->vxtxr_head == txr->vxtxr_next)
2149 txq->vxtxq_watchdog = 0;
2150
2151 return more;
2152 }
2153
2154 static int
2155 vmxnet3_newbuf(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq,
2156 struct vmxnet3_rxring *rxr)
2157 {
2158 struct mbuf *m;
2159 struct vmxnet3_rxdesc *rxd;
2160 struct vmxnet3_rxbuf *rxb;
2161 bus_dma_tag_t tag;
2162 bus_dmamap_t dmap;
2163 int idx, btype, error;
2164
2165 tag = sc->vmx_dmat;
2166 dmap = rxr->vxrxr_spare_dmap;
2167 idx = rxr->vxrxr_fill;
2168 rxd = &rxr->vxrxr_rxd[idx];
2169 rxb = &rxr->vxrxr_rxbuf[idx];
2170
2171 /* Don't allocate buffers for ring 2 for now. */
2172 if (rxr->vxrxr_rid != 0)
2173 return -1;
2174 btype = VMXNET3_BTYPE_HEAD;
2175
2176 MGETHDR(m, M_DONTWAIT, MT_DATA);
2177 if (m == NULL)
2178 return (ENOBUFS);
2179
2180 MCLGET(m, M_DONTWAIT);
2181 if ((m->m_flags & M_EXT) == 0) {
2182 rxq->vxrxq_mgetcl_failed.ev_count++;
2183 m_freem(m);
2184 return (ENOBUFS);
2185 }
2186
2187 m->m_pkthdr.len = m->m_len = JUMBO_LEN;
2188 m_adj(m, ETHER_ALIGN);
2189
2190 error = bus_dmamap_load_mbuf(sc->vmx_dmat, dmap, m, BUS_DMA_NOWAIT);
2191 if (error) {
2192 m_freem(m);
2193 rxq->vxrxq_mbuf_load_failed.ev_count++;
2194 return (error);
2195 }
2196
2197 if (rxb->vrxb_m != NULL) {
2198 bus_dmamap_sync(tag, rxb->vrxb_dmamap,
2199 0, rxb->vrxb_dmamap->dm_mapsize,
2200 BUS_DMASYNC_POSTREAD);
2201 bus_dmamap_unload(tag, rxb->vrxb_dmamap);
2202 }
2203
2204 rxr->vxrxr_spare_dmap = rxb->vrxb_dmamap;
2205 rxb->vrxb_dmamap = dmap;
2206 rxb->vrxb_m = m;
2207
2208 rxd->addr = DMAADDR(dmap);
2209 rxd->len = m->m_pkthdr.len;
2210 rxd->btype = btype;
2211 rxd->gen = rxr->vxrxr_gen;
2212
2213 vmxnet3_rxr_increment_fill(rxr);
2214 return (0);
2215 }
2216
2217 static void
2218 vmxnet3_rxq_eof_discard(struct vmxnet3_rxqueue *rxq,
2219 struct vmxnet3_rxring *rxr, int idx)
2220 {
2221 struct vmxnet3_rxdesc *rxd;
2222
2223 rxd = &rxr->vxrxr_rxd[idx];
2224 rxd->gen = rxr->vxrxr_gen;
2225 vmxnet3_rxr_increment_fill(rxr);
2226 }
2227
2228 static void
2229 vmxnet3_rxq_discard_chain(struct vmxnet3_rxqueue *rxq)
2230 {
2231 struct vmxnet3_softc *sc;
2232 struct vmxnet3_rxring *rxr;
2233 struct vmxnet3_comp_ring *rxc;
2234 struct vmxnet3_rxcompdesc *rxcd;
2235 int idx, eof;
2236
2237 sc = rxq->vxrxq_sc;
2238 rxc = &rxq->vxrxq_comp_ring;
2239
2240 do {
2241 rxcd = &rxc->vxcr_u.rxcd[rxc->vxcr_next];
2242 if (rxcd->gen != rxc->vxcr_gen)
2243 break; /* Not expected. */
2244 vmxnet3_barrier(sc, VMXNET3_BARRIER_RD);
2245
2246 if (++rxc->vxcr_next == rxc->vxcr_ndesc) {
2247 rxc->vxcr_next = 0;
2248 rxc->vxcr_gen ^= 1;
2249 }
2250
2251 idx = rxcd->rxd_idx;
2252 eof = rxcd->eop;
2253 if (rxcd->qid < sc->vmx_nrxqueues)
2254 rxr = &rxq->vxrxq_cmd_ring[0];
2255 else
2256 rxr = &rxq->vxrxq_cmd_ring[1];
2257 vmxnet3_rxq_eof_discard(rxq, rxr, idx);
2258 } while (!eof);
2259 }
2260
2261 static void
2262 vmxnet3_rx_csum(struct vmxnet3_rxcompdesc *rxcd, struct mbuf *m)
2263 {
2264 if (rxcd->no_csum)
2265 return;
2266
2267 if (rxcd->ipv4) {
2268 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
2269 if (rxcd->ipcsum_ok == 0)
2270 m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
2271 }
2272
2273 if (rxcd->fragment)
2274 return;
2275
2276 if (rxcd->tcp) {
2277 m->m_pkthdr.csum_flags |=
2278 rxcd->ipv4 ? M_CSUM_TCPv4 : M_CSUM_TCPv6;
2279 if ((rxcd->csum_ok) == 0)
2280 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
2281 }
2282
2283 if (rxcd->udp) {
2284 m->m_pkthdr.csum_flags |=
2285 rxcd->ipv4 ? M_CSUM_UDPv4 : M_CSUM_UDPv6 ;
2286 if ((rxcd->csum_ok) == 0)
2287 m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
2288 }
2289 }
2290
2291 static void
2292 vmxnet3_rxq_input(struct vmxnet3_rxqueue *rxq,
2293 struct vmxnet3_rxcompdesc *rxcd, struct mbuf *m)
2294 {
2295 struct vmxnet3_softc *sc;
2296 struct ifnet *ifp;
2297
2298 sc = rxq->vxrxq_sc;
2299 ifp = &sc->vmx_ethercom.ec_if;
2300
2301 if (rxcd->error) {
2302 if_statinc(ifp, if_ierrors);
2303 m_freem(m);
2304 return;
2305 }
2306
2307 if (!rxcd->no_csum)
2308 vmxnet3_rx_csum(rxcd, m);
2309 if (rxcd->vlan)
2310 vlan_set_tag(m, rxcd->vtag);
2311
2312 net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
2313 if_statinc_ref(nsr, if_ipackets);
2314 if_statadd_ref(nsr, if_ibytes, m->m_pkthdr.len);
2315 IF_STAT_PUTREF(ifp);
2316
2317 if_percpuq_enqueue(ifp->if_percpuq, m);
2318 }
2319
2320 static bool
2321 vmxnet3_rxq_eof(struct vmxnet3_rxqueue *rxq, u_int limit)
2322 {
2323 struct vmxnet3_softc *sc;
2324 struct ifnet *ifp;
2325 struct vmxnet3_rxring *rxr;
2326 struct vmxnet3_comp_ring *rxc;
2327 struct vmxnet3_rxdesc *rxd __diagused;
2328 struct vmxnet3_rxcompdesc *rxcd;
2329 struct mbuf *m, *m_head, *m_tail;
2330 u_int idx, length;
2331 bool more = false;
2332
2333 sc = rxq->vxrxq_sc;
2334 ifp = &sc->vmx_ethercom.ec_if;
2335 rxc = &rxq->vxrxq_comp_ring;
2336
2337 VMXNET3_RXQ_LOCK_ASSERT(rxq);
2338
2339 if ((ifp->if_flags & IFF_RUNNING) == 0)
2340 return more;
2341
2342 m_head = rxq->vxrxq_mhead;
2343 rxq->vxrxq_mhead = NULL;
2344 m_tail = rxq->vxrxq_mtail;
2345 rxq->vxrxq_mtail = NULL;
2346 KASSERT(m_head == NULL || m_tail != NULL);
2347
2348 for (;;) {
2349 if (limit-- == 0) {
2350 more = true;
2351 break;
2352 }
2353
2354 rxcd = &rxc->vxcr_u.rxcd[rxc->vxcr_next];
2355 if (rxcd->gen != rxc->vxcr_gen) {
2356 rxq->vxrxq_mhead = m_head;
2357 rxq->vxrxq_mtail = m_tail;
2358 break;
2359 }
2360 vmxnet3_barrier(sc, VMXNET3_BARRIER_RD);
2361
2362 if (++rxc->vxcr_next == rxc->vxcr_ndesc) {
2363 rxc->vxcr_next = 0;
2364 rxc->vxcr_gen ^= 1;
2365 }
2366
2367 idx = rxcd->rxd_idx;
2368 length = rxcd->len;
2369 if (rxcd->qid < sc->vmx_nrxqueues)
2370 rxr = &rxq->vxrxq_cmd_ring[0];
2371 else
2372 rxr = &rxq->vxrxq_cmd_ring[1];
2373 rxd = &rxr->vxrxr_rxd[idx];
2374
2375 m = rxr->vxrxr_rxbuf[idx].vrxb_m;
2376 KASSERT(m != NULL);
2377
2378 /*
2379 * The host may skip descriptors. We detect this when this
2380 * descriptor does not match the previous fill index. Catch
2381 * up with the host now.
2382 */
2383 if (__predict_false(rxr->vxrxr_fill != idx)) {
2384 while (rxr->vxrxr_fill != idx) {
2385 rxr->vxrxr_rxd[rxr->vxrxr_fill].gen =
2386 rxr->vxrxr_gen;
2387 vmxnet3_rxr_increment_fill(rxr);
2388 }
2389 }
2390
2391 if (rxcd->sop) {
2392 /* start of frame w/o head buffer */
2393 KASSERT(rxd->btype == VMXNET3_BTYPE_HEAD);
2394 /* start of frame not in ring 0 */
2395 KASSERT(rxr == &rxq->vxrxq_cmd_ring[0]);
2396 /* duplicate start of frame? */
2397 KASSERT(m_head == NULL);
2398
2399 if (length == 0) {
2400 /* Just ignore this descriptor. */
2401 vmxnet3_rxq_eof_discard(rxq, rxr, idx);
2402 goto nextp;
2403 }
2404
2405 if (vmxnet3_newbuf(sc, rxq, rxr) != 0) {
2406 if_statinc(ifp, if_iqdrops);
2407 vmxnet3_rxq_eof_discard(rxq, rxr, idx);
2408 if (!rxcd->eop)
2409 vmxnet3_rxq_discard_chain(rxq);
2410 goto nextp;
2411 }
2412
2413 m_set_rcvif(m, ifp);
2414 m->m_pkthdr.len = m->m_len = length;
2415 m->m_pkthdr.csum_flags = 0;
2416 m_head = m_tail = m;
2417
2418 } else {
2419 /* non start of frame w/o body buffer */
2420 KASSERT(rxd->btype == VMXNET3_BTYPE_BODY);
2421 /* frame not started? */
2422 KASSERT(m_head != NULL);
2423
2424 if (vmxnet3_newbuf(sc, rxq, rxr) != 0) {
2425 if_statinc(ifp, if_iqdrops);
2426 vmxnet3_rxq_eof_discard(rxq, rxr, idx);
2427 if (!rxcd->eop)
2428 vmxnet3_rxq_discard_chain(rxq);
2429 m_freem(m_head);
2430 m_head = m_tail = NULL;
2431 goto nextp;
2432 }
2433
2434 m->m_len = length;
2435 m_head->m_pkthdr.len += length;
2436 m_tail->m_next = m;
2437 m_tail = m;
2438 }
2439
2440 if (rxcd->eop) {
2441 vmxnet3_rxq_input(rxq, rxcd, m_head);
2442 m_head = m_tail = NULL;
2443
2444 /* Must recheck after dropping the Rx lock. */
2445 if ((ifp->if_flags & IFF_RUNNING) == 0)
2446 break;
2447 }
2448
2449 nextp:
2450 if (__predict_false(rxq->vxrxq_rs->update_rxhead)) {
2451 int qid = rxcd->qid;
2452 bus_size_t r;
2453
2454 idx = (idx + 1) % rxr->vxrxr_ndesc;
2455 if (qid >= sc->vmx_nrxqueues) {
2456 qid -= sc->vmx_nrxqueues;
2457 r = VMXNET3_BAR0_RXH2(qid);
2458 } else
2459 r = VMXNET3_BAR0_RXH1(qid);
2460 vmxnet3_write_bar0(sc, r, idx);
2461 }
2462 }
2463
2464 return more;
2465 }
2466
2467 static inline void
2468 vmxnet3_sched_handle_queue(struct vmxnet3_softc *sc, struct vmxnet3_queue *vmxq)
2469 {
2470
2471 if (vmxq->vxq_workqueue) {
2472 /*
2473 * When this function is called, "vmxq" is owned by one CPU.
2474 * so, atomic operation is not required here.
2475 */
2476 if (!vmxq->vxq_wq_enqueued) {
2477 vmxq->vxq_wq_enqueued = true;
2478 workqueue_enqueue(sc->vmx_queue_wq,
2479 &vmxq->vxq_wq_cookie, curcpu());
2480 }
2481 } else {
2482 softint_schedule(vmxq->vxq_si);
2483 }
2484 }
2485
2486 static int
2487 vmxnet3_legacy_intr(void *xsc)
2488 {
2489 struct vmxnet3_softc *sc;
2490 struct vmxnet3_queue *vmxq;
2491 struct vmxnet3_txqueue *txq;
2492 struct vmxnet3_rxqueue *rxq;
2493 u_int txlimit, rxlimit;
2494 bool txmore, rxmore;
2495
2496 sc = xsc;
2497 vmxq = &sc->vmx_queue[0];
2498 txq = &vmxq->vxq_txqueue;
2499 rxq = &vmxq->vxq_rxqueue;
2500 txlimit = sc->vmx_tx_intr_process_limit;
2501 rxlimit = sc->vmx_rx_intr_process_limit;
2502
2503 if (sc->vmx_intr_type == VMXNET3_IT_LEGACY) {
2504 if (vmxnet3_read_bar1(sc, VMXNET3_BAR1_INTR) == 0)
2505 return (0);
2506 }
2507 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
2508 vmxnet3_disable_all_intrs(sc);
2509
2510 if (sc->vmx_ds->event != 0)
2511 vmxnet3_evintr(sc);
2512
2513 VMXNET3_TXQ_LOCK(txq);
2514 txmore = vmxnet3_txq_eof(txq, txlimit);
2515 VMXNET3_TXQ_UNLOCK(txq);
2516
2517 VMXNET3_RXQ_LOCK(rxq);
2518 rxmore = vmxnet3_rxq_eof(rxq, rxlimit);
2519 VMXNET3_RXQ_UNLOCK(rxq);
2520
2521 if (txmore || rxmore)
2522 vmxnet3_sched_handle_queue(sc, vmxq);
2523 else {
2524 if_schedule_deferred_start(&sc->vmx_ethercom.ec_if);
2525 vmxnet3_enable_all_intrs(sc);
2526 }
2527
2528 return (1);
2529 }
2530
2531 static int
2532 vmxnet3_txrxq_intr(void *xvmxq)
2533 {
2534 struct vmxnet3_softc *sc;
2535 struct vmxnet3_queue *vmxq;
2536 struct vmxnet3_txqueue *txq;
2537 struct vmxnet3_rxqueue *rxq;
2538 u_int txlimit, rxlimit;
2539 bool txmore, rxmore;
2540
2541 vmxq = xvmxq;
2542 txq = &vmxq->vxq_txqueue;
2543 rxq = &vmxq->vxq_rxqueue;
2544 sc = txq->vxtxq_sc;
2545 txlimit = sc->vmx_tx_intr_process_limit;
2546 rxlimit = sc->vmx_rx_intr_process_limit;
2547 vmxq->vxq_workqueue = sc->vmx_txrx_workqueue;
2548
2549 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
2550 vmxnet3_disable_intr(sc, vmxq->vxq_intr_idx);
2551
2552 VMXNET3_TXQ_LOCK(txq);
2553 txq->vxtxq_intr.ev_count++;
2554 txmore = vmxnet3_txq_eof(txq, txlimit);
2555 VMXNET3_TXQ_UNLOCK(txq);
2556
2557 VMXNET3_RXQ_LOCK(rxq);
2558 rxq->vxrxq_intr.ev_count++;
2559 rxmore = vmxnet3_rxq_eof(rxq, rxlimit);
2560 VMXNET3_RXQ_UNLOCK(rxq);
2561
2562 if (txmore || rxmore)
2563 vmxnet3_sched_handle_queue(sc, vmxq);
2564 else {
2565 /* for ALTQ */
2566 if (vmxq->vxq_id == 0)
2567 if_schedule_deferred_start(&sc->vmx_ethercom.ec_if);
2568 softint_schedule(txq->vxtxq_si);
2569
2570 vmxnet3_enable_intr(sc, vmxq->vxq_intr_idx);
2571 }
2572
2573 return (1);
2574 }
2575
2576 static void
2577 vmxnet3_handle_queue(void *xvmxq)
2578 {
2579 struct vmxnet3_softc *sc;
2580 struct vmxnet3_queue *vmxq;
2581 struct vmxnet3_txqueue *txq;
2582 struct vmxnet3_rxqueue *rxq;
2583 u_int txlimit, rxlimit;
2584 bool txmore, rxmore;
2585
2586 vmxq = xvmxq;
2587 txq = &vmxq->vxq_txqueue;
2588 rxq = &vmxq->vxq_rxqueue;
2589 sc = txq->vxtxq_sc;
2590 txlimit = sc->vmx_tx_process_limit;
2591 rxlimit = sc->vmx_rx_process_limit;
2592
2593 VMXNET3_TXQ_LOCK(txq);
2594 txq->vxtxq_defer.ev_count++;
2595 txmore = vmxnet3_txq_eof(txq, txlimit);
2596 if (txmore)
2597 txq->vxtxq_deferreq.ev_count++;
2598 /* for ALTQ */
2599 if (vmxq->vxq_id == 0)
2600 if_schedule_deferred_start(&sc->vmx_ethercom.ec_if);
2601 softint_schedule(txq->vxtxq_si);
2602 VMXNET3_TXQ_UNLOCK(txq);
2603
2604 VMXNET3_RXQ_LOCK(rxq);
2605 rxq->vxrxq_defer.ev_count++;
2606 rxmore = vmxnet3_rxq_eof(rxq, rxlimit);
2607 if (rxmore)
2608 rxq->vxrxq_deferreq.ev_count++;
2609 VMXNET3_RXQ_UNLOCK(rxq);
2610
2611 if (txmore || rxmore)
2612 vmxnet3_sched_handle_queue(sc, vmxq);
2613 else
2614 vmxnet3_enable_intr(sc, vmxq->vxq_intr_idx);
2615 }
2616
2617 static void
2618 vmxnet3_handle_queue_work(struct work *wk, void *context)
2619 {
2620 struct vmxnet3_queue *vmxq;
2621
2622 vmxq = container_of(wk, struct vmxnet3_queue, vxq_wq_cookie);
2623 vmxq->vxq_wq_enqueued = false;
2624 vmxnet3_handle_queue(vmxq);
2625 }
2626
2627 static int
2628 vmxnet3_event_intr(void *xsc)
2629 {
2630 struct vmxnet3_softc *sc;
2631
2632 sc = xsc;
2633
2634 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE)
2635 vmxnet3_disable_intr(sc, sc->vmx_event_intr_idx);
2636
2637 sc->vmx_event_intr.ev_count++;
2638
2639 if (sc->vmx_ds->event != 0)
2640 vmxnet3_evintr(sc);
2641
2642 vmxnet3_enable_intr(sc, sc->vmx_event_intr_idx);
2643
2644 return (1);
2645 }
2646
2647 static void
2648 vmxnet3_txstop(struct vmxnet3_softc *sc, struct vmxnet3_txqueue *txq)
2649 {
2650 struct vmxnet3_txring *txr;
2651 struct vmxnet3_txbuf *txb;
2652 u_int i;
2653
2654 txr = &txq->vxtxq_cmd_ring;
2655
2656 for (i = 0; i < txr->vxtxr_ndesc; i++) {
2657 txb = &txr->vxtxr_txbuf[i];
2658
2659 if (txb->vtxb_m == NULL)
2660 continue;
2661
2662 bus_dmamap_sync(sc->vmx_dmat, txb->vtxb_dmamap,
2663 0, txb->vtxb_dmamap->dm_mapsize,
2664 BUS_DMASYNC_POSTWRITE);
2665 bus_dmamap_unload(sc->vmx_dmat, txb->vtxb_dmamap);
2666 m_freem(txb->vtxb_m);
2667 txb->vtxb_m = NULL;
2668 }
2669 }
2670
2671 static void
2672 vmxnet3_rxstop(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq)
2673 {
2674 struct vmxnet3_rxring *rxr;
2675 struct vmxnet3_rxbuf *rxb;
2676 u_int i, j;
2677
2678 if (rxq->vxrxq_mhead != NULL) {
2679 m_freem(rxq->vxrxq_mhead);
2680 rxq->vxrxq_mhead = NULL;
2681 rxq->vxrxq_mtail = NULL;
2682 }
2683
2684 for (i = 0; i < VMXNET3_RXRINGS_PERQ; i++) {
2685 rxr = &rxq->vxrxq_cmd_ring[i];
2686
2687 for (j = 0; j < rxr->vxrxr_ndesc; j++) {
2688 rxb = &rxr->vxrxr_rxbuf[j];
2689
2690 if (rxb->vrxb_m == NULL)
2691 continue;
2692
2693 bus_dmamap_sync(sc->vmx_dmat, rxb->vrxb_dmamap,
2694 0, rxb->vrxb_dmamap->dm_mapsize,
2695 BUS_DMASYNC_POSTREAD);
2696 bus_dmamap_unload(sc->vmx_dmat, rxb->vrxb_dmamap);
2697 m_freem(rxb->vrxb_m);
2698 rxb->vrxb_m = NULL;
2699 }
2700 }
2701 }
2702
2703 static void
2704 vmxnet3_stop_rendezvous(struct vmxnet3_softc *sc)
2705 {
2706 struct vmxnet3_rxqueue *rxq;
2707 struct vmxnet3_txqueue *txq;
2708 struct vmxnet3_queue *vmxq;
2709 int i;
2710
2711 for (i = 0; i < sc->vmx_nrxqueues; i++) {
2712 rxq = &sc->vmx_queue[i].vxq_rxqueue;
2713 VMXNET3_RXQ_LOCK(rxq);
2714 VMXNET3_RXQ_UNLOCK(rxq);
2715 }
2716 for (i = 0; i < sc->vmx_ntxqueues; i++) {
2717 txq = &sc->vmx_queue[i].vxq_txqueue;
2718 VMXNET3_TXQ_LOCK(txq);
2719 VMXNET3_TXQ_UNLOCK(txq);
2720 }
2721 for (i = 0; i < sc->vmx_nrxqueues; i++) {
2722 vmxq = &sc->vmx_queue[i];
2723 workqueue_wait(sc->vmx_queue_wq, &vmxq->vxq_wq_cookie);
2724 }
2725 }
2726
2727 static void
2728 vmxnet3_stop_locked(struct vmxnet3_softc *sc)
2729 {
2730 struct ifnet *ifp;
2731 int q;
2732
2733 ifp = &sc->vmx_ethercom.ec_if;
2734 VMXNET3_CORE_LOCK_ASSERT(sc);
2735
2736 ifp->if_flags &= ~IFF_RUNNING;
2737 sc->vmx_link_active = 0;
2738 callout_stop(&sc->vmx_tick);
2739
2740 /* Disable interrupts. */
2741 vmxnet3_disable_all_intrs(sc);
2742 vmxnet3_write_cmd(sc, VMXNET3_CMD_DISABLE);
2743
2744 vmxnet3_stop_rendezvous(sc);
2745
2746 for (q = 0; q < sc->vmx_ntxqueues; q++)
2747 vmxnet3_txstop(sc, &sc->vmx_queue[q].vxq_txqueue);
2748 for (q = 0; q < sc->vmx_nrxqueues; q++)
2749 vmxnet3_rxstop(sc, &sc->vmx_queue[q].vxq_rxqueue);
2750
2751 vmxnet3_write_cmd(sc, VMXNET3_CMD_RESET);
2752 }
2753
2754 static void
2755 vmxnet3_stop(struct ifnet *ifp, int disable)
2756 {
2757 struct vmxnet3_softc *sc = ifp->if_softc;
2758
2759 VMXNET3_CORE_LOCK(sc);
2760 vmxnet3_stop_locked(sc);
2761 VMXNET3_CORE_UNLOCK(sc);
2762 }
2763
2764 static void
2765 vmxnet3_txinit(struct vmxnet3_softc *sc, struct vmxnet3_txqueue *txq)
2766 {
2767 struct vmxnet3_txring *txr;
2768 struct vmxnet3_comp_ring *txc;
2769
2770 txr = &txq->vxtxq_cmd_ring;
2771 txr->vxtxr_head = 0;
2772 txr->vxtxr_next = 0;
2773 txr->vxtxr_gen = VMXNET3_INIT_GEN;
2774 memset(txr->vxtxr_txd, 0,
2775 txr->vxtxr_ndesc * sizeof(struct vmxnet3_txdesc));
2776
2777 txc = &txq->vxtxq_comp_ring;
2778 txc->vxcr_next = 0;
2779 txc->vxcr_gen = VMXNET3_INIT_GEN;
2780 memset(txc->vxcr_u.txcd, 0,
2781 txc->vxcr_ndesc * sizeof(struct vmxnet3_txcompdesc));
2782 }
2783
2784 static int
2785 vmxnet3_rxinit(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq)
2786 {
2787 struct vmxnet3_rxring *rxr;
2788 struct vmxnet3_comp_ring *rxc;
2789 u_int i, populate, idx;
2790 int error;
2791
2792 /* LRO and jumbo frame is not supported yet */
2793 populate = 1;
2794
2795 for (i = 0; i < populate; i++) {
2796 rxr = &rxq->vxrxq_cmd_ring[i];
2797 rxr->vxrxr_fill = 0;
2798 rxr->vxrxr_gen = VMXNET3_INIT_GEN;
2799 memset(rxr->vxrxr_rxd, 0,
2800 rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc));
2801
2802 for (idx = 0; idx < rxr->vxrxr_ndesc; idx++) {
2803 error = vmxnet3_newbuf(sc, rxq, rxr);
2804 if (error)
2805 return (error);
2806 }
2807 }
2808
2809 for (/**/; i < VMXNET3_RXRINGS_PERQ; i++) {
2810 rxr = &rxq->vxrxq_cmd_ring[i];
2811 rxr->vxrxr_fill = 0;
2812 rxr->vxrxr_gen = 0;
2813 memset(rxr->vxrxr_rxd, 0,
2814 rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc));
2815 }
2816
2817 rxc = &rxq->vxrxq_comp_ring;
2818 rxc->vxcr_next = 0;
2819 rxc->vxcr_gen = VMXNET3_INIT_GEN;
2820 memset(rxc->vxcr_u.rxcd, 0,
2821 rxc->vxcr_ndesc * sizeof(struct vmxnet3_rxcompdesc));
2822
2823 return (0);
2824 }
2825
2826 static int
2827 vmxnet3_reinit_queues(struct vmxnet3_softc *sc)
2828 {
2829 device_t dev;
2830 int q, error;
2831 dev = sc->vmx_dev;
2832
2833 for (q = 0; q < sc->vmx_ntxqueues; q++)
2834 vmxnet3_txinit(sc, &sc->vmx_queue[q].vxq_txqueue);
2835
2836 for (q = 0; q < sc->vmx_nrxqueues; q++) {
2837 error = vmxnet3_rxinit(sc, &sc->vmx_queue[q].vxq_rxqueue);
2838 if (error) {
2839 device_printf(dev, "cannot populate Rx queue %d\n", q);
2840 return (error);
2841 }
2842 }
2843
2844 return (0);
2845 }
2846
2847 static int
2848 vmxnet3_enable_device(struct vmxnet3_softc *sc)
2849 {
2850 int q;
2851
2852 if (vmxnet3_read_cmd(sc, VMXNET3_CMD_ENABLE) != 0) {
2853 device_printf(sc->vmx_dev, "device enable command failed!\n");
2854 return (1);
2855 }
2856
2857 /* Reset the Rx queue heads. */
2858 for (q = 0; q < sc->vmx_nrxqueues; q++) {
2859 vmxnet3_write_bar0(sc, VMXNET3_BAR0_RXH1(q), 0);
2860 vmxnet3_write_bar0(sc, VMXNET3_BAR0_RXH2(q), 0);
2861 }
2862
2863 return (0);
2864 }
2865
2866 static void
2867 vmxnet3_reinit_rxfilters(struct vmxnet3_softc *sc)
2868 {
2869
2870 vmxnet3_set_rxfilter(sc);
2871
2872 memset(sc->vmx_ds->vlan_filter, 0, sizeof(sc->vmx_ds->vlan_filter));
2873 vmxnet3_write_cmd(sc, VMXNET3_CMD_VLAN_FILTER);
2874 }
2875
2876 static int
2877 vmxnet3_reinit(struct vmxnet3_softc *sc)
2878 {
2879
2880 vmxnet3_set_lladdr(sc);
2881 vmxnet3_reinit_shared_data(sc);
2882
2883 if (vmxnet3_reinit_queues(sc) != 0)
2884 return (ENXIO);
2885
2886 if (vmxnet3_enable_device(sc) != 0)
2887 return (ENXIO);
2888
2889 vmxnet3_reinit_rxfilters(sc);
2890
2891 return (0);
2892 }
2893
2894 static int
2895 vmxnet3_init_locked(struct vmxnet3_softc *sc)
2896 {
2897 struct ifnet *ifp = &sc->vmx_ethercom.ec_if;
2898 int error;
2899
2900 vmxnet3_stop_locked(sc);
2901
2902 error = vmxnet3_reinit(sc);
2903 if (error) {
2904 vmxnet3_stop_locked(sc);
2905 return (error);
2906 }
2907
2908 ifp->if_flags |= IFF_RUNNING;
2909 vmxnet3_if_link_status(sc);
2910
2911 vmxnet3_enable_all_intrs(sc);
2912 callout_reset(&sc->vmx_tick, hz, vmxnet3_tick, sc);
2913
2914 return (0);
2915 }
2916
2917 static int
2918 vmxnet3_init(struct ifnet *ifp)
2919 {
2920 struct vmxnet3_softc *sc = ifp->if_softc;
2921 int error;
2922
2923 VMXNET3_CORE_LOCK(sc);
2924 error = vmxnet3_init_locked(sc);
2925 VMXNET3_CORE_UNLOCK(sc);
2926
2927 return (error);
2928 }
2929
2930 static int
2931 vmxnet3_txq_offload_ctx(struct vmxnet3_txqueue *txq, struct mbuf *m,
2932 int *start, int *csum_start)
2933 {
2934 struct ether_header *eh;
2935 struct mbuf *mp;
2936 int offset, csum_off, iphl, offp;
2937 bool v4;
2938
2939 eh = mtod(m, struct ether_header *);
2940 switch (htons(eh->ether_type)) {
2941 case ETHERTYPE_IP:
2942 case ETHERTYPE_IPV6:
2943 offset = ETHER_HDR_LEN;
2944 break;
2945 case ETHERTYPE_VLAN:
2946 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
2947 break;
2948 default:
2949 m_freem(m);
2950 return (EINVAL);
2951 }
2952
2953 if ((m->m_pkthdr.csum_flags &
2954 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4)) != 0) {
2955 iphl = M_CSUM_DATA_IPv4_IPHL(m->m_pkthdr.csum_data);
2956 v4 = true;
2957 } else {
2958 iphl = M_CSUM_DATA_IPv6_IPHL(m->m_pkthdr.csum_data);
2959 v4 = false;
2960 }
2961 *start = offset + iphl;
2962
2963 if (m->m_pkthdr.csum_flags &
2964 (M_CSUM_TCPv4 | M_CSUM_TCPv6 | M_CSUM_TSOv4 | M_CSUM_TSOv6)) {
2965 csum_off = offsetof(struct tcphdr, th_sum);
2966 } else {
2967 csum_off = offsetof(struct udphdr, uh_sum);
2968 }
2969
2970 *csum_start = *start + csum_off;
2971 mp = m_pulldown(m, 0, *csum_start + 2, &offp);
2972 if (!mp) {
2973 /* m is already freed */
2974 return ENOBUFS;
2975 }
2976
2977 if (m->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) {
2978 struct tcphdr *tcp;
2979
2980 txq->vxtxq_stats.vmtxs_tso++;
2981 tcp = (void *)(mtod(mp, char *) + offp + *start);
2982
2983 if (v4) {
2984 struct ip *ip;
2985
2986 ip = (void *)(mtod(mp, char *) + offp + offset);
2987 tcp->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
2988 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
2989 } else {
2990 struct ip6_hdr *ip6;
2991
2992 ip6 = (void *)(mtod(mp, char *) + offp + offset);
2993 tcp->th_sum = in6_cksum_phdr(&ip6->ip6_src,
2994 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
2995 }
2996
2997 /*
2998 * For TSO, the size of the protocol header is also
2999 * included in the descriptor header size.
3000 */
3001 *start += (tcp->th_off << 2);
3002 } else
3003 txq->vxtxq_stats.vmtxs_csum++;
3004
3005 return (0);
3006 }
3007
3008 static int
3009 vmxnet3_txq_load_mbuf(struct vmxnet3_txqueue *txq, struct mbuf **m0,
3010 bus_dmamap_t dmap)
3011 {
3012 struct mbuf *m;
3013 bus_dma_tag_t tag;
3014 int error;
3015
3016 m = *m0;
3017 tag = txq->vxtxq_sc->vmx_dmat;
3018
3019 error = bus_dmamap_load_mbuf(tag, dmap, m, BUS_DMA_NOWAIT);
3020 if (error == 0 || error != EFBIG)
3021 return (error);
3022
3023 m = m_defrag(m, M_NOWAIT);
3024 if (m != NULL) {
3025 *m0 = m;
3026 error = bus_dmamap_load_mbuf(tag, dmap, m, BUS_DMA_NOWAIT);
3027 } else
3028 error = ENOBUFS;
3029
3030 if (error) {
3031 m_freem(*m0);
3032 *m0 = NULL;
3033 txq->vxtxq_defrag_failed.ev_count++;
3034 } else
3035 txq->vxtxq_defragged.ev_count++;
3036
3037 return (error);
3038 }
3039
3040 static void
3041 vmxnet3_txq_unload_mbuf(struct vmxnet3_txqueue *txq, bus_dmamap_t dmap)
3042 {
3043
3044 bus_dmamap_unload(txq->vxtxq_sc->vmx_dmat, dmap);
3045 }
3046
3047 static int
3048 vmxnet3_txq_encap(struct vmxnet3_txqueue *txq, struct mbuf **m0)
3049 {
3050 struct vmxnet3_softc *sc;
3051 struct vmxnet3_txring *txr;
3052 struct vmxnet3_txdesc *txd, *sop;
3053 struct mbuf *m;
3054 bus_dmamap_t dmap;
3055 bus_dma_segment_t *segs;
3056 int i, gen, start, csum_start, nsegs, error;
3057
3058 sc = txq->vxtxq_sc;
3059 start = 0;
3060 txd = NULL;
3061 txr = &txq->vxtxq_cmd_ring;
3062 dmap = txr->vxtxr_txbuf[txr->vxtxr_head].vtxb_dmamap;
3063 csum_start = 0; /* GCC */
3064
3065 error = vmxnet3_txq_load_mbuf(txq, m0, dmap);
3066 if (error)
3067 return (error);
3068
3069 nsegs = dmap->dm_nsegs;
3070 segs = dmap->dm_segs;
3071
3072 m = *m0;
3073 KASSERT(m->m_flags & M_PKTHDR);
3074 KASSERT(nsegs <= VMXNET3_TX_MAXSEGS);
3075
3076 if (vmxnet3_txring_avail(txr) < nsegs) {
3077 txq->vxtxq_stats.vmtxs_full++;
3078 vmxnet3_txq_unload_mbuf(txq, dmap);
3079 return (ENOSPC);
3080 } else if (m->m_pkthdr.csum_flags & VMXNET3_CSUM_ALL_OFFLOAD) {
3081 error = vmxnet3_txq_offload_ctx(txq, m, &start, &csum_start);
3082 if (error) {
3083 /* m is already freed */
3084 txq->vxtxq_stats.vmtxs_offload_failed++;
3085 vmxnet3_txq_unload_mbuf(txq, dmap);
3086 *m0 = NULL;
3087 return (error);
3088 }
3089 }
3090
3091 txr->vxtxr_txbuf[txr->vxtxr_head].vtxb_m = m;
3092 sop = &txr->vxtxr_txd[txr->vxtxr_head];
3093 gen = txr->vxtxr_gen ^ 1; /* Owned by cpu (yet) */
3094
3095 for (i = 0; i < nsegs; i++) {
3096 txd = &txr->vxtxr_txd[txr->vxtxr_head];
3097
3098 txd->addr = segs[i].ds_addr;
3099 txd->len = segs[i].ds_len;
3100 txd->gen = gen;
3101 txd->dtype = 0;
3102 txd->offload_mode = VMXNET3_OM_NONE;
3103 txd->offload_pos = 0;
3104 txd->hlen = 0;
3105 txd->eop = 0;
3106 txd->compreq = 0;
3107 txd->vtag_mode = 0;
3108 txd->vtag = 0;
3109
3110 if (++txr->vxtxr_head == txr->vxtxr_ndesc) {
3111 txr->vxtxr_head = 0;
3112 txr->vxtxr_gen ^= 1;
3113 }
3114 gen = txr->vxtxr_gen;
3115 }
3116 txd->eop = 1;
3117 txd->compreq = 1;
3118
3119 if (vlan_has_tag(m)) {
3120 sop->vtag_mode = 1;
3121 sop->vtag = vlan_get_tag(m);
3122 }
3123
3124 if (m->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) {
3125 sop->offload_mode = VMXNET3_OM_TSO;
3126 sop->hlen = start;
3127 sop->offload_pos = m->m_pkthdr.segsz;
3128 } else if (m->m_pkthdr.csum_flags & (VMXNET3_CSUM_OFFLOAD |
3129 VMXNET3_CSUM_OFFLOAD_IPV6)) {
3130 sop->offload_mode = VMXNET3_OM_CSUM;
3131 sop->hlen = start;
3132 sop->offload_pos = csum_start;
3133 }
3134
3135 /* Finally, change the ownership. */
3136 vmxnet3_barrier(sc, VMXNET3_BARRIER_WR);
3137 sop->gen ^= 1;
3138
3139 txq->vxtxq_ts->npending += nsegs;
3140 if (txq->vxtxq_ts->npending >= txq->vxtxq_ts->intr_threshold) {
3141 struct vmxnet3_queue *vmxq;
3142 vmxq = container_of(txq, struct vmxnet3_queue, vxq_txqueue);
3143 txq->vxtxq_ts->npending = 0;
3144 vmxnet3_write_bar0(sc, VMXNET3_BAR0_TXH(vmxq->vxq_id),
3145 txr->vxtxr_head);
3146 }
3147
3148 return (0);
3149 }
3150
3151 #define VMXNET3_TX_START 1
3152 #define VMXNET3_TX_TRANSMIT 2
3153 static inline void
3154 vmxnet3_tx_common_locked(struct ifnet *ifp, struct vmxnet3_txqueue *txq, int txtype)
3155 {
3156 struct vmxnet3_softc *sc;
3157 struct vmxnet3_txring *txr;
3158 struct mbuf *m_head;
3159 int tx;
3160
3161 sc = ifp->if_softc;
3162 txr = &txq->vxtxq_cmd_ring;
3163 tx = 0;
3164
3165 VMXNET3_TXQ_LOCK_ASSERT(txq);
3166
3167 if ((ifp->if_flags & IFF_RUNNING) == 0 ||
3168 sc->vmx_link_active == 0)
3169 return;
3170
3171 for (;;) {
3172 if (txtype == VMXNET3_TX_START)
3173 IFQ_POLL(&ifp->if_snd, m_head);
3174 else
3175 m_head = pcq_peek(txq->vxtxq_interq);
3176 if (m_head == NULL)
3177 break;
3178
3179 if (vmxnet3_txring_avail(txr) < VMXNET3_TX_MAXSEGS)
3180 break;
3181
3182 if (txtype == VMXNET3_TX_START)
3183 IFQ_DEQUEUE(&ifp->if_snd, m_head);
3184 else
3185 m_head = pcq_get(txq->vxtxq_interq);
3186 if (m_head == NULL)
3187 break;
3188
3189 if (vmxnet3_txq_encap(txq, &m_head) != 0) {
3190 if (m_head != NULL)
3191 m_freem(m_head);
3192 break;
3193 }
3194
3195 tx++;
3196 bpf_mtap(ifp, m_head, BPF_D_OUT);
3197 }
3198
3199 if (tx > 0)
3200 txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT;
3201 }
3202
3203 static void
3204 vmxnet3_start_locked(struct ifnet *ifp)
3205 {
3206 struct vmxnet3_softc *sc;
3207 struct vmxnet3_txqueue *txq;
3208
3209 sc = ifp->if_softc;
3210 txq = &sc->vmx_queue[0].vxq_txqueue;
3211
3212 vmxnet3_tx_common_locked(ifp, txq, VMXNET3_TX_START);
3213 }
3214
3215 void
3216 vmxnet3_start(struct ifnet *ifp)
3217 {
3218 struct vmxnet3_softc *sc;
3219 struct vmxnet3_txqueue *txq;
3220
3221 sc = ifp->if_softc;
3222 txq = &sc->vmx_queue[0].vxq_txqueue;
3223
3224 VMXNET3_TXQ_LOCK(txq);
3225 vmxnet3_start_locked(ifp);
3226 VMXNET3_TXQ_UNLOCK(txq);
3227 }
3228
3229 static int
3230 vmxnet3_select_txqueue(struct ifnet *ifp, struct mbuf *m __unused)
3231 {
3232 struct vmxnet3_softc *sc;
3233 u_int cpuid;
3234
3235 sc = ifp->if_softc;
3236 cpuid = cpu_index(curcpu());
3237 /*
3238 * Furure work
3239 * We should select txqueue to even up the load even if ncpu is
3240 * different from sc->vmx_ntxqueues. Currently, the load is not
3241 * even, that is, when ncpu is six and ntxqueues is four, the load
3242 * of vmx_queue[0] and vmx_queue[1] is higher than vmx_queue[2] and
3243 * vmx_queue[3] because CPU#4 always uses vmx_queue[0] and CPU#5 always
3244 * uses vmx_queue[1].
3245 * Furthermore, we should not use random value to select txqueue to
3246 * avoid reordering. We should use flow information of mbuf.
3247 */
3248 return cpuid % sc->vmx_ntxqueues;
3249 }
3250
3251 static void
3252 vmxnet3_transmit_locked(struct ifnet *ifp, struct vmxnet3_txqueue *txq)
3253 {
3254
3255 vmxnet3_tx_common_locked(ifp, txq, VMXNET3_TX_TRANSMIT);
3256 }
3257
3258 static int
3259 vmxnet3_transmit(struct ifnet *ifp, struct mbuf *m)
3260 {
3261 struct vmxnet3_softc *sc;
3262 struct vmxnet3_txqueue *txq;
3263 int qid;
3264
3265 qid = vmxnet3_select_txqueue(ifp, m);
3266 sc = ifp->if_softc;
3267 txq = &sc->vmx_queue[qid].vxq_txqueue;
3268
3269 if (__predict_false(!pcq_put(txq->vxtxq_interq, m))) {
3270 VMXNET3_TXQ_LOCK(txq);
3271 txq->vxtxq_pcqdrop.ev_count++;
3272 VMXNET3_TXQ_UNLOCK(txq);
3273 m_freem(m);
3274 return ENOBUFS;
3275 }
3276
3277 #ifdef VMXNET3_ALWAYS_TXDEFER
3278 kpreempt_disable();
3279 softint_schedule(txq->vxtxq_si);
3280 kpreempt_enable();
3281 #else
3282 if (VMXNET3_TXQ_TRYLOCK(txq)) {
3283 vmxnet3_transmit_locked(ifp, txq);
3284 VMXNET3_TXQ_UNLOCK(txq);
3285 } else {
3286 kpreempt_disable();
3287 softint_schedule(txq->vxtxq_si);
3288 kpreempt_enable();
3289 }
3290 #endif
3291
3292 return 0;
3293 }
3294
3295 static void
3296 vmxnet3_deferred_transmit(void *arg)
3297 {
3298 struct vmxnet3_txqueue *txq = arg;
3299 struct vmxnet3_softc *sc = txq->vxtxq_sc;
3300 struct ifnet *ifp = &sc->vmx_ethercom.ec_if;
3301
3302 VMXNET3_TXQ_LOCK(txq);
3303 txq->vxtxq_transmitdef.ev_count++;
3304 if (pcq_peek(txq->vxtxq_interq) != NULL)
3305 vmxnet3_transmit_locked(ifp, txq);
3306 VMXNET3_TXQ_UNLOCK(txq);
3307 }
3308
3309 static void
3310 vmxnet3_set_rxfilter(struct vmxnet3_softc *sc)
3311 {
3312 struct ifnet *ifp = &sc->vmx_ethercom.ec_if;
3313 struct ethercom *ec = &sc->vmx_ethercom;
3314 struct vmxnet3_driver_shared *ds = sc->vmx_ds;
3315 struct ether_multi *enm;
3316 struct ether_multistep step;
3317 u_int mode;
3318 uint8_t *p;
3319
3320 ds->mcast_tablelen = 0;
3321 ETHER_LOCK(ec);
3322 CLR(ec->ec_flags, ETHER_F_ALLMULTI);
3323 ETHER_UNLOCK(ec);
3324
3325 /*
3326 * Always accept broadcast frames.
3327 * Always accept frames destined to our station address.
3328 */
3329 mode = VMXNET3_RXMODE_BCAST | VMXNET3_RXMODE_UCAST;
3330
3331 ETHER_LOCK(ec);
3332 if (ISSET(ifp->if_flags, IFF_PROMISC) ||
3333 ec->ec_multicnt > VMXNET3_MULTICAST_MAX)
3334 goto allmulti;
3335
3336 p = sc->vmx_mcast;
3337 ETHER_FIRST_MULTI(step, ec, enm);
3338 while (enm != NULL) {
3339 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3340 /*
3341 * We must listen to a range of multicast addresses.
3342 * For now, just accept all multicasts, rather than
3343 * trying to set only those filter bits needed to match
3344 * the range. (At this time, the only use of address
3345 * ranges is for IP multicast routing, for which the
3346 * range is big enough to require all bits set.)
3347 */
3348 goto allmulti;
3349 }
3350 memcpy(p, enm->enm_addrlo, ETHER_ADDR_LEN);
3351
3352 p += ETHER_ADDR_LEN;
3353
3354 ETHER_NEXT_MULTI(step, enm);
3355 }
3356
3357 if (ec->ec_multicnt > 0) {
3358 SET(mode, VMXNET3_RXMODE_MCAST);
3359 ds->mcast_tablelen = p - sc->vmx_mcast;
3360 }
3361 ETHER_UNLOCK(ec);
3362
3363 goto setit;
3364
3365 allmulti:
3366 SET(ec->ec_flags, ETHER_F_ALLMULTI);
3367 ETHER_UNLOCK(ec);
3368 SET(mode, (VMXNET3_RXMODE_ALLMULTI | VMXNET3_RXMODE_MCAST));
3369 if (ifp->if_flags & IFF_PROMISC)
3370 SET(mode, VMXNET3_RXMODE_PROMISC);
3371
3372 setit:
3373 vmxnet3_write_cmd(sc, VMXNET3_CMD_SET_FILTER);
3374 ds->rxmode = mode;
3375 vmxnet3_write_cmd(sc, VMXNET3_CMD_SET_RXMODE);
3376 }
3377
3378 static int
3379 vmxnet3_ioctl(struct ifnet *ifp, u_long cmd, void *data)
3380 {
3381 struct vmxnet3_softc *sc = ifp->if_softc;
3382 struct ifreq *ifr = (struct ifreq *)data;
3383 int s, error = 0;
3384
3385 switch (cmd) {
3386 case SIOCSIFMTU: {
3387 int nmtu = ifr->ifr_mtu;
3388
3389 if (nmtu < VMXNET3_MIN_MTU || nmtu > VMXNET3_MAX_MTU) {
3390 error = EINVAL;
3391 break;
3392 }
3393 if (ifp->if_mtu != (uint64_t)nmtu) {
3394 s = splnet();
3395 error = ether_ioctl(ifp, cmd, data);
3396 splx(s);
3397 if (error == ENETRESET)
3398 error = vmxnet3_init(ifp);
3399 }
3400 break;
3401 }
3402
3403 default:
3404 s = splnet();
3405 error = ether_ioctl(ifp, cmd, data);
3406 splx(s);
3407 }
3408
3409 if (error == ENETRESET) {
3410 VMXNET3_CORE_LOCK(sc);
3411 if (ifp->if_flags & IFF_RUNNING)
3412 vmxnet3_set_rxfilter(sc);
3413 VMXNET3_CORE_UNLOCK(sc);
3414 error = 0;
3415 }
3416
3417 return error;
3418 }
3419
3420 static int
3421 vmxnet3_ifflags_cb(struct ethercom *ec)
3422 {
3423 struct vmxnet3_softc *sc;
3424
3425 sc = ec->ec_if.if_softc;
3426
3427 VMXNET3_CORE_LOCK(sc);
3428 vmxnet3_set_rxfilter(sc);
3429 VMXNET3_CORE_UNLOCK(sc);
3430
3431 vmxnet3_if_link_status(sc);
3432
3433 return 0;
3434 }
3435
3436 static int
3437 vmxnet3_watchdog(struct vmxnet3_txqueue *txq)
3438 {
3439 struct vmxnet3_softc *sc;
3440 struct vmxnet3_queue *vmxq;
3441
3442 sc = txq->vxtxq_sc;
3443 vmxq = container_of(txq, struct vmxnet3_queue, vxq_txqueue);
3444
3445 VMXNET3_TXQ_LOCK(txq);
3446 if (txq->vxtxq_watchdog == 0 || --txq->vxtxq_watchdog) {
3447 VMXNET3_TXQ_UNLOCK(txq);
3448 return (0);
3449 }
3450 txq->vxtxq_watchdogto.ev_count++;
3451 VMXNET3_TXQ_UNLOCK(txq);
3452
3453 device_printf(sc->vmx_dev, "watchdog timeout on queue %d\n",
3454 vmxq->vxq_id);
3455 return (1);
3456 }
3457
3458 static void
3459 vmxnet3_refresh_host_stats(struct vmxnet3_softc *sc)
3460 {
3461
3462 vmxnet3_write_cmd(sc, VMXNET3_CMD_GET_STATS);
3463 }
3464
3465 static void
3466 vmxnet3_tick(void *xsc)
3467 {
3468 struct vmxnet3_softc *sc;
3469 int i, timedout;
3470
3471 sc = xsc;
3472 timedout = 0;
3473
3474 VMXNET3_CORE_LOCK(sc);
3475
3476 vmxnet3_refresh_host_stats(sc);
3477
3478 for (i = 0; i < sc->vmx_ntxqueues; i++)
3479 timedout |= vmxnet3_watchdog(&sc->vmx_queue[i].vxq_txqueue);
3480
3481 if (timedout != 0)
3482 vmxnet3_init_locked(sc);
3483 else
3484 callout_reset(&sc->vmx_tick, hz, vmxnet3_tick, sc);
3485
3486 VMXNET3_CORE_UNLOCK(sc);
3487 }
3488
3489 /*
3490 * update link state of ifnet and softc
3491 */
3492 static void
3493 vmxnet3_if_link_status(struct vmxnet3_softc *sc)
3494 {
3495 struct ifnet *ifp = &sc->vmx_ethercom.ec_if;
3496 u_int link;
3497 bool up;
3498
3499 up = vmxnet3_cmd_link_status(ifp);
3500 if (up) {
3501 sc->vmx_link_active = 1;
3502 link = LINK_STATE_UP;
3503 } else {
3504 sc->vmx_link_active = 0;
3505 link = LINK_STATE_DOWN;
3506 }
3507
3508 if_link_state_change(ifp, link);
3509 }
3510
3511 /*
3512 * check vmx(4) state by VMXNET3_CMD and update ifp->if_baudrate
3513 * returns
3514 * - true: link up
3515 * - flase: link down
3516 */
3517 static bool
3518 vmxnet3_cmd_link_status(struct ifnet *ifp)
3519 {
3520 struct vmxnet3_softc *sc = ifp->if_softc;
3521 u_int x, speed;
3522
3523 x = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_LINK);
3524 if ((x & 1) == 0)
3525 return false;
3526
3527 speed = x >> 16;
3528 ifp->if_baudrate = IF_Mbps(speed);
3529 return true;
3530 }
3531
3532 static void
3533 vmxnet3_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
3534 {
3535 bool up;
3536
3537 ifmr->ifm_status = IFM_AVALID;
3538 ifmr->ifm_active = IFM_ETHER;
3539
3540 up = vmxnet3_cmd_link_status(ifp);
3541 if (!up)
3542 return;
3543
3544 ifmr->ifm_status |= IFM_ACTIVE;
3545
3546 if (ifp->if_baudrate >= IF_Gbps(10ULL))
3547 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
3548 }
3549
3550 static int
3551 vmxnet3_ifmedia_change(struct ifnet *ifp)
3552 {
3553 return 0;
3554 }
3555
3556 static void
3557 vmxnet3_set_lladdr(struct vmxnet3_softc *sc)
3558 {
3559 uint32_t ml, mh;
3560
3561 ml = sc->vmx_lladdr[0];
3562 ml |= sc->vmx_lladdr[1] << 8;
3563 ml |= sc->vmx_lladdr[2] << 16;
3564 ml |= sc->vmx_lladdr[3] << 24;
3565 vmxnet3_write_bar1(sc, VMXNET3_BAR1_MACL, ml);
3566
3567 mh = sc->vmx_lladdr[4];
3568 mh |= sc->vmx_lladdr[5] << 8;
3569 vmxnet3_write_bar1(sc, VMXNET3_BAR1_MACH, mh);
3570 }
3571
3572 static void
3573 vmxnet3_get_lladdr(struct vmxnet3_softc *sc)
3574 {
3575 uint32_t ml, mh;
3576
3577 ml = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_MACL);
3578 mh = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_MACH);
3579
3580 sc->vmx_lladdr[0] = ml;
3581 sc->vmx_lladdr[1] = ml >> 8;
3582 sc->vmx_lladdr[2] = ml >> 16;
3583 sc->vmx_lladdr[3] = ml >> 24;
3584 sc->vmx_lladdr[4] = mh;
3585 sc->vmx_lladdr[5] = mh >> 8;
3586 }
3587
3588 static void
3589 vmxnet3_enable_all_intrs(struct vmxnet3_softc *sc)
3590 {
3591 int i;
3592
3593 sc->vmx_ds->ictrl &= ~VMXNET3_ICTRL_DISABLE_ALL;
3594 for (i = 0; i < sc->vmx_nintrs; i++)
3595 vmxnet3_enable_intr(sc, i);
3596 }
3597
3598 static void
3599 vmxnet3_disable_all_intrs(struct vmxnet3_softc *sc)
3600 {
3601 int i;
3602
3603 sc->vmx_ds->ictrl |= VMXNET3_ICTRL_DISABLE_ALL;
3604 for (i = 0; i < sc->vmx_nintrs; i++)
3605 vmxnet3_disable_intr(sc, i);
3606 }
3607
3608 static int
3609 vmxnet3_dma_malloc(struct vmxnet3_softc *sc, bus_size_t size, bus_size_t align,
3610 struct vmxnet3_dma_alloc *dma)
3611 {
3612 bus_dma_tag_t t = sc->vmx_dmat;
3613 bus_dma_segment_t *segs = dma->dma_segs;
3614 int n, error;
3615
3616 memset(dma, 0, sizeof(*dma));
3617
3618 error = bus_dmamem_alloc(t, size, align, 0, segs, 1, &n, BUS_DMA_NOWAIT);
3619 if (error) {
3620 aprint_error_dev(sc->vmx_dev, "bus_dmamem_alloc failed: %d\n", error);
3621 goto fail1;
3622 }
3623 KASSERT(n == 1);
3624
3625 error = bus_dmamem_map(t, segs, 1, size, &dma->dma_vaddr, BUS_DMA_NOWAIT);
3626 if (error) {
3627 aprint_error_dev(sc->vmx_dev, "bus_dmamem_map failed: %d\n", error);
3628 goto fail2;
3629 }
3630
3631 error = bus_dmamap_create(t, size, 1, size, 0, BUS_DMA_NOWAIT, &dma->dma_map);
3632 if (error) {
3633 aprint_error_dev(sc->vmx_dev, "bus_dmamap_create failed: %d\n", error);
3634 goto fail3;
3635 }
3636
3637 error = bus_dmamap_load(t, dma->dma_map, dma->dma_vaddr, size, NULL,
3638 BUS_DMA_NOWAIT);
3639 if (error) {
3640 aprint_error_dev(sc->vmx_dev, "bus_dmamap_load failed: %d\n", error);
3641 goto fail4;
3642 }
3643
3644 memset(dma->dma_vaddr, 0, size);
3645 dma->dma_paddr = DMAADDR(dma->dma_map);
3646 dma->dma_size = size;
3647
3648 return (0);
3649 fail4:
3650 bus_dmamap_destroy(t, dma->dma_map);
3651 fail3:
3652 bus_dmamem_unmap(t, dma->dma_vaddr, size);
3653 fail2:
3654 bus_dmamem_free(t, segs, 1);
3655 fail1:
3656 return (error);
3657 }
3658
3659 static void
3660 vmxnet3_dma_free(struct vmxnet3_softc *sc, struct vmxnet3_dma_alloc *dma)
3661 {
3662 bus_dma_tag_t t = sc->vmx_dmat;
3663
3664 bus_dmamap_unload(t, dma->dma_map);
3665 bus_dmamap_destroy(t, dma->dma_map);
3666 bus_dmamem_unmap(t, dma->dma_vaddr, dma->dma_size);
3667 bus_dmamem_free(t, dma->dma_segs, 1);
3668
3669 memset(dma, 0, sizeof(*dma));
3670 }
3671
3672 MODULE(MODULE_CLASS_DRIVER, if_vmx, "pci");
3673
3674 #ifdef _MODULE
3675 #include "ioconf.c"
3676 #endif
3677
3678 static int
3679 if_vmx_modcmd(modcmd_t cmd, void *opaque)
3680 {
3681 int error = 0;
3682
3683 switch (cmd) {
3684 case MODULE_CMD_INIT:
3685 #ifdef _MODULE
3686 error = config_init_component(cfdriver_ioconf_if_vmx,
3687 cfattach_ioconf_if_vmx, cfdata_ioconf_if_vmx);
3688 #endif
3689 return error;
3690 case MODULE_CMD_FINI:
3691 #ifdef _MODULE
3692 error = config_fini_component(cfdriver_ioconf_if_vmx,
3693 cfattach_ioconf_if_vmx, cfdata_ioconf_if_vmx);
3694 #endif
3695 return error;
3696 default:
3697 return ENOTTY;
3698 }
3699 }
3700
3701