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