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