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