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