xref: /freebsd/sys/dev/ixgbe/if_ixv.c (revision 137a344c6341d1469432e9deb3a25593f96672ad)
1 /******************************************************************************
2 
3   Copyright (c) 2001-2017, Intel Corporation
4   All rights reserved.
5 
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8 
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11 
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15 
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19 
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31 
32 ******************************************************************************/
33 /*$FreeBSD$*/
34 
35 
36 #include "opt_inet.h"
37 #include "opt_inet6.h"
38 
39 #include "ixgbe.h"
40 #include "ifdi_if.h"
41 
42 #include <net/netmap.h>
43 #include <dev/netmap/netmap_kern.h>
44 
45 /************************************************************************
46  * Driver version
47  ************************************************************************/
48 char ixv_driver_version[] = "2.0.0-k";
49 
50 /************************************************************************
51  * PCI Device ID Table
52  *
53  *   Used by probe to select devices to load on
54  *   Last field stores an index into ixv_strings
55  *   Last entry must be all 0s
56  *
57  *   { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
58  ************************************************************************/
59 static pci_vendor_info_t ixv_vendor_info_array[] =
60 {
61 	PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, "Intel(R) PRO/10GbE Virtual Function Network Driver"),
62 	PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, "Intel(R) PRO/10GbE Virtual Function Network Driver"),
63 	PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, "Intel(R) PRO/10GbE Virtual Function Network Driver"),
64 	PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, "Intel(R) PRO/10GbE Virtual Function Network Driver"),
65 	PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_VF, "Intel(R) PRO/10GbE Virtual Function Network Driver"),
66 	/* required last entry */
67 PVID_END
68 };
69 
70 /************************************************************************
71  * Function prototypes
72  ************************************************************************/
73 static void     *ixv_register(device_t dev);
74 static int      ixv_if_attach_pre(if_ctx_t ctx);
75 static int      ixv_if_attach_post(if_ctx_t ctx);
76 static int      ixv_if_detach(if_ctx_t ctx);
77 
78 static int      ixv_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t qid);
79 static int      ixv_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nqs, int nqsets);
80 static int      ixv_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nqs, int nqsets);
81 static void     ixv_if_queues_free(if_ctx_t ctx);
82 static void     ixv_identify_hardware(if_ctx_t ctx);
83 static void     ixv_init_device_features(struct adapter *);
84 static int      ixv_allocate_pci_resources(if_ctx_t ctx);
85 static void     ixv_free_pci_resources(if_ctx_t ctx);
86 static int      ixv_setup_interface(if_ctx_t ctx);
87 static void     ixv_if_media_status(if_ctx_t , struct ifmediareq *);
88 static int      ixv_if_media_change(if_ctx_t ctx);
89 static void     ixv_if_update_admin_status(if_ctx_t ctx);
90 static int      ixv_if_msix_intr_assign(if_ctx_t ctx, int msix);
91 
92 static int      ixv_if_mtu_set(if_ctx_t ctx, uint32_t mtu);
93 static void     ixv_if_init(if_ctx_t ctx);
94 static void     ixv_if_local_timer(if_ctx_t ctx, uint16_t qid);
95 static void     ixv_if_stop(if_ctx_t ctx);
96 static int      ixv_negotiate_api(struct adapter *);
97 
98 static void     ixv_initialize_transmit_units(if_ctx_t ctx);
99 static void     ixv_initialize_receive_units(if_ctx_t ctx);
100 static void     ixv_initialize_rss_mapping(struct adapter *);
101 
102 static void     ixv_setup_vlan_support(if_ctx_t ctx);
103 static void     ixv_configure_ivars(struct adapter *);
104 static void     ixv_if_enable_intr(if_ctx_t ctx);
105 static void     ixv_if_disable_intr(if_ctx_t ctx);
106 static void     ixv_if_multi_set(if_ctx_t ctx);
107 
108 static void     ixv_if_register_vlan(if_ctx_t, u16);
109 static void     ixv_if_unregister_vlan(if_ctx_t, u16);
110 
111 static uint64_t ixv_if_get_counter(if_ctx_t, ift_counter);
112 
113 static void     ixv_save_stats(struct adapter *);
114 static void     ixv_init_stats(struct adapter *);
115 static void     ixv_update_stats(struct adapter *);
116 static void     ixv_add_stats_sysctls(struct adapter *adapter);
117 
118 static int      ixv_sysctl_debug(SYSCTL_HANDLER_ARGS);
119 static void     ixv_set_ivar(struct adapter *, u8, u8, s8);
120 
121 static u8       *ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
122 
123 /* The MSI-X Interrupt handlers */
124 static int      ixv_msix_que(void *);
125 static int      ixv_msix_mbx(void *);
126 
127 /************************************************************************
128  * FreeBSD Device Interface Entry Points
129  ************************************************************************/
130 static device_method_t ixv_methods[] = {
131 	/* Device interface */
132 	DEVMETHOD(device_register, ixv_register),
133 	DEVMETHOD(device_probe, iflib_device_probe),
134 	DEVMETHOD(device_attach, iflib_device_attach),
135 	DEVMETHOD(device_detach, iflib_device_detach),
136 	DEVMETHOD(device_shutdown, iflib_device_shutdown),
137 	DEVMETHOD_END
138 };
139 
140 static driver_t ixv_driver = {
141 	"ixv", ixv_methods, sizeof(struct adapter),
142 };
143 
144 devclass_t ixv_devclass;
145 DRIVER_MODULE(ixv, pci, ixv_driver, ixv_devclass, 0, 0);
146 MODULE_DEPEND(ixv, pci, 1, 1, 1);
147 MODULE_DEPEND(ixv, ether, 1, 1, 1);
148 #ifdef DEV_NETMAP
149 MODULE_DEPEND(ixv, netmap, 1, 1, 1);
150 #endif /* DEV_NETMAP */
151 
152 static device_method_t ixv_if_methods[] = {
153 	DEVMETHOD(ifdi_attach_pre, ixv_if_attach_pre),
154 	DEVMETHOD(ifdi_attach_post, ixv_if_attach_post),
155 	DEVMETHOD(ifdi_detach, ixv_if_detach),
156 	DEVMETHOD(ifdi_init, ixv_if_init),
157 	DEVMETHOD(ifdi_stop, ixv_if_stop),
158 	DEVMETHOD(ifdi_msix_intr_assign, ixv_if_msix_intr_assign),
159 	DEVMETHOD(ifdi_intr_enable, ixv_if_enable_intr),
160 	DEVMETHOD(ifdi_intr_disable, ixv_if_disable_intr),
161 	DEVMETHOD(ifdi_tx_queue_intr_enable, ixv_if_rx_queue_intr_enable),
162 	DEVMETHOD(ifdi_rx_queue_intr_enable, ixv_if_rx_queue_intr_enable),
163 	DEVMETHOD(ifdi_tx_queues_alloc, ixv_if_tx_queues_alloc),
164 	DEVMETHOD(ifdi_rx_queues_alloc, ixv_if_rx_queues_alloc),
165 	DEVMETHOD(ifdi_queues_free, ixv_if_queues_free),
166 	DEVMETHOD(ifdi_update_admin_status, ixv_if_update_admin_status),
167 	DEVMETHOD(ifdi_multi_set, ixv_if_multi_set),
168 	DEVMETHOD(ifdi_mtu_set, ixv_if_mtu_set),
169 	DEVMETHOD(ifdi_media_status, ixv_if_media_status),
170 	DEVMETHOD(ifdi_media_change, ixv_if_media_change),
171 	DEVMETHOD(ifdi_timer, ixv_if_local_timer),
172 	DEVMETHOD(ifdi_vlan_register, ixv_if_register_vlan),
173 	DEVMETHOD(ifdi_vlan_unregister, ixv_if_unregister_vlan),
174 	DEVMETHOD(ifdi_get_counter, ixv_if_get_counter),
175 	DEVMETHOD_END
176 };
177 
178 static driver_t ixv_if_driver = {
179   "ixv_if", ixv_if_methods, sizeof(struct adapter)
180 };
181 
182 /*
183  * TUNEABLE PARAMETERS:
184  */
185 
186 /* Flow control setting, default to full */
187 static int ixv_flow_control = ixgbe_fc_full;
188 TUNABLE_INT("hw.ixv.flow_control", &ixv_flow_control);
189 
190 /*
191  * Header split: this causes the hardware to DMA
192  * the header into a separate mbuf from the payload,
193  * it can be a performance win in some workloads, but
194  * in others it actually hurts, its off by default.
195  */
196 static int ixv_header_split = FALSE;
197 TUNABLE_INT("hw.ixv.hdr_split", &ixv_header_split);
198 
199 /*
200  * Shadow VFTA table, this is needed because
201  * the real filter table gets cleared during
202  * a soft reset and we need to repopulate it.
203  */
204 static u32 ixv_shadow_vfta[IXGBE_VFTA_SIZE];
205 extern struct if_txrx ixgbe_txrx;
206 
207 static struct if_shared_ctx ixv_sctx_init = {
208 	.isc_magic = IFLIB_MAGIC,
209 	.isc_q_align = PAGE_SIZE,/* max(DBA_ALIGN, PAGE_SIZE) */
210 	.isc_tx_maxsize = IXGBE_TSO_SIZE,
211 
212 	.isc_tx_maxsegsize = PAGE_SIZE,
213 
214 	.isc_rx_maxsize = MJUM16BYTES,
215 	.isc_rx_nsegments = 1,
216 	.isc_rx_maxsegsize = MJUM16BYTES,
217 	.isc_nfl = 1,
218 	.isc_ntxqs = 1,
219 	.isc_nrxqs = 1,
220 	.isc_admin_intrcnt = 1,
221 	.isc_vendor_info = ixv_vendor_info_array,
222 	.isc_driver_version = ixv_driver_version,
223 	.isc_driver = &ixv_if_driver,
224 
225 	.isc_nrxd_min = {MIN_RXD},
226 	.isc_ntxd_min = {MIN_TXD},
227 	.isc_nrxd_max = {MAX_RXD},
228 	.isc_ntxd_max = {MAX_TXD},
229 	.isc_nrxd_default = {DEFAULT_RXD},
230 	.isc_ntxd_default = {DEFAULT_TXD},
231 };
232 
233 if_shared_ctx_t ixv_sctx = &ixv_sctx_init;
234 
235 static void *
236 ixv_register(device_t dev)
237 {
238 	return (ixv_sctx);
239 }
240 
241 /************************************************************************
242  * ixv_if_tx_queues_alloc
243  ************************************************************************/
244 static int
245 ixv_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
246                        int ntxqs, int ntxqsets)
247 {
248 	struct adapter     *adapter = iflib_get_softc(ctx);
249 	if_softc_ctx_t     scctx = adapter->shared;
250 	struct ix_tx_queue *que;
251 	int                i, j, error;
252 
253 	MPASS(adapter->num_tx_queues == ntxqsets);
254 	MPASS(ntxqs == 1);
255 
256 	/* Allocate queue structure memory */
257 	adapter->tx_queues =
258 	    (struct ix_tx_queue *)malloc(sizeof(struct ix_tx_queue) * ntxqsets,
259 	                                 M_DEVBUF, M_NOWAIT | M_ZERO);
260 	if (!adapter->tx_queues) {
261 		device_printf(iflib_get_dev(ctx),
262 		    "Unable to allocate TX ring memory\n");
263 		return (ENOMEM);
264 	}
265 
266 	for (i = 0, que = adapter->tx_queues; i < ntxqsets; i++, que++) {
267 		struct tx_ring *txr = &que->txr;
268 
269 		txr->me = i;
270 		txr->adapter =  que->adapter = adapter;
271 		adapter->active_queues |= (u64)1 << txr->me;
272 
273 		/* Allocate report status array */
274 		if (!(txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_DEVBUF, M_NOWAIT | M_ZERO))) {
275 			error = ENOMEM;
276 			goto fail;
277 		}
278 		for (j = 0; j < scctx->isc_ntxd[0]; j++)
279 			txr->tx_rsq[j] = QIDX_INVALID;
280 		/* get the virtual and physical address of the hardware queues */
281 		txr->tail = IXGBE_VFTDT(txr->me);
282 		txr->tx_base = (union ixgbe_adv_tx_desc *)vaddrs[i*ntxqs];
283 		txr->tx_paddr = paddrs[i*ntxqs];
284 
285 		txr->bytes = 0;
286 		txr->total_packets = 0;
287 
288 	}
289 
290 	device_printf(iflib_get_dev(ctx), "allocated for %d queues\n",
291 	    adapter->num_tx_queues);
292 
293 	return (0);
294 
295  fail:
296 	ixv_if_queues_free(ctx);
297 
298 	return (error);
299 } /* ixv_if_tx_queues_alloc */
300 
301 /************************************************************************
302  * ixv_if_rx_queues_alloc
303  ************************************************************************/
304 static int
305 ixv_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
306                        int nrxqs, int nrxqsets)
307 {
308 	struct adapter     *adapter = iflib_get_softc(ctx);
309 	struct ix_rx_queue *que;
310 	int                i, error;
311 
312 	MPASS(adapter->num_rx_queues == nrxqsets);
313 	MPASS(nrxqs == 1);
314 
315 	/* Allocate queue structure memory */
316 	adapter->rx_queues =
317 	    (struct ix_rx_queue *)malloc(sizeof(struct ix_rx_queue) * nrxqsets,
318 	                                 M_DEVBUF, M_NOWAIT | M_ZERO);
319 	if (!adapter->rx_queues) {
320 		device_printf(iflib_get_dev(ctx),
321 		    "Unable to allocate TX ring memory\n");
322 		error = ENOMEM;
323 		goto fail;
324 	}
325 
326 	for (i = 0, que = adapter->rx_queues; i < nrxqsets; i++, que++) {
327 		struct rx_ring *rxr = &que->rxr;
328 		rxr->me = i;
329 		rxr->adapter = que->adapter = adapter;
330 
331 
332 		/* get the virtual and physical address of the hw queues */
333 		rxr->tail = IXGBE_VFRDT(rxr->me);
334 		rxr->rx_base = (union ixgbe_adv_rx_desc *)vaddrs[i];
335 		rxr->rx_paddr = paddrs[i*nrxqs];
336 		rxr->bytes = 0;
337 		rxr->que = que;
338 	}
339 
340 	device_printf(iflib_get_dev(ctx), "allocated for %d rx queues\n",
341 	    adapter->num_rx_queues);
342 
343 	return (0);
344 
345 fail:
346 	ixv_if_queues_free(ctx);
347 
348 	return (error);
349 } /* ixv_if_rx_queues_alloc */
350 
351 /************************************************************************
352  * ixv_if_queues_free
353  ************************************************************************/
354 static void
355 ixv_if_queues_free(if_ctx_t ctx)
356 {
357 	struct adapter     *adapter = iflib_get_softc(ctx);
358 	struct ix_tx_queue *que = adapter->tx_queues;
359 	int                i;
360 
361 	if (que == NULL)
362 		goto free;
363 
364 	for (i = 0; i < adapter->num_tx_queues; i++, que++) {
365 		struct tx_ring *txr = &que->txr;
366 		if (txr->tx_rsq == NULL)
367 			break;
368 
369 		free(txr->tx_rsq, M_DEVBUF);
370 		txr->tx_rsq = NULL;
371 	}
372 	if (adapter->tx_queues != NULL)
373 		free(adapter->tx_queues, M_DEVBUF);
374 free:
375 	if (adapter->rx_queues != NULL)
376 		free(adapter->rx_queues, M_DEVBUF);
377 	adapter->tx_queues = NULL;
378 	adapter->rx_queues = NULL;
379 } /* ixv_if_queues_free */
380 
381 /************************************************************************
382  * ixv_if_attach_pre - Device initialization routine
383  *
384  *   Called when the driver is being loaded.
385  *   Identifies the type of hardware, allocates all resources
386  *   and initializes the hardware.
387  *
388  *   return 0 on success, positive on failure
389  ************************************************************************/
390 static int
391 ixv_if_attach_pre(if_ctx_t ctx)
392 {
393 	struct adapter  *adapter;
394 	device_t        dev;
395 	if_softc_ctx_t  scctx;
396 	struct ixgbe_hw *hw;
397 	int             error = 0;
398 
399 	INIT_DEBUGOUT("ixv_attach: begin");
400 
401 	/* Allocate, clear, and link in our adapter structure */
402 	dev = iflib_get_dev(ctx);
403 	adapter = iflib_get_softc(ctx);
404 	adapter->dev = dev;
405 	adapter->ctx = ctx;
406 	adapter->hw.back = adapter;
407 	scctx = adapter->shared = iflib_get_softc_ctx(ctx);
408 	adapter->media = iflib_get_media(ctx);
409 	hw = &adapter->hw;
410 
411 	/* Do base PCI setup - map BAR0 */
412 	if (ixv_allocate_pci_resources(ctx)) {
413 		device_printf(dev, "ixv_allocate_pci_resources() failed!\n");
414 		error = ENXIO;
415 		goto err_out;
416 	}
417 
418 	/* SYSCTL APIs */
419 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
420 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "debug",
421 	    CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixv_sysctl_debug, "I",
422 	    "Debug Info");
423 
424 	/* Determine hardware revision */
425 	ixv_identify_hardware(ctx);
426 	ixv_init_device_features(adapter);
427 
428 	/* Initialize the shared code */
429 	error = ixgbe_init_ops_vf(hw);
430 	if (error) {
431 		device_printf(dev, "ixgbe_init_ops_vf() failed!\n");
432 		error = EIO;
433 		goto err_out;
434 	}
435 
436 	/* Setup the mailbox */
437 	ixgbe_init_mbx_params_vf(hw);
438 
439 	error = hw->mac.ops.reset_hw(hw);
440 	if (error == IXGBE_ERR_RESET_FAILED)
441 		device_printf(dev, "...reset_hw() failure: Reset Failed!\n");
442 	else if (error)
443 		device_printf(dev, "...reset_hw() failed with error %d\n",
444 		    error);
445 	if (error) {
446 		error = EIO;
447 		goto err_out;
448 	}
449 
450 	error = hw->mac.ops.init_hw(hw);
451 	if (error) {
452 		device_printf(dev, "...init_hw() failed with error %d\n",
453 		    error);
454 		error = EIO;
455 		goto err_out;
456 	}
457 
458 	/* Negotiate mailbox API version */
459 	error = ixv_negotiate_api(adapter);
460 	if (error) {
461 		device_printf(dev,
462 		    "Mailbox API negotiation failed during attach!\n");
463 		goto err_out;
464 	}
465 
466 	/* If no mac address was assigned, make a random one */
467 	if (!ixv_check_ether_addr(hw->mac.addr)) {
468 		u8 addr[ETHER_ADDR_LEN];
469 		arc4rand(&addr, sizeof(addr), 0);
470 		addr[0] &= 0xFE;
471 		addr[0] |= 0x02;
472 		bcopy(addr, hw->mac.addr, sizeof(addr));
473 		bcopy(addr, hw->mac.perm_addr, sizeof(addr));
474 	}
475 
476 	/* Most of the iflib initialization... */
477 
478 	iflib_set_mac(ctx, hw->mac.addr);
479 	switch (adapter->hw.mac.type) {
480 	case ixgbe_mac_X550_vf:
481 	case ixgbe_mac_X550EM_x_vf:
482 	case ixgbe_mac_X550EM_a_vf:
483 		scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 2;
484 		break;
485 	default:
486 		scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 1;
487 	}
488 	scctx->isc_txqsizes[0] =
489 	    roundup2(scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc) +
490 	    sizeof(u32), DBA_ALIGN);
491 	scctx->isc_rxqsizes[0] =
492 	    roundup2(scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc),
493 	    DBA_ALIGN);
494 	/* XXX */
495 	scctx->isc_tx_csum_flags = CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_TSO |
496 	    CSUM_IP6_TCP | CSUM_IP6_UDP | CSUM_IP6_TSO;
497 	scctx->isc_tx_nsegments = IXGBE_82599_SCATTER;
498 	scctx->isc_msix_bar = PCIR_BAR(MSIX_82598_BAR);
499 	scctx->isc_tx_tso_segments_max = scctx->isc_tx_nsegments;
500 	scctx->isc_tx_tso_size_max = IXGBE_TSO_SIZE;
501 	scctx->isc_tx_tso_segsize_max = PAGE_SIZE;
502 
503 	scctx->isc_txrx = &ixgbe_txrx;
504 
505 	/*
506 	 * Tell the upper layer(s) we support everything the PF
507 	 * driver does except...
508 	 *   hardware stats
509 	 *   Wake-on-LAN
510 	 */
511 	scctx->isc_capenable = IXGBE_CAPS;
512 	scctx->isc_capenable ^= IFCAP_HWSTATS | IFCAP_WOL;
513 
514 	INIT_DEBUGOUT("ixv_if_attach_pre: end");
515 
516 	return (0);
517 
518 err_out:
519 	ixv_free_pci_resources(ctx);
520 
521 	return (error);
522 } /* ixv_if_attach_pre */
523 
524 static int
525 ixv_if_attach_post(if_ctx_t ctx)
526 {
527 	struct adapter *adapter = iflib_get_softc(ctx);
528 	device_t       dev = iflib_get_dev(ctx);
529 	int            error = 0;
530 
531 	/* Setup OS specific network interface */
532 	error = ixv_setup_interface(ctx);
533 	if (error) {
534 		device_printf(dev, "Interface setup failed: %d\n", error);
535 		goto end;
536 	}
537 
538 	/* Do the stats setup */
539 	ixv_save_stats(adapter);
540 	ixv_init_stats(adapter);
541 	ixv_add_stats_sysctls(adapter);
542 
543 end:
544 	return error;
545 } /* ixv_if_attach_post */
546 
547 /************************************************************************
548  * ixv_detach - Device removal routine
549  *
550  *   Called when the driver is being removed.
551  *   Stops the adapter and deallocates all the resources
552  *   that were allocated for driver operation.
553  *
554  *   return 0 on success, positive on failure
555  ************************************************************************/
556 static int
557 ixv_if_detach(if_ctx_t ctx)
558 {
559 	INIT_DEBUGOUT("ixv_detach: begin");
560 
561 	ixv_free_pci_resources(ctx);
562 
563 	return (0);
564 } /* ixv_if_detach */
565 
566 /************************************************************************
567  * ixv_if_mtu_set
568  ************************************************************************/
569 static int
570 ixv_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
571 {
572 	struct adapter *adapter = iflib_get_softc(ctx);
573 	struct ifnet   *ifp = iflib_get_ifp(ctx);
574 	int            error = 0;
575 
576 	IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
577 	if (mtu > IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR) {
578 		error = EINVAL;
579 	} else {
580 		ifp->if_mtu = mtu;
581 		adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
582 	}
583 
584 	return error;
585 } /* ixv_if_mtu_set */
586 
587 /************************************************************************
588  * ixv_if_init - Init entry point
589  *
590  *   Used in two ways: It is used by the stack as an init entry
591  *   point in network interface structure. It is also used
592  *   by the driver as a hw/sw initialization routine to get
593  *   to a consistent state.
594  *
595  *   return 0 on success, positive on failure
596  ************************************************************************/
597 static void
598 ixv_if_init(if_ctx_t ctx)
599 {
600 	struct adapter  *adapter = iflib_get_softc(ctx);
601 	struct ifnet    *ifp = iflib_get_ifp(ctx);
602 	device_t        dev = iflib_get_dev(ctx);
603 	struct ixgbe_hw *hw = &adapter->hw;
604 	int             error = 0;
605 
606 	INIT_DEBUGOUT("ixv_if_init: begin");
607 	hw->adapter_stopped = FALSE;
608 	hw->mac.ops.stop_adapter(hw);
609 
610 	/* reprogram the RAR[0] in case user changed it. */
611 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
612 
613 	/* Get the latest mac address, User can use a LAA */
614 	bcopy(IF_LLADDR(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
615 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1);
616 
617 	/* Reset VF and renegotiate mailbox API version */
618 	hw->mac.ops.reset_hw(hw);
619 	error = ixv_negotiate_api(adapter);
620 	if (error) {
621 		device_printf(dev,
622 		    "Mailbox API negotiation failed in if_init!\n");
623 		return;
624 	}
625 
626 	ixv_initialize_transmit_units(ctx);
627 
628 	/* Setup Multicast table */
629 	ixv_if_multi_set(ctx);
630 
631 	/*
632 	 * Determine the correct mbuf pool
633 	 * for doing jumbo/headersplit
634 	 */
635 	if (ifp->if_mtu > ETHERMTU)
636 		adapter->rx_mbuf_sz = MJUMPAGESIZE;
637 	else
638 		adapter->rx_mbuf_sz = MCLBYTES;
639 
640 	/* Configure RX settings */
641 	ixv_initialize_receive_units(ctx);
642 
643 	/* Set up VLAN offload and filter */
644 	ixv_setup_vlan_support(ctx);
645 
646 	/* Set up MSI-X routing */
647 	ixv_configure_ivars(adapter);
648 
649 	/* Set up auto-mask */
650 	IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, IXGBE_EICS_RTX_QUEUE);
651 
652 	/* Set moderation on the Link interrupt */
653 	IXGBE_WRITE_REG(hw, IXGBE_VTEITR(adapter->vector), IXGBE_LINK_ITR);
654 
655 	/* Stats init */
656 	ixv_init_stats(adapter);
657 
658 	/* Config/Enable Link */
659 	hw->mac.ops.check_link(hw, &adapter->link_speed, &adapter->link_up,
660 	    FALSE);
661 
662 	/* And now turn on interrupts */
663 	ixv_if_enable_intr(ctx);
664 
665 	/* Now inform the stack we're ready */
666 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
667 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
668 
669 	return;
670 } /* ixv_if_init */
671 
672 /************************************************************************
673  * ixv_enable_queue
674  ************************************************************************/
675 static inline void
676 ixv_enable_queue(struct adapter *adapter, u32 vector)
677 {
678 	struct ixgbe_hw *hw = &adapter->hw;
679 	u32             queue = 1 << vector;
680 	u32             mask;
681 
682 	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
683 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
684 } /* ixv_enable_queue */
685 
686 /************************************************************************
687  * ixv_disable_queue
688  ************************************************************************/
689 static inline void
690 ixv_disable_queue(struct adapter *adapter, u32 vector)
691 {
692 	struct ixgbe_hw *hw = &adapter->hw;
693 	u64             queue = (u64)(1 << vector);
694 	u32             mask;
695 
696 	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
697 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
698 } /* ixv_disable_queue */
699 
700 
701 /************************************************************************
702  * ixv_msix_que - MSI-X Queue Interrupt Service routine
703  ************************************************************************/
704 static int
705 ixv_msix_que(void *arg)
706 {
707 	struct ix_rx_queue *que = arg;
708 	struct adapter     *adapter = que->adapter;
709 
710 	ixv_disable_queue(adapter, que->msix);
711 	++que->irqs;
712 
713 	return (FILTER_SCHEDULE_THREAD);
714 } /* ixv_msix_que */
715 
716 /************************************************************************
717  * ixv_msix_mbx
718  ************************************************************************/
719 static int
720 ixv_msix_mbx(void *arg)
721 {
722 	struct adapter  *adapter = arg;
723 	struct ixgbe_hw *hw = &adapter->hw;
724 	u32             reg;
725 
726 	++adapter->link_irq;
727 
728 	/* First get the cause */
729 	reg = IXGBE_READ_REG(hw, IXGBE_VTEICS);
730 	/* Clear interrupt with write */
731 	IXGBE_WRITE_REG(hw, IXGBE_VTEICR, reg);
732 
733 	/* Link status change */
734 	if (reg & IXGBE_EICR_LSC)
735 		iflib_admin_intr_deferred(adapter->ctx);
736 
737 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_EIMS_OTHER);
738 
739 	return (FILTER_HANDLED);
740 } /* ixv_msix_mbx */
741 
742 /************************************************************************
743  * ixv_media_status - Media Ioctl callback
744  *
745  *   Called whenever the user queries the status of
746  *   the interface using ifconfig.
747  ************************************************************************/
748 static void
749 ixv_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr)
750 {
751 	struct adapter *adapter = iflib_get_softc(ctx);
752 
753 	INIT_DEBUGOUT("ixv_media_status: begin");
754 
755 	iflib_admin_intr_deferred(ctx);
756 
757 	ifmr->ifm_status = IFM_AVALID;
758 	ifmr->ifm_active = IFM_ETHER;
759 
760 	if (!adapter->link_active)
761 		return;
762 
763 	ifmr->ifm_status |= IFM_ACTIVE;
764 
765 	switch (adapter->link_speed) {
766 		case IXGBE_LINK_SPEED_1GB_FULL:
767 			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
768 			break;
769 		case IXGBE_LINK_SPEED_10GB_FULL:
770 			ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
771 			break;
772 		case IXGBE_LINK_SPEED_100_FULL:
773 			ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
774 			break;
775 		case IXGBE_LINK_SPEED_10_FULL:
776 			ifmr->ifm_active |= IFM_10_T | IFM_FDX;
777 			break;
778 	}
779 } /* ixv_if_media_status */
780 
781 /************************************************************************
782  * ixv_if_media_change - Media Ioctl callback
783  *
784  *   Called when the user changes speed/duplex using
785  *   media/mediopt option with ifconfig.
786  ************************************************************************/
787 static int
788 ixv_if_media_change(if_ctx_t ctx)
789 {
790 	struct adapter *adapter = iflib_get_softc(ctx);
791 	struct ifmedia *ifm = iflib_get_media(ctx);
792 
793 	INIT_DEBUGOUT("ixv_media_change: begin");
794 
795 	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
796 		return (EINVAL);
797 
798 	switch (IFM_SUBTYPE(ifm->ifm_media)) {
799 	case IFM_AUTO:
800 		break;
801 	default:
802 		device_printf(adapter->dev, "Only auto media type\n");
803 		return (EINVAL);
804 	}
805 
806 	return (0);
807 } /* ixv_if_media_change */
808 
809 
810 /************************************************************************
811  * ixv_negotiate_api
812  *
813  *   Negotiate the Mailbox API with the PF;
814  *   start with the most featured API first.
815  ************************************************************************/
816 static int
817 ixv_negotiate_api(struct adapter *adapter)
818 {
819 	struct ixgbe_hw *hw = &adapter->hw;
820 	int             mbx_api[] = { ixgbe_mbox_api_11,
821 	                              ixgbe_mbox_api_10,
822 	                              ixgbe_mbox_api_unknown };
823 	int             i = 0;
824 
825 	while (mbx_api[i] != ixgbe_mbox_api_unknown) {
826 		if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0)
827 			return (0);
828 		i++;
829 	}
830 
831 	return (EINVAL);
832 } /* ixv_negotiate_api */
833 
834 
835 /************************************************************************
836  * ixv_if_multi_set - Multicast Update
837  *
838  *   Called whenever multicast address list is updated.
839  ************************************************************************/
840 static void
841 ixv_if_multi_set(if_ctx_t ctx)
842 {
843 	u8       mta[MAX_NUM_MULTICAST_ADDRESSES * IXGBE_ETH_LENGTH_OF_ADDRESS];
844 	struct adapter     *adapter = iflib_get_softc(ctx);
845 	u8                 *update_ptr;
846 	struct ifmultiaddr *ifma;
847 	if_t               ifp = iflib_get_ifp(ctx);
848 	int                mcnt = 0;
849 
850 	IOCTL_DEBUGOUT("ixv_if_multi_set: begin");
851 
852 	TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
853 		if (ifma->ifma_addr->sa_family != AF_LINK)
854 			continue;
855 		bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
856 		    &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
857 		    IXGBE_ETH_LENGTH_OF_ADDRESS);
858 		mcnt++;
859 	}
860 
861 	update_ptr = mta;
862 
863 	adapter->hw.mac.ops.update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
864 	    ixv_mc_array_itr, TRUE);
865 } /* ixv_if_multi_set */
866 
867 /************************************************************************
868  * ixv_mc_array_itr
869  *
870  *   An iterator function needed by the multicast shared code.
871  *   It feeds the shared code routine the addresses in the
872  *   array of ixv_set_multi() one by one.
873  ************************************************************************/
874 static u8 *
875 ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
876 {
877 	u8 *addr = *update_ptr;
878 	u8 *newptr;
879 
880 	*vmdq = 0;
881 
882 	newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
883 	*update_ptr = newptr;
884 
885 	return addr;
886 } /* ixv_mc_array_itr */
887 
888 /************************************************************************
889  * ixv_if_local_timer - Timer routine
890  *
891  *   Checks for link status, updates statistics,
892  *   and runs the watchdog check.
893  ************************************************************************/
894 static void
895 ixv_if_local_timer(if_ctx_t ctx, uint16_t qid)
896 {
897 	if (qid != 0)
898 		return;
899 
900 	/* Fire off the adminq task */
901 	iflib_admin_intr_deferred(ctx);
902 } /* ixv_if_local_timer */
903 
904 /************************************************************************
905  * ixv_if_update_admin_status - Update OS on link state
906  *
907  * Note: Only updates the OS on the cached link state.
908  *       The real check of the hardware only happens with
909  *       a link interrupt.
910  ************************************************************************/
911 static void
912 ixv_if_update_admin_status(if_ctx_t ctx)
913 {
914 	struct adapter *adapter = iflib_get_softc(ctx);
915 	device_t       dev = iflib_get_dev(ctx);
916 
917 	adapter->hw.mac.get_link_status = TRUE;
918 	ixgbe_check_link(&adapter->hw, &adapter->link_speed, &adapter->link_up,
919 	    FALSE);
920 
921 	if (adapter->link_up) {
922 		if (adapter->link_active == FALSE) {
923 			if (bootverbose)
924 				device_printf(dev, "Link is up %d Gbps %s \n",
925 				    ((adapter->link_speed == 128) ? 10 : 1),
926 				    "Full Duplex");
927 			adapter->link_active = TRUE;
928 			iflib_link_state_change(ctx, LINK_STATE_UP,
929 			    IF_Gbps(10));
930 		}
931 	} else { /* Link down */
932 		if (adapter->link_active == TRUE) {
933 			if (bootverbose)
934 				device_printf(dev, "Link is Down\n");
935 			iflib_link_state_change(ctx, LINK_STATE_DOWN,  0);
936 			adapter->link_active = FALSE;
937 		}
938 	}
939 
940 	/* Stats Update */
941 	ixv_update_stats(adapter);
942 } /* ixv_if_update_admin_status */
943 
944 
945 /************************************************************************
946  * ixv_if_stop - Stop the hardware
947  *
948  *   Disables all traffic on the adapter by issuing a
949  *   global reset on the MAC and deallocates TX/RX buffers.
950  ************************************************************************/
951 static void
952 ixv_if_stop(if_ctx_t ctx)
953 {
954 	struct adapter  *adapter = iflib_get_softc(ctx);
955 	struct ixgbe_hw *hw = &adapter->hw;
956 
957 	INIT_DEBUGOUT("ixv_stop: begin\n");
958 
959 	ixv_if_disable_intr(ctx);
960 
961 	hw->mac.ops.reset_hw(hw);
962 	adapter->hw.adapter_stopped = FALSE;
963 	hw->mac.ops.stop_adapter(hw);
964 
965 	/* Update the stack */
966 	adapter->link_up = FALSE;
967 	ixv_if_update_admin_status(ctx);
968 
969 	/* reprogram the RAR[0] in case user changed it. */
970 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
971 } /* ixv_if_stop */
972 
973 
974 /************************************************************************
975  * ixv_identify_hardware - Determine hardware revision.
976  ************************************************************************/
977 static void
978 ixv_identify_hardware(if_ctx_t ctx)
979 {
980 	struct adapter  *adapter = iflib_get_softc(ctx);
981 	device_t        dev = iflib_get_dev(ctx);
982 	struct ixgbe_hw *hw = &adapter->hw;
983 
984 	/* Save off the information about this board */
985 	hw->vendor_id = pci_get_vendor(dev);
986 	hw->device_id = pci_get_device(dev);
987 	hw->revision_id = pci_get_revid(dev);
988 	hw->subsystem_vendor_id = pci_get_subvendor(dev);
989 	hw->subsystem_device_id = pci_get_subdevice(dev);
990 
991 	/* A subset of set_mac_type */
992 	switch (hw->device_id) {
993 	case IXGBE_DEV_ID_82599_VF:
994 		hw->mac.type = ixgbe_mac_82599_vf;
995 		break;
996 	case IXGBE_DEV_ID_X540_VF:
997 		hw->mac.type = ixgbe_mac_X540_vf;
998 		break;
999 	case IXGBE_DEV_ID_X550_VF:
1000 		hw->mac.type = ixgbe_mac_X550_vf;
1001 		break;
1002 	case IXGBE_DEV_ID_X550EM_X_VF:
1003 		hw->mac.type = ixgbe_mac_X550EM_x_vf;
1004 		break;
1005 	case IXGBE_DEV_ID_X550EM_A_VF:
1006 		hw->mac.type = ixgbe_mac_X550EM_a_vf;
1007 		break;
1008 	default:
1009 		device_printf(dev, "unknown mac type\n");
1010 		hw->mac.type = ixgbe_mac_unknown;
1011 		break;
1012 	}
1013 } /* ixv_identify_hardware */
1014 
1015 /************************************************************************
1016  * ixv_if_msix_intr_assign - Setup MSI-X Interrupt resources and handlers
1017  ************************************************************************/
1018 static int
1019 ixv_if_msix_intr_assign(if_ctx_t ctx, int msix)
1020 {
1021 	struct adapter     *adapter = iflib_get_softc(ctx);
1022 	device_t           dev = iflib_get_dev(ctx);
1023 	struct ix_rx_queue *rx_que = adapter->rx_queues;
1024 	struct ix_tx_queue *tx_que;
1025 	int                error, rid, vector = 0;
1026 	char               buf[16];
1027 
1028 	for (int i = 0; i < adapter->num_rx_queues; i++, vector++, rx_que++) {
1029 		rid = vector + 1;
1030 
1031 		snprintf(buf, sizeof(buf), "rxq%d", i);
1032 		error = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
1033 		    IFLIB_INTR_RX, ixv_msix_que, rx_que, rx_que->rxr.me, buf);
1034 
1035 		if (error) {
1036 			device_printf(iflib_get_dev(ctx),
1037 			    "Failed to allocate que int %d err: %d", i, error);
1038 			adapter->num_rx_queues = i + 1;
1039 			goto fail;
1040 		}
1041 
1042 		rx_que->msix = vector;
1043 		adapter->active_queues |= (u64)(1 << rx_que->msix);
1044 
1045 	}
1046 
1047 	for (int i = 0; i < adapter->num_tx_queues; i++) {
1048 		snprintf(buf, sizeof(buf), "txq%d", i);
1049 		tx_que = &adapter->tx_queues[i];
1050 		tx_que->msix = i % adapter->num_rx_queues;
1051 		iflib_softirq_alloc_generic(ctx,
1052 		    &adapter->rx_queues[tx_que->msix].que_irq,
1053 		    IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
1054 	}
1055 	rid = vector + 1;
1056 	error = iflib_irq_alloc_generic(ctx, &adapter->irq, rid,
1057 	    IFLIB_INTR_ADMIN, ixv_msix_mbx, adapter, 0, "aq");
1058 	if (error) {
1059 		device_printf(iflib_get_dev(ctx),
1060 		    "Failed to register admin handler");
1061 		return (error);
1062 	}
1063 
1064 	adapter->vector = vector;
1065 	/*
1066 	 * Due to a broken design QEMU will fail to properly
1067 	 * enable the guest for MSIX unless the vectors in
1068 	 * the table are all set up, so we must rewrite the
1069 	 * ENABLE in the MSIX control register again at this
1070 	 * point to cause it to successfully initialize us.
1071 	 */
1072 	if (adapter->hw.mac.type == ixgbe_mac_82599_vf) {
1073 		int msix_ctrl;
1074 		pci_find_cap(dev, PCIY_MSIX, &rid);
1075 		rid += PCIR_MSIX_CTRL;
1076 		msix_ctrl = pci_read_config(dev, rid, 2);
1077 		msix_ctrl |= PCIM_MSIXCTRL_MSIX_ENABLE;
1078 		pci_write_config(dev, rid, msix_ctrl, 2);
1079 	}
1080 
1081 	return (0);
1082 
1083 fail:
1084 	iflib_irq_free(ctx, &adapter->irq);
1085 	rx_que = adapter->rx_queues;
1086 	for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++)
1087 		iflib_irq_free(ctx, &rx_que->que_irq);
1088 
1089 	return (error);
1090 } /* ixv_if_msix_intr_assign */
1091 
1092 /************************************************************************
1093  * ixv_allocate_pci_resources
1094  ************************************************************************/
1095 static int
1096 ixv_allocate_pci_resources(if_ctx_t ctx)
1097 {
1098 	struct adapter *adapter = iflib_get_softc(ctx);
1099 	device_t       dev = iflib_get_dev(ctx);
1100 	int            rid;
1101 
1102 	rid = PCIR_BAR(0);
1103 	adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
1104 	    RF_ACTIVE);
1105 
1106 	if (!(adapter->pci_mem)) {
1107 		device_printf(dev, "Unable to allocate bus resource: memory\n");
1108 		return (ENXIO);
1109 	}
1110 
1111 	adapter->osdep.mem_bus_space_tag = rman_get_bustag(adapter->pci_mem);
1112 	adapter->osdep.mem_bus_space_handle =
1113 	    rman_get_bushandle(adapter->pci_mem);
1114 	adapter->hw.hw_addr = (u8 *)&adapter->osdep.mem_bus_space_handle;
1115 
1116 	return (0);
1117 } /* ixv_allocate_pci_resources */
1118 
1119 /************************************************************************
1120  * ixv_free_pci_resources
1121  ************************************************************************/
1122 static void
1123 ixv_free_pci_resources(if_ctx_t ctx)
1124 {
1125 	struct adapter     *adapter = iflib_get_softc(ctx);
1126 	struct ix_rx_queue *que = adapter->rx_queues;
1127 	device_t           dev = iflib_get_dev(ctx);
1128 
1129 	/* Release all msix queue resources */
1130 	if (adapter->intr_type == IFLIB_INTR_MSIX)
1131 		iflib_irq_free(ctx, &adapter->irq);
1132 
1133 	if (que != NULL) {
1134 		for (int i = 0; i < adapter->num_rx_queues; i++, que++) {
1135 			iflib_irq_free(ctx, &que->que_irq);
1136 		}
1137 	}
1138 
1139 	/* Clean the Legacy or Link interrupt last */
1140 	if (adapter->pci_mem != NULL)
1141 		bus_release_resource(dev, SYS_RES_MEMORY,
1142 				     PCIR_BAR(0), adapter->pci_mem);
1143 } /* ixv_free_pci_resources */
1144 
1145 /************************************************************************
1146  * ixv_setup_interface
1147  *
1148  *   Setup networking device structure and register an interface.
1149  ************************************************************************/
1150 static int
1151 ixv_setup_interface(if_ctx_t ctx)
1152 {
1153 	struct adapter *adapter = iflib_get_softc(ctx);
1154 	if_softc_ctx_t scctx = adapter->shared;
1155 	struct ifnet   *ifp = iflib_get_ifp(ctx);
1156 
1157 	INIT_DEBUGOUT("ixv_setup_interface: begin");
1158 
1159 	if_setifheaderlen(ifp, sizeof(struct ether_vlan_header));
1160 	if_setbaudrate(ifp, IF_Gbps(10));
1161 	ifp->if_snd.ifq_maxlen = scctx->isc_ntxd[0] - 2;
1162 
1163 
1164 	adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
1165 	ifmedia_add(adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1166 	ifmedia_set(adapter->media, IFM_ETHER | IFM_AUTO);
1167 
1168 	return 0;
1169 } /* ixv_setup_interface */
1170 
1171 /************************************************************************
1172  * ixv_if_get_counter
1173  ************************************************************************/
1174 static uint64_t
1175 ixv_if_get_counter(if_ctx_t ctx, ift_counter cnt)
1176 {
1177 	struct adapter *adapter = iflib_get_softc(ctx);
1178 	if_t           ifp = iflib_get_ifp(ctx);
1179 
1180 	switch (cnt) {
1181 	case IFCOUNTER_IPACKETS:
1182 		return (adapter->ipackets);
1183 	case IFCOUNTER_OPACKETS:
1184 		return (adapter->opackets);
1185 	case IFCOUNTER_IBYTES:
1186 		return (adapter->ibytes);
1187 	case IFCOUNTER_OBYTES:
1188 		return (adapter->obytes);
1189 	case IFCOUNTER_IMCASTS:
1190 		return (adapter->imcasts);
1191 	default:
1192 		return (if_get_counter_default(ifp, cnt));
1193 	}
1194 } /* ixv_if_get_counter */
1195 
1196 /************************************************************************
1197  * ixv_initialize_transmit_units - Enable transmit unit.
1198  ************************************************************************/
1199 static void
1200 ixv_initialize_transmit_units(if_ctx_t ctx)
1201 {
1202 	struct adapter     *adapter = iflib_get_softc(ctx);
1203 	struct ixgbe_hw    *hw = &adapter->hw;
1204 	if_softc_ctx_t     scctx = adapter->shared;
1205 	struct ix_tx_queue *que = adapter->tx_queues;
1206 	int                i;
1207 
1208 	for (i = 0; i < adapter->num_tx_queues; i++, que++) {
1209 		struct tx_ring *txr = &que->txr;
1210 		u64            tdba = txr->tx_paddr;
1211 		u32            txctrl, txdctl;
1212 		int            j = txr->me;
1213 
1214 		/* Set WTHRESH to 8, burst writeback */
1215 		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1216 		txdctl |= (8 << 16);
1217 		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1218 
1219 		/* Set the HW Tx Head and Tail indices */
1220 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDH(j), 0);
1221 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(j), 0);
1222 
1223 		/* Set Tx Tail register */
1224 		txr->tail = IXGBE_VFTDT(j);
1225 
1226 		txr->tx_rs_cidx = txr->tx_rs_pidx = txr->tx_cidx_processed = 0;
1227 		for (int k = 0; k < scctx->isc_ntxd[0]; k++)
1228 			txr->tx_rsq[k] = QIDX_INVALID;
1229 
1230 		/* Set Ring parameters */
1231 		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(j),
1232 		    (tdba & 0x00000000ffffffffULL));
1233 		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(j), (tdba >> 32));
1234 		IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(j),
1235 		    scctx->isc_ntxd[0] * sizeof(struct ixgbe_legacy_tx_desc));
1236 		txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(j));
1237 		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
1238 		IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(j), txctrl);
1239 
1240 		/* Now enable */
1241 		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
1242 		txdctl |= IXGBE_TXDCTL_ENABLE;
1243 		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
1244 	}
1245 
1246 	return;
1247 } /* ixv_initialize_transmit_units */
1248 
1249 /************************************************************************
1250  * ixv_initialize_rss_mapping
1251  ************************************************************************/
1252 static void
1253 ixv_initialize_rss_mapping(struct adapter *adapter)
1254 {
1255 	struct ixgbe_hw *hw = &adapter->hw;
1256 	u32             reta = 0, mrqc, rss_key[10];
1257 	int             queue_id;
1258 	int             i, j;
1259 	u32             rss_hash_config;
1260 
1261 	if (adapter->feat_en & IXGBE_FEATURE_RSS) {
1262 		/* Fetch the configured RSS key */
1263 		rss_getkey((uint8_t *)&rss_key);
1264 	} else {
1265 		/* set up random bits */
1266 		arc4rand(&rss_key, sizeof(rss_key), 0);
1267 	}
1268 
1269 	/* Now fill out hash function seeds */
1270 	for (i = 0; i < 10; i++)
1271 		IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]);
1272 
1273 	/* Set up the redirection table */
1274 	for (i = 0, j = 0; i < 64; i++, j++) {
1275 		if (j == adapter->num_rx_queues)
1276 			j = 0;
1277 
1278 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
1279 			/*
1280 			 * Fetch the RSS bucket id for the given indirection
1281 			 * entry. Cap it at the number of configured buckets
1282 			 * (which is num_rx_queues.)
1283 			 */
1284 			queue_id = rss_get_indirection_to_bucket(i);
1285 			queue_id = queue_id % adapter->num_rx_queues;
1286 		} else
1287 			queue_id = j;
1288 
1289 		/*
1290 		 * The low 8 bits are for hash value (n+0);
1291 		 * The next 8 bits are for hash value (n+1), etc.
1292 		 */
1293 		reta >>= 8;
1294 		reta |= ((uint32_t)queue_id) << 24;
1295 		if ((i & 3) == 3) {
1296 			IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), reta);
1297 			reta = 0;
1298 		}
1299 	}
1300 
1301 	/* Perform hash on these packet types */
1302 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
1303 		rss_hash_config = rss_gethashconfig();
1304 	else {
1305 		/*
1306 		 * Disable UDP - IP fragments aren't currently being handled
1307 		 * and so we end up with a mix of 2-tuple and 4-tuple
1308 		 * traffic.
1309 		 */
1310 		rss_hash_config = RSS_HASHTYPE_RSS_IPV4
1311 		                | RSS_HASHTYPE_RSS_TCP_IPV4
1312 		                | RSS_HASHTYPE_RSS_IPV6
1313 		                | RSS_HASHTYPE_RSS_TCP_IPV6;
1314 	}
1315 
1316 	mrqc = IXGBE_MRQC_RSSEN;
1317 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
1318 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
1319 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
1320 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
1321 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
1322 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
1323 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
1324 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
1325 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
1326 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_IPV6_EX defined, but not supported\n",
1327 		    __func__);
1328 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
1329 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_TCP_IPV6_EX defined, but not supported\n",
1330 		    __func__);
1331 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
1332 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
1333 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
1334 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
1335 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
1336 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_UDP_IPV6_EX defined, but not supported\n",
1337 		    __func__);
1338 	IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, mrqc);
1339 } /* ixv_initialize_rss_mapping */
1340 
1341 
1342 /************************************************************************
1343  * ixv_initialize_receive_units - Setup receive registers and features.
1344  ************************************************************************/
1345 static void
1346 ixv_initialize_receive_units(if_ctx_t ctx)
1347 {
1348 	struct adapter     *adapter = iflib_get_softc(ctx);
1349 	if_softc_ctx_t     scctx;
1350 	struct ixgbe_hw    *hw = &adapter->hw;
1351 	struct ifnet       *ifp = iflib_get_ifp(ctx);
1352 	struct ix_rx_queue *que = adapter->rx_queues;
1353 	u32                bufsz, psrtype;
1354 
1355 	if (ifp->if_mtu > ETHERMTU)
1356 		bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1357 	else
1358 		bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
1359 
1360 	psrtype = IXGBE_PSRTYPE_TCPHDR
1361 	        | IXGBE_PSRTYPE_UDPHDR
1362 	        | IXGBE_PSRTYPE_IPV4HDR
1363 	        | IXGBE_PSRTYPE_IPV6HDR
1364 	        | IXGBE_PSRTYPE_L2HDR;
1365 
1366 	if (adapter->num_rx_queues > 1)
1367 		psrtype |= 1 << 29;
1368 
1369 	IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
1370 
1371 	/* Tell PF our max_frame size */
1372 	if (ixgbevf_rlpml_set_vf(hw, adapter->max_frame_size) != 0) {
1373 		device_printf(adapter->dev, "There is a problem with the PF setup.  It is likely the receive unit for this VF will not function correctly.\n");
1374 	}
1375 	scctx = adapter->shared;
1376 
1377 	for (int i = 0; i < adapter->num_rx_queues; i++, que++) {
1378 		struct rx_ring *rxr = &que->rxr;
1379 		u64            rdba = rxr->rx_paddr;
1380 		u32            reg, rxdctl;
1381 		int            j = rxr->me;
1382 
1383 		/* Disable the queue */
1384 		rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
1385 		rxdctl &= ~IXGBE_RXDCTL_ENABLE;
1386 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1387 		for (int k = 0; k < 10; k++) {
1388 			if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1389 			    IXGBE_RXDCTL_ENABLE)
1390 				msec_delay(1);
1391 			else
1392 				break;
1393 		}
1394 		wmb();
1395 		/* Setup the Base and Length of the Rx Descriptor Ring */
1396 		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(j),
1397 		    (rdba & 0x00000000ffffffffULL));
1398 		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(j), (rdba >> 32));
1399 		IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(j),
1400 		    scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc));
1401 
1402 		/* Reset the ring indices */
1403 		IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
1404 		IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0);
1405 
1406 		/* Set up the SRRCTL register */
1407 		reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(j));
1408 		reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
1409 		reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
1410 		reg |= bufsz;
1411 		reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
1412 		IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(j), reg);
1413 
1414 		/* Capture Rx Tail index */
1415 		rxr->tail = IXGBE_VFRDT(rxr->me);
1416 
1417 		/* Do the queue enabling last */
1418 		rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
1419 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1420 		for (int l = 0; l < 10; l++) {
1421 			if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
1422 			    IXGBE_RXDCTL_ENABLE)
1423 				break;
1424 			msec_delay(1);
1425 		}
1426 		wmb();
1427 
1428 		/* Set the Tail Pointer */
1429 #ifdef DEV_NETMAP
1430 		/*
1431 		 * In netmap mode, we must preserve the buffers made
1432 		 * available to userspace before the if_init()
1433 		 * (this is true by default on the TX side, because
1434 		 * init makes all buffers available to userspace).
1435 		 *
1436 		 * netmap_reset() and the device specific routines
1437 		 * (e.g. ixgbe_setup_receive_rings()) map these
1438 		 * buffers at the end of the NIC ring, so here we
1439 		 * must set the RDT (tail) register to make sure
1440 		 * they are not overwritten.
1441 		 *
1442 		 * In this driver the NIC ring starts at RDH = 0,
1443 		 * RDT points to the last slot available for reception (?),
1444 		 * so RDT = num_rx_desc - 1 means the whole ring is available.
1445 		 */
1446 		if (ifp->if_capenable & IFCAP_NETMAP) {
1447 			struct netmap_adapter *na = NA(ifp);
1448 			struct netmap_kring *kring = &na->rx_rings[j];
1449 			int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1450 
1451 			IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t);
1452 		} else
1453 #endif /* DEV_NETMAP */
1454 			IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
1455 			    scctx->isc_nrxd[0] - 1);
1456 	}
1457 
1458 	ixv_initialize_rss_mapping(adapter);
1459 } /* ixv_initialize_receive_units */
1460 
1461 /************************************************************************
1462  * ixv_setup_vlan_support
1463  ************************************************************************/
1464 static void
1465 ixv_setup_vlan_support(if_ctx_t ctx)
1466 {
1467 	struct adapter  *adapter = iflib_get_softc(ctx);
1468 	struct ixgbe_hw *hw = &adapter->hw;
1469 	u32             ctrl, vid, vfta, retry;
1470 
1471 	/*
1472 	 * We get here thru if_init, meaning
1473 	 * a soft reset, this has already cleared
1474 	 * the VFTA and other state, so if there
1475 	 * have been no vlan's registered do nothing.
1476 	 */
1477 	if (adapter->num_vlans == 0)
1478 		return;
1479 
1480 	/* Enable the queues */
1481 	for (int i = 0; i < adapter->num_rx_queues; i++) {
1482 		ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
1483 		ctrl |= IXGBE_RXDCTL_VME;
1484 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl);
1485 		/*
1486 		 * Let Rx path know that it needs to store VLAN tag
1487 		 * as part of extra mbuf info.
1488 		 */
1489 		adapter->rx_queues[i].rxr.vtag_strip = TRUE;
1490 	}
1491 
1492 	/*
1493 	 * A soft reset zero's out the VFTA, so
1494 	 * we need to repopulate it now.
1495 	 */
1496 	for (int i = 0; i < IXGBE_VFTA_SIZE; i++) {
1497 		if (ixv_shadow_vfta[i] == 0)
1498 			continue;
1499 		vfta = ixv_shadow_vfta[i];
1500 		/*
1501 		 * Reconstruct the vlan id's
1502 		 * based on the bits set in each
1503 		 * of the array ints.
1504 		 */
1505 		for (int j = 0; j < 32; j++) {
1506 			retry = 0;
1507 			if ((vfta & (1 << j)) == 0)
1508 				continue;
1509 			vid = (i * 32) + j;
1510 			/* Call the shared code mailbox routine */
1511 			while (hw->mac.ops.set_vfta(hw, vid, 0, TRUE, FALSE)) {
1512 				if (++retry > 5)
1513 					break;
1514 			}
1515 		}
1516 	}
1517 } /* ixv_setup_vlan_support */
1518 
1519 /************************************************************************
1520  * ixv_if_register_vlan
1521  *
1522  *   Run via a vlan config EVENT, it enables us to use the
1523  *   HW Filter table since we can get the vlan id. This just
1524  *   creates the entry in the soft version of the VFTA, init
1525  *   will repopulate the real table.
1526  ************************************************************************/
1527 static void
1528 ixv_if_register_vlan(if_ctx_t ctx, u16 vtag)
1529 {
1530 	struct adapter *adapter = iflib_get_softc(ctx);
1531 	u16            index, bit;
1532 
1533 	index = (vtag >> 5) & 0x7F;
1534 	bit = vtag & 0x1F;
1535 	ixv_shadow_vfta[index] |= (1 << bit);
1536 	++adapter->num_vlans;
1537 } /* ixv_if_register_vlan */
1538 
1539 /************************************************************************
1540  * ixv_if_unregister_vlan
1541  *
1542  *   Run via a vlan unconfig EVENT, remove our entry
1543  *   in the soft vfta.
1544  ************************************************************************/
1545 static void
1546 ixv_if_unregister_vlan(if_ctx_t ctx, u16 vtag)
1547 {
1548 	struct adapter *adapter = iflib_get_softc(ctx);
1549 	u16            index, bit;
1550 
1551 	index = (vtag >> 5) & 0x7F;
1552 	bit = vtag & 0x1F;
1553 	ixv_shadow_vfta[index] &= ~(1 << bit);
1554 	--adapter->num_vlans;
1555 } /* ixv_if_unregister_vlan */
1556 
1557 /************************************************************************
1558  * ixv_if_enable_intr
1559  ************************************************************************/
1560 static void
1561 ixv_if_enable_intr(if_ctx_t ctx)
1562 {
1563 	struct adapter  *adapter = iflib_get_softc(ctx);
1564 	struct ixgbe_hw *hw = &adapter->hw;
1565 	struct ix_rx_queue *que = adapter->rx_queues;
1566 	u32             mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
1567 
1568 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
1569 
1570 	mask = IXGBE_EIMS_ENABLE_MASK;
1571 	mask &= ~(IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
1572 	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
1573 
1574 	for (int i = 0; i < adapter->num_rx_queues; i++, que++)
1575 		ixv_enable_queue(adapter, que->msix);
1576 
1577 	IXGBE_WRITE_FLUSH(hw);
1578 } /* ixv_if_enable_intr */
1579 
1580 /************************************************************************
1581  * ixv_if_disable_intr
1582  ************************************************************************/
1583 static void
1584 ixv_if_disable_intr(if_ctx_t ctx)
1585 {
1586 	struct adapter *adapter = iflib_get_softc(ctx);
1587 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIAC, 0);
1588 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIMC, ~0);
1589 	IXGBE_WRITE_FLUSH(&adapter->hw);
1590 } /* ixv_if_disable_intr */
1591 
1592 /************************************************************************
1593  * ixv_if_rx_queue_intr_enable
1594  ************************************************************************/
1595 static int
1596 ixv_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
1597 {
1598 	struct adapter	*adapter = iflib_get_softc(ctx);
1599 	struct ix_rx_queue *que = &adapter->rx_queues[rxqid];
1600 
1601 	ixv_enable_queue(adapter, que->rxr.me);
1602 
1603 	return (0);
1604 } /* ixv_if_rx_queue_intr_enable */
1605 
1606 /************************************************************************
1607  * ixv_set_ivar
1608  *
1609  *   Setup the correct IVAR register for a particular MSI-X interrupt
1610  *    - entry is the register array entry
1611  *    - vector is the MSI-X vector for this queue
1612  *    - type is RX/TX/MISC
1613  ************************************************************************/
1614 static void
1615 ixv_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
1616 {
1617 	struct ixgbe_hw *hw = &adapter->hw;
1618 	u32             ivar, index;
1619 
1620 	vector |= IXGBE_IVAR_ALLOC_VAL;
1621 
1622 	if (type == -1) { /* MISC IVAR */
1623 		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
1624 		ivar &= ~0xFF;
1625 		ivar |= vector;
1626 		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
1627 	} else {          /* RX/TX IVARS */
1628 		index = (16 * (entry & 1)) + (8 * type);
1629 		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
1630 		ivar &= ~(0xFF << index);
1631 		ivar |= (vector << index);
1632 		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
1633 	}
1634 } /* ixv_set_ivar */
1635 
1636 /************************************************************************
1637  * ixv_configure_ivars
1638  ************************************************************************/
1639 static void
1640 ixv_configure_ivars(struct adapter *adapter)
1641 {
1642 	struct ix_rx_queue *que = adapter->rx_queues;
1643 
1644 	MPASS(adapter->num_rx_queues == adapter->num_tx_queues);
1645 
1646 	for (int i = 0; i < adapter->num_rx_queues; i++, que++) {
1647 		/* First the RX queue entry */
1648 		ixv_set_ivar(adapter, i, que->msix, 0);
1649 		/* ... and the TX */
1650 		ixv_set_ivar(adapter, i, que->msix, 1);
1651 		/* Set an initial value in EITR */
1652 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEITR(que->msix),
1653 		    IXGBE_EITR_DEFAULT);
1654 	}
1655 
1656 	/* For the mailbox interrupt */
1657 	ixv_set_ivar(adapter, 1, adapter->vector, -1);
1658 } /* ixv_configure_ivars */
1659 
1660 /************************************************************************
1661  * ixv_save_stats
1662  *
1663  *   The VF stats registers never have a truly virgin
1664  *   starting point, so this routine tries to make an
1665  *   artificial one, marking ground zero on attach as
1666  *   it were.
1667  ************************************************************************/
1668 static void
1669 ixv_save_stats(struct adapter *adapter)
1670 {
1671 	if (adapter->stats.vf.vfgprc || adapter->stats.vf.vfgptc) {
1672 		adapter->stats.vf.saved_reset_vfgprc +=
1673 		    adapter->stats.vf.vfgprc - adapter->stats.vf.base_vfgprc;
1674 		adapter->stats.vf.saved_reset_vfgptc +=
1675 		    adapter->stats.vf.vfgptc - adapter->stats.vf.base_vfgptc;
1676 		adapter->stats.vf.saved_reset_vfgorc +=
1677 		    adapter->stats.vf.vfgorc - adapter->stats.vf.base_vfgorc;
1678 		adapter->stats.vf.saved_reset_vfgotc +=
1679 		    adapter->stats.vf.vfgotc - adapter->stats.vf.base_vfgotc;
1680 		adapter->stats.vf.saved_reset_vfmprc +=
1681 		    adapter->stats.vf.vfmprc - adapter->stats.vf.base_vfmprc;
1682 	}
1683 } /* ixv_save_stats */
1684 
1685 /************************************************************************
1686  * ixv_init_stats
1687  ************************************************************************/
1688 static void
1689 ixv_init_stats(struct adapter *adapter)
1690 {
1691 	struct ixgbe_hw *hw = &adapter->hw;
1692 
1693 	adapter->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
1694 	adapter->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
1695 	adapter->stats.vf.last_vfgorc |=
1696 	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
1697 
1698 	adapter->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
1699 	adapter->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
1700 	adapter->stats.vf.last_vfgotc |=
1701 	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
1702 
1703 	adapter->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
1704 
1705 	adapter->stats.vf.base_vfgprc = adapter->stats.vf.last_vfgprc;
1706 	adapter->stats.vf.base_vfgorc = adapter->stats.vf.last_vfgorc;
1707 	adapter->stats.vf.base_vfgptc = adapter->stats.vf.last_vfgptc;
1708 	adapter->stats.vf.base_vfgotc = adapter->stats.vf.last_vfgotc;
1709 	adapter->stats.vf.base_vfmprc = adapter->stats.vf.last_vfmprc;
1710 } /* ixv_init_stats */
1711 
1712 #define UPDATE_STAT_32(reg, last, count)                \
1713 {                                                       \
1714 	u32 current = IXGBE_READ_REG(hw, reg);          \
1715 	if (current < last)                             \
1716 		count += 0x100000000LL;                 \
1717 	last = current;                                 \
1718 	count &= 0xFFFFFFFF00000000LL;                  \
1719 	count |= current;                               \
1720 }
1721 
1722 #define UPDATE_STAT_36(lsb, msb, last, count)           \
1723 {                                                       \
1724 	u64 cur_lsb = IXGBE_READ_REG(hw, lsb);          \
1725 	u64 cur_msb = IXGBE_READ_REG(hw, msb);          \
1726 	u64 current = ((cur_msb << 32) | cur_lsb);      \
1727 	if (current < last)                             \
1728 		count += 0x1000000000LL;                \
1729 	last = current;                                 \
1730 	count &= 0xFFFFFFF000000000LL;                  \
1731 	count |= current;                               \
1732 }
1733 
1734 /************************************************************************
1735  * ixv_update_stats - Update the board statistics counters.
1736  ************************************************************************/
1737 void
1738 ixv_update_stats(struct adapter *adapter)
1739 {
1740 	struct ixgbe_hw *hw = &adapter->hw;
1741 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
1742 
1743 	UPDATE_STAT_32(IXGBE_VFGPRC, adapter->stats.vf.last_vfgprc,
1744 	    adapter->stats.vf.vfgprc);
1745 	UPDATE_STAT_32(IXGBE_VFGPTC, adapter->stats.vf.last_vfgptc,
1746 	    adapter->stats.vf.vfgptc);
1747 	UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB,
1748 	    adapter->stats.vf.last_vfgorc, adapter->stats.vf.vfgorc);
1749 	UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB,
1750 	    adapter->stats.vf.last_vfgotc, adapter->stats.vf.vfgotc);
1751 	UPDATE_STAT_32(IXGBE_VFMPRC, adapter->stats.vf.last_vfmprc,
1752 	    adapter->stats.vf.vfmprc);
1753 
1754 	/* Fill out the OS statistics structure */
1755 	IXGBE_SET_IPACKETS(adapter, stats->vfgprc);
1756 	IXGBE_SET_OPACKETS(adapter, stats->vfgptc);
1757 	IXGBE_SET_IBYTES(adapter, stats->vfgorc);
1758 	IXGBE_SET_OBYTES(adapter, stats->vfgotc);
1759 	IXGBE_SET_IMCASTS(adapter, stats->vfmprc);
1760 } /* ixv_update_stats */
1761 
1762 /************************************************************************
1763  * ixv_add_stats_sysctls - Add statistic sysctls for the VF.
1764  ************************************************************************/
1765 static void
1766 ixv_add_stats_sysctls(struct adapter *adapter)
1767 {
1768 	device_t                dev = adapter->dev;
1769 	struct ix_tx_queue      *tx_que = adapter->tx_queues;
1770 	struct ix_rx_queue      *rx_que = adapter->rx_queues;
1771 	struct sysctl_ctx_list  *ctx = device_get_sysctl_ctx(dev);
1772 	struct sysctl_oid       *tree = device_get_sysctl_tree(dev);
1773 	struct sysctl_oid_list  *child = SYSCTL_CHILDREN(tree);
1774 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
1775 	struct sysctl_oid       *stat_node, *queue_node;
1776 	struct sysctl_oid_list  *stat_list, *queue_list;
1777 
1778 #define QUEUE_NAME_LEN 32
1779 	char                    namebuf[QUEUE_NAME_LEN];
1780 
1781 	/* Driver Statistics */
1782 	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
1783 	    CTLFLAG_RD, &adapter->watchdog_events, "Watchdog timeouts");
1784 	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
1785 	    CTLFLAG_RD, &adapter->link_irq, "Link MSI-X IRQ Handled");
1786 
1787 	for (int i = 0; i < adapter->num_tx_queues; i++, tx_que++) {
1788 		struct tx_ring *txr = &tx_que->txr;
1789 		snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1790 		queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1791 		    CTLFLAG_RD, NULL, "Queue Name");
1792 		queue_list = SYSCTL_CHILDREN(queue_node);
1793 
1794 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso_tx",
1795 		    CTLFLAG_RD, &(txr->tso_tx), "TSO Packets");
1796 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
1797 		    CTLFLAG_RD, &(txr->total_packets), "TX Packets");
1798 	}
1799 
1800 	for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++) {
1801 		struct rx_ring *rxr = &rx_que->rxr;
1802 		snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1803 		queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1804 		    CTLFLAG_RD, NULL, "Queue Name");
1805 		queue_list = SYSCTL_CHILDREN(queue_node);
1806 
1807 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
1808 		    CTLFLAG_RD, &(rx_que->irqs), "IRQs on queue");
1809 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
1810 		    CTLFLAG_RD, &(rxr->rx_packets), "RX packets");
1811 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
1812 		    CTLFLAG_RD, &(rxr->rx_bytes), "RX bytes");
1813 		SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_discarded",
1814 		    CTLFLAG_RD, &(rxr->rx_discarded), "Discarded RX packets");
1815 	}
1816 
1817 	stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac",
1818 	    CTLFLAG_RD, NULL, "VF Statistics (read from HW registers)");
1819 	stat_list = SYSCTL_CHILDREN(stat_node);
1820 
1821 	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_rcvd",
1822 	    CTLFLAG_RD, &stats->vfgprc, "Good Packets Received");
1823 	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_rcvd",
1824 	    CTLFLAG_RD, &stats->vfgorc, "Good Octets Received");
1825 	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_rcvd",
1826 	    CTLFLAG_RD, &stats->vfmprc, "Multicast Packets Received");
1827 	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
1828 	    CTLFLAG_RD, &stats->vfgptc, "Good Packets Transmitted");
1829 	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
1830 	    CTLFLAG_RD, &stats->vfgotc, "Good Octets Transmitted");
1831 } /* ixv_add_stats_sysctls */
1832 
1833 /************************************************************************
1834  * ixv_print_debug_info
1835  *
1836  *   Called only when em_display_debug_stats is enabled.
1837  *   Provides a way to take a look at important statistics
1838  *   maintained by the driver and hardware.
1839  ************************************************************************/
1840 static void
1841 ixv_print_debug_info(struct adapter *adapter)
1842 {
1843 	device_t        dev = adapter->dev;
1844 	struct ixgbe_hw *hw = &adapter->hw;
1845 
1846 	device_printf(dev, "Error Byte Count = %u \n",
1847 	    IXGBE_READ_REG(hw, IXGBE_ERRBC));
1848 
1849 	device_printf(dev, "MBX IRQ Handled: %lu\n", (long)adapter->link_irq);
1850 } /* ixv_print_debug_info */
1851 
1852 /************************************************************************
1853  * ixv_sysctl_debug
1854  ************************************************************************/
1855 static int
1856 ixv_sysctl_debug(SYSCTL_HANDLER_ARGS)
1857 {
1858 	struct adapter *adapter;
1859 	int            error, result;
1860 
1861 	result = -1;
1862 	error = sysctl_handle_int(oidp, &result, 0, req);
1863 
1864 	if (error || !req->newptr)
1865 		return (error);
1866 
1867 	if (result == 1) {
1868 		adapter = (struct adapter *)arg1;
1869 		ixv_print_debug_info(adapter);
1870 	}
1871 
1872 	return error;
1873 } /* ixv_sysctl_debug */
1874 
1875 /************************************************************************
1876  * ixv_init_device_features
1877  ************************************************************************/
1878 static void
1879 ixv_init_device_features(struct adapter *adapter)
1880 {
1881 	adapter->feat_cap = IXGBE_FEATURE_NETMAP
1882 	                  | IXGBE_FEATURE_VF
1883 	                  | IXGBE_FEATURE_RSS
1884 	                  | IXGBE_FEATURE_LEGACY_TX;
1885 
1886 	/* A tad short on feature flags for VFs, atm. */
1887 	switch (adapter->hw.mac.type) {
1888 	case ixgbe_mac_82599_vf:
1889 		break;
1890 	case ixgbe_mac_X540_vf:
1891 		break;
1892 	case ixgbe_mac_X550_vf:
1893 	case ixgbe_mac_X550EM_x_vf:
1894 	case ixgbe_mac_X550EM_a_vf:
1895 		adapter->feat_cap |= IXGBE_FEATURE_NEEDS_CTXD;
1896 		break;
1897 	default:
1898 		break;
1899 	}
1900 
1901 	/* Enabled by default... */
1902 	/* Is a virtual function (VF) */
1903 	if (adapter->feat_cap & IXGBE_FEATURE_VF)
1904 		adapter->feat_en |= IXGBE_FEATURE_VF;
1905 	/* Netmap */
1906 	if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
1907 		adapter->feat_en |= IXGBE_FEATURE_NETMAP;
1908 	/* Receive-Side Scaling (RSS) */
1909 	if (adapter->feat_cap & IXGBE_FEATURE_RSS)
1910 		adapter->feat_en |= IXGBE_FEATURE_RSS;
1911 	/* Needs advanced context descriptor regardless of offloads req'd */
1912 	if (adapter->feat_cap & IXGBE_FEATURE_NEEDS_CTXD)
1913 		adapter->feat_en |= IXGBE_FEATURE_NEEDS_CTXD;
1914 } /* ixv_init_device_features */
1915 
1916