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