]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixl/if_ixl.c
Update to ELF Tool Chain r3475
[FreeBSD/FreeBSD.git] / sys / dev / ixl / if_ixl.c
1 /******************************************************************************
2
3   Copyright (c) 2013-2015, 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 #ifndef IXL_STANDALONE_BUILD
36 #include "opt_inet.h"
37 #include "opt_inet6.h"
38 #include "opt_rss.h"
39 #endif
40
41 #include "ixl.h"
42 #include "ixl_pf.h"
43
44 #ifdef RSS
45 #include <net/rss_config.h>
46 #endif
47
48 /*********************************************************************
49  *  Driver version
50  *********************************************************************/
51 char ixl_driver_version[] = "1.4.27-k";
52
53 /*********************************************************************
54  *  PCI Device ID Table
55  *
56  *  Used by probe to select devices to load on
57  *  Last field stores an index into ixl_strings
58  *  Last entry must be all 0s
59  *
60  *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
61  *********************************************************************/
62
63 static ixl_vendor_info_t ixl_vendor_info_array[] =
64 {
65         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_SFP_XL710, 0, 0, 0},
66         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_KX_B, 0, 0, 0},
67         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_KX_C, 0, 0, 0},
68         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_A, 0, 0, 0},
69         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_B, 0, 0, 0},
70         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_QSFP_C, 0, 0, 0},
71         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T, 0, 0, 0},
72         {I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T4, 0, 0, 0},
73         /* required last entry */
74         {0, 0, 0, 0, 0}
75 };
76
77 /*********************************************************************
78  *  Table of branding strings
79  *********************************************************************/
80
81 static char    *ixl_strings[] = {
82         "Intel(R) Ethernet Connection XL710 Driver"
83 };
84
85
86 /*********************************************************************
87  *  Function prototypes
88  *********************************************************************/
89 static int      ixl_probe(device_t);
90 static int      ixl_attach(device_t);
91 static int      ixl_detach(device_t);
92 static int      ixl_shutdown(device_t);
93 static int      ixl_get_hw_capabilities(struct ixl_pf *);
94 static void     ixl_cap_txcsum_tso(struct ixl_vsi *, struct ifnet *, int);
95 static int      ixl_ioctl(struct ifnet *, u_long, caddr_t);
96 static void     ixl_init(void *);
97 static void     ixl_init_locked(struct ixl_pf *);
98 static void     ixl_stop(struct ixl_pf *);
99 static void     ixl_stop_locked(struct ixl_pf *);
100 static void     ixl_media_status(struct ifnet *, struct ifmediareq *);
101 static int      ixl_media_change(struct ifnet *);
102 static void     ixl_update_link_status(struct ixl_pf *);
103 static int      ixl_allocate_pci_resources(struct ixl_pf *);
104 static u16      ixl_get_bus_info(struct i40e_hw *, device_t);
105 static int      ixl_setup_stations(struct ixl_pf *);
106 static int      ixl_switch_config(struct ixl_pf *);
107 static int      ixl_initialize_vsi(struct ixl_vsi *);
108
109 static int      ixl_setup_adminq_msix(struct ixl_pf *);
110 static int      ixl_setup_adminq_tq(struct ixl_pf *);
111 static int      ixl_setup_queue_msix(struct ixl_vsi *);
112 static int      ixl_setup_queue_tqs(struct ixl_vsi *);
113 static int      ixl_teardown_adminq_msix(struct ixl_pf *);
114 static int      ixl_teardown_queue_msix(struct ixl_vsi *);
115 static void     ixl_configure_intr0_msix(struct ixl_pf *);
116 static void     ixl_configure_queue_intr_msix(struct ixl_pf *);
117 static void     ixl_free_queue_tqs(struct ixl_vsi *);
118 static void     ixl_free_adminq_tq(struct ixl_pf *);
119
120 static int      ixl_assign_vsi_legacy(struct ixl_pf *);
121 static int      ixl_init_msix(struct ixl_pf *);
122 static void     ixl_configure_itr(struct ixl_pf *);
123 static void     ixl_configure_legacy(struct ixl_pf *);
124 static void     ixl_free_pci_resources(struct ixl_pf *);
125 static void     ixl_local_timer(void *);
126 static int      ixl_setup_interface(device_t, struct ixl_vsi *);
127 static void     ixl_link_event(struct ixl_pf *, struct i40e_arq_event_info *);
128 static void     ixl_config_rss(struct ixl_vsi *);
129 static void     ixl_set_queue_rx_itr(struct ixl_queue *);
130 static void     ixl_set_queue_tx_itr(struct ixl_queue *);
131 static int      ixl_set_advertised_speeds(struct ixl_pf *, int);
132 static void     ixl_get_initial_advertised_speeds(struct ixl_pf *);
133
134 static int      ixl_enable_rings(struct ixl_vsi *);
135 static int      ixl_disable_rings(struct ixl_vsi *);
136 static void     ixl_enable_intr(struct ixl_vsi *);
137 static void     ixl_disable_intr(struct ixl_vsi *);
138 static void     ixl_disable_rings_intr(struct ixl_vsi *);
139
140 static void     ixl_enable_adminq(struct i40e_hw *);
141 static void     ixl_disable_adminq(struct i40e_hw *);
142 static void     ixl_enable_queue(struct i40e_hw *, int);
143 static void     ixl_disable_queue(struct i40e_hw *, int);
144 static void     ixl_enable_legacy(struct i40e_hw *);
145 static void     ixl_disable_legacy(struct i40e_hw *);
146
147 static void     ixl_set_promisc(struct ixl_vsi *);
148 static void     ixl_add_multi(struct ixl_vsi *);
149 static void     ixl_del_multi(struct ixl_vsi *);
150 static void     ixl_register_vlan(void *, struct ifnet *, u16);
151 static void     ixl_unregister_vlan(void *, struct ifnet *, u16);
152 static void     ixl_setup_vlan_filters(struct ixl_vsi *);
153
154 static void     ixl_init_filters(struct ixl_vsi *);
155 static void     ixl_reconfigure_filters(struct ixl_vsi *vsi);
156 static void     ixl_add_filter(struct ixl_vsi *, u8 *, s16 vlan);
157 static void     ixl_del_filter(struct ixl_vsi *, u8 *, s16 vlan);
158 static void     ixl_add_hw_filters(struct ixl_vsi *, int, int);
159 static void     ixl_del_hw_filters(struct ixl_vsi *, int);
160 static struct ixl_mac_filter *
161                 ixl_find_filter(struct ixl_vsi *, u8 *, s16);
162 static void     ixl_add_mc_filter(struct ixl_vsi *, u8 *);
163 static void     ixl_free_mac_filters(struct ixl_vsi *vsi);
164
165 /* Sysctls*/
166 static void     ixl_add_device_sysctls(struct ixl_pf *);
167
168 static int      ixl_set_flowcntl(SYSCTL_HANDLER_ARGS);
169 static int      ixl_set_advertise(SYSCTL_HANDLER_ARGS);
170 static int      ixl_current_speed(SYSCTL_HANDLER_ARGS);
171 static int      ixl_sysctl_show_fw(SYSCTL_HANDLER_ARGS);
172
173 #ifdef IXL_DEBUG_SYSCTL
174 static int      ixl_debug_info(SYSCTL_HANDLER_ARGS);
175 static void     ixl_print_debug_info(struct ixl_pf *);
176
177 static int      ixl_sysctl_link_status(SYSCTL_HANDLER_ARGS);
178 static int      ixl_sysctl_phy_abilities(SYSCTL_HANDLER_ARGS);
179 static int      ixl_sysctl_sw_filter_list(SYSCTL_HANDLER_ARGS);
180 static int      ixl_sysctl_hw_res_alloc(SYSCTL_HANDLER_ARGS);
181 static int      ixl_sysctl_switch_config(SYSCTL_HANDLER_ARGS);
182 #endif
183
184 /* The MSI/X Interrupt handlers */
185 static void     ixl_intr(void *);
186 static void     ixl_msix_que(void *);
187 static void     ixl_msix_adminq(void *);
188 static void     ixl_handle_mdd_event(struct ixl_pf *);
189
190 /* Deferred interrupt tasklets */
191 static void     ixl_do_adminq(void *, int);
192
193 /* Statistics */
194 static void     ixl_add_hw_stats(struct ixl_pf *);
195 static void     ixl_add_sysctls_mac_stats(struct sysctl_ctx_list *,
196                     struct sysctl_oid_list *, struct i40e_hw_port_stats *);
197 static void     ixl_add_sysctls_eth_stats(struct sysctl_ctx_list *,
198                     struct sysctl_oid_list *,
199                     struct i40e_eth_stats *);
200 static void     ixl_update_stats_counters(struct ixl_pf *);
201 static void     ixl_update_eth_stats(struct ixl_vsi *);
202 static void     ixl_update_vsi_stats(struct ixl_vsi *);
203 static void     ixl_pf_reset_stats(struct ixl_pf *);
204 static void     ixl_vsi_reset_stats(struct ixl_vsi *);
205 static void     ixl_stat_update48(struct i40e_hw *, u32, u32, bool,
206                     u64 *, u64 *);
207 static void     ixl_stat_update32(struct i40e_hw *, u32, bool,
208                     u64 *, u64 *);
209 /* NVM update */
210 static int      ixl_handle_nvmupd_cmd(struct ixl_pf *, struct ifdrv *);
211 static void     ixl_handle_empr_reset(struct ixl_pf *);
212 static int      ixl_rebuild_hw_structs_after_reset(struct ixl_pf *);
213
214 /* Debug helper functions */
215 #ifdef IXL_DEBUG
216 static void     ixl_print_nvm_cmd(device_t, struct i40e_nvm_access *);
217 #endif
218
219 #ifdef PCI_IOV
220 static int      ixl_adminq_err_to_errno(enum i40e_admin_queue_err err);
221
222 static int      ixl_iov_init(device_t dev, uint16_t num_vfs, const nvlist_t*);
223 static void     ixl_iov_uninit(device_t dev);
224 static int      ixl_add_vf(device_t dev, uint16_t vfnum, const nvlist_t*);
225
226 static void     ixl_handle_vf_msg(struct ixl_pf *,
227                     struct i40e_arq_event_info *);
228 static void     ixl_handle_vflr(void *arg, int pending);
229
230 static void     ixl_reset_vf(struct ixl_pf *pf, struct ixl_vf *vf);
231 static void     ixl_reinit_vf(struct ixl_pf *pf, struct ixl_vf *vf);
232 #endif
233
234 /*********************************************************************
235  *  FreeBSD Device Interface Entry Points
236  *********************************************************************/
237
238 static device_method_t ixl_methods[] = {
239         /* Device interface */
240         DEVMETHOD(device_probe, ixl_probe),
241         DEVMETHOD(device_attach, ixl_attach),
242         DEVMETHOD(device_detach, ixl_detach),
243         DEVMETHOD(device_shutdown, ixl_shutdown),
244 #ifdef PCI_IOV
245         DEVMETHOD(pci_iov_init, ixl_iov_init),
246         DEVMETHOD(pci_iov_uninit, ixl_iov_uninit),
247         DEVMETHOD(pci_iov_add_vf, ixl_add_vf),
248 #endif
249         {0, 0}
250 };
251
252 static driver_t ixl_driver = {
253         "ixl", ixl_methods, sizeof(struct ixl_pf),
254 };
255
256 devclass_t ixl_devclass;
257 DRIVER_MODULE(ixl, pci, ixl_driver, ixl_devclass, 0, 0);
258
259 MODULE_DEPEND(ixl, pci, 1, 1, 1);
260 MODULE_DEPEND(ixl, ether, 1, 1, 1);
261 #ifdef DEV_NETMAP
262 MODULE_DEPEND(ixl, netmap, 1, 1, 1);
263 #endif /* DEV_NETMAP */
264
265 /*
266 ** Global reset mutex
267 */
268 static struct mtx ixl_reset_mtx;
269
270 /*
271 ** TUNEABLE PARAMETERS:
272 */
273
274 static SYSCTL_NODE(_hw, OID_AUTO, ixl, CTLFLAG_RD, 0,
275                    "IXL driver parameters");
276
277 /*
278  * MSIX should be the default for best performance,
279  * but this allows it to be forced off for testing.
280  */
281 static int ixl_enable_msix = 1;
282 TUNABLE_INT("hw.ixl.enable_msix", &ixl_enable_msix);
283 SYSCTL_INT(_hw_ixl, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixl_enable_msix, 0,
284     "Enable MSI-X interrupts");
285
286 /*
287 ** Number of descriptors per ring:
288 **   - TX and RX are the same size
289 */
290 static int ixl_ringsz = DEFAULT_RING;
291 TUNABLE_INT("hw.ixl.ringsz", &ixl_ringsz);
292 SYSCTL_INT(_hw_ixl, OID_AUTO, ring_size, CTLFLAG_RDTUN,
293     &ixl_ringsz, 0, "Descriptor Ring Size");
294
295 /* 
296 ** This can be set manually, if left as 0 the
297 ** number of queues will be calculated based
298 ** on cpus and msix vectors available.
299 */
300 int ixl_max_queues = 0;
301 TUNABLE_INT("hw.ixl.max_queues", &ixl_max_queues);
302 SYSCTL_INT(_hw_ixl, OID_AUTO, max_queues, CTLFLAG_RDTUN,
303     &ixl_max_queues, 0, "Number of Queues");
304
305 /*
306 ** Controls for Interrupt Throttling 
307 **      - true/false for dynamic adjustment
308 **      - default values for static ITR
309 */
310 int ixl_dynamic_rx_itr = 1;
311 TUNABLE_INT("hw.ixl.dynamic_rx_itr", &ixl_dynamic_rx_itr);
312 SYSCTL_INT(_hw_ixl, OID_AUTO, dynamic_rx_itr, CTLFLAG_RDTUN,
313     &ixl_dynamic_rx_itr, 0, "Dynamic RX Interrupt Rate");
314
315 int ixl_dynamic_tx_itr = 1;
316 TUNABLE_INT("hw.ixl.dynamic_tx_itr", &ixl_dynamic_tx_itr);
317 SYSCTL_INT(_hw_ixl, OID_AUTO, dynamic_tx_itr, CTLFLAG_RDTUN,
318     &ixl_dynamic_tx_itr, 0, "Dynamic TX Interrupt Rate");
319
320 int ixl_rx_itr = IXL_ITR_8K;
321 TUNABLE_INT("hw.ixl.rx_itr", &ixl_rx_itr);
322 SYSCTL_INT(_hw_ixl, OID_AUTO, rx_itr, CTLFLAG_RDTUN,
323     &ixl_rx_itr, 0, "RX Interrupt Rate");
324
325 int ixl_tx_itr = IXL_ITR_4K;
326 TUNABLE_INT("hw.ixl.tx_itr", &ixl_tx_itr);
327 SYSCTL_INT(_hw_ixl, OID_AUTO, tx_itr, CTLFLAG_RDTUN,
328     &ixl_tx_itr, 0, "TX Interrupt Rate");
329
330 #ifdef IXL_FDIR
331 static int ixl_enable_fdir = 1;
332 TUNABLE_INT("hw.ixl.enable_fdir", &ixl_enable_fdir);
333 /* Rate at which we sample */
334 int ixl_atr_rate = 20;
335 TUNABLE_INT("hw.ixl.atr_rate", &ixl_atr_rate);
336 #endif
337
338 #ifdef DEV_NETMAP
339 #define NETMAP_IXL_MAIN /* only bring in one part of the netmap code */
340 #include <dev/netmap/if_ixl_netmap.h>
341 #endif /* DEV_NETMAP */
342
343 static char *ixl_fc_string[6] = {
344         "None",
345         "Rx",
346         "Tx",
347         "Full",
348         "Priority",
349         "Default"
350 };
351
352 static MALLOC_DEFINE(M_IXL, "ixl", "ixl driver allocations");
353
354 static uint8_t ixl_bcast_addr[ETHER_ADDR_LEN] =
355     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
356
357 /*********************************************************************
358  *  Device identification routine
359  *
360  *  ixl_probe determines if the driver should be loaded on
361  *  the hardware based on PCI vendor/device id of the device.
362  *
363  *  return BUS_PROBE_DEFAULT on success, positive on failure
364  *********************************************************************/
365
366 static int
367 ixl_probe(device_t dev)
368 {
369         ixl_vendor_info_t *ent;
370
371         u16     pci_vendor_id, pci_device_id;
372         u16     pci_subvendor_id, pci_subdevice_id;
373         char    device_name[256];
374         static bool lock_init = FALSE;
375
376 #if 0
377         INIT_DEBUGOUT("ixl_probe: begin");
378 #endif
379         pci_vendor_id = pci_get_vendor(dev);
380         if (pci_vendor_id != I40E_INTEL_VENDOR_ID)
381                 return (ENXIO);
382
383         pci_device_id = pci_get_device(dev);
384         pci_subvendor_id = pci_get_subvendor(dev);
385         pci_subdevice_id = pci_get_subdevice(dev);
386
387         ent = ixl_vendor_info_array;
388         while (ent->vendor_id != 0) {
389                 if ((pci_vendor_id == ent->vendor_id) &&
390                     (pci_device_id == ent->device_id) &&
391
392                     ((pci_subvendor_id == ent->subvendor_id) ||
393                      (ent->subvendor_id == 0)) &&
394
395                     ((pci_subdevice_id == ent->subdevice_id) ||
396                      (ent->subdevice_id == 0))) {
397                         sprintf(device_name, "%s, Version - %s",
398                                 ixl_strings[ent->index],
399                                 ixl_driver_version);
400                         device_set_desc_copy(dev, device_name);
401                         /* One shot mutex init */
402                         if (lock_init == FALSE) {
403                                 lock_init = TRUE;
404                                 mtx_init(&ixl_reset_mtx,
405                                     "ixl_reset",
406                                     "IXL RESET Lock", MTX_DEF);
407                         }
408                         return (BUS_PROBE_DEFAULT);
409                 }
410                 ent++;
411         }
412         return (ENXIO);
413 }
414
415 /*********************************************************************
416  *  Device initialization routine
417  *
418  *  The attach entry point is called when the driver is being loaded.
419  *  This routine identifies the type of hardware, allocates all resources
420  *  and initializes the hardware.
421  *
422  *  return 0 on success, positive on failure
423  *********************************************************************/
424
425 static int
426 ixl_attach(device_t dev)
427 {
428         struct ixl_pf   *pf;
429         struct i40e_hw  *hw;
430         struct ixl_vsi  *vsi;
431         u16             bus;
432         int             error = 0;
433 #ifdef PCI_IOV
434         nvlist_t        *pf_schema, *vf_schema;
435         int             iov_error;
436 #endif
437
438         INIT_DEBUGOUT("ixl_attach: begin");
439
440         /* Allocate, clear, and link in our primary soft structure */
441         pf = device_get_softc(dev);
442         pf->dev = pf->osdep.dev = dev;
443         hw = &pf->hw;
444
445         /*
446         ** Note this assumes we have a single embedded VSI,
447         ** this could be enhanced later to allocate multiple
448         */
449         vsi = &pf->vsi;
450         vsi->dev = pf->dev;
451
452         /* Core Lock Init*/
453         IXL_PF_LOCK_INIT(pf, device_get_nameunit(dev));
454
455         /* Set up the timer callout */
456         callout_init_mtx(&pf->timer, &pf->pf_mtx, 0);
457
458         /* Save off the PCI information */
459         hw->vendor_id = pci_get_vendor(dev);
460         hw->device_id = pci_get_device(dev);
461         hw->revision_id = pci_read_config(dev, PCIR_REVID, 1);
462         hw->subsystem_vendor_id =
463             pci_read_config(dev, PCIR_SUBVEND_0, 2);
464         hw->subsystem_device_id =
465             pci_read_config(dev, PCIR_SUBDEV_0, 2);
466
467         hw->bus.device = pci_get_slot(dev);
468         hw->bus.func = pci_get_function(dev);
469
470         pf->vc_debug_lvl = 1;
471
472         /* Do PCI setup - map BAR0, etc */
473         if (ixl_allocate_pci_resources(pf)) {
474                 device_printf(dev, "Allocation of PCI resources failed\n");
475                 error = ENXIO;
476                 goto err_out;
477         }
478
479         /* Establish a clean starting point */
480         i40e_clear_hw(hw);
481         error = i40e_pf_reset(hw);
482         if (error) {
483                 device_printf(dev, "PF reset failure %d\n", error);
484                 error = EIO;
485                 goto err_out;
486         }
487
488         /* Set admin queue parameters */
489         hw->aq.num_arq_entries = IXL_AQ_LEN;
490         hw->aq.num_asq_entries = IXL_AQ_LEN;
491         hw->aq.arq_buf_size = IXL_AQ_BUFSZ;
492         hw->aq.asq_buf_size = IXL_AQ_BUFSZ;
493
494         /* Initialize mac filter list for VSI */
495         SLIST_INIT(&vsi->ftl);
496
497         /* Initialize the shared code */
498         error = i40e_init_shared_code(hw);
499         if (error) {
500                 device_printf(dev, "Unable to initialize shared code, error %d\n",
501                     error);
502                 error = EIO;
503                 goto err_out;
504         }
505
506         /* Set up the admin queue */
507         error = i40e_init_adminq(hw);
508         if (error != 0 && error != I40E_ERR_FIRMWARE_API_VERSION) {
509                 device_printf(dev, "Unable to initialize Admin Queue, error %d\n",
510                     error);
511                 error = EIO;
512                 goto err_out;
513         }
514         ixl_print_nvm_version(pf);
515
516         if (error == I40E_ERR_FIRMWARE_API_VERSION) {
517                 device_printf(dev, "The driver for the device stopped "
518                     "because the NVM image is newer than expected.\n"
519                     "You must install the most recent version of "
520                     "the network driver.\n");
521                 error = EIO;
522                 goto err_out;
523         }
524
525         if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
526             hw->aq.api_min_ver > I40E_FW_API_VERSION_MINOR)
527                 device_printf(dev, "The driver for the device detected "
528                     "a newer version of the NVM image than expected.\n"
529                     "Please install the most recent version of the network driver.\n");
530         else if (hw->aq.api_maj_ver < I40E_FW_API_VERSION_MAJOR ||
531             hw->aq.api_min_ver < (I40E_FW_API_VERSION_MINOR - 1))
532                 device_printf(dev, "The driver for the device detected "
533                     "an older version of the NVM image than expected.\n"
534                     "Please update the NVM image.\n");
535
536         /* Clear PXE mode */
537         i40e_clear_pxe_mode(hw);
538
539         /* Get capabilities from the device */
540         error = ixl_get_hw_capabilities(pf);
541         if (error) {
542                 device_printf(dev, "HW capabilities failure!\n");
543                 goto err_get_cap;
544         }
545
546         /* Set up host memory cache */
547         error = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp,
548             hw->func_caps.num_rx_qp, 0, 0);
549         if (error) {
550                 device_printf(dev, "init_lan_hmc failed: %d\n", error);
551                 goto err_get_cap;
552         }
553
554         error = i40e_configure_lan_hmc(hw, I40E_HMC_MODEL_DIRECT_ONLY);
555         if (error) {
556                 device_printf(dev, "configure_lan_hmc failed: %d\n", error);
557                 goto err_mac_hmc;
558         }
559
560         /* Disable LLDP from the firmware for certain NVM versions */
561         if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) ||
562             (pf->hw.aq.fw_maj_ver < 4))
563                 i40e_aq_stop_lldp(hw, TRUE, NULL);
564
565         i40e_get_mac_addr(hw, hw->mac.addr);
566         error = i40e_validate_mac_addr(hw->mac.addr);
567         if (error) {
568                 device_printf(dev, "validate_mac_addr failed: %d\n", error);
569                 goto err_mac_hmc;
570         }
571         bcopy(hw->mac.addr, hw->mac.perm_addr, ETHER_ADDR_LEN);
572         i40e_get_port_mac_addr(hw, hw->mac.port_addr);
573
574         /* Set up VSI and queues */
575         if (ixl_setup_stations(pf) != 0) { 
576                 device_printf(dev, "setup stations failed!\n");
577                 error = ENOMEM;
578                 goto err_mac_hmc;
579         }
580
581         if (((hw->aq.fw_maj_ver == 4) && (hw->aq.fw_min_ver < 33)) ||
582             (hw->aq.fw_maj_ver < 4)) {
583                 i40e_msec_delay(75);
584                 error = i40e_aq_set_link_restart_an(hw, TRUE, NULL);
585                 if (error) {
586                         device_printf(dev, "link restart failed, aq_err=%d\n",
587                             pf->hw.aq.asq_last_status);
588                         goto err_late;
589                 }
590         }
591
592         /* Determine link state */
593         hw->phy.get_link_info = TRUE;
594         i40e_get_link_status(hw, &pf->link_up);
595
596         /* Setup OS network interface / ifnet */
597         if (ixl_setup_interface(dev, vsi) != 0) {
598                 device_printf(dev, "interface setup failed!\n");
599                 error = EIO;
600                 goto err_late;
601         }
602
603         error = ixl_switch_config(pf);
604         if (error) {
605                 device_printf(dev, "Initial ixl_switch_config() failed: %d\n",
606                      error);
607                 goto err_late;
608         }
609
610         /* Limit PHY interrupts to link, autoneg, and modules failure */
611         error = i40e_aq_set_phy_int_mask(hw, IXL_DEFAULT_PHY_INT_MASK,
612             NULL);
613         if (error) {
614                 device_printf(dev, "i40e_aq_set_phy_mask() failed: err %d,"
615                     " aq_err %d\n", error, hw->aq.asq_last_status);
616                 goto err_late;
617         }
618
619         /* Get the bus configuration and set the shared code's config */
620         bus = ixl_get_bus_info(hw, dev);
621         i40e_set_pci_config_data(hw, bus);
622
623         /*
624          * In MSI-X mode, initialize the Admin Queue interrupt,
625          * so userland tools can communicate with the adapter regardless of
626          * the ifnet interface's status.
627          */
628         if (pf->msix > 1) {
629                 error = ixl_setup_adminq_msix(pf);
630                 if (error) {
631                         device_printf(dev, "ixl_setup_adminq_msix error: %d\n",
632                             error);
633                         goto err_late;
634                 }
635                 error = ixl_setup_adminq_tq(pf);
636                 if (error) {
637                         device_printf(dev, "ixl_setup_adminq_tq error: %d\n",
638                             error);
639                         goto err_late;
640                 }
641                 ixl_configure_intr0_msix(pf);
642                 ixl_enable_adminq(hw);
643         }
644
645         /* Initialize statistics & add sysctls */
646         ixl_add_device_sysctls(pf);
647
648         ixl_pf_reset_stats(pf);
649         ixl_update_stats_counters(pf);
650         ixl_add_hw_stats(pf);
651
652         /* Register for VLAN events */
653         vsi->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
654             ixl_register_vlan, vsi, EVENTHANDLER_PRI_FIRST);
655         vsi->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
656             ixl_unregister_vlan, vsi, EVENTHANDLER_PRI_FIRST);
657
658 #ifdef PCI_IOV
659         /* SR-IOV is only supported when MSI-X is in use. */
660         if (pf->msix > 1) {
661                 pf_schema = pci_iov_schema_alloc_node();
662                 vf_schema = pci_iov_schema_alloc_node();
663                 pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
664                 pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
665                     IOV_SCHEMA_HASDEFAULT, TRUE);
666                 pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
667                     IOV_SCHEMA_HASDEFAULT, FALSE);
668                 pci_iov_schema_add_bool(vf_schema, "allow-promisc",
669                     IOV_SCHEMA_HASDEFAULT, FALSE);
670
671                 iov_error = pci_iov_attach(dev, pf_schema, vf_schema);
672                 if (iov_error != 0) {
673                         device_printf(dev,
674                             "Failed to initialize SR-IOV (error=%d)\n",
675                             iov_error);
676                 } else
677                         device_printf(dev, "SR-IOV ready\n");
678         }
679 #endif
680
681 #ifdef DEV_NETMAP
682         ixl_netmap_attach(vsi);
683 #endif /* DEV_NETMAP */
684         INIT_DEBUGOUT("ixl_attach: end");
685         return (0);
686
687 err_late:
688         if (vsi->ifp != NULL)
689                 if_free(vsi->ifp);
690 err_mac_hmc:
691         i40e_shutdown_lan_hmc(hw);
692 err_get_cap:
693         i40e_shutdown_adminq(hw);
694 err_out:
695         ixl_free_pci_resources(pf);
696         ixl_free_vsi(vsi);
697         IXL_PF_LOCK_DESTROY(pf);
698         return (error);
699 }
700
701 /*********************************************************************
702  *  Device removal routine
703  *
704  *  The detach entry point is called when the driver is being removed.
705  *  This routine stops the adapter and deallocates all the resources
706  *  that were allocated for driver operation.
707  *
708  *  return 0 on success, positive on failure
709  *********************************************************************/
710
711 static int
712 ixl_detach(device_t dev)
713 {
714         struct ixl_pf           *pf = device_get_softc(dev);
715         struct i40e_hw          *hw = &pf->hw;
716         struct ixl_vsi          *vsi = &pf->vsi;
717         enum i40e_status_code   status;
718 #ifdef PCI_IOV
719         int                     error;
720 #endif
721
722         INIT_DEBUGOUT("ixl_detach: begin");
723
724         /* Make sure VLANS are not using driver */
725         if (vsi->ifp->if_vlantrunk != NULL) {
726                 device_printf(dev, "Vlan in use, detach first\n");
727                 return (EBUSY);
728         }
729
730 #ifdef PCI_IOV
731         error = pci_iov_detach(dev);
732         if (error != 0) {
733                 device_printf(dev, "SR-IOV in use; detach first.\n");
734                 return (error);
735         }
736 #endif
737
738         ether_ifdetach(vsi->ifp);
739         if (vsi->ifp->if_drv_flags & IFF_DRV_RUNNING)
740                 ixl_stop(pf);
741
742         ixl_free_queue_tqs(vsi);
743
744         /* Shutdown LAN HMC */
745         status = i40e_shutdown_lan_hmc(hw);
746         if (status)
747                 device_printf(dev,
748                     "Shutdown LAN HMC failed with code %d\n", status);
749
750         /* Shutdown admin queue */
751         ixl_disable_adminq(hw);
752         ixl_free_adminq_tq(pf);
753         ixl_teardown_adminq_msix(pf);
754         status = i40e_shutdown_adminq(hw);
755         if (status)
756                 device_printf(dev,
757                     "Shutdown Admin queue failed with code %d\n", status);
758
759         /* Unregister VLAN events */
760         if (vsi->vlan_attach != NULL)
761                 EVENTHANDLER_DEREGISTER(vlan_config, vsi->vlan_attach);
762         if (vsi->vlan_detach != NULL)
763                 EVENTHANDLER_DEREGISTER(vlan_unconfig, vsi->vlan_detach);
764
765         callout_drain(&pf->timer);
766 #ifdef DEV_NETMAP
767         netmap_detach(vsi->ifp);
768 #endif /* DEV_NETMAP */
769         ixl_free_pci_resources(pf);
770         bus_generic_detach(dev);
771         if_free(vsi->ifp);
772         ixl_free_vsi(vsi);
773         IXL_PF_LOCK_DESTROY(pf);
774         return (0);
775 }
776
777 /*********************************************************************
778  *
779  *  Shutdown entry point
780  *
781  **********************************************************************/
782
783 static int
784 ixl_shutdown(device_t dev)
785 {
786         struct ixl_pf *pf = device_get_softc(dev);
787         ixl_stop(pf);
788         return (0);
789 }
790
791
792 /*********************************************************************
793  *
794  *  Get the hardware capabilities
795  *
796  **********************************************************************/
797
798 static int
799 ixl_get_hw_capabilities(struct ixl_pf *pf)
800 {
801         struct i40e_aqc_list_capabilities_element_resp *buf;
802         struct i40e_hw  *hw = &pf->hw;
803         device_t        dev = pf->dev;
804         int             error, len;
805         u16             needed;
806         bool            again = TRUE;
807
808         len = 40 * sizeof(struct i40e_aqc_list_capabilities_element_resp);
809 retry:
810         if (!(buf = (struct i40e_aqc_list_capabilities_element_resp *)
811             malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO))) {
812                 device_printf(dev, "Unable to allocate cap memory\n");
813                 return (ENOMEM);
814         }
815
816         /* This populates the hw struct */
817         error = i40e_aq_discover_capabilities(hw, buf, len,
818             &needed, i40e_aqc_opc_list_func_capabilities, NULL);
819         free(buf, M_DEVBUF);
820         if ((pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOMEM) &&
821             (again == TRUE)) {
822                 /* retry once with a larger buffer */
823                 again = FALSE;
824                 len = needed;
825                 goto retry;
826         } else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK) {
827                 device_printf(dev, "capability discovery failed: %d\n",
828                     pf->hw.aq.asq_last_status);
829                 return (ENODEV);
830         }
831
832         /* Capture this PF's starting queue pair */
833         pf->qbase = hw->func_caps.base_queue;
834
835 #ifdef IXL_DEBUG
836         device_printf(dev, "pf_id=%d, num_vfs=%d, msix_pf=%d, "
837             "msix_vf=%d, fd_g=%d, fd_b=%d, tx_qp=%d rx_qp=%d qbase=%d\n",
838             hw->pf_id, hw->func_caps.num_vfs,
839             hw->func_caps.num_msix_vectors,
840             hw->func_caps.num_msix_vectors_vf,
841             hw->func_caps.fd_filters_guaranteed,
842             hw->func_caps.fd_filters_best_effort,
843             hw->func_caps.num_tx_qp,
844             hw->func_caps.num_rx_qp,
845             hw->func_caps.base_queue);
846 #endif
847         return (error);
848 }
849
850 static void
851 ixl_cap_txcsum_tso(struct ixl_vsi *vsi, struct ifnet *ifp, int mask)
852 {
853         device_t        dev = vsi->dev;
854
855         /* Enable/disable TXCSUM/TSO4 */
856         if (!(ifp->if_capenable & IFCAP_TXCSUM)
857             && !(ifp->if_capenable & IFCAP_TSO4)) {
858                 if (mask & IFCAP_TXCSUM) {
859                         ifp->if_capenable |= IFCAP_TXCSUM;
860                         /* enable TXCSUM, restore TSO if previously enabled */
861                         if (vsi->flags & IXL_FLAGS_KEEP_TSO4) {
862                                 vsi->flags &= ~IXL_FLAGS_KEEP_TSO4;
863                                 ifp->if_capenable |= IFCAP_TSO4;
864                         }
865                 }
866                 else if (mask & IFCAP_TSO4) {
867                         ifp->if_capenable |= (IFCAP_TXCSUM | IFCAP_TSO4);
868                         vsi->flags &= ~IXL_FLAGS_KEEP_TSO4;
869                         device_printf(dev,
870                             "TSO4 requires txcsum, enabling both...\n");
871                 }
872         } else if((ifp->if_capenable & IFCAP_TXCSUM)
873             && !(ifp->if_capenable & IFCAP_TSO4)) {
874                 if (mask & IFCAP_TXCSUM)
875                         ifp->if_capenable &= ~IFCAP_TXCSUM;
876                 else if (mask & IFCAP_TSO4)
877                         ifp->if_capenable |= IFCAP_TSO4;
878         } else if((ifp->if_capenable & IFCAP_TXCSUM)
879             && (ifp->if_capenable & IFCAP_TSO4)) {
880                 if (mask & IFCAP_TXCSUM) {
881                         vsi->flags |= IXL_FLAGS_KEEP_TSO4;
882                         ifp->if_capenable &= ~(IFCAP_TXCSUM | IFCAP_TSO4);
883                         device_printf(dev, 
884                             "TSO4 requires txcsum, disabling both...\n");
885                 } else if (mask & IFCAP_TSO4)
886                         ifp->if_capenable &= ~IFCAP_TSO4;
887         }
888
889         /* Enable/disable TXCSUM_IPV6/TSO6 */
890         if (!(ifp->if_capenable & IFCAP_TXCSUM_IPV6)
891             && !(ifp->if_capenable & IFCAP_TSO6)) {
892                 if (mask & IFCAP_TXCSUM_IPV6) {
893                         ifp->if_capenable |= IFCAP_TXCSUM_IPV6;
894                         if (vsi->flags & IXL_FLAGS_KEEP_TSO6) {
895                                 vsi->flags &= ~IXL_FLAGS_KEEP_TSO6;
896                                 ifp->if_capenable |= IFCAP_TSO6;
897                         }
898                 } else if (mask & IFCAP_TSO6) {
899                         ifp->if_capenable |= (IFCAP_TXCSUM_IPV6 | IFCAP_TSO6);
900                         vsi->flags &= ~IXL_FLAGS_KEEP_TSO6;
901                         device_printf(dev,
902                             "TSO6 requires txcsum6, enabling both...\n");
903                 }
904         } else if((ifp->if_capenable & IFCAP_TXCSUM_IPV6)
905             && !(ifp->if_capenable & IFCAP_TSO6)) {
906                 if (mask & IFCAP_TXCSUM_IPV6)
907                         ifp->if_capenable &= ~IFCAP_TXCSUM_IPV6;
908                 else if (mask & IFCAP_TSO6)
909                         ifp->if_capenable |= IFCAP_TSO6;
910         } else if ((ifp->if_capenable & IFCAP_TXCSUM_IPV6)
911             && (ifp->if_capenable & IFCAP_TSO6)) {
912                 if (mask & IFCAP_TXCSUM_IPV6) {
913                         vsi->flags |= IXL_FLAGS_KEEP_TSO6;
914                         ifp->if_capenable &= ~(IFCAP_TXCSUM_IPV6 | IFCAP_TSO6);
915                         device_printf(dev,
916                             "TSO6 requires txcsum6, disabling both...\n");
917                 } else if (mask & IFCAP_TSO6)
918                         ifp->if_capenable &= ~IFCAP_TSO6;
919         }
920 }
921
922 /*********************************************************************
923  *  Ioctl entry point
924  *
925  *  ixl_ioctl is called when the user wants to configure the
926  *  interface.
927  *
928  *  return 0 on success, positive on failure
929  **********************************************************************/
930
931 static int
932 ixl_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
933 {
934         struct ixl_vsi  *vsi = ifp->if_softc;
935         struct ixl_pf   *pf = vsi->back;
936         struct ifreq    *ifr = (struct ifreq *)data;
937         struct ifdrv    *ifd = (struct ifdrv *)data;
938 #if defined(INET) || defined(INET6)
939         struct ifaddr *ifa = (struct ifaddr *)data;
940         bool            avoid_reset = FALSE;
941 #endif
942         int             error = 0;
943
944         switch (command) {
945
946         case SIOCSIFADDR:
947 #ifdef INET
948                 if (ifa->ifa_addr->sa_family == AF_INET)
949                         avoid_reset = TRUE;
950 #endif
951 #ifdef INET6
952                 if (ifa->ifa_addr->sa_family == AF_INET6)
953                         avoid_reset = TRUE;
954 #endif
955 #if defined(INET) || defined(INET6)
956                 /*
957                 ** Calling init results in link renegotiation,
958                 ** so we avoid doing it when possible.
959                 */
960                 if (avoid_reset) {
961                         ifp->if_flags |= IFF_UP;
962                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
963                                 ixl_init(pf);
964 #ifdef INET
965                         if (!(ifp->if_flags & IFF_NOARP))
966                                 arp_ifinit(ifp, ifa);
967 #endif
968                 } else
969                         error = ether_ioctl(ifp, command, data);
970                 break;
971 #endif
972         case SIOCSIFMTU:
973                 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
974                 if (ifr->ifr_mtu > IXL_MAX_FRAME -
975                    ETHER_HDR_LEN - ETHER_CRC_LEN - ETHER_VLAN_ENCAP_LEN) {
976                         error = EINVAL;
977                 } else {
978                         IXL_PF_LOCK(pf);
979                         ifp->if_mtu = ifr->ifr_mtu;
980                         vsi->max_frame_size =
981                                 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN
982                             + ETHER_VLAN_ENCAP_LEN;
983                         ixl_init_locked(pf);
984                         IXL_PF_UNLOCK(pf);
985                 }
986                 break;
987         case SIOCSIFFLAGS:
988                 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
989                 IXL_PF_LOCK(pf);
990                 if (ifp->if_flags & IFF_UP) {
991                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) {
992                                 if ((ifp->if_flags ^ pf->if_flags) &
993                                     (IFF_PROMISC | IFF_ALLMULTI)) {
994                                         ixl_set_promisc(vsi);
995                                 }
996                         } else {
997                                 IXL_PF_UNLOCK(pf);
998                                 ixl_init(pf);
999                                 IXL_PF_LOCK(pf);
1000                         }
1001                 } else {
1002                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1003                                 IXL_PF_UNLOCK(pf);
1004                                 ixl_stop(pf);
1005                                 IXL_PF_LOCK(pf);
1006                         }
1007                 }
1008                 pf->if_flags = ifp->if_flags;
1009                 IXL_PF_UNLOCK(pf);
1010                 break;
1011         case SIOCSDRVSPEC:
1012         case SIOCGDRVSPEC:
1013                 IOCTL_DEBUGOUT("ioctl: SIOCxDRVSPEC (Get/Set Driver-specific "
1014                     "Info)\n");
1015
1016                 /* NVM update command */
1017                 if (ifd->ifd_cmd == I40E_NVM_ACCESS)
1018                         error = ixl_handle_nvmupd_cmd(pf, ifd);
1019                 else
1020                         error = EINVAL;
1021                 break;
1022         case SIOCADDMULTI:
1023                 IOCTL_DEBUGOUT("ioctl: SIOCADDMULTI");
1024                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1025                         IXL_PF_LOCK(pf);
1026                         ixl_disable_intr(vsi);
1027                         ixl_add_multi(vsi);
1028                         ixl_enable_intr(vsi);
1029                         IXL_PF_UNLOCK(pf);
1030                 }
1031                 break;
1032         case SIOCDELMULTI:
1033                 IOCTL_DEBUGOUT("ioctl: SIOCDELMULTI");
1034                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1035                         IXL_PF_LOCK(pf);
1036                         ixl_disable_intr(vsi);
1037                         ixl_del_multi(vsi);
1038                         ixl_enable_intr(vsi);
1039                         IXL_PF_UNLOCK(pf);
1040                 }
1041                 break;
1042         case SIOCSIFMEDIA:
1043         case SIOCGIFMEDIA:
1044 #ifdef IFM_ETH_XTYPE
1045         case SIOCGIFXMEDIA:
1046 #endif
1047                 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
1048                 error = ifmedia_ioctl(ifp, ifr, &vsi->media, command);
1049                 break;
1050         case SIOCSIFCAP:
1051         {
1052                 int mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1053                 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
1054
1055                 ixl_cap_txcsum_tso(vsi, ifp, mask);
1056
1057                 if (mask & IFCAP_RXCSUM)
1058                         ifp->if_capenable ^= IFCAP_RXCSUM;
1059                 if (mask & IFCAP_RXCSUM_IPV6)
1060                         ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1061                 if (mask & IFCAP_LRO)
1062                         ifp->if_capenable ^= IFCAP_LRO;
1063                 if (mask & IFCAP_VLAN_HWTAGGING)
1064                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1065                 if (mask & IFCAP_VLAN_HWFILTER)
1066                         ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
1067                 if (mask & IFCAP_VLAN_HWTSO)
1068                         ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
1069                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1070                         IXL_PF_LOCK(pf);
1071                         ixl_init_locked(pf);
1072                         IXL_PF_UNLOCK(pf);
1073                 }
1074                 VLAN_CAPABILITIES(ifp);
1075
1076                 break;
1077         }
1078
1079         default:
1080                 IOCTL_DEBUGOUT("ioctl: UNKNOWN (0x%X)\n", (int)command);
1081                 error = ether_ioctl(ifp, command, data);
1082                 break;
1083         }
1084
1085         return (error);
1086 }
1087
1088
1089 /*********************************************************************
1090  *  Init entry point
1091  *
1092  *  This routine is used in two ways. It is used by the stack as
1093  *  init entry point in network interface structure. It is also used
1094  *  by the driver as a hw/sw initialization routine to get to a
1095  *  consistent state.
1096  *
1097  *  return 0 on success, positive on failure
1098  **********************************************************************/
1099
1100 static void
1101 ixl_init_locked(struct ixl_pf *pf)
1102 {
1103         struct i40e_hw  *hw = &pf->hw;
1104         struct ixl_vsi  *vsi = &pf->vsi;
1105         struct ifnet    *ifp = vsi->ifp;
1106         device_t        dev = pf->dev;
1107         struct i40e_filter_control_settings     filter;
1108         u8              tmpaddr[ETHER_ADDR_LEN];
1109         int             ret;
1110
1111         mtx_assert(&pf->pf_mtx, MA_OWNED);
1112         INIT_DEBUGOUT("ixl_init_locked: begin");
1113
1114         ixl_stop_locked(pf);
1115
1116         /* Get the latest mac address... User might use a LAA */
1117         bcopy(IF_LLADDR(vsi->ifp), tmpaddr,
1118               I40E_ETH_LENGTH_OF_ADDRESS);
1119         if (!cmp_etheraddr(hw->mac.addr, tmpaddr) &&
1120             (i40e_validate_mac_addr(tmpaddr) == I40E_SUCCESS)) {
1121                 ixl_del_filter(vsi, hw->mac.addr, IXL_VLAN_ANY);
1122                 bcopy(tmpaddr, hw->mac.addr,
1123                     I40E_ETH_LENGTH_OF_ADDRESS);
1124                 ret = i40e_aq_mac_address_write(hw,
1125                     I40E_AQC_WRITE_TYPE_LAA_ONLY,
1126                     hw->mac.addr, NULL);
1127                 if (ret) {
1128                         device_printf(dev, "LLA address"
1129                          "change failed!!\n");
1130                         return;
1131                 }
1132         }
1133
1134         ixl_add_filter(vsi, hw->mac.addr, IXL_VLAN_ANY);
1135
1136         /* Set the various hardware offload abilities */
1137         ifp->if_hwassist = 0;
1138         if (ifp->if_capenable & IFCAP_TSO)
1139                 ifp->if_hwassist |= CSUM_TSO;
1140         if (ifp->if_capenable & IFCAP_TXCSUM)
1141                 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
1142         if (ifp->if_capenable & IFCAP_TXCSUM_IPV6)
1143                 ifp->if_hwassist |= (CSUM_TCP_IPV6 | CSUM_UDP_IPV6);
1144
1145         /* Set up the device filtering */
1146         bzero(&filter, sizeof(filter));
1147         filter.enable_ethtype = TRUE;
1148         filter.enable_macvlan = TRUE;
1149 #ifdef IXL_FDIR
1150         filter.enable_fdir = TRUE;
1151 #endif
1152         filter.hash_lut_size = I40E_HASH_LUT_SIZE_512;
1153         if (i40e_set_filter_control(hw, &filter))
1154                 device_printf(dev, "i40e_set_filter_control() failed\n");
1155
1156         /* Set up RSS */
1157         ixl_config_rss(vsi);
1158
1159         /* Prepare the VSI: rings, hmc contexts, etc... */
1160         if (ixl_initialize_vsi(vsi)) {
1161                 device_printf(dev, "initialize vsi failed!!\n");
1162                 return;
1163         }
1164
1165         /* Add protocol filters to list */
1166         ixl_init_filters(vsi);
1167
1168         /* Setup vlan's if needed */
1169         ixl_setup_vlan_filters(vsi);
1170
1171         /* Set up MSI/X routing and the ITR settings */
1172         if (ixl_enable_msix) {
1173                 ixl_configure_queue_intr_msix(pf);
1174                 ixl_configure_itr(pf);
1175         } else
1176                 ixl_configure_legacy(pf);
1177
1178         ixl_enable_rings(vsi);
1179
1180         i40e_aq_set_default_vsi(hw, vsi->seid, NULL);
1181
1182         ixl_reconfigure_filters(vsi);
1183
1184         /* And now turn on interrupts */
1185         ixl_enable_intr(vsi);
1186
1187         /* Get link info */
1188         hw->phy.get_link_info = TRUE;
1189         i40e_get_link_status(hw, &pf->link_up);
1190         ixl_update_link_status(pf);
1191
1192         /* Set initial advertised speed sysctl value */
1193         ixl_get_initial_advertised_speeds(pf);
1194
1195         /* Start the local timer */
1196         callout_reset(&pf->timer, hz, ixl_local_timer, pf);
1197
1198         /* Now inform the stack we're ready */
1199         ifp->if_drv_flags |= IFF_DRV_RUNNING;
1200
1201         return;
1202 }
1203
1204 /* For the set_advertise sysctl */
1205 static void
1206 ixl_get_initial_advertised_speeds(struct ixl_pf *pf)
1207 {
1208         struct i40e_hw *hw = &pf->hw;
1209         device_t dev = pf->dev;
1210         enum i40e_status_code status;
1211         struct i40e_aq_get_phy_abilities_resp abilities;
1212
1213         /* Set initial sysctl values */
1214         status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
1215                                               NULL);
1216         if (status) {
1217                 /* Non-fatal error */
1218                 device_printf(dev, "%s: i40e_aq_get_phy_capabilities() error %d\n",
1219                      __func__, status);
1220                 return;
1221         }
1222
1223         if (abilities.link_speed & I40E_LINK_SPEED_40GB)
1224                 pf->advertised_speed |= 0x10;
1225         if (abilities.link_speed & I40E_LINK_SPEED_20GB)
1226                 pf->advertised_speed |= 0x8;
1227         if (abilities.link_speed & I40E_LINK_SPEED_10GB)
1228                 pf->advertised_speed |= 0x4;
1229         if (abilities.link_speed & I40E_LINK_SPEED_1GB)
1230                 pf->advertised_speed |= 0x2;
1231         if (abilities.link_speed & I40E_LINK_SPEED_100MB)
1232                 pf->advertised_speed |= 0x1;
1233 }
1234
1235 static int
1236 ixl_teardown_hw_structs(struct ixl_pf *pf)
1237 {
1238         enum i40e_status_code status = 0;
1239         struct i40e_hw *hw = &pf->hw;
1240         device_t dev = pf->dev;
1241
1242         /* Shutdown LAN HMC */
1243         if (hw->hmc.hmc_obj) {
1244                 status = i40e_shutdown_lan_hmc(hw);
1245                 if (status) {
1246                         device_printf(dev,
1247                             "init: LAN HMC shutdown failure; status %d\n", status);
1248                         goto err_out;
1249                 }
1250         }
1251
1252         // XXX: This gets called when we know the adminq is inactive;
1253         // so we already know it's setup when we get here.
1254
1255         /* Shutdown admin queue */
1256         status = i40e_shutdown_adminq(hw);
1257         if (status)
1258                 device_printf(dev,
1259                     "init: Admin Queue shutdown failure; status %d\n", status);
1260
1261 err_out:
1262         return (status);
1263 }
1264
1265 static int
1266 ixl_reset(struct ixl_pf *pf)
1267 {
1268         struct i40e_hw *hw = &pf->hw;
1269         device_t dev = pf->dev;
1270         u8 set_fc_err_mask;
1271         int error = 0;
1272
1273         // XXX: clear_hw() actually writes to hw registers -- maybe this isn't necessary
1274         i40e_clear_hw(hw);
1275         error = i40e_pf_reset(hw);
1276         if (error) {
1277                 device_printf(dev, "init: PF reset failure");
1278                 error = EIO;
1279                 goto err_out;
1280         }
1281
1282         error = i40e_init_adminq(hw);
1283         if (error) {
1284                 device_printf(dev, "init: Admin queue init failure;"
1285                     " status code %d", error);
1286                 error = EIO;
1287                 goto err_out;
1288         }
1289
1290         i40e_clear_pxe_mode(hw);
1291
1292         error = ixl_get_hw_capabilities(pf);
1293         if (error) {
1294                 device_printf(dev, "init: Error retrieving HW capabilities;"
1295                     " status code %d\n", error);
1296                 goto err_out;
1297         }
1298
1299         error = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp,
1300             hw->func_caps.num_rx_qp, 0, 0);
1301         if (error) {
1302                 device_printf(dev, "init: LAN HMC init failed; status code %d\n",
1303                     error);
1304                 error = EIO;
1305                 goto err_out;
1306         }
1307
1308         error = i40e_configure_lan_hmc(hw, I40E_HMC_MODEL_DIRECT_ONLY);
1309         if (error) {
1310                 device_printf(dev, "init: LAN HMC config failed; status code %d\n",
1311                     error);
1312                 error = EIO;
1313                 goto err_out;
1314         }
1315
1316         // XXX: possible fix for panic, but our failure recovery is still broken
1317         error = ixl_switch_config(pf);
1318         if (error) {
1319                 device_printf(dev, "init: ixl_switch_config() failed: %d\n",
1320                      error);
1321                 goto err_out;
1322         }
1323
1324         error = i40e_aq_set_phy_int_mask(hw, IXL_DEFAULT_PHY_INT_MASK,
1325             NULL);
1326         if (error) {
1327                 device_printf(dev, "init: i40e_aq_set_phy_mask() failed: err %d,"
1328                     " aq_err %d\n", error, hw->aq.asq_last_status);
1329                 error = EIO;
1330                 goto err_out;
1331         }
1332
1333         error = i40e_set_fc(hw, &set_fc_err_mask, true);
1334         if (error) {
1335                 device_printf(dev, "init: setting link flow control failed; retcode %d,"
1336                     " fc_err_mask 0x%02x\n", error, set_fc_err_mask);
1337                 goto err_out;
1338         }
1339
1340         // XXX: (Rebuild VSIs?)
1341
1342         /* Firmware delay workaround */
1343         if (((hw->aq.fw_maj_ver == 4) && (hw->aq.fw_min_ver < 33)) ||
1344             (hw->aq.fw_maj_ver < 4)) {
1345                 i40e_msec_delay(75);
1346                 error = i40e_aq_set_link_restart_an(hw, TRUE, NULL);
1347                 if (error) {
1348                         device_printf(dev, "init: link restart failed, aq_err %d\n",
1349                             hw->aq.asq_last_status);
1350                         goto err_out;
1351                 }
1352         }
1353
1354
1355 err_out:
1356         return (error);
1357 }
1358
1359 static void
1360 ixl_init(void *arg)
1361 {
1362         struct ixl_pf *pf = arg;
1363         struct ixl_vsi *vsi = &pf->vsi;
1364         device_t dev = pf->dev;
1365         int error = 0;
1366
1367         /*
1368          * If the aq is dead here, it probably means something outside of the driver
1369          * did something to the adapter, like a PF reset.
1370          * So rebuild the driver's state here if that occurs.
1371          */
1372         if (!i40e_check_asq_alive(&pf->hw)) {
1373                 device_printf(dev, "Admin Queue is down; resetting...\n");
1374                 IXL_PF_LOCK(pf);
1375                 ixl_teardown_hw_structs(pf);
1376                 ixl_reset(pf);
1377                 IXL_PF_UNLOCK(pf);
1378         }
1379
1380         /*
1381          * Set up LAN queue interrupts here.
1382          * Kernel interrupt setup functions cannot be called while holding a lock,
1383          * so this is done outside of init_locked().
1384          */
1385         if (pf->msix > 1) {
1386                 /* Teardown existing interrupts, if they exist */
1387                 ixl_teardown_queue_msix(vsi);
1388                 ixl_free_queue_tqs(vsi);
1389                 /* Then set them up again */
1390                 error = ixl_setup_queue_msix(vsi);
1391                 if (error)
1392                         device_printf(dev, "ixl_setup_queue_msix() error: %d\n",
1393                             error);
1394                 error = ixl_setup_queue_tqs(vsi);
1395                 if (error)
1396                         device_printf(dev, "ixl_setup_queue_tqs() error: %d\n",
1397                             error);
1398         } else
1399                 // possibly broken
1400                 error = ixl_assign_vsi_legacy(pf);
1401         if (error) {
1402                 device_printf(pf->dev, "assign_vsi_msix/legacy error: %d\n", error);
1403                 return;
1404         }
1405
1406         IXL_PF_LOCK(pf);
1407         ixl_init_locked(pf);
1408         IXL_PF_UNLOCK(pf);
1409 }
1410
1411 /*
1412 ** MSIX Interrupt Handlers and Tasklets
1413 */
1414 static void
1415 ixl_handle_que(void *context, int pending)
1416 {
1417         struct ixl_queue *que = context;
1418         struct ixl_vsi *vsi = que->vsi;
1419         struct i40e_hw  *hw = vsi->hw;
1420         struct tx_ring  *txr = &que->txr;
1421         struct ifnet    *ifp = vsi->ifp;
1422         bool            more;
1423
1424         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1425                 more = ixl_rxeof(que, IXL_RX_LIMIT);
1426                 IXL_TX_LOCK(txr);
1427                 ixl_txeof(que);
1428                 if (!drbr_empty(ifp, txr->br))
1429                         ixl_mq_start_locked(ifp, txr);
1430                 IXL_TX_UNLOCK(txr);
1431                 if (more) {
1432                         taskqueue_enqueue(que->tq, &que->task);
1433                         return;
1434                 }
1435         }
1436
1437         /* Reenable this interrupt - hmmm */
1438         ixl_enable_queue(hw, que->me);
1439         return;
1440 }
1441
1442
1443 /*********************************************************************
1444  *
1445  *  Legacy Interrupt Service routine
1446  *
1447  **********************************************************************/
1448 void
1449 ixl_intr(void *arg)
1450 {
1451         struct ixl_pf           *pf = arg;
1452         struct i40e_hw          *hw =  &pf->hw;
1453         struct ixl_vsi          *vsi = &pf->vsi;
1454         struct ixl_queue        *que = vsi->queues;
1455         struct ifnet            *ifp = vsi->ifp;
1456         struct tx_ring          *txr = &que->txr;
1457         u32                     reg, icr0, mask;
1458         bool                    more_tx, more_rx;
1459
1460         ++que->irqs;
1461
1462         /* Protect against spurious interrupts */
1463         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1464                 return;
1465
1466         icr0 = rd32(hw, I40E_PFINT_ICR0);
1467
1468         reg = rd32(hw, I40E_PFINT_DYN_CTL0);
1469         reg = reg | I40E_PFINT_DYN_CTL0_CLEARPBA_MASK;
1470         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
1471
1472         mask = rd32(hw, I40E_PFINT_ICR0_ENA);
1473
1474 #ifdef PCI_IOV
1475         if (icr0 & I40E_PFINT_ICR0_VFLR_MASK)
1476                 taskqueue_enqueue(pf->tq, &pf->vflr_task);
1477 #endif
1478
1479         if (icr0 & I40E_PFINT_ICR0_ADMINQ_MASK) {
1480                 taskqueue_enqueue(pf->tq, &pf->adminq);
1481                 return;
1482         }
1483
1484         more_rx = ixl_rxeof(que, IXL_RX_LIMIT);
1485
1486         IXL_TX_LOCK(txr);
1487         more_tx = ixl_txeof(que);
1488         if (!drbr_empty(vsi->ifp, txr->br))
1489                 more_tx = 1;
1490         IXL_TX_UNLOCK(txr);
1491
1492         /* re-enable other interrupt causes */
1493         wr32(hw, I40E_PFINT_ICR0_ENA, mask);
1494
1495         /* And now the queues */
1496         reg = rd32(hw, I40E_QINT_RQCTL(0));
1497         reg |= I40E_QINT_RQCTL_CAUSE_ENA_MASK;
1498         wr32(hw, I40E_QINT_RQCTL(0), reg);
1499
1500         reg = rd32(hw, I40E_QINT_TQCTL(0));
1501         reg |= I40E_QINT_TQCTL_CAUSE_ENA_MASK;
1502         reg &= ~I40E_PFINT_ICR0_INTEVENT_MASK;
1503         wr32(hw, I40E_QINT_TQCTL(0), reg);
1504
1505         ixl_enable_legacy(hw);
1506
1507         return;
1508 }
1509
1510
1511 /*********************************************************************
1512  *
1513  *  MSIX VSI Interrupt Service routine
1514  *
1515  **********************************************************************/
1516 void
1517 ixl_msix_que(void *arg)
1518 {
1519         struct ixl_queue        *que = arg;
1520         struct ixl_vsi  *vsi = que->vsi;
1521         struct i40e_hw  *hw = vsi->hw;
1522         struct tx_ring  *txr = &que->txr;
1523         bool            more_tx, more_rx;
1524
1525         /* Protect against spurious interrupts */
1526         if (!(vsi->ifp->if_drv_flags & IFF_DRV_RUNNING))
1527                 return;
1528
1529         ++que->irqs;
1530
1531         more_rx = ixl_rxeof(que, IXL_RX_LIMIT);
1532
1533         IXL_TX_LOCK(txr);
1534         more_tx = ixl_txeof(que);
1535         /*
1536         ** Make certain that if the stack 
1537         ** has anything queued the task gets
1538         ** scheduled to handle it.
1539         */
1540         if (!drbr_empty(vsi->ifp, txr->br))
1541                 more_tx = 1;
1542         IXL_TX_UNLOCK(txr);
1543
1544         ixl_set_queue_rx_itr(que);
1545         ixl_set_queue_tx_itr(que);
1546
1547         if (more_tx || more_rx)
1548                 taskqueue_enqueue(que->tq, &que->task);
1549         else
1550                 ixl_enable_queue(hw, que->me);
1551
1552         return;
1553 }
1554
1555
1556 /*********************************************************************
1557  *
1558  *  MSIX Admin Queue Interrupt Service routine
1559  *
1560  **********************************************************************/
1561 static void
1562 ixl_msix_adminq(void *arg)
1563 {
1564         struct ixl_pf   *pf = arg;
1565         struct i40e_hw  *hw = &pf->hw;
1566         u32             reg, mask, rstat_reg;
1567         bool            do_task = FALSE;
1568
1569         ++pf->admin_irq;
1570
1571         reg = rd32(hw, I40E_PFINT_ICR0);
1572         mask = rd32(hw, I40E_PFINT_ICR0_ENA);
1573
1574         /* Check on the cause */
1575         if (reg & I40E_PFINT_ICR0_ADMINQ_MASK) {
1576                 mask &= ~I40E_PFINT_ICR0_ADMINQ_MASK;
1577                 do_task = TRUE;
1578         }
1579
1580         if (reg & I40E_PFINT_ICR0_MAL_DETECT_MASK) {
1581                 ixl_handle_mdd_event(pf);
1582                 mask &= ~I40E_PFINT_ICR0_MAL_DETECT_MASK;
1583         }
1584
1585         if (reg & I40E_PFINT_ICR0_GRST_MASK) {
1586                 device_printf(pf->dev, "Reset Requested!\n");
1587                 rstat_reg = rd32(hw, I40E_GLGEN_RSTAT);
1588                 rstat_reg = (rstat_reg & I40E_GLGEN_RSTAT_RESET_TYPE_MASK)
1589                     >> I40E_GLGEN_RSTAT_RESET_TYPE_SHIFT;
1590                 device_printf(pf->dev, "Reset type: ");
1591                 switch (rstat_reg) {
1592                 /* These others might be handled similarly to an EMPR reset */
1593                 case I40E_RESET_CORER:
1594                         printf("CORER\n");
1595                         break;
1596                 case I40E_RESET_GLOBR:
1597                         printf("GLOBR\n");
1598                         break;
1599                 case I40E_RESET_EMPR:
1600                         printf("EMPR\n");
1601                         atomic_set_int(&pf->state, IXL_PF_STATE_EMPR_RESETTING);
1602                         break;
1603                 default:
1604                         printf("?\n");
1605                         break;
1606                 }
1607                 // overload admin queue task to check reset progress?
1608                 do_task = TRUE;
1609         }
1610
1611         if (reg & I40E_PFINT_ICR0_ECC_ERR_MASK) {
1612                 device_printf(pf->dev, "ECC Error detected!\n");
1613         }
1614
1615         if (reg & I40E_PFINT_ICR0_HMC_ERR_MASK) {
1616                 device_printf(pf->dev, "HMC Error detected!\n");
1617         }
1618
1619         if (reg & I40E_PFINT_ICR0_PCI_EXCEPTION_MASK) {
1620                 device_printf(pf->dev, "PCI Exception detected!\n");
1621         }
1622
1623 #ifdef PCI_IOV
1624         if (reg & I40E_PFINT_ICR0_VFLR_MASK) {
1625                 mask &= ~I40E_PFINT_ICR0_ENA_VFLR_MASK;
1626                 taskqueue_enqueue(pf->tq, &pf->vflr_task);
1627         }
1628 #endif
1629
1630         reg = rd32(hw, I40E_PFINT_DYN_CTL0);
1631         reg = reg | I40E_PFINT_DYN_CTL0_CLEARPBA_MASK;
1632         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
1633
1634         if (do_task)
1635                 taskqueue_enqueue(pf->tq, &pf->adminq);
1636 }
1637
1638 /*********************************************************************
1639  *
1640  *  Media Ioctl callback
1641  *
1642  *  This routine is called whenever the user queries the status of
1643  *  the interface using ifconfig.
1644  *
1645  **********************************************************************/
1646 static void
1647 ixl_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
1648 {
1649         struct ixl_vsi  *vsi = ifp->if_softc;
1650         struct ixl_pf   *pf = vsi->back;
1651         struct i40e_hw  *hw = &pf->hw;
1652
1653         INIT_DEBUGOUT("ixl_media_status: begin");
1654         IXL_PF_LOCK(pf);
1655
1656         hw->phy.get_link_info = TRUE;
1657         i40e_get_link_status(hw, &pf->link_up);
1658         ixl_update_link_status(pf);
1659
1660         ifmr->ifm_status = IFM_AVALID;
1661         ifmr->ifm_active = IFM_ETHER;
1662
1663         if (!pf->link_up) {
1664                 IXL_PF_UNLOCK(pf);
1665                 return;
1666         }
1667
1668         ifmr->ifm_status |= IFM_ACTIVE;
1669
1670         /* Hardware always does full-duplex */
1671         ifmr->ifm_active |= IFM_FDX;
1672
1673         switch (hw->phy.link_info.phy_type) {
1674                 /* 100 M */
1675                 case I40E_PHY_TYPE_100BASE_TX:
1676                         ifmr->ifm_active |= IFM_100_TX;
1677                         break;
1678                 /* 1 G */
1679                 case I40E_PHY_TYPE_1000BASE_T:
1680                         ifmr->ifm_active |= IFM_1000_T;
1681                         break;
1682                 case I40E_PHY_TYPE_1000BASE_SX:
1683                         ifmr->ifm_active |= IFM_1000_SX;
1684                         break;
1685                 case I40E_PHY_TYPE_1000BASE_LX:
1686                         ifmr->ifm_active |= IFM_1000_LX;
1687                         break;
1688                 case I40E_PHY_TYPE_1000BASE_T_OPTICAL:
1689                         ifmr->ifm_active |= IFM_OTHER;
1690                         break;
1691                 /* 10 G */
1692                 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1693                         ifmr->ifm_active |= IFM_10G_TWINAX;
1694                         break;
1695                 case I40E_PHY_TYPE_10GBASE_SR:
1696                         ifmr->ifm_active |= IFM_10G_SR;
1697                         break;
1698                 case I40E_PHY_TYPE_10GBASE_LR:
1699                         ifmr->ifm_active |= IFM_10G_LR;
1700                         break;
1701                 case I40E_PHY_TYPE_10GBASE_T:
1702                         ifmr->ifm_active |= IFM_10G_T;
1703                         break;
1704                 case I40E_PHY_TYPE_XAUI:
1705                 case I40E_PHY_TYPE_XFI:
1706                 case I40E_PHY_TYPE_10GBASE_AOC:
1707                         ifmr->ifm_active |= IFM_OTHER;
1708                         break;
1709                 /* 40 G */
1710                 case I40E_PHY_TYPE_40GBASE_CR4:
1711                 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1712                         ifmr->ifm_active |= IFM_40G_CR4;
1713                         break;
1714                 case I40E_PHY_TYPE_40GBASE_SR4:
1715                         ifmr->ifm_active |= IFM_40G_SR4;
1716                         break;
1717                 case I40E_PHY_TYPE_40GBASE_LR4:
1718                         ifmr->ifm_active |= IFM_40G_LR4;
1719                         break;
1720                 case I40E_PHY_TYPE_XLAUI:
1721                         ifmr->ifm_active |= IFM_OTHER;
1722                         break;
1723 #ifndef IFM_ETH_XTYPE
1724                 case I40E_PHY_TYPE_1000BASE_KX:
1725                         ifmr->ifm_active |= IFM_1000_CX;
1726                         break;
1727                 case I40E_PHY_TYPE_SGMII:
1728                         ifmr->ifm_active |= IFM_OTHER;
1729                         break;
1730                 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1731                 case I40E_PHY_TYPE_10GBASE_CR1:
1732                         ifmr->ifm_active |= IFM_10G_TWINAX;
1733                         break;
1734                 case I40E_PHY_TYPE_10GBASE_KX4:
1735                         ifmr->ifm_active |= IFM_10G_CX4;
1736                         break;
1737                 case I40E_PHY_TYPE_10GBASE_KR:
1738                         ifmr->ifm_active |= IFM_10G_SR;
1739                         break;
1740                 case I40E_PHY_TYPE_SFI:
1741                         ifmr->ifm_active |= IFM_OTHER;
1742                         break;
1743                 case I40E_PHY_TYPE_40GBASE_KR4:
1744                 case I40E_PHY_TYPE_XLPPI:
1745                 case I40E_PHY_TYPE_40GBASE_AOC:
1746                         ifmr->ifm_active |= IFM_40G_SR4;
1747                         break;
1748 #else
1749                 case I40E_PHY_TYPE_1000BASE_KX:
1750                         ifmr->ifm_active |= IFM_1000_KX;
1751                         break;
1752                 case I40E_PHY_TYPE_SGMII:
1753                         ifmr->ifm_active |= IFM_1000_SGMII;
1754                         break;
1755                 /* ERJ: What's the difference between these? */
1756                 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1757                 case I40E_PHY_TYPE_10GBASE_CR1:
1758                         ifmr->ifm_active |= IFM_10G_CR1;
1759                         break;
1760                 case I40E_PHY_TYPE_10GBASE_KX4:
1761                         ifmr->ifm_active |= IFM_10G_KX4;
1762                         break;
1763                 case I40E_PHY_TYPE_10GBASE_KR:
1764                         ifmr->ifm_active |= IFM_10G_KR;
1765                         break;
1766                 case I40E_PHY_TYPE_SFI:
1767                         ifmr->ifm_active |= IFM_10G_SFI;
1768                         break;
1769                 /* Our single 20G media type */
1770                 case I40E_PHY_TYPE_20GBASE_KR2:
1771                         ifmr->ifm_active |= IFM_20G_KR2;
1772                         break;
1773                 case I40E_PHY_TYPE_40GBASE_KR4:
1774                         ifmr->ifm_active |= IFM_40G_KR4;
1775                         break;
1776                 case I40E_PHY_TYPE_XLPPI:
1777                 case I40E_PHY_TYPE_40GBASE_AOC:
1778                         ifmr->ifm_active |= IFM_40G_XLPPI;
1779                         break;
1780 #endif
1781                 /* Unknown to driver */
1782                 default:
1783                         ifmr->ifm_active |= IFM_UNKNOWN;
1784                         break;
1785         }
1786         /* Report flow control status as well */
1787         if (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX)
1788                 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
1789         if (hw->phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX)
1790                 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
1791
1792         IXL_PF_UNLOCK(pf);
1793
1794         return;
1795 }
1796
1797 /*
1798  * NOTE: Fortville does not support forcing media speeds. Instead,
1799  * use the set_advertise sysctl to set the speeds Fortville
1800  * will advertise or be allowed to operate at.
1801  */
1802 static int
1803 ixl_media_change(struct ifnet * ifp)
1804 {
1805         struct ixl_vsi *vsi = ifp->if_softc;
1806         struct ifmedia *ifm = &vsi->media;
1807
1808         INIT_DEBUGOUT("ixl_media_change: begin");
1809
1810         if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1811                 return (EINVAL);
1812
1813         if_printf(ifp, "Media change is not supported.\n");
1814
1815         return (ENODEV);
1816 }
1817
1818
1819 #ifdef IXL_FDIR
1820 /*
1821 ** ATR: Application Targetted Receive - creates a filter
1822 **      based on TX flow info that will keep the receive
1823 **      portion of the flow on the same queue. Based on the
1824 **      implementation this is only available for TCP connections
1825 */
1826 void
1827 ixl_atr(struct ixl_queue *que, struct tcphdr *th, int etype)
1828 {
1829         struct ixl_vsi                  *vsi = que->vsi;
1830         struct tx_ring                  *txr = &que->txr;
1831         struct i40e_filter_program_desc *FDIR;
1832         u32                             ptype, dtype;
1833         int                             idx;
1834
1835         /* check if ATR is enabled and sample rate */
1836         if ((!ixl_enable_fdir) || (!txr->atr_rate))
1837                 return;
1838         /*
1839         ** We sample all TCP SYN/FIN packets,
1840         ** or at the selected sample rate 
1841         */
1842         txr->atr_count++;
1843         if (((th->th_flags & (TH_FIN | TH_SYN)) == 0) &&
1844             (txr->atr_count < txr->atr_rate))
1845                 return;
1846         txr->atr_count = 0;
1847
1848         /* Get a descriptor to use */
1849         idx = txr->next_avail;
1850         FDIR = (struct i40e_filter_program_desc *) &txr->base[idx];
1851         if (++idx == que->num_desc)
1852                 idx = 0;
1853         txr->avail--;
1854         txr->next_avail = idx;
1855
1856         ptype = (que->me << I40E_TXD_FLTR_QW0_QINDEX_SHIFT) &
1857             I40E_TXD_FLTR_QW0_QINDEX_MASK;
1858
1859         ptype |= (etype == ETHERTYPE_IP) ?
1860             (I40E_FILTER_PCTYPE_NONF_IPV4_TCP <<
1861             I40E_TXD_FLTR_QW0_PCTYPE_SHIFT) :
1862             (I40E_FILTER_PCTYPE_NONF_IPV6_TCP <<
1863             I40E_TXD_FLTR_QW0_PCTYPE_SHIFT);
1864
1865         ptype |= vsi->id << I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT;
1866
1867         dtype = I40E_TX_DESC_DTYPE_FILTER_PROG;
1868
1869         /*
1870         ** We use the TCP TH_FIN as a trigger to remove
1871         ** the filter, otherwise its an update.
1872         */
1873         dtype |= (th->th_flags & TH_FIN) ?
1874             (I40E_FILTER_PROGRAM_DESC_PCMD_REMOVE <<
1875             I40E_TXD_FLTR_QW1_PCMD_SHIFT) :
1876             (I40E_FILTER_PROGRAM_DESC_PCMD_ADD_UPDATE <<
1877             I40E_TXD_FLTR_QW1_PCMD_SHIFT);
1878
1879         dtype |= I40E_FILTER_PROGRAM_DESC_DEST_DIRECT_PACKET_QINDEX <<
1880             I40E_TXD_FLTR_QW1_DEST_SHIFT;
1881
1882         dtype |= I40E_FILTER_PROGRAM_DESC_FD_STATUS_FD_ID <<
1883             I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT;
1884
1885         FDIR->qindex_flex_ptype_vsi = htole32(ptype);
1886         FDIR->dtype_cmd_cntindex = htole32(dtype);
1887         return;
1888 }
1889 #endif
1890
1891
1892 static void
1893 ixl_set_promisc(struct ixl_vsi *vsi)
1894 {
1895         struct ifnet    *ifp = vsi->ifp;
1896         struct i40e_hw  *hw = vsi->hw;
1897         int             err, mcnt = 0;
1898         bool            uni = FALSE, multi = FALSE;
1899
1900         if (ifp->if_flags & IFF_ALLMULTI)
1901                 multi = TRUE;
1902         else { /* Need to count the multicast addresses */
1903                 struct  ifmultiaddr *ifma;
1904                 if_maddr_rlock(ifp);
1905                 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1906                         if (ifma->ifma_addr->sa_family != AF_LINK)
1907                                 continue;
1908                         if (mcnt == MAX_MULTICAST_ADDR)
1909                                 break;
1910                         mcnt++;
1911                 }
1912                 if_maddr_runlock(ifp);
1913         }
1914
1915         if (mcnt >= MAX_MULTICAST_ADDR)
1916                 multi = TRUE;
1917         if (ifp->if_flags & IFF_PROMISC)
1918                 uni = TRUE;
1919
1920         err = i40e_aq_set_vsi_unicast_promiscuous(hw,
1921             vsi->seid, uni, NULL);
1922         err = i40e_aq_set_vsi_multicast_promiscuous(hw,
1923             vsi->seid, multi, NULL);
1924         return;
1925 }
1926
1927 /*********************************************************************
1928  *      Filter Routines
1929  *
1930  *      Routines for multicast and vlan filter management.
1931  *
1932  *********************************************************************/
1933 static void
1934 ixl_add_multi(struct ixl_vsi *vsi)
1935 {
1936         struct  ifmultiaddr     *ifma;
1937         struct ifnet            *ifp = vsi->ifp;
1938         struct i40e_hw          *hw = vsi->hw;
1939         int                     mcnt = 0, flags;
1940
1941         IOCTL_DEBUGOUT("ixl_add_multi: begin");
1942
1943         if_maddr_rlock(ifp);
1944         /*
1945         ** First just get a count, to decide if we
1946         ** we simply use multicast promiscuous.
1947         */
1948         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1949                 if (ifma->ifma_addr->sa_family != AF_LINK)
1950                         continue;
1951                 mcnt++;
1952         }
1953         if_maddr_runlock(ifp);
1954
1955         if (__predict_false(mcnt >= MAX_MULTICAST_ADDR)) {
1956                 /* delete existing MC filters */
1957                 ixl_del_hw_filters(vsi, mcnt);
1958                 i40e_aq_set_vsi_multicast_promiscuous(hw,
1959                     vsi->seid, TRUE, NULL);
1960                 return;
1961         }
1962
1963         mcnt = 0;
1964         if_maddr_rlock(ifp);
1965         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1966                 if (ifma->ifma_addr->sa_family != AF_LINK)
1967                         continue;
1968                 ixl_add_mc_filter(vsi,
1969                     (u8*)LLADDR((struct sockaddr_dl *) ifma->ifma_addr));
1970                 mcnt++;
1971         }
1972         if_maddr_runlock(ifp);
1973         if (mcnt > 0) {
1974                 flags = (IXL_FILTER_ADD | IXL_FILTER_USED | IXL_FILTER_MC);
1975                 ixl_add_hw_filters(vsi, flags, mcnt);
1976         }
1977
1978         IOCTL_DEBUGOUT("ixl_add_multi: end");
1979         return;
1980 }
1981
1982 static void
1983 ixl_del_multi(struct ixl_vsi *vsi)
1984 {
1985         struct ifnet            *ifp = vsi->ifp;
1986         struct ifmultiaddr      *ifma;
1987         struct ixl_mac_filter   *f;
1988         int                     mcnt = 0;
1989         bool            match = FALSE;
1990
1991         IOCTL_DEBUGOUT("ixl_del_multi: begin");
1992
1993         /* Search for removed multicast addresses */
1994         if_maddr_rlock(ifp);
1995         SLIST_FOREACH(f, &vsi->ftl, next) {
1996                 if ((f->flags & IXL_FILTER_USED) && (f->flags & IXL_FILTER_MC)) {
1997                         match = FALSE;
1998                         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1999                                 if (ifma->ifma_addr->sa_family != AF_LINK)
2000                                         continue;
2001                                 u8 *mc_addr = (u8 *)LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
2002                                 if (cmp_etheraddr(f->macaddr, mc_addr)) {
2003                                         match = TRUE;
2004                                         break;
2005                                 }
2006                         }
2007                         if (match == FALSE) {
2008                                 f->flags |= IXL_FILTER_DEL;
2009                                 mcnt++;
2010                         }
2011                 }
2012         }
2013         if_maddr_runlock(ifp);
2014
2015         if (mcnt > 0)
2016                 ixl_del_hw_filters(vsi, mcnt);
2017 }
2018
2019
2020 /*********************************************************************
2021  *  Timer routine
2022  *
2023  *  This routine checks for link status,updates statistics,
2024  *  and runs the watchdog check.
2025  *
2026  *  Only runs when the driver is configured UP and RUNNING.
2027  *
2028  **********************************************************************/
2029
2030 static void
2031 ixl_local_timer(void *arg)
2032 {
2033         struct ixl_pf           *pf = arg;
2034         struct i40e_hw          *hw = &pf->hw;
2035         struct ixl_vsi          *vsi = &pf->vsi;
2036         struct ixl_queue        *que = vsi->queues;
2037         device_t                dev = pf->dev;
2038         int                     hung = 0;
2039         u32                     mask;
2040
2041         mtx_assert(&pf->pf_mtx, MA_OWNED);
2042
2043         /* Fire off the adminq task */
2044         taskqueue_enqueue(pf->tq, &pf->adminq);
2045
2046         /* Update stats */
2047         ixl_update_stats_counters(pf);
2048
2049         /*
2050         ** Check status of the queues
2051         */
2052         mask = (I40E_PFINT_DYN_CTLN_INTENA_MASK |
2053                 I40E_PFINT_DYN_CTLN_SWINT_TRIG_MASK);
2054  
2055         for (int i = 0; i < vsi->num_queues; i++, que++) {
2056                 /* Any queues with outstanding work get a sw irq */
2057                 if (que->busy)
2058                         wr32(hw, I40E_PFINT_DYN_CTLN(que->me), mask);
2059                 /*
2060                 ** Each time txeof runs without cleaning, but there
2061                 ** are uncleaned descriptors it increments busy. If
2062                 ** we get to 5 we declare it hung.
2063                 */
2064                 if (que->busy == IXL_QUEUE_HUNG) {
2065                         ++hung;
2066                         /* Mark the queue as inactive */
2067                         vsi->active_queues &= ~((u64)1 << que->me);
2068                         continue;
2069                 } else {
2070                         /* Check if we've come back from hung */
2071                         if ((vsi->active_queues & ((u64)1 << que->me)) == 0)
2072                                 vsi->active_queues |= ((u64)1 << que->me);
2073                 }
2074                 if (que->busy >= IXL_MAX_TX_BUSY) {
2075 #ifdef IXL_DEBUG
2076                         device_printf(dev,"Warning queue %d "
2077                             "appears to be hung!\n", i);
2078 #endif
2079                         que->busy = IXL_QUEUE_HUNG;
2080                         ++hung;
2081                 }
2082         }
2083         /* Only reinit if all queues show hung */
2084         if (hung == vsi->num_queues)
2085                 goto hung;
2086
2087         callout_reset(&pf->timer, hz, ixl_local_timer, pf);
2088         return;
2089
2090 hung:
2091         device_printf(dev, "Local Timer: HANG DETECT - Resetting!!\n");
2092         ixl_init_locked(pf);
2093 }
2094
2095 /*
2096 ** Note: this routine updates the OS on the link state
2097 **      the real check of the hardware only happens with
2098 **      a link interrupt.
2099 */
2100 static void
2101 ixl_update_link_status(struct ixl_pf *pf)
2102 {
2103         struct ixl_vsi          *vsi = &pf->vsi;
2104         struct i40e_hw          *hw = &pf->hw;
2105         struct ifnet            *ifp = vsi->ifp;
2106         device_t                dev = pf->dev;
2107
2108         if (pf->link_up) {
2109                 if (vsi->link_active == FALSE) {
2110                         pf->fc = hw->fc.current_mode;
2111                         if (bootverbose) {
2112                                 device_printf(dev,"Link is up %d Gbps %s,"
2113                                     " Flow Control: %s\n",
2114                                     ((pf->link_speed ==
2115                                     I40E_LINK_SPEED_40GB)? 40:10),
2116                                     "Full Duplex", ixl_fc_string[pf->fc]);
2117                         }
2118                         vsi->link_active = TRUE;
2119                         /*
2120                         ** Warn user if link speed on NPAR enabled
2121                         ** partition is not at least 10GB
2122                         */
2123                         if (hw->func_caps.npar_enable &&
2124                            (hw->phy.link_info.link_speed ==
2125                            I40E_LINK_SPEED_1GB ||
2126                            hw->phy.link_info.link_speed ==
2127                            I40E_LINK_SPEED_100MB))
2128                                 device_printf(dev, "The partition detected"
2129                                     "link speed that is less than 10Gbps\n");
2130                         if_link_state_change(ifp, LINK_STATE_UP);
2131                 }
2132         } else { /* Link down */
2133                 if (vsi->link_active == TRUE) {
2134                         if (bootverbose)
2135                                 device_printf(dev, "Link is Down\n");
2136                         if_link_state_change(ifp, LINK_STATE_DOWN);
2137                         vsi->link_active = FALSE;
2138                 }
2139         }
2140
2141         return;
2142 }
2143
2144 static void
2145 ixl_stop(struct ixl_pf *pf)
2146 {
2147         IXL_PF_LOCK(pf);
2148         ixl_stop_locked(pf);
2149         IXL_PF_UNLOCK(pf);
2150
2151         ixl_teardown_queue_msix(&pf->vsi);
2152         ixl_free_queue_tqs(&pf->vsi);
2153 }
2154
2155 /*********************************************************************
2156  *
2157  *  This routine disables all traffic on the adapter by issuing a
2158  *  global reset on the MAC and deallocates TX/RX buffers.
2159  *
2160  **********************************************************************/
2161
2162 static void
2163 ixl_stop_locked(struct ixl_pf *pf)
2164 {
2165         struct ixl_vsi  *vsi = &pf->vsi;
2166         struct ifnet    *ifp = vsi->ifp;
2167
2168         INIT_DEBUGOUT("ixl_stop: begin\n");
2169
2170         IXL_PF_LOCK_ASSERT(pf);
2171
2172         /* Stop the local timer */
2173         callout_stop(&pf->timer);
2174
2175         ixl_disable_rings_intr(vsi);
2176         ixl_disable_rings(vsi);
2177
2178         /* Tell the stack that the interface is no longer active */
2179         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING);
2180 }
2181
2182
2183 /*********************************************************************
2184  *
2185  *  Setup MSIX Interrupt resources and handlers for the VSI
2186  *
2187  **********************************************************************/
2188 static int
2189 ixl_assign_vsi_legacy(struct ixl_pf *pf)
2190 {
2191         device_t        dev = pf->dev;
2192         struct          ixl_vsi *vsi = &pf->vsi;
2193         struct          ixl_queue *que = vsi->queues;
2194         int             error, rid = 0;
2195
2196         if (pf->msix == 1)
2197                 rid = 1;
2198         pf->res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
2199             &rid, RF_SHAREABLE | RF_ACTIVE);
2200         if (pf->res == NULL) {
2201                 device_printf(dev, "Unable to allocate"
2202                     " bus resource: vsi legacy/msi interrupt\n");
2203                 return (ENXIO);
2204         }
2205
2206         /* Set the handler function */
2207         error = bus_setup_intr(dev, pf->res,
2208             INTR_TYPE_NET | INTR_MPSAFE, NULL,
2209             ixl_intr, pf, &pf->tag);
2210         if (error) {
2211                 pf->res = NULL;
2212                 device_printf(dev, "Failed to register legacy/msi handler\n");
2213                 return (error);
2214         }
2215         bus_describe_intr(dev, pf->res, pf->tag, "irq0");
2216         TASK_INIT(&que->tx_task, 0, ixl_deferred_mq_start, que);
2217         TASK_INIT(&que->task, 0, ixl_handle_que, que);
2218         que->tq = taskqueue_create_fast("ixl_que", M_NOWAIT,
2219             taskqueue_thread_enqueue, &que->tq);
2220         taskqueue_start_threads(&que->tq, 1, PI_NET, "%s que",
2221             device_get_nameunit(dev));
2222         TASK_INIT(&pf->adminq, 0, ixl_do_adminq, pf);
2223
2224         pf->tq = taskqueue_create_fast("ixl_adm", M_NOWAIT,
2225             taskqueue_thread_enqueue, &pf->tq);
2226         taskqueue_start_threads(&pf->tq, 1, PI_NET, "%s adminq",
2227             device_get_nameunit(dev));
2228
2229         return (0);
2230 }
2231
2232 static int
2233 ixl_setup_adminq_tq(struct ixl_pf *pf)
2234 {
2235         device_t dev = pf->dev;
2236         int error = 0;
2237
2238         /* Tasklet for Admin Queue interrupts */
2239         TASK_INIT(&pf->adminq, 0, ixl_do_adminq, pf);
2240 #ifdef PCI_IOV
2241         /* VFLR Tasklet */
2242         TASK_INIT(&pf->vflr_task, 0, ixl_handle_vflr, pf);
2243 #endif
2244         /* Create and start Admin Queue taskqueue */
2245         pf->tq = taskqueue_create_fast("ixl_aq", M_NOWAIT,
2246             taskqueue_thread_enqueue, &pf->tq);
2247         if (!pf->tq) {
2248                 device_printf(dev, "taskqueue_create_fast (for AQ) returned NULL!\n");
2249                 return (ENOMEM);
2250         }
2251         error = taskqueue_start_threads(&pf->tq, 1, PI_NET, "%s aq",
2252             device_get_nameunit(dev));
2253         if (error) {
2254                 device_printf(dev, "taskqueue_start_threads (for AQ) error: %d\n",
2255                     error);
2256                 taskqueue_free(pf->tq);
2257                 return (error);
2258         }
2259         return (0);
2260 }
2261
2262 static int
2263 ixl_setup_queue_tqs(struct ixl_vsi *vsi)
2264 {
2265         struct ixl_queue *que = vsi->queues;
2266         device_t dev = vsi->dev;
2267
2268         /* Create queue tasks and start queue taskqueues */
2269         for (int i = 0; i < vsi->num_queues; i++, que++) {
2270                 TASK_INIT(&que->tx_task, 0, ixl_deferred_mq_start, que);
2271                 TASK_INIT(&que->task, 0, ixl_handle_que, que);
2272                 que->tq = taskqueue_create_fast("ixl_que", M_NOWAIT,
2273                     taskqueue_thread_enqueue, &que->tq);
2274 #ifdef RSS
2275                 CPU_SETOF(cpu_id, &cpu_mask);
2276                 taskqueue_start_threads_cpuset(&que->tq, 1, PI_NET,
2277                     &cpu_mask, "%s (bucket %d)",
2278                     device_get_nameunit(dev), cpu_id);
2279 #else
2280                 taskqueue_start_threads(&que->tq, 1, PI_NET,
2281                     "%s (que %d)", device_get_nameunit(dev), que->me);
2282 #endif
2283         }
2284
2285         return (0);
2286 }
2287
2288 static void
2289 ixl_free_adminq_tq(struct ixl_pf *pf)
2290 {
2291         if (pf->tq) {
2292                 taskqueue_free(pf->tq);
2293                 pf->tq = NULL;
2294         }
2295 }
2296
2297 static void
2298 ixl_free_queue_tqs(struct ixl_vsi *vsi)
2299 {
2300         struct ixl_queue *que = vsi->queues;
2301
2302         for (int i = 0; i < vsi->num_queues; i++, que++) {
2303                 if (que->tq) {
2304                         taskqueue_free(que->tq);
2305                         que->tq = NULL;
2306                 }
2307         }
2308 }
2309
2310 static int
2311 ixl_setup_adminq_msix(struct ixl_pf *pf)
2312 {
2313         device_t dev = pf->dev;
2314         int rid, error = 0;
2315
2316         /* Admin IRQ rid is 1, vector is 0 */
2317         rid = 1;
2318         /* Get interrupt resource from bus */
2319         pf->res = bus_alloc_resource_any(dev,
2320             SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
2321         if (!pf->res) {
2322                 device_printf(dev, "bus_alloc_resource_any() for Admin Queue"
2323                     " interrupt failed [rid=%d]\n", rid);
2324                 return (ENXIO);
2325         }
2326         /* Then associate interrupt with handler */
2327         error = bus_setup_intr(dev, pf->res,
2328             INTR_TYPE_NET | INTR_MPSAFE, NULL,
2329             ixl_msix_adminq, pf, &pf->tag);
2330         if (error) {
2331                 pf->res = NULL;
2332                 device_printf(dev, "bus_setup_intr() for Admin Queue"
2333                     " interrupt handler failed, error %d\n", error);
2334                 return (ENXIO);
2335         }
2336         error = bus_describe_intr(dev, pf->res, pf->tag, "aq");
2337         if (error) {
2338                 /* Probably non-fatal? */
2339                 device_printf(dev, "bus_describe_intr() for Admin Queue"
2340                     " interrupt name failed, error %d\n", error);
2341         }
2342         pf->admvec = 0;
2343
2344         return (0);
2345 }
2346
2347 /*
2348  * Allocate interrupt resources from bus and associate an interrupt handler
2349  * to those for the VSI's queues.
2350  */
2351 static int
2352 ixl_setup_queue_msix(struct ixl_vsi *vsi)
2353 {
2354         device_t        dev = vsi->dev;
2355         struct          ixl_queue *que = vsi->queues;
2356         struct          tx_ring  *txr;
2357         int             error, rid, vector = 1;
2358 #ifdef  RSS
2359         cpuset_t cpu_mask;
2360 #endif
2361
2362         /* Queue interrupt vector numbers start at 1 (adminq intr is 0) */
2363         for (int i = 0; i < vsi->num_queues; i++, vector++, que++) {
2364                 int cpu_id = i;
2365                 rid = vector + 1;
2366                 txr = &que->txr;
2367                 que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
2368                     RF_SHAREABLE | RF_ACTIVE);
2369                 if (!que->res) {
2370                         device_printf(dev, "bus_alloc_resource_any() for"
2371                             " Queue %d interrupt failed [rid=%d]\n",
2372                             que->me, rid);
2373                         return (ENXIO);
2374                 }
2375                 /* Set the handler function */
2376                 error = bus_setup_intr(dev, que->res,
2377                     INTR_TYPE_NET | INTR_MPSAFE, NULL,
2378                     ixl_msix_que, que, &que->tag);
2379                 if (error) {
2380                         device_printf(dev, "bus_setup_intr() for Queue %d"
2381                             " interrupt handler failed, error %d\n",
2382                             que->me, error);
2383                         // TODO: Check for error from this?
2384                         bus_release_resource(dev, SYS_RES_IRQ, rid, que->res);
2385                         return (error);
2386                 }
2387                 error = bus_describe_intr(dev, que->res, que->tag, "q%d", i);
2388                 if (error) {
2389                         device_printf(dev, "bus_describe_intr() for Queue %d"
2390                             " interrupt name failed, error %d\n",
2391                             que->me, error);
2392                 }
2393                 /* Bind the vector to a CPU */
2394 #ifdef RSS
2395                 cpu_id = rss_getcpu(i % rss_getnumbuckets());
2396 #endif
2397                 error = bus_bind_intr(dev, que->res, cpu_id);
2398                 if (error) {
2399                         device_printf(dev, "bus_bind_intr() for Queue %d"
2400                             " to CPU %d failed, error %d\n",
2401                             que->me, cpu_id, error);
2402                 }
2403                 que->msix = vector;
2404         }
2405
2406         return (0);
2407 }
2408
2409
2410 /*
2411  * Allocate MSI/X vectors
2412  */
2413 static int
2414 ixl_init_msix(struct ixl_pf *pf)
2415 {
2416         device_t dev = pf->dev;
2417         int rid, want, vectors, queues, available;
2418
2419         /* Override by tuneable */
2420         if (ixl_enable_msix == 0)
2421                 goto no_msix;
2422
2423         /*
2424         ** When used in a virtualized environment 
2425         ** PCI BUSMASTER capability may not be set
2426         ** so explicity set it here and rewrite
2427         ** the ENABLE in the MSIX control register
2428         ** at this point to cause the host to
2429         ** successfully initialize us.
2430         */
2431         {
2432                 u16 pci_cmd_word;
2433                 int msix_ctrl;
2434                 pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2);
2435                 pci_cmd_word |= PCIM_CMD_BUSMASTEREN;
2436                 pci_write_config(dev, PCIR_COMMAND, pci_cmd_word, 2);
2437                 pci_find_cap(dev, PCIY_MSIX, &rid);
2438                 rid += PCIR_MSIX_CTRL;
2439                 msix_ctrl = pci_read_config(dev, rid, 2);
2440                 msix_ctrl |= PCIM_MSIXCTRL_MSIX_ENABLE;
2441                 pci_write_config(dev, rid, msix_ctrl, 2);
2442         }
2443
2444         /* First try MSI/X */
2445         rid = PCIR_BAR(IXL_BAR);
2446         pf->msix_mem = bus_alloc_resource_any(dev,
2447             SYS_RES_MEMORY, &rid, RF_ACTIVE);
2448         if (!pf->msix_mem) {
2449                 /* May not be enabled */
2450                 device_printf(pf->dev,
2451                     "Unable to map MSIX table\n");
2452                 goto no_msix;
2453         }
2454
2455         available = pci_msix_count(dev); 
2456         if (available == 0) { /* system has msix disabled */
2457                 bus_release_resource(dev, SYS_RES_MEMORY,
2458                     rid, pf->msix_mem);
2459                 pf->msix_mem = NULL;
2460                 goto no_msix;
2461         }
2462
2463         /* Figure out a reasonable auto config value */
2464         queues = (mp_ncpus > (available - 1)) ? (available - 1) : mp_ncpus;
2465
2466         /* Override with tunable value if tunable is less than autoconfig count */
2467         if ((ixl_max_queues != 0) && (ixl_max_queues <= queues)) 
2468                 queues = ixl_max_queues;
2469         else if ((ixl_max_queues != 0) && (ixl_max_queues > queues))
2470                 device_printf(dev, "ixl_max_queues > # of cpus, using "
2471                     "autoconfig amount...\n");
2472         /* Or limit maximum auto-configured queues to 8 */
2473         else if ((ixl_max_queues == 0) && (queues > 8))
2474                 queues = 8;
2475
2476 #ifdef  RSS
2477         /* If we're doing RSS, clamp at the number of RSS buckets */
2478         if (queues > rss_getnumbuckets())
2479                 queues = rss_getnumbuckets();
2480 #endif
2481
2482         /*
2483         ** Want one vector (RX/TX pair) per queue
2484         ** plus an additional for the admin queue.
2485         */
2486         want = queues + 1;
2487         if (want <= available)  /* Have enough */
2488                 vectors = want;
2489         else {
2490                 device_printf(pf->dev,
2491                     "MSIX Configuration Problem, "
2492                     "%d vectors available but %d wanted!\n",
2493                     available, want);
2494                 return (0); /* Will go to Legacy setup */
2495         }
2496
2497         if (pci_alloc_msix(dev, &vectors) == 0) {
2498                 device_printf(pf->dev,
2499                     "Using MSIX interrupts with %d vectors\n", vectors);
2500                 pf->msix = vectors;
2501                 pf->vsi.num_queues = queues;
2502 #ifdef RSS
2503                 /*
2504                  * If we're doing RSS, the number of queues needs to
2505                  * match the number of RSS buckets that are configured.
2506                  *
2507                  * + If there's more queues than RSS buckets, we'll end
2508                  *   up with queues that get no traffic.
2509                  *
2510                  * + If there's more RSS buckets than queues, we'll end
2511                  *   up having multiple RSS buckets map to the same queue,
2512                  *   so there'll be some contention.
2513                  */
2514                 if (queues != rss_getnumbuckets()) {
2515                         device_printf(dev,
2516                             "%s: queues (%d) != RSS buckets (%d)"
2517                             "; performance will be impacted.\n",
2518                             __func__, queues, rss_getnumbuckets());
2519                 }
2520 #endif
2521                 return (vectors);
2522         }
2523 no_msix:
2524         vectors = pci_msi_count(dev);
2525         pf->vsi.num_queues = 1;
2526         ixl_max_queues = 1;
2527         ixl_enable_msix = 0;
2528         if (vectors == 1 && pci_alloc_msi(dev, &vectors) == 0)
2529                 device_printf(pf->dev, "Using an MSI interrupt\n");
2530         else {
2531                 vectors = 0;
2532                 device_printf(pf->dev, "Using a Legacy interrupt\n");
2533         }
2534         return (vectors);
2535 }
2536
2537 /*
2538  * Configure admin queue/misc interrupt cause registers in hardware.
2539  */
2540 static void
2541 ixl_configure_intr0_msix(struct ixl_pf *pf)
2542 {
2543         struct i40e_hw *hw = &pf->hw;
2544         u32 reg;
2545
2546         /* First set up the adminq - vector 0 */
2547         wr32(hw, I40E_PFINT_ICR0_ENA, 0);  /* disable all */
2548         rd32(hw, I40E_PFINT_ICR0);         /* read to clear */
2549
2550         reg = I40E_PFINT_ICR0_ENA_ECC_ERR_MASK |
2551             I40E_PFINT_ICR0_ENA_GRST_MASK |
2552             I40E_PFINT_ICR0_ENA_HMC_ERR_MASK |
2553             I40E_PFINT_ICR0_ENA_ADMINQ_MASK |
2554             I40E_PFINT_ICR0_ENA_MAL_DETECT_MASK |
2555             I40E_PFINT_ICR0_ENA_VFLR_MASK |
2556             I40E_PFINT_ICR0_ENA_PCI_EXCEPTION_MASK;
2557         wr32(hw, I40E_PFINT_ICR0_ENA, reg);
2558
2559         /*
2560          * 0x7FF is the end of the queue list.
2561          * This means we won't use MSI-X vector 0 for a queue interrupt
2562          * in MSIX mode.
2563          */
2564         wr32(hw, I40E_PFINT_LNKLST0, 0x7FF);
2565         /* Value is in 2 usec units, so 0x3E is 62*2 = 124 usecs. */
2566         wr32(hw, I40E_PFINT_ITR0(IXL_RX_ITR), 0x3E);
2567
2568         wr32(hw, I40E_PFINT_DYN_CTL0,
2569             I40E_PFINT_DYN_CTL0_SW_ITR_INDX_MASK |
2570             I40E_PFINT_DYN_CTL0_INTENA_MSK_MASK);
2571
2572         wr32(hw, I40E_PFINT_STAT_CTL0, 0);
2573 }
2574
2575 /*
2576  * Configure queue interrupt cause registers in hardware.
2577  */
2578 static void
2579 ixl_configure_queue_intr_msix(struct ixl_pf *pf)
2580 {
2581         struct i40e_hw  *hw = &pf->hw;
2582         struct ixl_vsi *vsi = &pf->vsi;
2583         u32             reg;
2584         u16             vector = 1;
2585
2586         for (int i = 0; i < vsi->num_queues; i++, vector++) {
2587                 wr32(hw, I40E_PFINT_DYN_CTLN(i), 0);
2588                 /* First queue type is RX / 0 */
2589                 wr32(hw, I40E_PFINT_LNKLSTN(i), i);
2590
2591                 reg = I40E_QINT_RQCTL_CAUSE_ENA_MASK |
2592                 (IXL_RX_ITR << I40E_QINT_RQCTL_ITR_INDX_SHIFT) |
2593                 (vector << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) |
2594                 (i << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) |
2595                 (I40E_QUEUE_TYPE_TX << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT);
2596                 wr32(hw, I40E_QINT_RQCTL(i), reg);
2597
2598                 reg = I40E_QINT_TQCTL_CAUSE_ENA_MASK |
2599                 (IXL_TX_ITR << I40E_QINT_TQCTL_ITR_INDX_SHIFT) |
2600                 (vector << I40E_QINT_TQCTL_MSIX_INDX_SHIFT) |
2601                 (IXL_QUEUE_EOL << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT) |
2602                 (I40E_QUEUE_TYPE_RX << I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT);
2603                 wr32(hw, I40E_QINT_TQCTL(i), reg);
2604         }
2605 }
2606
2607 /*
2608  * Configure for MSI single vector operation 
2609  */
2610 static void
2611 ixl_configure_legacy(struct ixl_pf *pf)
2612 {
2613         struct i40e_hw  *hw = &pf->hw;
2614         u32             reg;
2615
2616         wr32(hw, I40E_PFINT_ITR0(0), 0);
2617         wr32(hw, I40E_PFINT_ITR0(1), 0);
2618
2619         /* Setup "other" causes */
2620         reg = I40E_PFINT_ICR0_ENA_ECC_ERR_MASK
2621             | I40E_PFINT_ICR0_ENA_MAL_DETECT_MASK
2622             | I40E_PFINT_ICR0_ENA_GRST_MASK
2623             | I40E_PFINT_ICR0_ENA_PCI_EXCEPTION_MASK
2624             | I40E_PFINT_ICR0_ENA_GPIO_MASK
2625             | I40E_PFINT_ICR0_ENA_LINK_STAT_CHANGE_MASK
2626             | I40E_PFINT_ICR0_ENA_HMC_ERR_MASK
2627             | I40E_PFINT_ICR0_ENA_PE_CRITERR_MASK
2628             | I40E_PFINT_ICR0_ENA_VFLR_MASK
2629             | I40E_PFINT_ICR0_ENA_ADMINQ_MASK
2630             ;
2631         wr32(hw, I40E_PFINT_ICR0_ENA, reg);
2632
2633         /* SW_ITR_IDX = 0, but don't change INTENA */
2634         wr32(hw, I40E_PFINT_DYN_CTL0,
2635             I40E_PFINT_DYN_CTLN_SW_ITR_INDX_MASK |
2636             I40E_PFINT_DYN_CTLN_INTENA_MSK_MASK);
2637         /* SW_ITR_IDX = 0, OTHER_ITR_IDX = 0 */
2638         wr32(hw, I40E_PFINT_STAT_CTL0, 0);
2639
2640         /* FIRSTQ_INDX = 0, FIRSTQ_TYPE = 0 (rx) */
2641         wr32(hw, I40E_PFINT_LNKLST0, 0);
2642
2643         /* Associate the queue pair to the vector and enable the q int */
2644         reg = I40E_QINT_RQCTL_CAUSE_ENA_MASK
2645             | (IXL_RX_ITR << I40E_QINT_RQCTL_ITR_INDX_SHIFT)
2646             | (I40E_QUEUE_TYPE_TX << I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT);
2647         wr32(hw, I40E_QINT_RQCTL(0), reg);
2648
2649         reg = I40E_QINT_TQCTL_CAUSE_ENA_MASK
2650             | (IXL_TX_ITR << I40E_QINT_TQCTL_ITR_INDX_SHIFT)
2651             | (IXL_QUEUE_EOL << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT);
2652         wr32(hw, I40E_QINT_TQCTL(0), reg);
2653 }
2654
2655
2656 /*
2657  * Get initial ITR values from tunable values.
2658  */
2659 static void
2660 ixl_configure_itr(struct ixl_pf *pf)
2661 {
2662         struct i40e_hw          *hw = &pf->hw;
2663         struct ixl_vsi          *vsi = &pf->vsi;
2664         struct ixl_queue        *que = vsi->queues;
2665
2666         vsi->rx_itr_setting = ixl_rx_itr;
2667         vsi->tx_itr_setting = ixl_tx_itr;
2668         
2669         for (int i = 0; i < vsi->num_queues; i++, que++) {
2670                 struct tx_ring  *txr = &que->txr;
2671                 struct rx_ring  *rxr = &que->rxr;
2672
2673                 wr32(hw, I40E_PFINT_ITRN(IXL_RX_ITR, i),
2674                     vsi->rx_itr_setting);
2675                 rxr->itr = vsi->rx_itr_setting;
2676                 rxr->latency = IXL_AVE_LATENCY;
2677
2678                 wr32(hw, I40E_PFINT_ITRN(IXL_TX_ITR, i),
2679                     vsi->tx_itr_setting);
2680                 txr->itr = vsi->tx_itr_setting;
2681                 txr->latency = IXL_AVE_LATENCY;
2682         }
2683 }
2684
2685
2686 static int
2687 ixl_allocate_pci_resources(struct ixl_pf *pf)
2688 {
2689         int             rid;
2690         device_t        dev = pf->dev;
2691
2692         rid = PCIR_BAR(0);
2693         pf->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
2694             &rid, RF_ACTIVE);
2695
2696         if (!(pf->pci_mem)) {
2697                 device_printf(dev, "Unable to allocate bus resource: PCI memory\n");
2698                 return (ENXIO);
2699         }
2700
2701         pf->osdep.mem_bus_space_tag =
2702                 rman_get_bustag(pf->pci_mem);
2703         pf->osdep.mem_bus_space_handle =
2704                 rman_get_bushandle(pf->pci_mem);
2705         pf->osdep.mem_bus_space_size = rman_get_size(pf->pci_mem);
2706         pf->osdep.flush_reg = I40E_GLGEN_STAT;
2707         pf->hw.hw_addr = (u8 *) &pf->osdep.mem_bus_space_handle;
2708
2709         pf->hw.back = &pf->osdep;
2710
2711         /*
2712         ** Now setup MSI or MSI/X, should
2713         ** return us the number of supported
2714         ** vectors. (Will be 1 for MSI)
2715         */
2716         pf->msix = ixl_init_msix(pf);
2717         return (0);
2718 }
2719
2720 /*
2721  * Teardown and release the admin queue/misc vector
2722  * interrupt.
2723  */
2724 static int
2725 ixl_teardown_adminq_msix(struct ixl_pf *pf)
2726 {
2727         device_t                dev = pf->dev;
2728         int                     rid;
2729
2730         if (pf->admvec) /* we are doing MSIX */
2731                 rid = pf->admvec + 1;
2732         else
2733                 (pf->msix != 0) ? (rid = 1):(rid = 0);
2734
2735         // TODO: Check for errors from bus_teardown_intr
2736         // TODO: Check for errors from bus_release_resource
2737         if (pf->tag != NULL) {
2738                 bus_teardown_intr(dev, pf->res, pf->tag);
2739                 pf->tag = NULL;
2740         }
2741         if (pf->res != NULL) {
2742                 bus_release_resource(dev, SYS_RES_IRQ, rid, pf->res);
2743                 pf->res = NULL;
2744         }
2745
2746         return (0);
2747 }
2748
2749 static int
2750 ixl_teardown_queue_msix(struct ixl_vsi *vsi)
2751 {
2752         struct ixl_queue        *que = vsi->queues;
2753         device_t                dev = vsi->dev;
2754         int                     rid, error = 0;
2755
2756         /* We may get here before stations are setup */
2757         if ((!ixl_enable_msix) || (que == NULL))
2758                 return (0);
2759
2760         /* Release all MSIX queue resources */
2761         for (int i = 0; i < vsi->num_queues; i++, que++) {
2762                 rid = que->msix + 1;
2763                 if (que->tag != NULL) {
2764                         error = bus_teardown_intr(dev, que->res, que->tag);
2765                         if (error) {
2766                                 device_printf(dev, "bus_teardown_intr() for"
2767                                     " Queue %d interrupt failed\n",
2768                                     que->me);
2769                                 // return (ENXIO);
2770                         }
2771                         que->tag = NULL;
2772                 }
2773                 if (que->res != NULL) {
2774                         error = bus_release_resource(dev, SYS_RES_IRQ, rid, que->res);
2775                         if (error) {
2776                                 device_printf(dev, "bus_release_resource() for"
2777                                     " Queue %d interrupt failed [rid=%d]\n",
2778                                     que->me, rid);
2779                                 // return (ENXIO);
2780                         }
2781                         que->res = NULL;
2782                 }
2783         }
2784
2785         return (0);
2786 }
2787
2788 static void
2789 ixl_free_pci_resources(struct ixl_pf *pf)
2790 {
2791         device_t                dev = pf->dev;
2792         int                     memrid;
2793
2794         ixl_teardown_queue_msix(&pf->vsi);
2795         ixl_teardown_adminq_msix(pf);
2796
2797         if (pf->msix)
2798                 pci_release_msi(dev);
2799
2800         memrid = PCIR_BAR(IXL_BAR);
2801
2802         if (pf->msix_mem != NULL)
2803                 bus_release_resource(dev, SYS_RES_MEMORY,
2804                     memrid, pf->msix_mem);
2805
2806         if (pf->pci_mem != NULL)
2807                 bus_release_resource(dev, SYS_RES_MEMORY,
2808                     PCIR_BAR(0), pf->pci_mem);
2809
2810         return;
2811 }
2812
2813 static void
2814 ixl_add_ifmedia(struct ixl_vsi *vsi, u32 phy_type)
2815 {
2816         /* Display supported media types */
2817         if (phy_type & (1 << I40E_PHY_TYPE_100BASE_TX))
2818                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_100_TX, 0, NULL);
2819
2820         if (phy_type & (1 << I40E_PHY_TYPE_1000BASE_T))
2821                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_1000_T, 0, NULL);
2822         if (phy_type & (1 << I40E_PHY_TYPE_1000BASE_SX))
2823                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
2824         if (phy_type & (1 << I40E_PHY_TYPE_1000BASE_LX))
2825                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
2826
2827         if (phy_type & (1 << I40E_PHY_TYPE_XAUI) ||
2828             phy_type & (1 << I40E_PHY_TYPE_XFI) ||
2829             phy_type & (1 << I40E_PHY_TYPE_10GBASE_SFPP_CU))
2830                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_TWINAX, 0, NULL);
2831
2832         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_SR))
2833                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
2834         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_LR))
2835                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
2836         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_T))
2837                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_T, 0, NULL);
2838
2839         if (phy_type & (1 << I40E_PHY_TYPE_40GBASE_CR4) ||
2840             phy_type & (1 << I40E_PHY_TYPE_40GBASE_CR4_CU) ||
2841             phy_type & (1 << I40E_PHY_TYPE_40GBASE_AOC) ||
2842             phy_type & (1 << I40E_PHY_TYPE_XLAUI) ||
2843             phy_type & (1 << I40E_PHY_TYPE_40GBASE_KR4))
2844                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_CR4, 0, NULL);
2845         if (phy_type & (1 << I40E_PHY_TYPE_40GBASE_SR4))
2846                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_SR4, 0, NULL);
2847         if (phy_type & (1 << I40E_PHY_TYPE_40GBASE_LR4))
2848                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_LR4, 0, NULL);
2849
2850 #ifndef IFM_ETH_XTYPE
2851         if (phy_type & (1 << I40E_PHY_TYPE_1000BASE_KX))
2852                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
2853
2854         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_CR1_CU) ||
2855             phy_type & (1 << I40E_PHY_TYPE_10GBASE_CR1) ||
2856             phy_type & (1 << I40E_PHY_TYPE_10GBASE_AOC) ||
2857             phy_type & (1 << I40E_PHY_TYPE_SFI))
2858                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_TWINAX, 0, NULL);
2859         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_KX4))
2860                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
2861         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_KR))
2862                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
2863
2864         if (phy_type & (1 << I40E_PHY_TYPE_40GBASE_KR4))
2865                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_SR4, 0, NULL);
2866         if (phy_type & (1 << I40E_PHY_TYPE_XLPPI))
2867                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_CR4, 0, NULL);
2868 #else
2869         if (phy_type & (1 << I40E_PHY_TYPE_1000BASE_KX))
2870                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_1000_KX, 0, NULL);
2871
2872         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_CR1_CU)
2873             || phy_type & (1 << I40E_PHY_TYPE_10GBASE_CR1))
2874                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_CR1, 0, NULL);
2875         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_AOC))
2876                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_TWINAX_LONG, 0, NULL);
2877         if (phy_type & (1 << I40E_PHY_TYPE_SFI))
2878                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_SFI, 0, NULL);
2879         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_KX4))
2880                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_KX4, 0, NULL);
2881         if (phy_type & (1 << I40E_PHY_TYPE_10GBASE_KR))
2882                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_10G_KR, 0, NULL);
2883
2884         if (phy_type & (1 << I40E_PHY_TYPE_20GBASE_KR2))
2885                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_20G_KR2, 0, NULL);
2886
2887         if (phy_type & (1 << I40E_PHY_TYPE_40GBASE_KR4))
2888                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_KR4, 0, NULL);
2889         if (phy_type & (1 << I40E_PHY_TYPE_XLPPI))
2890                 ifmedia_add(&vsi->media, IFM_ETHER | IFM_40G_XLPPI, 0, NULL);
2891 #endif
2892 }
2893
2894 /*********************************************************************
2895  *
2896  *  Setup networking device structure and register an interface.
2897  *
2898  **********************************************************************/
2899 static int
2900 ixl_setup_interface(device_t dev, struct ixl_vsi *vsi)
2901 {
2902         struct ifnet            *ifp;
2903         struct i40e_hw          *hw = vsi->hw;
2904         struct ixl_queue        *que = vsi->queues;
2905         struct i40e_aq_get_phy_abilities_resp abilities;
2906         enum i40e_status_code aq_error = 0;
2907
2908         INIT_DEBUGOUT("ixl_setup_interface: begin");
2909
2910         ifp = vsi->ifp = if_alloc(IFT_ETHER);
2911         if (ifp == NULL) {
2912                 device_printf(dev, "can not allocate ifnet structure\n");
2913                 return (-1);
2914         }
2915         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
2916         ifp->if_mtu = ETHERMTU;
2917         ifp->if_baudrate = IF_Gbps(40);
2918         ifp->if_init = ixl_init;
2919         ifp->if_softc = vsi;
2920         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2921         ifp->if_ioctl = ixl_ioctl;
2922
2923 #if __FreeBSD_version >= 1100036
2924         if_setgetcounterfn(ifp, ixl_get_counter);
2925 #endif
2926
2927         ifp->if_transmit = ixl_mq_start;
2928
2929         ifp->if_qflush = ixl_qflush;
2930
2931         ifp->if_snd.ifq_maxlen = que->num_desc - 2;
2932
2933         vsi->max_frame_size =
2934             ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN
2935             + ETHER_VLAN_ENCAP_LEN;
2936
2937         /*
2938          * Tell the upper layer(s) we support long frames.
2939          */
2940         ifp->if_hdrlen = sizeof(struct ether_vlan_header);
2941
2942         ifp->if_capabilities |= IFCAP_HWCSUM;
2943         ifp->if_capabilities |= IFCAP_HWCSUM_IPV6;
2944         ifp->if_capabilities |= IFCAP_TSO;
2945         ifp->if_capabilities |= IFCAP_JUMBO_MTU;
2946         ifp->if_capabilities |= IFCAP_LRO;
2947
2948         /* VLAN capabilties */
2949         ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING
2950                              |  IFCAP_VLAN_HWTSO
2951                              |  IFCAP_VLAN_MTU
2952                              |  IFCAP_VLAN_HWCSUM;
2953         ifp->if_capenable = ifp->if_capabilities;
2954
2955         /*
2956         ** Don't turn this on by default, if vlans are
2957         ** created on another pseudo device (eg. lagg)
2958         ** then vlan events are not passed thru, breaking
2959         ** operation, but with HW FILTER off it works. If
2960         ** using vlans directly on the ixl driver you can
2961         ** enable this and get full hardware tag filtering.
2962         */
2963         ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
2964
2965         /*
2966          * Specify the media types supported by this adapter and register
2967          * callbacks to update media and link information
2968          */
2969         ifmedia_init(&vsi->media, IFM_IMASK, ixl_media_change,
2970                      ixl_media_status);
2971
2972         aq_error = i40e_aq_get_phy_capabilities(hw,
2973             FALSE, TRUE, &abilities, NULL);
2974         /* May need delay to detect fiber correctly */
2975         if (aq_error == I40E_ERR_UNKNOWN_PHY) {
2976                 i40e_msec_delay(200);
2977                 aq_error = i40e_aq_get_phy_capabilities(hw, FALSE,
2978                     TRUE, &abilities, NULL);
2979         }
2980         if (aq_error) {
2981                 if (aq_error == I40E_ERR_UNKNOWN_PHY)
2982                         device_printf(dev, "Unknown PHY type detected!\n");
2983                 else
2984                         device_printf(dev,
2985                             "Error getting supported media types, err %d,"
2986                             " AQ error %d\n", aq_error, hw->aq.asq_last_status);
2987                 return (0);
2988         }
2989
2990         ixl_add_ifmedia(vsi, abilities.phy_type);
2991
2992         /* Use autoselect media by default */
2993         ifmedia_add(&vsi->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2994         ifmedia_set(&vsi->media, IFM_ETHER | IFM_AUTO);
2995
2996         ether_ifattach(ifp, hw->mac.addr);
2997
2998         return (0);
2999 }
3000
3001 /*
3002 ** Run when the Admin Queue gets a link state change interrupt.
3003 */
3004 static void
3005 ixl_link_event(struct ixl_pf *pf, struct i40e_arq_event_info *e)
3006 {
3007         struct i40e_hw  *hw = &pf->hw; 
3008         device_t dev = pf->dev;
3009         struct i40e_aqc_get_link_status *status =
3010             (struct i40e_aqc_get_link_status *)&e->desc.params.raw;
3011
3012         /* Request link status from adapter */
3013         hw->phy.get_link_info = TRUE;
3014         i40e_get_link_status(hw, &pf->link_up);
3015
3016         /* Print out message if an unqualified module is found */
3017         if ((status->link_info & I40E_AQ_MEDIA_AVAILABLE) &&
3018             (!(status->an_info & I40E_AQ_QUALIFIED_MODULE)) &&
3019             (!(status->link_info & I40E_AQ_LINK_UP)))
3020                 device_printf(dev, "Link failed because "
3021                     "an unqualified module was detected!\n");
3022
3023         /* Update OS link info */
3024         ixl_update_link_status(pf);
3025 }
3026
3027 /*********************************************************************
3028  *
3029  *  Get Firmware Switch configuration
3030  *      - this will need to be more robust when more complex
3031  *        switch configurations are enabled.
3032  *
3033  **********************************************************************/
3034 static int
3035 ixl_switch_config(struct ixl_pf *pf)
3036 {
3037         struct i40e_hw  *hw = &pf->hw; 
3038         struct ixl_vsi  *vsi = &pf->vsi;
3039         device_t        dev = vsi->dev;
3040         struct i40e_aqc_get_switch_config_resp *sw_config;
3041         u8      aq_buf[I40E_AQ_LARGE_BUF];
3042         int     ret;
3043         u16     next = 0;
3044
3045         memset(&aq_buf, 0, sizeof(aq_buf));
3046         sw_config = (struct i40e_aqc_get_switch_config_resp *)aq_buf;
3047         ret = i40e_aq_get_switch_config(hw, sw_config,
3048             sizeof(aq_buf), &next, NULL);
3049         if (ret) {
3050                 device_printf(dev, "aq_get_switch_config() failed, error %d,"
3051                     " aq_error %d\n", ret, pf->hw.aq.asq_last_status);
3052                 return (ret);
3053         }
3054 #ifdef IXL_DEBUG
3055         device_printf(dev,
3056             "Switch config: header reported: %d in structure, %d total\n",
3057             sw_config->header.num_reported, sw_config->header.num_total);
3058         for (int i = 0; i < sw_config->header.num_reported; i++) {
3059                 device_printf(dev,
3060                     "%d: type=%d seid=%d uplink=%d downlink=%d\n", i,
3061                     sw_config->element[i].element_type,
3062                     sw_config->element[i].seid,
3063                     sw_config->element[i].uplink_seid,
3064                     sw_config->element[i].downlink_seid);
3065         }
3066 #endif
3067         /* Simplified due to a single VSI at the moment */
3068         vsi->uplink_seid = sw_config->element[0].uplink_seid;
3069         vsi->downlink_seid = sw_config->element[0].downlink_seid;
3070         vsi->seid = sw_config->element[0].seid;
3071         return (ret);
3072 }
3073
3074 /*********************************************************************
3075  *
3076  *  Initialize the VSI:  this handles contexts, which means things
3077  *                       like the number of descriptors, buffer size,
3078  *                       plus we init the rings thru this function.
3079  *
3080  **********************************************************************/
3081 static int
3082 ixl_initialize_vsi(struct ixl_vsi *vsi)
3083 {
3084         struct ixl_pf           *pf = vsi->back;
3085         struct ixl_queue        *que = vsi->queues;
3086         device_t                dev = vsi->dev;
3087         struct i40e_hw          *hw = vsi->hw;
3088         struct i40e_vsi_context ctxt;
3089         int                     err = 0;
3090
3091         memset(&ctxt, 0, sizeof(ctxt));
3092         ctxt.seid = vsi->seid;
3093         if (pf->veb_seid != 0)
3094                 ctxt.uplink_seid = pf->veb_seid;
3095         ctxt.pf_num = hw->pf_id;
3096         err = i40e_aq_get_vsi_params(hw, &ctxt, NULL);
3097         if (err) {
3098                 device_printf(dev, "i40e_aq_get_vsi_params() failed, error %d"
3099                     " aq_error %d\n", err, hw->aq.asq_last_status);
3100                 return (err);
3101         }
3102 #ifdef IXL_DEBUG
3103         device_printf(dev, "get_vsi_params: seid: %d, uplinkseid: %d, vsi_number: %d, "
3104             "vsis_allocated: %d, vsis_unallocated: %d, flags: 0x%x, "
3105             "pfnum: %d, vfnum: %d, stat idx: %d, enabled: %d\n", ctxt.seid,
3106             ctxt.uplink_seid, ctxt.vsi_number,
3107             ctxt.vsis_allocated, ctxt.vsis_unallocated,
3108             ctxt.flags, ctxt.pf_num, ctxt.vf_num,
3109             ctxt.info.stat_counter_idx, ctxt.info.up_enable_bits);
3110 #endif
3111         /*
3112         ** Set the queue and traffic class bits
3113         **  - when multiple traffic classes are supported
3114         **    this will need to be more robust.
3115         */
3116         ctxt.info.valid_sections = I40E_AQ_VSI_PROP_QUEUE_MAP_VALID;
3117         ctxt.info.mapping_flags |= I40E_AQ_VSI_QUE_MAP_CONTIG;
3118         /* In contig mode, que_mapping[0] is first queue index used by this VSI */
3119         ctxt.info.queue_mapping[0] = 0;
3120         /*
3121          * This VSI will only use traffic class 0; start traffic class 0's
3122          * queue allocation at queue 0, and assign it 64 (2^6) queues (though
3123          * the driver may not use all of them).
3124          */
3125         ctxt.info.tc_mapping[0] = ((0 << I40E_AQ_VSI_TC_QUE_OFFSET_SHIFT)
3126             & I40E_AQ_VSI_TC_QUE_OFFSET_MASK) |
3127             ((6 << I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT)
3128             & I40E_AQ_VSI_TC_QUE_NUMBER_MASK);
3129
3130         /* Set VLAN receive stripping mode */
3131         ctxt.info.valid_sections |= I40E_AQ_VSI_PROP_VLAN_VALID;
3132         ctxt.info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL;
3133         if (vsi->ifp->if_capenable & IFCAP_VLAN_HWTAGGING)
3134                 ctxt.info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_EMOD_STR_BOTH;
3135         else
3136                 ctxt.info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_EMOD_NOTHING;
3137
3138         /* Keep copy of VSI info in VSI for statistic counters */
3139         memcpy(&vsi->info, &ctxt.info, sizeof(ctxt.info));
3140
3141         /* Reset VSI statistics */
3142         ixl_vsi_reset_stats(vsi);
3143         vsi->hw_filters_add = 0;
3144         vsi->hw_filters_del = 0;
3145
3146         ctxt.flags = htole16(I40E_AQ_VSI_TYPE_PF);
3147
3148         err = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
3149         if (err) {
3150                 device_printf(dev, "i40e_aq_update_vsi_params() failed, error %d, aq_error %d\n",
3151                    err, hw->aq.asq_last_status);
3152                 return (err);
3153         }
3154
3155         for (int i = 0; i < vsi->num_queues; i++, que++) {
3156                 struct tx_ring          *txr = &que->txr;
3157                 struct rx_ring          *rxr = &que->rxr;
3158                 struct i40e_hmc_obj_txq tctx;
3159                 struct i40e_hmc_obj_rxq rctx;
3160                 u32                     txctl;
3161                 u16                     size;
3162
3163                 /* Setup the HMC TX Context  */
3164                 size = que->num_desc * sizeof(struct i40e_tx_desc);
3165                 memset(&tctx, 0, sizeof(struct i40e_hmc_obj_txq));
3166                 tctx.new_context = 1;
3167                 tctx.base = (txr->dma.pa/IXL_TX_CTX_BASE_UNITS);
3168                 tctx.qlen = que->num_desc;
3169                 tctx.fc_ena = 0;
3170                 tctx.rdylist = vsi->info.qs_handle[0]; /* index is TC */
3171                 /* Enable HEAD writeback */
3172                 tctx.head_wb_ena = 1;
3173                 tctx.head_wb_addr = txr->dma.pa +
3174                     (que->num_desc * sizeof(struct i40e_tx_desc));
3175                 tctx.rdylist_act = 0;
3176                 err = i40e_clear_lan_tx_queue_context(hw, i);
3177                 if (err) {
3178                         device_printf(dev, "Unable to clear TX context\n");
3179                         break;
3180                 }
3181                 err = i40e_set_lan_tx_queue_context(hw, i, &tctx);
3182                 if (err) {
3183                         device_printf(dev, "Unable to set TX context\n");
3184                         break;
3185                 }
3186                 /* Associate the ring with this PF */
3187                 txctl = I40E_QTX_CTL_PF_QUEUE;
3188                 txctl |= ((hw->pf_id << I40E_QTX_CTL_PF_INDX_SHIFT) &
3189                     I40E_QTX_CTL_PF_INDX_MASK);
3190                 wr32(hw, I40E_QTX_CTL(i), txctl);
3191                 ixl_flush(hw);
3192
3193                 /* Do ring (re)init */
3194                 ixl_init_tx_ring(que);
3195
3196                 /* Next setup the HMC RX Context  */
3197                 if (vsi->max_frame_size <= MCLBYTES)
3198                         rxr->mbuf_sz = MCLBYTES;
3199                 else
3200                         rxr->mbuf_sz = MJUMPAGESIZE;
3201
3202                 u16 max_rxmax = rxr->mbuf_sz * hw->func_caps.rx_buf_chain_len;
3203
3204                 /* Set up an RX context for the HMC */
3205                 memset(&rctx, 0, sizeof(struct i40e_hmc_obj_rxq));
3206                 rctx.dbuff = rxr->mbuf_sz >> I40E_RXQ_CTX_DBUFF_SHIFT;
3207                 /* ignore header split for now */
3208                 rctx.hbuff = 0 >> I40E_RXQ_CTX_HBUFF_SHIFT;
3209                 rctx.rxmax = (vsi->max_frame_size < max_rxmax) ?
3210                     vsi->max_frame_size : max_rxmax;
3211                 rctx.dtype = 0;
3212                 rctx.dsize = 1; /* do 32byte descriptors */
3213                 rctx.hsplit_0 = 0;  /* no HDR split initially */
3214                 rctx.base = (rxr->dma.pa/IXL_RX_CTX_BASE_UNITS);
3215                 rctx.qlen = que->num_desc;
3216                 rctx.tphrdesc_ena = 1;
3217                 rctx.tphwdesc_ena = 1;
3218                 rctx.tphdata_ena = 0;
3219                 rctx.tphhead_ena = 0;
3220                 rctx.lrxqthresh = 2;
3221                 rctx.crcstrip = 1;
3222                 rctx.l2tsel = 1;
3223                 rctx.showiv = 1;
3224                 rctx.fc_ena = 0;
3225                 rctx.prefena = 1;
3226
3227                 err = i40e_clear_lan_rx_queue_context(hw, i);
3228                 if (err) {
3229                         device_printf(dev,
3230                             "Unable to clear RX context %d\n", i);
3231                         break;
3232                 }
3233                 err = i40e_set_lan_rx_queue_context(hw, i, &rctx);
3234                 if (err) {
3235                         device_printf(dev, "Unable to set RX context %d\n", i);
3236                         break;
3237                 }
3238                 err = ixl_init_rx_ring(que);
3239                 if (err) {
3240                         device_printf(dev, "Fail in init_rx_ring %d\n", i);
3241                         break;
3242                 }
3243 #ifdef DEV_NETMAP
3244                 /* preserve queue */
3245                 if (vsi->ifp->if_capenable & IFCAP_NETMAP) {
3246                         struct netmap_adapter *na = NA(vsi->ifp);
3247                         struct netmap_kring *kring = &na->rx_rings[i];
3248                         int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
3249                         wr32(vsi->hw, I40E_QRX_TAIL(que->me), t);
3250                 } else
3251 #endif /* DEV_NETMAP */
3252                 wr32(vsi->hw, I40E_QRX_TAIL(que->me), que->num_desc - 1);
3253         }
3254         return (err);
3255 }
3256
3257
3258 /*********************************************************************
3259  *
3260  *  Free all VSI structs.
3261  *
3262  **********************************************************************/
3263 void
3264 ixl_free_vsi(struct ixl_vsi *vsi)
3265 {
3266         struct ixl_pf           *pf = (struct ixl_pf *)vsi->back;
3267         struct ixl_queue        *que = vsi->queues;
3268
3269         /* Free station queues */
3270         if (!vsi->queues)
3271                 goto free_filters;
3272
3273         for (int i = 0; i < vsi->num_queues; i++, que++) {
3274                 struct tx_ring *txr = &que->txr;
3275                 struct rx_ring *rxr = &que->rxr;
3276         
3277                 if (!mtx_initialized(&txr->mtx)) /* uninitialized */
3278                         continue;
3279                 IXL_TX_LOCK(txr);
3280                 ixl_free_que_tx(que);
3281                 if (txr->base)
3282                         i40e_free_dma_mem(&pf->hw, &txr->dma);
3283                 IXL_TX_UNLOCK(txr);
3284                 IXL_TX_LOCK_DESTROY(txr);
3285
3286                 if (!mtx_initialized(&rxr->mtx)) /* uninitialized */
3287                         continue;
3288                 IXL_RX_LOCK(rxr);
3289                 ixl_free_que_rx(que);
3290                 if (rxr->base)
3291                         i40e_free_dma_mem(&pf->hw, &rxr->dma);
3292                 IXL_RX_UNLOCK(rxr);
3293                 IXL_RX_LOCK_DESTROY(rxr);
3294                 
3295         }
3296         free(vsi->queues, M_DEVBUF);
3297
3298 free_filters:
3299         /* Free VSI filter list */
3300         ixl_free_mac_filters(vsi);
3301 }
3302
3303 static void
3304 ixl_free_mac_filters(struct ixl_vsi *vsi)
3305 {
3306         struct ixl_mac_filter *f;
3307
3308         while (!SLIST_EMPTY(&vsi->ftl)) {
3309                 f = SLIST_FIRST(&vsi->ftl);
3310                 SLIST_REMOVE_HEAD(&vsi->ftl, next);
3311                 free(f, M_DEVBUF);
3312         }
3313 }
3314
3315
3316 /*********************************************************************
3317  *
3318  *  Allocate memory for the VSI (virtual station interface) and their
3319  *  associated queues, rings and the descriptors associated with each,
3320  *  called only once at attach.
3321  *
3322  **********************************************************************/
3323 static int
3324 ixl_setup_stations(struct ixl_pf *pf)
3325 {
3326         device_t                dev = pf->dev;
3327         struct ixl_vsi          *vsi;
3328         struct ixl_queue        *que;
3329         struct tx_ring          *txr;
3330         struct rx_ring          *rxr;
3331         int                     rsize, tsize;
3332         int                     error = I40E_SUCCESS;
3333
3334         vsi = &pf->vsi;
3335         vsi->back = (void *)pf;
3336         vsi->hw = &pf->hw;
3337         vsi->id = 0;
3338         vsi->num_vlans = 0;
3339         vsi->back = pf;
3340
3341         /* Get memory for the station queues */
3342         if (!(vsi->queues =
3343             (struct ixl_queue *) malloc(sizeof(struct ixl_queue) *
3344             vsi->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
3345                 device_printf(dev, "Unable to allocate queue memory\n");
3346                 error = ENOMEM;
3347                 goto early;
3348         }
3349
3350         for (int i = 0; i < vsi->num_queues; i++) {
3351                 que = &vsi->queues[i];
3352                 que->num_desc = ixl_ringsz;
3353                 que->me = i;
3354                 que->vsi = vsi;
3355                 /* mark the queue as active */
3356                 vsi->active_queues |= (u64)1 << que->me;
3357                 txr = &que->txr;
3358                 txr->que = que;
3359                 txr->tail = I40E_QTX_TAIL(que->me);
3360
3361                 /* Initialize the TX lock */
3362                 snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)",
3363                     device_get_nameunit(dev), que->me);
3364                 mtx_init(&txr->mtx, txr->mtx_name, NULL, MTX_DEF);
3365                 /* Create the TX descriptor ring */
3366                 tsize = roundup2((que->num_desc *
3367                     sizeof(struct i40e_tx_desc)) +
3368                     sizeof(u32), DBA_ALIGN);
3369                 if (i40e_allocate_dma_mem(&pf->hw,
3370                     &txr->dma, i40e_mem_reserved, tsize, DBA_ALIGN)) {
3371                         device_printf(dev,
3372                             "Unable to allocate TX Descriptor memory\n");
3373                         error = ENOMEM;
3374                         goto fail;
3375                 }
3376                 txr->base = (struct i40e_tx_desc *)txr->dma.va;
3377                 bzero((void *)txr->base, tsize);
3378                 /* Now allocate transmit soft structs for the ring */
3379                 if (ixl_allocate_tx_data(que)) {
3380                         device_printf(dev,
3381                             "Critical Failure setting up TX structures\n");
3382                         error = ENOMEM;
3383                         goto fail;
3384                 }
3385                 /* Allocate a buf ring */
3386                 txr->br = buf_ring_alloc(4096, M_DEVBUF,
3387                     M_NOWAIT, &txr->mtx);
3388                 if (txr->br == NULL) {
3389                         device_printf(dev,
3390                             "Critical Failure setting up TX buf ring\n");
3391                         error = ENOMEM;
3392                         goto fail;
3393                 }
3394
3395                 /*
3396                  * Next the RX queues...
3397                  */ 
3398                 rsize = roundup2(que->num_desc *
3399                     sizeof(union i40e_rx_desc), DBA_ALIGN);
3400                 rxr = &que->rxr;
3401                 rxr->que = que;
3402                 rxr->tail = I40E_QRX_TAIL(que->me);
3403
3404                 /* Initialize the RX side lock */
3405                 snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)",
3406                     device_get_nameunit(dev), que->me);
3407                 mtx_init(&rxr->mtx, rxr->mtx_name, NULL, MTX_DEF);
3408
3409                 if (i40e_allocate_dma_mem(&pf->hw,
3410                     &rxr->dma, i40e_mem_reserved, rsize, 4096)) {
3411                         device_printf(dev,
3412                             "Unable to allocate RX Descriptor memory\n");
3413                         error = ENOMEM;
3414                         goto fail;
3415                 }
3416                 rxr->base = (union i40e_rx_desc *)rxr->dma.va;
3417                 bzero((void *)rxr->base, rsize);
3418
3419                 /* Allocate receive soft structs for the ring*/
3420                 if (ixl_allocate_rx_data(que)) {
3421                         device_printf(dev,
3422                             "Critical Failure setting up receive structs\n");
3423                         error = ENOMEM;
3424                         goto fail;
3425                 }
3426         }
3427
3428         return (0);
3429
3430 fail:
3431         for (int i = 0; i < vsi->num_queues; i++) {
3432                 que = &vsi->queues[i];
3433                 rxr = &que->rxr;
3434                 txr = &que->txr;
3435                 if (rxr->base)
3436                         i40e_free_dma_mem(&pf->hw, &rxr->dma);
3437                 if (txr->base)
3438                         i40e_free_dma_mem(&pf->hw, &txr->dma);
3439         }
3440
3441 early:
3442         return (error);
3443 }
3444
3445 /*
3446 ** Provide a update to the queue RX
3447 ** interrupt moderation value.
3448 */
3449 static void
3450 ixl_set_queue_rx_itr(struct ixl_queue *que)
3451 {
3452         struct ixl_vsi  *vsi = que->vsi;
3453         struct i40e_hw  *hw = vsi->hw;
3454         struct rx_ring  *rxr = &que->rxr;
3455         u16             rx_itr;
3456         u16             rx_latency = 0;
3457         int             rx_bytes;
3458
3459         /* Idle, do nothing */
3460         if (rxr->bytes == 0)
3461                 return;
3462
3463         if (ixl_dynamic_rx_itr) {
3464                 rx_bytes = rxr->bytes/rxr->itr;
3465                 rx_itr = rxr->itr;
3466
3467                 /* Adjust latency range */
3468                 switch (rxr->latency) {
3469                 case IXL_LOW_LATENCY:
3470                         if (rx_bytes > 10) {
3471                                 rx_latency = IXL_AVE_LATENCY;
3472                                 rx_itr = IXL_ITR_20K;
3473                         }
3474                         break;
3475                 case IXL_AVE_LATENCY:
3476                         if (rx_bytes > 20) {
3477                                 rx_latency = IXL_BULK_LATENCY;
3478                                 rx_itr = IXL_ITR_8K;
3479                         } else if (rx_bytes <= 10) {
3480                                 rx_latency = IXL_LOW_LATENCY;
3481                                 rx_itr = IXL_ITR_100K;
3482                         }
3483                         break;
3484                 case IXL_BULK_LATENCY:
3485                         if (rx_bytes <= 20) {
3486                                 rx_latency = IXL_AVE_LATENCY;
3487                                 rx_itr = IXL_ITR_20K;
3488                         }
3489                         break;
3490                  }
3491
3492                 rxr->latency = rx_latency;
3493
3494                 if (rx_itr != rxr->itr) {
3495                         /* do an exponential smoothing */
3496                         rx_itr = (10 * rx_itr * rxr->itr) /
3497                             ((9 * rx_itr) + rxr->itr);
3498                         rxr->itr = rx_itr & IXL_MAX_ITR;
3499                         wr32(hw, I40E_PFINT_ITRN(IXL_RX_ITR,
3500                             que->me), rxr->itr);
3501                 }
3502         } else { /* We may have have toggled to non-dynamic */
3503                 if (vsi->rx_itr_setting & IXL_ITR_DYNAMIC)
3504                         vsi->rx_itr_setting = ixl_rx_itr;
3505                 /* Update the hardware if needed */
3506                 if (rxr->itr != vsi->rx_itr_setting) {
3507                         rxr->itr = vsi->rx_itr_setting;
3508                         wr32(hw, I40E_PFINT_ITRN(IXL_RX_ITR,
3509                             que->me), rxr->itr);
3510                 }
3511         }
3512         rxr->bytes = 0;
3513         rxr->packets = 0;
3514         return;
3515 }
3516
3517
3518 /*
3519 ** Provide a update to the queue TX
3520 ** interrupt moderation value.
3521 */
3522 static void
3523 ixl_set_queue_tx_itr(struct ixl_queue *que)
3524 {
3525         struct ixl_vsi  *vsi = que->vsi;
3526         struct i40e_hw  *hw = vsi->hw;
3527         struct tx_ring  *txr = &que->txr;
3528         u16             tx_itr;
3529         u16             tx_latency = 0;
3530         int             tx_bytes;
3531
3532
3533         /* Idle, do nothing */
3534         if (txr->bytes == 0)
3535                 return;
3536
3537         if (ixl_dynamic_tx_itr) {
3538                 tx_bytes = txr->bytes/txr->itr;
3539                 tx_itr = txr->itr;
3540
3541                 switch (txr->latency) {
3542                 case IXL_LOW_LATENCY:
3543                         if (tx_bytes > 10) {
3544                                 tx_latency = IXL_AVE_LATENCY;
3545                                 tx_itr = IXL_ITR_20K;
3546                         }
3547                         break;
3548                 case IXL_AVE_LATENCY:
3549                         if (tx_bytes > 20) {
3550                                 tx_latency = IXL_BULK_LATENCY;
3551                                 tx_itr = IXL_ITR_8K;
3552                         } else if (tx_bytes <= 10) {
3553                                 tx_latency = IXL_LOW_LATENCY;
3554                                 tx_itr = IXL_ITR_100K;
3555                         }
3556                         break;
3557                 case IXL_BULK_LATENCY:
3558                         if (tx_bytes <= 20) {
3559                                 tx_latency = IXL_AVE_LATENCY;
3560                                 tx_itr = IXL_ITR_20K;
3561                         }
3562                         break;
3563                 }
3564
3565                 txr->latency = tx_latency;
3566
3567                 if (tx_itr != txr->itr) {
3568                  /* do an exponential smoothing */
3569                         tx_itr = (10 * tx_itr * txr->itr) /
3570                             ((9 * tx_itr) + txr->itr);
3571                         txr->itr = tx_itr & IXL_MAX_ITR;
3572                         wr32(hw, I40E_PFINT_ITRN(IXL_TX_ITR,
3573                             que->me), txr->itr);
3574                 }
3575
3576         } else { /* We may have have toggled to non-dynamic */
3577                 if (vsi->tx_itr_setting & IXL_ITR_DYNAMIC)
3578                         vsi->tx_itr_setting = ixl_tx_itr;
3579                 /* Update the hardware if needed */
3580                 if (txr->itr != vsi->tx_itr_setting) {
3581                         txr->itr = vsi->tx_itr_setting;
3582                         wr32(hw, I40E_PFINT_ITRN(IXL_TX_ITR,
3583                             que->me), txr->itr);
3584                 }
3585         }
3586         txr->bytes = 0;
3587         txr->packets = 0;
3588         return;
3589 }
3590
3591 #define QUEUE_NAME_LEN 32
3592
3593 static void
3594 ixl_add_vsi_sysctls(struct ixl_pf *pf, struct ixl_vsi *vsi,
3595     struct sysctl_ctx_list *ctx, const char *sysctl_name)
3596 {
3597         struct sysctl_oid *tree;
3598         struct sysctl_oid_list *child;
3599         struct sysctl_oid_list *vsi_list;
3600
3601         tree = device_get_sysctl_tree(pf->dev);
3602         child = SYSCTL_CHILDREN(tree);
3603         vsi->vsi_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, sysctl_name,
3604                                    CTLFLAG_RD, NULL, "VSI Number");
3605         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
3606
3607         ixl_add_sysctls_eth_stats(ctx, vsi_list, &vsi->eth_stats);
3608 }
3609
3610 #ifdef IXL_DEBUG
3611 /**
3612  * ixl_sysctl_qtx_tail_handler
3613  * Retrieves I40E_QTX_TAIL value from hardware
3614  * for a sysctl.
3615  */
3616 static int
3617 ixl_sysctl_qtx_tail_handler(SYSCTL_HANDLER_ARGS)
3618 {
3619         struct ixl_queue *que;
3620         int error;
3621         u32 val;
3622
3623         que = ((struct ixl_queue *)oidp->oid_arg1);
3624         if (!que) return 0;
3625
3626         val = rd32(que->vsi->hw, que->txr.tail);
3627         error = sysctl_handle_int(oidp, &val, 0, req);
3628         if (error || !req->newptr)
3629                 return error;
3630         return (0);
3631 }
3632
3633 /**
3634  * ixl_sysctl_qrx_tail_handler
3635  * Retrieves I40E_QRX_TAIL value from hardware
3636  * for a sysctl.
3637  */
3638 static int
3639 ixl_sysctl_qrx_tail_handler(SYSCTL_HANDLER_ARGS)
3640 {
3641         struct ixl_queue *que;
3642         int error;
3643         u32 val;
3644
3645         que = ((struct ixl_queue *)oidp->oid_arg1);
3646         if (!que) return 0;
3647
3648         val = rd32(que->vsi->hw, que->rxr.tail);
3649         error = sysctl_handle_int(oidp, &val, 0, req);
3650         if (error || !req->newptr)
3651                 return error;
3652         return (0);
3653 }
3654 #endif
3655
3656 static void
3657 ixl_add_hw_stats(struct ixl_pf *pf)
3658 {
3659         device_t dev = pf->dev;
3660         struct ixl_vsi *vsi = &pf->vsi;
3661         struct ixl_queue *queues = vsi->queues;
3662         struct i40e_hw_port_stats *pf_stats = &pf->stats;
3663
3664         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
3665         struct sysctl_oid *tree = device_get_sysctl_tree(dev);
3666         struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
3667         struct sysctl_oid_list *vsi_list;
3668
3669         struct sysctl_oid *queue_node;
3670         struct sysctl_oid_list *queue_list;
3671
3672         struct tx_ring *txr;
3673         struct rx_ring *rxr;
3674         char queue_namebuf[QUEUE_NAME_LEN];
3675
3676         /* Driver statistics */
3677         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
3678                         CTLFLAG_RD, &pf->watchdog_events,
3679                         "Watchdog timeouts");
3680         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "admin_irq",
3681                         CTLFLAG_RD, &pf->admin_irq,
3682                         "Admin Queue IRQ Handled");
3683
3684         ixl_add_vsi_sysctls(pf, &pf->vsi, ctx, "pf");
3685         vsi_list = SYSCTL_CHILDREN(pf->vsi.vsi_node);
3686
3687         /* Queue statistics */
3688         for (int q = 0; q < vsi->num_queues; q++) {
3689                 snprintf(queue_namebuf, QUEUE_NAME_LEN, "que%d", q);
3690                 queue_node = SYSCTL_ADD_NODE(ctx, vsi_list,
3691                     OID_AUTO, queue_namebuf, CTLFLAG_RD, NULL, "Queue #");
3692                 queue_list = SYSCTL_CHILDREN(queue_node);
3693
3694                 txr = &(queues[q].txr);
3695                 rxr = &(queues[q].rxr);
3696
3697                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "mbuf_defrag_failed",
3698                                 CTLFLAG_RD, &(queues[q].mbuf_defrag_failed),
3699                                 "m_defrag() failed");
3700                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
3701                                 CTLFLAG_RD, &(queues[q].irqs),
3702                                 "irqs on this queue");
3703                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso_tx",
3704                                 CTLFLAG_RD, &(queues[q].tso),
3705                                 "TSO");
3706                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_dma_setup",
3707                                 CTLFLAG_RD, &(queues[q].tx_dma_setup),
3708                                 "Driver tx dma failure in xmit");
3709                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "no_desc_avail",
3710                                 CTLFLAG_RD, &(txr->no_desc),
3711                                 "Queue No Descriptor Available");
3712                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
3713                                 CTLFLAG_RD, &(txr->total_packets),
3714                                 "Queue Packets Transmitted");
3715                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_bytes",
3716                                 CTLFLAG_RD, &(txr->tx_bytes),
3717                                 "Queue Bytes Transmitted");
3718                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
3719                                 CTLFLAG_RD, &(rxr->rx_packets),
3720                                 "Queue Packets Received");
3721                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
3722                                 CTLFLAG_RD, &(rxr->rx_bytes),
3723                                 "Queue Bytes Received");
3724                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_desc_err",
3725                                 CTLFLAG_RD, &(rxr->desc_errs),
3726                                 "Queue Rx Descriptor Errors");
3727                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "rx_itr",
3728                                 CTLFLAG_RD, &(rxr->itr), 0,
3729                                 "Queue Rx ITR Interval");
3730                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "tx_itr",
3731                                 CTLFLAG_RD, &(txr->itr), 0,
3732                                 "Queue Tx ITR Interval");
3733                 // Not actual latency; just a calculated value to put in a register
3734                 // TODO: Put in better descriptions here
3735                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "rx_latency",
3736                                 CTLFLAG_RD, &(rxr->latency), 0,
3737                                 "Queue Rx ITRL Average Interval");
3738                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "tx_latency",
3739                                 CTLFLAG_RD, &(txr->latency), 0,
3740                                 "Queue Tx ITRL Average Interval");
3741
3742 #ifdef IXL_DEBUG
3743                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_not_done",
3744                                 CTLFLAG_RD, &(rxr->not_done),
3745                                 "Queue Rx Descriptors not Done");
3746                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "rx_next_refresh",
3747                                 CTLFLAG_RD, &(rxr->next_refresh), 0,
3748                                 "Queue Rx Descriptors not Done");
3749                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "rx_next_check",
3750                                 CTLFLAG_RD, &(rxr->next_check), 0,
3751                                 "Queue Rx Descriptors not Done");
3752                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "qtx_tail", 
3753                                 CTLTYPE_UINT | CTLFLAG_RD, &queues[q],
3754                                 sizeof(struct ixl_queue),
3755                                 ixl_sysctl_qtx_tail_handler, "IU",
3756                                 "Queue Transmit Descriptor Tail");
3757                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "qrx_tail", 
3758                                 CTLTYPE_UINT | CTLFLAG_RD, &queues[q],
3759                                 sizeof(struct ixl_queue),
3760                                 ixl_sysctl_qrx_tail_handler, "IU",
3761                                 "Queue Receive Descriptor Tail");
3762 #endif
3763         }
3764
3765         /* MAC stats */
3766         ixl_add_sysctls_mac_stats(ctx, child, pf_stats);
3767 }
3768
3769 static void
3770 ixl_add_sysctls_eth_stats(struct sysctl_ctx_list *ctx,
3771         struct sysctl_oid_list *child,
3772         struct i40e_eth_stats *eth_stats)
3773 {
3774         struct ixl_sysctl_info ctls[] =
3775         {
3776                 {&eth_stats->rx_bytes, "good_octets_rcvd", "Good Octets Received"},
3777                 {&eth_stats->rx_unicast, "ucast_pkts_rcvd",
3778                         "Unicast Packets Received"},
3779                 {&eth_stats->rx_multicast, "mcast_pkts_rcvd",
3780                         "Multicast Packets Received"},
3781                 {&eth_stats->rx_broadcast, "bcast_pkts_rcvd",
3782                         "Broadcast Packets Received"},
3783                 {&eth_stats->rx_discards, "rx_discards", "Discarded RX packets"},
3784                 {&eth_stats->tx_bytes, "good_octets_txd", "Good Octets Transmitted"},
3785                 {&eth_stats->tx_unicast, "ucast_pkts_txd", "Unicast Packets Transmitted"},
3786                 {&eth_stats->tx_multicast, "mcast_pkts_txd",
3787                         "Multicast Packets Transmitted"},
3788                 {&eth_stats->tx_broadcast, "bcast_pkts_txd",
3789                         "Broadcast Packets Transmitted"},
3790                 // end
3791                 {0,0,0}
3792         };
3793
3794         struct ixl_sysctl_info *entry = ctls;
3795         while (entry->stat != NULL)
3796         {
3797                 SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, entry->name,
3798                                 CTLFLAG_RD, entry->stat,
3799                                 entry->description);
3800                 entry++;
3801         }
3802 }
3803
3804 static void
3805 ixl_add_sysctls_mac_stats(struct sysctl_ctx_list *ctx,
3806         struct sysctl_oid_list *child,
3807         struct i40e_hw_port_stats *stats)
3808 {
3809         struct sysctl_oid *stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac",
3810                                     CTLFLAG_RD, NULL, "Mac Statistics");
3811         struct sysctl_oid_list *stat_list = SYSCTL_CHILDREN(stat_node);
3812
3813         struct i40e_eth_stats *eth_stats = &stats->eth;
3814         ixl_add_sysctls_eth_stats(ctx, stat_list, eth_stats);
3815
3816         struct ixl_sysctl_info ctls[] = 
3817         {
3818                 {&stats->crc_errors, "crc_errors", "CRC Errors"},
3819                 {&stats->illegal_bytes, "illegal_bytes", "Illegal Byte Errors"},
3820                 {&stats->mac_local_faults, "local_faults", "MAC Local Faults"},
3821                 {&stats->mac_remote_faults, "remote_faults", "MAC Remote Faults"},
3822                 {&stats->rx_length_errors, "rx_length_errors", "Receive Length Errors"},
3823                 /* Packet Reception Stats */
3824                 {&stats->rx_size_64, "rx_frames_64", "64 byte frames received"},
3825                 {&stats->rx_size_127, "rx_frames_65_127", "65-127 byte frames received"},
3826                 {&stats->rx_size_255, "rx_frames_128_255", "128-255 byte frames received"},
3827                 {&stats->rx_size_511, "rx_frames_256_511", "256-511 byte frames received"},
3828                 {&stats->rx_size_1023, "rx_frames_512_1023", "512-1023 byte frames received"},
3829                 {&stats->rx_size_1522, "rx_frames_1024_1522", "1024-1522 byte frames received"},
3830                 {&stats->rx_size_big, "rx_frames_big", "1523-9522 byte frames received"},
3831                 {&stats->rx_undersize, "rx_undersize", "Undersized packets received"},
3832                 {&stats->rx_fragments, "rx_fragmented", "Fragmented packets received"},
3833                 {&stats->rx_oversize, "rx_oversized", "Oversized packets received"},
3834                 {&stats->rx_jabber, "rx_jabber", "Received Jabber"},
3835                 {&stats->checksum_error, "checksum_errors", "Checksum Errors"},
3836                 /* Packet Transmission Stats */
3837                 {&stats->tx_size_64, "tx_frames_64", "64 byte frames transmitted"},
3838                 {&stats->tx_size_127, "tx_frames_65_127", "65-127 byte frames transmitted"},
3839                 {&stats->tx_size_255, "tx_frames_128_255", "128-255 byte frames transmitted"},
3840                 {&stats->tx_size_511, "tx_frames_256_511", "256-511 byte frames transmitted"},
3841                 {&stats->tx_size_1023, "tx_frames_512_1023", "512-1023 byte frames transmitted"},
3842                 {&stats->tx_size_1522, "tx_frames_1024_1522", "1024-1522 byte frames transmitted"},
3843                 {&stats->tx_size_big, "tx_frames_big", "1523-9522 byte frames transmitted"},
3844                 /* Flow control */
3845                 {&stats->link_xon_tx, "xon_txd", "Link XON transmitted"},
3846                 {&stats->link_xon_rx, "xon_recvd", "Link XON received"},
3847                 {&stats->link_xoff_tx, "xoff_txd", "Link XOFF transmitted"},
3848                 {&stats->link_xoff_rx, "xoff_recvd", "Link XOFF received"},
3849                 /* End */
3850                 {0,0,0}
3851         };
3852
3853         struct ixl_sysctl_info *entry = ctls;
3854         while (entry->stat != NULL)
3855         {
3856                 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, entry->name,
3857                                 CTLFLAG_RD, entry->stat,
3858                                 entry->description);
3859                 entry++;
3860         }
3861 }
3862
3863
3864 /*
3865 ** ixl_config_rss - setup RSS 
3866 **  - note this is done for the single vsi
3867 */
3868 static void
3869 ixl_config_rss(struct ixl_vsi *vsi)
3870 {
3871         struct ixl_pf   *pf = (struct ixl_pf *)vsi->back;
3872         struct i40e_hw  *hw = vsi->hw;
3873         u32             lut = 0;
3874         u64             set_hena = 0, hena;
3875         int             i, j, que_id;
3876 #ifdef RSS
3877         u32             rss_hash_config;
3878         u32             rss_seed[IXL_KEYSZ];
3879 #else
3880         u32             rss_seed[IXL_KEYSZ] = {0x41b01687,
3881                             0x183cfd8c, 0xce880440, 0x580cbc3c,
3882                             0x35897377, 0x328b25e1, 0x4fa98922,
3883                             0xb7d90c14, 0xd5bad70d, 0xcd15a2c1};
3884 #endif
3885
3886 #ifdef RSS
3887         /* Fetch the configured RSS key */
3888         rss_getkey((uint8_t *) &rss_seed);
3889 #endif
3890
3891         /* Fill out hash function seed */
3892         for (i = 0; i < IXL_KEYSZ; i++)
3893                 i40e_write_rx_ctl(hw, I40E_PFQF_HKEY(i), rss_seed[i]);
3894
3895         /* Enable PCTYPES for RSS: */
3896 #ifdef RSS
3897         rss_hash_config = rss_gethashconfig();
3898         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
3899                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER);
3900         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
3901                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP);
3902         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
3903                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP);
3904         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
3905                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER);
3906         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
3907                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6);
3908         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
3909                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP);
3910         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
3911                 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP);
3912 #else
3913         set_hena =
3914                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) |
3915                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) |
3916                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP) |
3917                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER) |
3918                 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4) |
3919                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) |
3920                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) |
3921                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) |
3922                 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) |
3923                 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6) |
3924                 ((u64)1 << I40E_FILTER_PCTYPE_L2_PAYLOAD);
3925 #endif
3926         hena = (u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0)) |
3927             ((u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1)) << 32);
3928         hena |= set_hena;
3929         i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (u32)hena);
3930         i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32));
3931
3932         /* Populate the LUT with max no. of queues in round robin fashion */
3933         for (i = j = 0; i < pf->hw.func_caps.rss_table_size; i++, j++) {
3934                 if (j == vsi->num_queues)
3935                         j = 0;
3936 #ifdef RSS
3937                 /*
3938                  * Fetch the RSS bucket id for the given indirection entry.
3939                  * Cap it at the number of configured buckets (which is
3940                  * num_queues.)
3941                  */
3942                 que_id = rss_get_indirection_to_bucket(i);
3943                 que_id = que_id % vsi->num_queues;
3944 #else
3945                 que_id = j;
3946 #endif
3947                 /* lut = 4-byte sliding window of 4 lut entries */
3948                 lut = (lut << 8) | (que_id &
3949                     ((0x1 << pf->hw.func_caps.rss_table_entry_width) - 1));
3950                 /* On i = 3, we have 4 entries in lut; write to the register */
3951                 if ((i & 3) == 3)
3952                         wr32(hw, I40E_PFQF_HLUT(i >> 2), lut);
3953         }
3954         ixl_flush(hw);
3955 }
3956
3957
3958 /*
3959 ** This routine is run via an vlan config EVENT,
3960 ** it enables us to use the HW Filter table since
3961 ** we can get the vlan id. This just creates the
3962 ** entry in the soft version of the VFTA, init will
3963 ** repopulate the real table.
3964 */
3965 static void
3966 ixl_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3967 {
3968         struct ixl_vsi  *vsi = ifp->if_softc;
3969         struct i40e_hw  *hw = vsi->hw;
3970         struct ixl_pf   *pf = (struct ixl_pf *)vsi->back;
3971
3972         if (ifp->if_softc !=  arg)   /* Not our event */
3973                 return;
3974
3975         if ((vtag == 0) || (vtag > 4095))       /* Invalid */
3976                 return;
3977
3978         IXL_PF_LOCK(pf);
3979         ++vsi->num_vlans;
3980         ixl_add_filter(vsi, hw->mac.addr, vtag);
3981         IXL_PF_UNLOCK(pf);
3982 }
3983
3984 /*
3985 ** This routine is run via an vlan
3986 ** unconfig EVENT, remove our entry
3987 ** in the soft vfta.
3988 */
3989 static void
3990 ixl_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3991 {
3992         struct ixl_vsi  *vsi = ifp->if_softc;
3993         struct i40e_hw  *hw = vsi->hw;
3994         struct ixl_pf   *pf = (struct ixl_pf *)vsi->back;
3995
3996         if (ifp->if_softc !=  arg)
3997                 return;
3998
3999         if ((vtag == 0) || (vtag > 4095))       /* Invalid */
4000                 return;
4001
4002         IXL_PF_LOCK(pf);
4003         --vsi->num_vlans;
4004         ixl_del_filter(vsi, hw->mac.addr, vtag);
4005         IXL_PF_UNLOCK(pf);
4006 }
4007
4008 /*
4009 ** This routine updates vlan filters, called by init
4010 ** it scans the filter table and then updates the hw
4011 ** after a soft reset.
4012 */
4013 static void
4014 ixl_setup_vlan_filters(struct ixl_vsi *vsi)
4015 {
4016         struct ixl_mac_filter   *f;
4017         int                     cnt = 0, flags;
4018
4019         if (vsi->num_vlans == 0)
4020                 return;
4021         /*
4022         ** Scan the filter list for vlan entries,
4023         ** mark them for addition and then call
4024         ** for the AQ update.
4025         */
4026         SLIST_FOREACH(f, &vsi->ftl, next) {
4027                 if (f->flags & IXL_FILTER_VLAN) {
4028                         f->flags |=
4029                             (IXL_FILTER_ADD |
4030                             IXL_FILTER_USED);
4031                         cnt++;
4032                 }
4033         }
4034         if (cnt == 0) {
4035                 printf("setup vlan: no filters found!\n");
4036                 return;
4037         }
4038         flags = IXL_FILTER_VLAN;
4039         flags |= (IXL_FILTER_ADD | IXL_FILTER_USED);
4040         ixl_add_hw_filters(vsi, flags, cnt);
4041         return;
4042 }
4043
4044 /*
4045 ** Initialize filter list and add filters that the hardware
4046 ** needs to know about.
4047 **
4048 ** Requires VSI's filter list & seid to be set before calling.
4049 */
4050 static void
4051 ixl_init_filters(struct ixl_vsi *vsi)
4052 {
4053         /* Add broadcast address */
4054         ixl_add_filter(vsi, ixl_bcast_addr, IXL_VLAN_ANY);
4055
4056         /*
4057          * Prevent Tx flow control frames from being sent out by
4058          * non-firmware transmitters.
4059          */
4060         i40e_add_filter_to_drop_tx_flow_control_frames(vsi->hw, vsi->seid);
4061 }
4062
4063 /*
4064 ** This routine adds mulicast filters
4065 */
4066 static void
4067 ixl_add_mc_filter(struct ixl_vsi *vsi, u8 *macaddr)
4068 {
4069         struct ixl_mac_filter *f;
4070
4071         /* Does one already exist */
4072         f = ixl_find_filter(vsi, macaddr, IXL_VLAN_ANY);
4073         if (f != NULL)
4074                 return;
4075
4076         f = ixl_get_filter(vsi);
4077         if (f == NULL) {
4078                 printf("WARNING: no filter available!!\n");
4079                 return;
4080         }
4081         bcopy(macaddr, f->macaddr, ETHER_ADDR_LEN);
4082         f->vlan = IXL_VLAN_ANY;
4083         f->flags |= (IXL_FILTER_ADD | IXL_FILTER_USED
4084             | IXL_FILTER_MC);
4085
4086         return;
4087 }
4088
4089 static void
4090 ixl_reconfigure_filters(struct ixl_vsi *vsi)
4091 {
4092
4093         ixl_add_hw_filters(vsi, IXL_FILTER_USED, vsi->num_macs);
4094 }
4095
4096 /*
4097 ** This routine adds macvlan filters
4098 */
4099 static void
4100 ixl_add_filter(struct ixl_vsi *vsi, u8 *macaddr, s16 vlan)
4101 {
4102         struct ixl_mac_filter   *f, *tmp;
4103         struct ixl_pf           *pf;
4104         device_t                dev;
4105
4106         DEBUGOUT("ixl_add_filter: begin");
4107
4108         pf = vsi->back;
4109         dev = pf->dev;
4110
4111         /* Does one already exist */
4112         f = ixl_find_filter(vsi, macaddr, vlan);
4113         if (f != NULL)
4114                 return;
4115         /*
4116         ** Is this the first vlan being registered, if so we
4117         ** need to remove the ANY filter that indicates we are
4118         ** not in a vlan, and replace that with a 0 filter.
4119         */
4120         if ((vlan != IXL_VLAN_ANY) && (vsi->num_vlans == 1)) {
4121                 tmp = ixl_find_filter(vsi, macaddr, IXL_VLAN_ANY);
4122                 if (tmp != NULL) {
4123                         ixl_del_filter(vsi, macaddr, IXL_VLAN_ANY);
4124                         ixl_add_filter(vsi, macaddr, 0);
4125                 }
4126         }
4127
4128         f = ixl_get_filter(vsi);
4129         if (f == NULL) {
4130                 device_printf(dev, "WARNING: no filter available!!\n");
4131                 return;
4132         }
4133         bcopy(macaddr, f->macaddr, ETHER_ADDR_LEN);
4134         f->vlan = vlan;
4135         f->flags |= (IXL_FILTER_ADD | IXL_FILTER_USED);
4136         if (f->vlan != IXL_VLAN_ANY)
4137                 f->flags |= IXL_FILTER_VLAN;
4138         else
4139                 vsi->num_macs++;
4140
4141         ixl_add_hw_filters(vsi, f->flags, 1);
4142         return;
4143 }
4144
4145 static void
4146 ixl_del_filter(struct ixl_vsi *vsi, u8 *macaddr, s16 vlan)
4147 {
4148         struct ixl_mac_filter *f;
4149
4150         f = ixl_find_filter(vsi, macaddr, vlan);
4151         if (f == NULL)
4152                 return;
4153
4154         f->flags |= IXL_FILTER_DEL;
4155         ixl_del_hw_filters(vsi, 1);
4156         vsi->num_macs--;
4157
4158         /* Check if this is the last vlan removal */
4159         if (vlan != IXL_VLAN_ANY && vsi->num_vlans == 0) {
4160                 /* Switch back to a non-vlan filter */
4161                 ixl_del_filter(vsi, macaddr, 0);
4162                 ixl_add_filter(vsi, macaddr, IXL_VLAN_ANY);
4163         }
4164         return;
4165 }
4166
4167 /*
4168 ** Find the filter with both matching mac addr and vlan id
4169 */
4170 static struct ixl_mac_filter *
4171 ixl_find_filter(struct ixl_vsi *vsi, u8 *macaddr, s16 vlan)
4172 {
4173         struct ixl_mac_filter   *f;
4174         bool                    match = FALSE;
4175
4176         SLIST_FOREACH(f, &vsi->ftl, next) {
4177                 if (!cmp_etheraddr(f->macaddr, macaddr))
4178                         continue;
4179                 if (f->vlan == vlan) {
4180                         match = TRUE;
4181                         break;
4182                 }
4183         }       
4184
4185         if (!match)
4186                 f = NULL;
4187         return (f);
4188 }
4189
4190 /*
4191 ** This routine takes additions to the vsi filter
4192 ** table and creates an Admin Queue call to create
4193 ** the filters in the hardware.
4194 */
4195 static void
4196 ixl_add_hw_filters(struct ixl_vsi *vsi, int flags, int cnt)
4197 {
4198         struct i40e_aqc_add_macvlan_element_data *a, *b;
4199         struct ixl_mac_filter   *f;
4200         struct ixl_pf           *pf;
4201         struct i40e_hw          *hw;
4202         device_t                dev;
4203         int                     err, j = 0;
4204
4205         pf = vsi->back;
4206         dev = pf->dev;
4207         hw = &pf->hw;
4208         IXL_PF_LOCK_ASSERT(pf);
4209
4210         a = malloc(sizeof(struct i40e_aqc_add_macvlan_element_data) * cnt,
4211             M_DEVBUF, M_NOWAIT | M_ZERO);
4212         if (a == NULL) {
4213                 device_printf(dev, "add_hw_filters failed to get memory\n");
4214                 return;
4215         }
4216
4217         /*
4218         ** Scan the filter list, each time we find one
4219         ** we add it to the admin queue array and turn off
4220         ** the add bit.
4221         */
4222         SLIST_FOREACH(f, &vsi->ftl, next) {
4223                 if (f->flags == flags) {
4224                         b = &a[j]; // a pox on fvl long names :)
4225                         bcopy(f->macaddr, b->mac_addr, ETHER_ADDR_LEN);
4226                         if (f->vlan == IXL_VLAN_ANY) {
4227                                 b->vlan_tag = 0;
4228                                 b->flags = I40E_AQC_MACVLAN_ADD_IGNORE_VLAN;
4229                         } else {
4230                                 b->vlan_tag = f->vlan;
4231                                 b->flags = 0;
4232                         }
4233                         b->flags |= I40E_AQC_MACVLAN_ADD_PERFECT_MATCH;
4234                         f->flags &= ~IXL_FILTER_ADD;
4235                         j++;
4236                 }
4237                 if (j == cnt)
4238                         break;
4239         }
4240         if (j > 0) {
4241                 err = i40e_aq_add_macvlan(hw, vsi->seid, a, j, NULL);
4242                 if (err) 
4243                         device_printf(dev, "aq_add_macvlan err %d, "
4244                             "aq_error %d\n", err, hw->aq.asq_last_status);
4245                 else
4246                         vsi->hw_filters_add += j;
4247         }
4248         free(a, M_DEVBUF);
4249         return;
4250 }
4251
4252 /*
4253 ** This routine takes removals in the vsi filter
4254 ** table and creates an Admin Queue call to delete
4255 ** the filters in the hardware.
4256 */
4257 static void
4258 ixl_del_hw_filters(struct ixl_vsi *vsi, int cnt)
4259 {
4260         struct i40e_aqc_remove_macvlan_element_data *d, *e;
4261         struct ixl_pf           *pf;
4262         struct i40e_hw          *hw;
4263         device_t                dev;
4264         struct ixl_mac_filter   *f, *f_temp;
4265         int                     err, j = 0;
4266
4267         DEBUGOUT("ixl_del_hw_filters: begin\n");
4268
4269         pf = vsi->back;
4270         hw = &pf->hw;
4271         dev = pf->dev;
4272
4273         d = malloc(sizeof(struct i40e_aqc_remove_macvlan_element_data) * cnt,
4274             M_DEVBUF, M_NOWAIT | M_ZERO);
4275         if (d == NULL) {
4276                 printf("del hw filter failed to get memory\n");
4277                 return;
4278         }
4279
4280         SLIST_FOREACH_SAFE(f, &vsi->ftl, next, f_temp) {
4281                 if (f->flags & IXL_FILTER_DEL) {
4282                         e = &d[j]; // a pox on fvl long names :)
4283                         bcopy(f->macaddr, e->mac_addr, ETHER_ADDR_LEN);
4284                         e->vlan_tag = (f->vlan == IXL_VLAN_ANY ? 0 : f->vlan);
4285                         e->flags = I40E_AQC_MACVLAN_DEL_PERFECT_MATCH;
4286                         /* delete entry from vsi list */
4287                         SLIST_REMOVE(&vsi->ftl, f, ixl_mac_filter, next);
4288                         free(f, M_DEVBUF);
4289                         j++;
4290                 }
4291                 if (j == cnt)
4292                         break;
4293         }
4294         if (j > 0) {
4295                 err = i40e_aq_remove_macvlan(hw, vsi->seid, d, j, NULL);
4296                 /* NOTE: returns ENOENT every time but seems to work fine,
4297                    so we'll ignore that specific error. */
4298                 // TODO: Does this still occur on current firmwares?
4299                 if (err && hw->aq.asq_last_status != I40E_AQ_RC_ENOENT) {
4300                         int sc = 0;
4301                         for (int i = 0; i < j; i++)
4302                                 sc += (!d[i].error_code);
4303                         vsi->hw_filters_del += sc;
4304                         device_printf(dev,
4305                             "Failed to remove %d/%d filters, aq error %d\n",
4306                             j - sc, j, hw->aq.asq_last_status);
4307                 } else
4308                         vsi->hw_filters_del += j;
4309         }
4310         free(d, M_DEVBUF);
4311
4312         DEBUGOUT("ixl_del_hw_filters: end\n");
4313         return;
4314 }
4315
4316 static int
4317 ixl_enable_rings(struct ixl_vsi *vsi)
4318 {
4319         struct ixl_pf   *pf = vsi->back;
4320         struct i40e_hw  *hw = &pf->hw;
4321         int             index, error;
4322         u32             reg;
4323
4324         error = 0;
4325         for (int i = 0; i < vsi->num_queues; i++) {
4326                 index = vsi->first_queue + i;
4327                 i40e_pre_tx_queue_cfg(hw, index, TRUE);
4328
4329                 reg = rd32(hw, I40E_QTX_ENA(index));
4330                 reg |= I40E_QTX_ENA_QENA_REQ_MASK |
4331                     I40E_QTX_ENA_QENA_STAT_MASK;
4332                 wr32(hw, I40E_QTX_ENA(index), reg);
4333                 /* Verify the enable took */
4334                 for (int j = 0; j < 10; j++) {
4335                         reg = rd32(hw, I40E_QTX_ENA(index));
4336                         if (reg & I40E_QTX_ENA_QENA_STAT_MASK)
4337                                 break;
4338                         i40e_msec_delay(10);
4339                 }
4340                 if ((reg & I40E_QTX_ENA_QENA_STAT_MASK) == 0) {
4341                         device_printf(pf->dev, "TX queue %d disabled!\n",
4342                             index);
4343                         error = ETIMEDOUT;
4344                 }
4345
4346                 reg = rd32(hw, I40E_QRX_ENA(index));
4347                 reg |= I40E_QRX_ENA_QENA_REQ_MASK |
4348                     I40E_QRX_ENA_QENA_STAT_MASK;
4349                 wr32(hw, I40E_QRX_ENA(index), reg);
4350                 /* Verify the enable took */
4351                 for (int j = 0; j < 10; j++) {
4352                         reg = rd32(hw, I40E_QRX_ENA(index));
4353                         if (reg & I40E_QRX_ENA_QENA_STAT_MASK)
4354                                 break;
4355                         i40e_msec_delay(10);
4356                 }
4357                 if ((reg & I40E_QRX_ENA_QENA_STAT_MASK) == 0) {
4358                         device_printf(pf->dev, "RX queue %d disabled!\n",
4359                             index);
4360                         error = ETIMEDOUT;
4361                 }
4362         }
4363
4364         return (error);
4365 }
4366
4367 static int
4368 ixl_disable_rings(struct ixl_vsi *vsi)
4369 {
4370         struct ixl_pf   *pf = vsi->back;
4371         struct i40e_hw  *hw = &pf->hw;
4372         int             index, error;
4373         u32             reg;
4374
4375         error = 0;
4376         for (int i = 0; i < vsi->num_queues; i++) {
4377                 index = vsi->first_queue + i;
4378
4379                 i40e_pre_tx_queue_cfg(hw, index, FALSE);
4380                 i40e_usec_delay(500);
4381
4382                 reg = rd32(hw, I40E_QTX_ENA(index));
4383                 reg &= ~I40E_QTX_ENA_QENA_REQ_MASK;
4384                 wr32(hw, I40E_QTX_ENA(index), reg);
4385                 /* Verify the disable took */
4386                 for (int j = 0; j < 10; j++) {
4387                         reg = rd32(hw, I40E_QTX_ENA(index));
4388                         if (!(reg & I40E_QTX_ENA_QENA_STAT_MASK))
4389                                 break;
4390                         i40e_msec_delay(10);
4391                 }
4392                 if (reg & I40E_QTX_ENA_QENA_STAT_MASK) {
4393                         device_printf(pf->dev, "TX queue %d still enabled!\n",
4394                             index);
4395                         error = ETIMEDOUT;
4396                 }
4397
4398                 reg = rd32(hw, I40E_QRX_ENA(index));
4399                 reg &= ~I40E_QRX_ENA_QENA_REQ_MASK;
4400                 wr32(hw, I40E_QRX_ENA(index), reg);
4401                 /* Verify the disable took */
4402                 for (int j = 0; j < 10; j++) {
4403                         reg = rd32(hw, I40E_QRX_ENA(index));
4404                         if (!(reg & I40E_QRX_ENA_QENA_STAT_MASK))
4405                                 break;
4406                         i40e_msec_delay(10);
4407                 }
4408                 if (reg & I40E_QRX_ENA_QENA_STAT_MASK) {
4409                         device_printf(pf->dev, "RX queue %d still enabled!\n",
4410                             index);
4411                         error = ETIMEDOUT;
4412                 }
4413         }
4414
4415         return (error);
4416 }
4417
4418 /**
4419  * ixl_handle_mdd_event
4420  *
4421  * Called from interrupt handler to identify possibly malicious vfs
4422  * (But also detects events from the PF, as well)
4423  **/
4424 static void
4425 ixl_handle_mdd_event(struct ixl_pf *pf)
4426 {
4427         struct i40e_hw *hw = &pf->hw;
4428         device_t dev = pf->dev;
4429         bool mdd_detected = false;
4430         bool pf_mdd_detected = false;
4431         u32 reg;
4432
4433         /* find what triggered the MDD event */
4434         reg = rd32(hw, I40E_GL_MDET_TX);
4435         if (reg & I40E_GL_MDET_TX_VALID_MASK) {
4436                 u8 pf_num = (reg & I40E_GL_MDET_TX_PF_NUM_MASK) >>
4437                                 I40E_GL_MDET_TX_PF_NUM_SHIFT;
4438                 u8 event = (reg & I40E_GL_MDET_TX_EVENT_MASK) >>
4439                                 I40E_GL_MDET_TX_EVENT_SHIFT;
4440                 u8 queue = (reg & I40E_GL_MDET_TX_QUEUE_MASK) >>
4441                                 I40E_GL_MDET_TX_QUEUE_SHIFT;
4442                 device_printf(dev,
4443                          "Malicious Driver Detection event 0x%02x"
4444                          " on TX queue %d pf number 0x%02x\n",
4445                          event, queue, pf_num);
4446                 wr32(hw, I40E_GL_MDET_TX, 0xffffffff);
4447                 mdd_detected = true;
4448         }
4449         reg = rd32(hw, I40E_GL_MDET_RX);
4450         if (reg & I40E_GL_MDET_RX_VALID_MASK) {
4451                 u8 func = (reg & I40E_GL_MDET_RX_FUNCTION_MASK) >>
4452                                 I40E_GL_MDET_RX_FUNCTION_SHIFT;
4453                 u8 event = (reg & I40E_GL_MDET_RX_EVENT_MASK) >>
4454                                 I40E_GL_MDET_RX_EVENT_SHIFT;
4455                 u8 queue = (reg & I40E_GL_MDET_RX_QUEUE_MASK) >>
4456                                 I40E_GL_MDET_RX_QUEUE_SHIFT;
4457                 device_printf(dev,
4458                          "Malicious Driver Detection event 0x%02x"
4459                          " on RX queue %d of function 0x%02x\n",
4460                          event, queue, func);
4461                 wr32(hw, I40E_GL_MDET_RX, 0xffffffff);
4462                 mdd_detected = true;
4463         }
4464
4465         if (mdd_detected) {
4466                 reg = rd32(hw, I40E_PF_MDET_TX);
4467                 if (reg & I40E_PF_MDET_TX_VALID_MASK) {
4468                         wr32(hw, I40E_PF_MDET_TX, 0xFFFF);
4469                         device_printf(dev,
4470                                  "MDD TX event is for this function 0x%08x",
4471                                  reg);
4472                         pf_mdd_detected = true;
4473                 }
4474                 reg = rd32(hw, I40E_PF_MDET_RX);
4475                 if (reg & I40E_PF_MDET_RX_VALID_MASK) {
4476                         wr32(hw, I40E_PF_MDET_RX, 0xFFFF);
4477                         device_printf(dev,
4478                                  "MDD RX event is for this function 0x%08x",
4479                                  reg);
4480                         pf_mdd_detected = true;
4481                 }
4482         }
4483
4484         /* re-enable mdd interrupt cause */
4485         reg = rd32(hw, I40E_PFINT_ICR0_ENA);
4486         reg |= I40E_PFINT_ICR0_ENA_MAL_DETECT_MASK;
4487         wr32(hw, I40E_PFINT_ICR0_ENA, reg);
4488         ixl_flush(hw);
4489 }
4490
4491 static void
4492 ixl_enable_intr(struct ixl_vsi *vsi)
4493 {
4494         struct i40e_hw          *hw = vsi->hw;
4495         struct ixl_queue        *que = vsi->queues;
4496
4497         if (ixl_enable_msix) {
4498                 for (int i = 0; i < vsi->num_queues; i++, que++)
4499                         ixl_enable_queue(hw, que->me);
4500         } else
4501                 ixl_enable_legacy(hw);
4502 }
4503
4504 static void
4505 ixl_disable_rings_intr(struct ixl_vsi *vsi)
4506 {
4507         struct i40e_hw          *hw = vsi->hw;
4508         struct ixl_queue        *que = vsi->queues;
4509
4510         for (int i = 0; i < vsi->num_queues; i++, que++)
4511                 ixl_disable_queue(hw, que->me);
4512 }
4513
4514 static void
4515 ixl_disable_intr(struct ixl_vsi *vsi)
4516 {
4517         struct i40e_hw          *hw = vsi->hw;
4518
4519         if (ixl_enable_msix)
4520                 ixl_disable_adminq(hw);
4521         else
4522                 ixl_disable_legacy(hw);
4523 }
4524
4525 static void
4526 ixl_enable_adminq(struct i40e_hw *hw)
4527 {
4528         u32             reg;
4529
4530         reg = I40E_PFINT_DYN_CTL0_INTENA_MASK |
4531             I40E_PFINT_DYN_CTL0_CLEARPBA_MASK |
4532             (IXL_ITR_NONE << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT);
4533         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
4534         ixl_flush(hw);
4535 }
4536
4537 static void
4538 ixl_disable_adminq(struct i40e_hw *hw)
4539 {
4540         u32             reg;
4541
4542         reg = IXL_ITR_NONE << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT;
4543         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
4544         ixl_flush(hw);
4545 }
4546
4547 static void
4548 ixl_enable_queue(struct i40e_hw *hw, int id)
4549 {
4550         u32             reg;
4551
4552         reg = I40E_PFINT_DYN_CTLN_INTENA_MASK |
4553             I40E_PFINT_DYN_CTLN_CLEARPBA_MASK |
4554             (IXL_ITR_NONE << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT);
4555         wr32(hw, I40E_PFINT_DYN_CTLN(id), reg);
4556 }
4557
4558 static void
4559 ixl_disable_queue(struct i40e_hw *hw, int id)
4560 {
4561         u32             reg;
4562
4563         reg = IXL_ITR_NONE << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
4564         wr32(hw, I40E_PFINT_DYN_CTLN(id), reg);
4565 }
4566
4567 static void
4568 ixl_enable_legacy(struct i40e_hw *hw)
4569 {
4570         u32             reg;
4571         reg = I40E_PFINT_DYN_CTL0_INTENA_MASK |
4572             I40E_PFINT_DYN_CTL0_CLEARPBA_MASK |
4573             (IXL_ITR_NONE << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT);
4574         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
4575 }
4576
4577 static void
4578 ixl_disable_legacy(struct i40e_hw *hw)
4579 {
4580         u32             reg;
4581
4582         reg = IXL_ITR_NONE << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT;
4583         wr32(hw, I40E_PFINT_DYN_CTL0, reg);
4584 }
4585
4586 static void
4587 ixl_update_stats_counters(struct ixl_pf *pf)
4588 {
4589         struct i40e_hw  *hw = &pf->hw;
4590         struct ixl_vsi  *vsi = &pf->vsi;
4591         struct ixl_vf   *vf;
4592
4593         struct i40e_hw_port_stats *nsd = &pf->stats;
4594         struct i40e_hw_port_stats *osd = &pf->stats_offsets;
4595
4596         /* Update hw stats */
4597         ixl_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port),
4598                            pf->stat_offsets_loaded,
4599                            &osd->crc_errors, &nsd->crc_errors);
4600         ixl_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port),
4601                            pf->stat_offsets_loaded,
4602                            &osd->illegal_bytes, &nsd->illegal_bytes);
4603         ixl_stat_update48(hw, I40E_GLPRT_GORCH(hw->port),
4604                            I40E_GLPRT_GORCL(hw->port),
4605                            pf->stat_offsets_loaded,
4606                            &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
4607         ixl_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
4608                            I40E_GLPRT_GOTCL(hw->port),
4609                            pf->stat_offsets_loaded,
4610                            &osd->eth.tx_bytes, &nsd->eth.tx_bytes);
4611         ixl_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
4612                            pf->stat_offsets_loaded,
4613                            &osd->eth.rx_discards,
4614                            &nsd->eth.rx_discards);
4615         ixl_stat_update48(hw, I40E_GLPRT_UPRCH(hw->port),
4616                            I40E_GLPRT_UPRCL(hw->port),
4617                            pf->stat_offsets_loaded,
4618                            &osd->eth.rx_unicast,
4619                            &nsd->eth.rx_unicast);
4620         ixl_stat_update48(hw, I40E_GLPRT_UPTCH(hw->port),
4621                            I40E_GLPRT_UPTCL(hw->port),
4622                            pf->stat_offsets_loaded,
4623                            &osd->eth.tx_unicast,
4624                            &nsd->eth.tx_unicast);
4625         ixl_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
4626                            I40E_GLPRT_MPRCL(hw->port),
4627                            pf->stat_offsets_loaded,
4628                            &osd->eth.rx_multicast,
4629                            &nsd->eth.rx_multicast);
4630         ixl_stat_update48(hw, I40E_GLPRT_MPTCH(hw->port),
4631                            I40E_GLPRT_MPTCL(hw->port),
4632                            pf->stat_offsets_loaded,
4633                            &osd->eth.tx_multicast,
4634                            &nsd->eth.tx_multicast);
4635         ixl_stat_update48(hw, I40E_GLPRT_BPRCH(hw->port),
4636                            I40E_GLPRT_BPRCL(hw->port),
4637                            pf->stat_offsets_loaded,
4638                            &osd->eth.rx_broadcast,
4639                            &nsd->eth.rx_broadcast);
4640         ixl_stat_update48(hw, I40E_GLPRT_BPTCH(hw->port),
4641                            I40E_GLPRT_BPTCL(hw->port),
4642                            pf->stat_offsets_loaded,
4643                            &osd->eth.tx_broadcast,
4644                            &nsd->eth.tx_broadcast);
4645
4646         ixl_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port),
4647                            pf->stat_offsets_loaded,
4648                            &osd->tx_dropped_link_down,
4649                            &nsd->tx_dropped_link_down);
4650         ixl_stat_update32(hw, I40E_GLPRT_MLFC(hw->port),
4651                            pf->stat_offsets_loaded,
4652                            &osd->mac_local_faults,
4653                            &nsd->mac_local_faults);
4654         ixl_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
4655                            pf->stat_offsets_loaded,
4656                            &osd->mac_remote_faults,
4657                            &nsd->mac_remote_faults);
4658         ixl_stat_update32(hw, I40E_GLPRT_RLEC(hw->port),
4659                            pf->stat_offsets_loaded,
4660                            &osd->rx_length_errors,
4661                            &nsd->rx_length_errors);
4662
4663         /* Flow control (LFC) stats */
4664         ixl_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port),
4665                            pf->stat_offsets_loaded,
4666                            &osd->link_xon_rx, &nsd->link_xon_rx);
4667         ixl_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port),
4668                            pf->stat_offsets_loaded,
4669                            &osd->link_xon_tx, &nsd->link_xon_tx);
4670         ixl_stat_update32(hw, I40E_GLPRT_LXOFFRXC(hw->port),
4671                            pf->stat_offsets_loaded,
4672                            &osd->link_xoff_rx, &nsd->link_xoff_rx);
4673         ixl_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port),
4674                            pf->stat_offsets_loaded,
4675                            &osd->link_xoff_tx, &nsd->link_xoff_tx);
4676
4677         /* Packet size stats rx */
4678         ixl_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port),
4679                            I40E_GLPRT_PRC64L(hw->port),
4680                            pf->stat_offsets_loaded,
4681                            &osd->rx_size_64, &nsd->rx_size_64);
4682         ixl_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
4683                            I40E_GLPRT_PRC127L(hw->port),
4684                            pf->stat_offsets_loaded,
4685                            &osd->rx_size_127, &nsd->rx_size_127);
4686         ixl_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
4687                            I40E_GLPRT_PRC255L(hw->port),
4688                            pf->stat_offsets_loaded,
4689                            &osd->rx_size_255, &nsd->rx_size_255);
4690         ixl_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
4691                            I40E_GLPRT_PRC511L(hw->port),
4692                            pf->stat_offsets_loaded,
4693                            &osd->rx_size_511, &nsd->rx_size_511);
4694         ixl_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
4695                            I40E_GLPRT_PRC1023L(hw->port),
4696                            pf->stat_offsets_loaded,
4697                            &osd->rx_size_1023, &nsd->rx_size_1023);
4698         ixl_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
4699                            I40E_GLPRT_PRC1522L(hw->port),
4700                            pf->stat_offsets_loaded,
4701                            &osd->rx_size_1522, &nsd->rx_size_1522);
4702         ixl_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
4703                            I40E_GLPRT_PRC9522L(hw->port),
4704                            pf->stat_offsets_loaded,
4705                            &osd->rx_size_big, &nsd->rx_size_big);
4706
4707         /* Packet size stats tx */
4708         ixl_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port),
4709                            I40E_GLPRT_PTC64L(hw->port),
4710                            pf->stat_offsets_loaded,
4711                            &osd->tx_size_64, &nsd->tx_size_64);
4712         ixl_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port),
4713                            I40E_GLPRT_PTC127L(hw->port),
4714                            pf->stat_offsets_loaded,
4715                            &osd->tx_size_127, &nsd->tx_size_127);
4716         ixl_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port),
4717                            I40E_GLPRT_PTC255L(hw->port),
4718                            pf->stat_offsets_loaded,
4719                            &osd->tx_size_255, &nsd->tx_size_255);
4720         ixl_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
4721                            I40E_GLPRT_PTC511L(hw->port),
4722                            pf->stat_offsets_loaded,
4723                            &osd->tx_size_511, &nsd->tx_size_511);
4724         ixl_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
4725                            I40E_GLPRT_PTC1023L(hw->port),
4726                            pf->stat_offsets_loaded,
4727                            &osd->tx_size_1023, &nsd->tx_size_1023);
4728         ixl_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
4729                            I40E_GLPRT_PTC1522L(hw->port),
4730                            pf->stat_offsets_loaded,
4731                            &osd->tx_size_1522, &nsd->tx_size_1522);
4732         ixl_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
4733                            I40E_GLPRT_PTC9522L(hw->port),
4734                            pf->stat_offsets_loaded,
4735                            &osd->tx_size_big, &nsd->tx_size_big);
4736
4737         ixl_stat_update32(hw, I40E_GLPRT_RUC(hw->port),
4738                            pf->stat_offsets_loaded,
4739                            &osd->rx_undersize, &nsd->rx_undersize);
4740         ixl_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
4741                            pf->stat_offsets_loaded,
4742                            &osd->rx_fragments, &nsd->rx_fragments);
4743         ixl_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
4744                            pf->stat_offsets_loaded,
4745                            &osd->rx_oversize, &nsd->rx_oversize);
4746         ixl_stat_update32(hw, I40E_GLPRT_RJC(hw->port),
4747                            pf->stat_offsets_loaded,
4748                            &osd->rx_jabber, &nsd->rx_jabber);
4749         pf->stat_offsets_loaded = true;
4750         /* End hw stats */
4751
4752         /* Update vsi stats */
4753         ixl_update_vsi_stats(vsi);
4754
4755         for (int i = 0; i < pf->num_vfs; i++) {
4756                 vf = &pf->vfs[i];
4757                 if (vf->vf_flags & VF_FLAG_ENABLED)
4758                         ixl_update_eth_stats(&pf->vfs[i].vsi);
4759         }
4760 }
4761
4762 static int
4763 ixl_rebuild_hw_structs_after_reset(struct ixl_pf *pf)
4764 {
4765         struct i40e_hw *hw = &pf->hw;
4766         struct ixl_vsi *vsi = &pf->vsi;
4767         device_t dev = pf->dev;
4768         bool is_up = false;
4769         int error = 0;
4770
4771         is_up = !!(vsi->ifp->if_drv_flags & IFF_DRV_RUNNING);
4772
4773         /* Teardown */
4774         if (is_up)
4775                 ixl_stop(pf);
4776         error = i40e_shutdown_lan_hmc(hw);
4777         if (error)
4778                 device_printf(dev,
4779                     "Shutdown LAN HMC failed with code %d\n", error);
4780         ixl_disable_adminq(hw);
4781         ixl_teardown_adminq_msix(pf);
4782         error = i40e_shutdown_adminq(hw);
4783         if (error)
4784                 device_printf(dev,
4785                     "Shutdown Admin queue failed with code %d\n", error);
4786
4787         /* Setup */
4788         error = i40e_init_adminq(hw);
4789         if (error != 0 && error != I40E_ERR_FIRMWARE_API_VERSION) {
4790                 device_printf(dev, "Unable to initialize Admin Queue, error %d\n",
4791                     error);
4792         }
4793         error = ixl_setup_adminq_msix(pf);
4794         if (error) {
4795                 device_printf(dev, "ixl_setup_adminq_msix error: %d\n",
4796                     error);
4797         }
4798         ixl_configure_intr0_msix(pf);
4799         ixl_enable_adminq(hw);
4800         error = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp,
4801             hw->func_caps.num_rx_qp, 0, 0);
4802         if (error) {
4803                 device_printf(dev, "init_lan_hmc failed: %d\n", error);
4804         }
4805         error = i40e_configure_lan_hmc(hw, I40E_HMC_MODEL_DIRECT_ONLY);
4806         if (error) {
4807                 device_printf(dev, "configure_lan_hmc failed: %d\n", error);
4808         }
4809         if (is_up)
4810                 ixl_init(pf);
4811
4812         return (0);
4813 }
4814
4815 static void
4816 ixl_handle_empr_reset(struct ixl_pf *pf)
4817 {
4818         struct i40e_hw *hw = &pf->hw;
4819         device_t dev = pf->dev;
4820         int count = 0;
4821         u32 reg;
4822
4823         /* Typically finishes within 3-4 seconds */
4824         while (count++ < 100) {
4825                 reg = rd32(hw, I40E_GLGEN_RSTAT)
4826                     & I40E_GLGEN_RSTAT_DEVSTATE_MASK;
4827                 if (reg)
4828                         i40e_msec_delay(100);
4829                 else
4830                         break;
4831         }
4832 #ifdef IXL_DEBUG
4833         // Reset-related
4834         device_printf(dev, "EMPR reset wait count: %d\n", count);
4835 #endif
4836
4837         device_printf(dev, "Rebuilding driver state...\n");
4838         ixl_rebuild_hw_structs_after_reset(pf);
4839         device_printf(dev, "Rebuilding driver state done.\n");
4840
4841         atomic_clear_int(&pf->state, IXL_PF_STATE_EMPR_RESETTING);
4842 }
4843
4844 /*
4845 ** Tasklet handler for MSIX Adminq interrupts
4846 **  - do outside interrupt since it might sleep
4847 */
4848 static void
4849 ixl_do_adminq(void *context, int pending)
4850 {
4851         struct ixl_pf                   *pf = context;
4852         struct i40e_hw                  *hw = &pf->hw;
4853         struct i40e_arq_event_info      event;
4854         i40e_status                     ret;
4855         device_t                        dev = pf->dev;
4856         u32                             loop = 0;
4857         u16                             opcode, result;
4858
4859         if (pf->state & IXL_PF_STATE_EMPR_RESETTING) {
4860                 /* Flag cleared at end of this function */
4861                 ixl_handle_empr_reset(pf);
4862                 return;
4863         }
4864
4865         /* Admin Queue handling */
4866         event.buf_len = IXL_AQ_BUF_SZ;
4867         event.msg_buf = malloc(event.buf_len,
4868             M_DEVBUF, M_NOWAIT | M_ZERO);
4869         if (!event.msg_buf) {
4870                 device_printf(dev, "%s: Unable to allocate memory for Admin"
4871                     " Queue event!\n", __func__);
4872                 return;
4873         }
4874
4875         IXL_PF_LOCK(pf);
4876         /* clean and process any events */
4877         do {
4878                 ret = i40e_clean_arq_element(hw, &event, &result);
4879                 if (ret)
4880                         break;
4881                 opcode = LE16_TO_CPU(event.desc.opcode);
4882 #ifdef IXL_DEBUG
4883                 device_printf(dev, "%s: Admin Queue event: %#06x\n", __func__,
4884                     opcode);
4885 #endif
4886                 switch (opcode) {
4887                 case i40e_aqc_opc_get_link_status:
4888                         ixl_link_event(pf, &event);
4889                         break;
4890                 case i40e_aqc_opc_send_msg_to_pf:
4891 #ifdef PCI_IOV
4892                         ixl_handle_vf_msg(pf, &event);
4893 #endif
4894                         break;
4895                 case i40e_aqc_opc_event_lan_overflow:
4896                 default:
4897                         break;
4898                 }
4899
4900         } while (result && (loop++ < IXL_ADM_LIMIT));
4901
4902         free(event.msg_buf, M_DEVBUF);
4903
4904         /*
4905          * If there are still messages to process, reschedule ourselves.
4906          * Otherwise, re-enable our interrupt and go to sleep.
4907          */
4908         if (result > 0)
4909                 taskqueue_enqueue(pf->tq, &pf->adminq);
4910         else
4911                 ixl_enable_adminq(hw);
4912
4913         IXL_PF_UNLOCK(pf);
4914 }
4915
4916 /**
4917  * Update VSI-specific ethernet statistics counters.
4918  **/
4919 void
4920 ixl_update_eth_stats(struct ixl_vsi *vsi)
4921 {
4922         struct ixl_pf *pf = (struct ixl_pf *)vsi->back;
4923         struct i40e_hw *hw = &pf->hw;
4924         struct i40e_eth_stats *es;
4925         struct i40e_eth_stats *oes;
4926         struct i40e_hw_port_stats *nsd;
4927         u16 stat_idx = vsi->info.stat_counter_idx;
4928
4929         es = &vsi->eth_stats;
4930         oes = &vsi->eth_stats_offsets;
4931         nsd = &pf->stats;
4932
4933         /* Gather up the stats that the hw collects */
4934         ixl_stat_update32(hw, I40E_GLV_TEPC(stat_idx),
4935                            vsi->stat_offsets_loaded,
4936                            &oes->tx_errors, &es->tx_errors);
4937         ixl_stat_update32(hw, I40E_GLV_RDPC(stat_idx),
4938                            vsi->stat_offsets_loaded,
4939                            &oes->rx_discards, &es->rx_discards);
4940
4941         ixl_stat_update48(hw, I40E_GLV_GORCH(stat_idx),
4942                            I40E_GLV_GORCL(stat_idx),
4943                            vsi->stat_offsets_loaded,
4944                            &oes->rx_bytes, &es->rx_bytes);
4945         ixl_stat_update48(hw, I40E_GLV_UPRCH(stat_idx),
4946                            I40E_GLV_UPRCL(stat_idx),
4947                            vsi->stat_offsets_loaded,
4948                            &oes->rx_unicast, &es->rx_unicast);
4949         ixl_stat_update48(hw, I40E_GLV_MPRCH(stat_idx),
4950                            I40E_GLV_MPRCL(stat_idx),
4951                            vsi->stat_offsets_loaded,
4952                            &oes->rx_multicast, &es->rx_multicast);
4953         ixl_stat_update48(hw, I40E_GLV_BPRCH(stat_idx),
4954                            I40E_GLV_BPRCL(stat_idx),
4955                            vsi->stat_offsets_loaded,
4956                            &oes->rx_broadcast, &es->rx_broadcast);
4957
4958         ixl_stat_update48(hw, I40E_GLV_GOTCH(stat_idx),
4959                            I40E_GLV_GOTCL(stat_idx),
4960                            vsi->stat_offsets_loaded,
4961                            &oes->tx_bytes, &es->tx_bytes);
4962         ixl_stat_update48(hw, I40E_GLV_UPTCH(stat_idx),
4963                            I40E_GLV_UPTCL(stat_idx),
4964                            vsi->stat_offsets_loaded,
4965                            &oes->tx_unicast, &es->tx_unicast);
4966         ixl_stat_update48(hw, I40E_GLV_MPTCH(stat_idx),
4967                            I40E_GLV_MPTCL(stat_idx),
4968                            vsi->stat_offsets_loaded,
4969                            &oes->tx_multicast, &es->tx_multicast);
4970         ixl_stat_update48(hw, I40E_GLV_BPTCH(stat_idx),
4971                            I40E_GLV_BPTCL(stat_idx),
4972                            vsi->stat_offsets_loaded,
4973                            &oes->tx_broadcast, &es->tx_broadcast);
4974         vsi->stat_offsets_loaded = true;
4975 }
4976
4977 static void
4978 ixl_update_vsi_stats(struct ixl_vsi *vsi)
4979 {
4980         struct ixl_pf           *pf;
4981         struct ifnet            *ifp;
4982         struct i40e_eth_stats   *es;
4983         u64                     tx_discards;
4984
4985         struct i40e_hw_port_stats *nsd;
4986
4987         pf = vsi->back;
4988         ifp = vsi->ifp;
4989         es = &vsi->eth_stats;
4990         nsd = &pf->stats;
4991
4992         ixl_update_eth_stats(vsi);
4993
4994         tx_discards = es->tx_discards + nsd->tx_dropped_link_down;
4995         for (int i = 0; i < vsi->num_queues; i++)
4996                 tx_discards += vsi->queues[i].txr.br->br_drops;
4997
4998         /* Update ifnet stats */
4999         IXL_SET_IPACKETS(vsi, es->rx_unicast +
5000                            es->rx_multicast +
5001                            es->rx_broadcast);
5002         IXL_SET_OPACKETS(vsi, es->tx_unicast +
5003                            es->tx_multicast +
5004                            es->tx_broadcast);
5005         IXL_SET_IBYTES(vsi, es->rx_bytes);
5006         IXL_SET_OBYTES(vsi, es->tx_bytes);
5007         IXL_SET_IMCASTS(vsi, es->rx_multicast);
5008         IXL_SET_OMCASTS(vsi, es->tx_multicast);
5009
5010         IXL_SET_IERRORS(vsi, nsd->crc_errors + nsd->illegal_bytes +
5011             nsd->rx_undersize + nsd->rx_oversize + nsd->rx_fragments +
5012             nsd->rx_jabber);
5013         IXL_SET_OERRORS(vsi, es->tx_errors);
5014         IXL_SET_IQDROPS(vsi, es->rx_discards + nsd->eth.rx_discards);
5015         IXL_SET_OQDROPS(vsi, tx_discards);
5016         IXL_SET_NOPROTO(vsi, es->rx_unknown_protocol);
5017         IXL_SET_COLLISIONS(vsi, 0);
5018 }
5019
5020 /**
5021  * Reset all of the stats for the given pf
5022  **/
5023 void ixl_pf_reset_stats(struct ixl_pf *pf)
5024 {
5025         bzero(&pf->stats, sizeof(struct i40e_hw_port_stats));
5026         bzero(&pf->stats_offsets, sizeof(struct i40e_hw_port_stats));
5027         pf->stat_offsets_loaded = false;
5028 }
5029
5030 /**
5031  * Resets all stats of the given vsi
5032  **/
5033 void ixl_vsi_reset_stats(struct ixl_vsi *vsi)
5034 {
5035         bzero(&vsi->eth_stats, sizeof(struct i40e_eth_stats));
5036         bzero(&vsi->eth_stats_offsets, sizeof(struct i40e_eth_stats));
5037         vsi->stat_offsets_loaded = false;
5038 }
5039
5040 /**
5041  * Read and update a 48 bit stat from the hw
5042  *
5043  * Since the device stats are not reset at PFReset, they likely will not
5044  * be zeroed when the driver starts.  We'll save the first values read
5045  * and use them as offsets to be subtracted from the raw values in order
5046  * to report stats that count from zero.
5047  **/
5048 static void
5049 ixl_stat_update48(struct i40e_hw *hw, u32 hireg, u32 loreg,
5050         bool offset_loaded, u64 *offset, u64 *stat)
5051 {
5052         u64 new_data;
5053
5054 #if defined(__FreeBSD__) && (__FreeBSD_version >= 1000000) && defined(__amd64__)
5055         new_data = rd64(hw, loreg);
5056 #else
5057         /*
5058          * Use two rd32's instead of one rd64; FreeBSD versions before
5059          * 10 don't support 8 byte bus reads/writes.
5060          */
5061         new_data = rd32(hw, loreg);
5062         new_data |= ((u64)(rd32(hw, hireg) & 0xFFFF)) << 32;
5063 #endif
5064
5065         if (!offset_loaded)
5066                 *offset = new_data;
5067         if (new_data >= *offset)
5068                 *stat = new_data - *offset;
5069         else
5070                 *stat = (new_data + ((u64)1 << 48)) - *offset;
5071         *stat &= 0xFFFFFFFFFFFFULL;
5072 }
5073
5074 /**
5075  * Read and update a 32 bit stat from the hw
5076  **/
5077 static void
5078 ixl_stat_update32(struct i40e_hw *hw, u32 reg,
5079         bool offset_loaded, u64 *offset, u64 *stat)
5080 {
5081         u32 new_data;
5082
5083         new_data = rd32(hw, reg);
5084         if (!offset_loaded)
5085                 *offset = new_data;
5086         if (new_data >= *offset)
5087                 *stat = (u32)(new_data - *offset);
5088         else
5089                 *stat = (u32)((new_data + ((u64)1 << 32)) - *offset);
5090 }
5091
5092 static void
5093 ixl_add_device_sysctls(struct ixl_pf *pf)
5094 {
5095         device_t dev = pf->dev;
5096
5097         /* Set up sysctls */
5098         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5099             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5100             OID_AUTO, "fc", CTLTYPE_INT | CTLFLAG_RW,
5101             pf, 0, ixl_set_flowcntl, "I", IXL_SYSCTL_HELP_FC);
5102
5103         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5104             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5105             OID_AUTO, "advertise_speed", CTLTYPE_INT | CTLFLAG_RW,
5106             pf, 0, ixl_set_advertise, "I", IXL_SYSCTL_HELP_SET_ADVERTISE);
5107
5108         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5109             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5110             OID_AUTO, "current_speed", CTLTYPE_STRING | CTLFLAG_RD,
5111             pf, 0, ixl_current_speed, "A", "Current Port Speed");
5112
5113         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5114             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5115             OID_AUTO, "fw_version", CTLTYPE_STRING | CTLFLAG_RD,
5116             pf, 0, ixl_sysctl_show_fw, "A", "Firmware version");
5117
5118 #if 0
5119         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
5120             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5121             OID_AUTO, "rx_itr", CTLFLAG_RW,
5122             &ixl_rx_itr, 0, "RX ITR");
5123
5124         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
5125             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5126             OID_AUTO, "dynamic_rx_itr", CTLFLAG_RW,
5127             &ixl_dynamic_rx_itr, 0, "Dynamic RX ITR");
5128
5129         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
5130             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5131             OID_AUTO, "tx_itr", CTLFLAG_RW,
5132             &ixl_tx_itr, 0, "TX ITR");
5133
5134         SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
5135             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5136             OID_AUTO, "dynamic_tx_itr", CTLFLAG_RW,
5137             &ixl_dynamic_tx_itr, 0, "Dynamic TX ITR");
5138 #endif
5139
5140 #ifdef IXL_DEBUG_SYSCTL
5141         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5142             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5143             OID_AUTO, "debug", CTLTYPE_INT|CTLFLAG_RW, pf, 0,
5144             ixl_debug_info, "I", "Debug Information");
5145
5146         /* Shared-code debug message level */
5147         SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev),
5148             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5149             OID_AUTO, "debug_mask", CTLFLAG_RW,
5150             &pf->hw.debug_mask, 0, "Debug Message Level");
5151
5152         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5153             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5154             OID_AUTO, "link_status", CTLTYPE_STRING | CTLFLAG_RD,
5155             pf, 0, ixl_sysctl_link_status, "A", IXL_SYSCTL_HELP_LINK_STATUS);
5156
5157         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5158             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5159             OID_AUTO, "phy_abilities", CTLTYPE_STRING | CTLFLAG_RD,
5160             pf, 0, ixl_sysctl_phy_abilities, "A", "PHY Abilities");
5161
5162         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5163             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5164             OID_AUTO, "filter_list", CTLTYPE_STRING | CTLFLAG_RD,
5165             pf, 0, ixl_sysctl_sw_filter_list, "A", "SW Filter List");
5166
5167         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5168             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5169             OID_AUTO, "hw_res_alloc", CTLTYPE_STRING | CTLFLAG_RD,
5170             pf, 0, ixl_sysctl_hw_res_alloc, "A", "HW Resource Allocation");
5171
5172         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
5173             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5174             OID_AUTO, "switch_config", CTLTYPE_STRING | CTLFLAG_RD,
5175             pf, 0, ixl_sysctl_switch_config, "A", "HW Switch Configuration");
5176
5177 #ifdef PCI_IOV
5178         SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev),
5179             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
5180             OID_AUTO, "vc_debug_level", CTLFLAG_RW, &pf->vc_debug_lvl,
5181             0, "PF/VF Virtual Channel debug level");
5182 #endif
5183 #endif
5184 }
5185
5186 /*
5187 ** Set flow control using sysctl:
5188 **      0 - off
5189 **      1 - rx pause
5190 **      2 - tx pause
5191 **      3 - full
5192 */
5193 static int
5194 ixl_set_flowcntl(SYSCTL_HANDLER_ARGS)
5195 {
5196         /*
5197          * TODO: ensure tx CRC by hardware should be enabled
5198          * if tx flow control is enabled.
5199          * ^ N/A for 40G ports
5200          */
5201         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5202         struct i40e_hw *hw = &pf->hw;
5203         device_t dev = pf->dev;
5204         int requested_fc, error = 0;
5205         enum i40e_status_code aq_error = 0;
5206         u8 fc_aq_err = 0;
5207
5208         /* Get request */
5209         requested_fc = pf->fc;
5210         error = sysctl_handle_int(oidp, &requested_fc, 0, req);
5211         if ((error) || (req->newptr == NULL))
5212                 return (error);
5213         if (requested_fc < 0 || requested_fc > 3) {
5214                 device_printf(dev,
5215                     "Invalid fc mode; valid modes are 0 through 3\n");
5216                 return (EINVAL);
5217         }
5218
5219         /* Set fc ability for port */
5220         hw->fc.requested_mode = requested_fc;
5221         aq_error = i40e_set_fc(hw, &fc_aq_err, TRUE);
5222         if (aq_error) {
5223                 device_printf(dev,
5224                     "%s: Error setting new fc mode %d; fc_err %#x\n",
5225                     __func__, aq_error, fc_aq_err);
5226                 return (EIO);
5227         }
5228         pf->fc = requested_fc;
5229
5230         /* Get new link state */
5231         i40e_msec_delay(250);
5232         hw->phy.get_link_info = TRUE;
5233         i40e_get_link_status(hw, &pf->link_up);
5234
5235         return (0);
5236 }
5237
5238 static int
5239 ixl_current_speed(SYSCTL_HANDLER_ARGS)
5240 {
5241         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5242         struct i40e_hw *hw = &pf->hw;
5243         int error = 0, index = 0;
5244
5245         char *speeds[] = {
5246                 "Unknown",
5247                 "100M",
5248                 "1G",
5249                 "10G",
5250                 "40G",
5251                 "20G"
5252         };
5253
5254         ixl_update_link_status(pf);
5255
5256         switch (hw->phy.link_info.link_speed) {
5257         case I40E_LINK_SPEED_100MB:
5258                 index = 1;
5259                 break;
5260         case I40E_LINK_SPEED_1GB:
5261                 index = 2;
5262                 break;
5263         case I40E_LINK_SPEED_10GB:
5264                 index = 3;
5265                 break;
5266         case I40E_LINK_SPEED_40GB:
5267                 index = 4;
5268                 break;
5269         case I40E_LINK_SPEED_20GB:
5270                 index = 5;
5271                 break;
5272         case I40E_LINK_SPEED_UNKNOWN:
5273         default:
5274                 index = 0;
5275                 break;
5276         }
5277
5278         error = sysctl_handle_string(oidp, speeds[index],
5279             strlen(speeds[index]), req);
5280         return (error);
5281 }
5282
5283 static int
5284 ixl_set_advertised_speeds(struct ixl_pf *pf, int speeds)
5285 {
5286         struct i40e_hw *hw = &pf->hw;
5287         device_t dev = pf->dev;
5288         struct i40e_aq_get_phy_abilities_resp abilities;
5289         struct i40e_aq_set_phy_config config;
5290         enum i40e_status_code aq_error = 0;
5291
5292         /* Get current capability information */
5293         aq_error = i40e_aq_get_phy_capabilities(hw,
5294             FALSE, FALSE, &abilities, NULL);
5295         if (aq_error) {
5296                 device_printf(dev,
5297                     "%s: Error getting phy capabilities %d,"
5298                     " aq error: %d\n", __func__, aq_error,
5299                     hw->aq.asq_last_status);
5300                 return (EAGAIN);
5301         }
5302
5303         /* Prepare new config */
5304         bzero(&config, sizeof(config));
5305         config.phy_type = abilities.phy_type;
5306         config.abilities = abilities.abilities
5307             | I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
5308         config.eee_capability = abilities.eee_capability;
5309         config.eeer = abilities.eeer_val;
5310         config.low_power_ctrl = abilities.d3_lpan;
5311         /* Translate into aq cmd link_speed */
5312         if (speeds & 0x10)
5313                 config.link_speed |= I40E_LINK_SPEED_40GB;
5314         if (speeds & 0x8)
5315                 config.link_speed |= I40E_LINK_SPEED_20GB;
5316         if (speeds & 0x4)
5317                 config.link_speed |= I40E_LINK_SPEED_10GB;
5318         if (speeds & 0x2)
5319                 config.link_speed |= I40E_LINK_SPEED_1GB;
5320         if (speeds & 0x1)
5321                 config.link_speed |= I40E_LINK_SPEED_100MB;
5322
5323         /* Do aq command & restart link */
5324         aq_error = i40e_aq_set_phy_config(hw, &config, NULL);
5325         if (aq_error) {
5326                 device_printf(dev,
5327                     "%s: Error setting new phy config %d,"
5328                     " aq error: %d\n", __func__, aq_error,
5329                     hw->aq.asq_last_status);
5330                 return (EAGAIN);
5331         }
5332
5333         /*
5334         ** This seems a bit heavy handed, but we
5335         ** need to get a reinit on some devices
5336         */
5337         IXL_PF_LOCK(pf);
5338         ixl_stop_locked(pf);
5339         ixl_init_locked(pf);
5340         IXL_PF_UNLOCK(pf);
5341
5342         return (0);
5343 }
5344
5345 /*
5346 ** Control link advertise speed:
5347 **      Flags:
5348 **       0x1 - advertise 100 Mb
5349 **       0x2 - advertise 1G
5350 **       0x4 - advertise 10G
5351 **       0x8 - advertise 20G
5352 **      0x10 - advertise 40G
5353 **
5354 **      Set to 0 to disable link
5355 */
5356 static int
5357 ixl_set_advertise(SYSCTL_HANDLER_ARGS)
5358 {
5359         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5360         struct i40e_hw *hw = &pf->hw;
5361         device_t dev = pf->dev;
5362         int requested_ls = 0;
5363         int error = 0;
5364
5365         /* Read in new mode */
5366         requested_ls = pf->advertised_speed;
5367         error = sysctl_handle_int(oidp, &requested_ls, 0, req);
5368         if ((error) || (req->newptr == NULL))
5369                 return (error);
5370         /* Check for sane value */
5371         if (requested_ls > 0x10) {
5372                 device_printf(dev, "Invalid advertised speed; "
5373                     "valid modes are 0x1 through 0x10\n");
5374                 return (EINVAL);
5375         }
5376         /* Then check for validity based on adapter type */
5377         switch (hw->device_id) {
5378         case I40E_DEV_ID_10G_BASE_T:
5379         case I40E_DEV_ID_10G_BASE_T4:
5380                 /* BaseT */
5381                 if (requested_ls & ~(0x7)) {
5382                         device_printf(dev,
5383                             "Only 100M/1G/10G speeds supported on this device.\n");
5384                         return (EINVAL);
5385                 }
5386                 break;
5387         case I40E_DEV_ID_20G_KR2:
5388         case I40E_DEV_ID_20G_KR2_A:
5389                 /* 20G */
5390                 if (requested_ls & ~(0xE)) {
5391                         device_printf(dev,
5392                             "Only 1G/10G/20G speeds supported on this device.\n");
5393                         return (EINVAL);
5394                 }
5395                 break;
5396         case I40E_DEV_ID_KX_B:
5397         case I40E_DEV_ID_QSFP_A:
5398         case I40E_DEV_ID_QSFP_B:
5399                 /* 40G */
5400                 if (requested_ls & ~(0x10)) {
5401                         device_printf(dev,
5402                             "Only 40G speeds supported on this device.\n");
5403                         return (EINVAL);
5404                 }
5405                 break;
5406         default:
5407                 /* 10G (1G) */
5408                 if (requested_ls & ~(0x6)) {
5409                         device_printf(dev,
5410                             "Only 1/10Gbs speeds are supported on this device.\n");
5411                         return (EINVAL);
5412                 }
5413                 break;
5414         }
5415
5416         /* Exit if no change */
5417         if (pf->advertised_speed == requested_ls)
5418                 return (0);
5419
5420         error = ixl_set_advertised_speeds(pf, requested_ls);
5421         if (error)
5422                 return (error);
5423
5424         pf->advertised_speed = requested_ls;
5425         ixl_update_link_status(pf);
5426         return (0);
5427 }
5428
5429 /*
5430 ** Get the width and transaction speed of
5431 ** the bus this adapter is plugged into.
5432 */
5433 static u16
5434 ixl_get_bus_info(struct i40e_hw *hw, device_t dev)
5435 {
5436         u16                     link;
5437         u32                     offset;
5438                 
5439         /* Get the PCI Express Capabilities offset */
5440         pci_find_cap(dev, PCIY_EXPRESS, &offset);
5441
5442         /* ...and read the Link Status Register */
5443         link = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
5444
5445         switch (link & I40E_PCI_LINK_WIDTH) {
5446         case I40E_PCI_LINK_WIDTH_1:
5447                 hw->bus.width = i40e_bus_width_pcie_x1;
5448                 break;
5449         case I40E_PCI_LINK_WIDTH_2:
5450                 hw->bus.width = i40e_bus_width_pcie_x2;
5451                 break;
5452         case I40E_PCI_LINK_WIDTH_4:
5453                 hw->bus.width = i40e_bus_width_pcie_x4;
5454                 break;
5455         case I40E_PCI_LINK_WIDTH_8:
5456                 hw->bus.width = i40e_bus_width_pcie_x8;
5457                 break;
5458         default:
5459                 hw->bus.width = i40e_bus_width_unknown;
5460                 break;
5461         }
5462
5463         switch (link & I40E_PCI_LINK_SPEED) {
5464         case I40E_PCI_LINK_SPEED_2500:
5465                 hw->bus.speed = i40e_bus_speed_2500;
5466                 break;
5467         case I40E_PCI_LINK_SPEED_5000:
5468                 hw->bus.speed = i40e_bus_speed_5000;
5469                 break;
5470         case I40E_PCI_LINK_SPEED_8000:
5471                 hw->bus.speed = i40e_bus_speed_8000;
5472                 break;
5473         default:
5474                 hw->bus.speed = i40e_bus_speed_unknown;
5475                 break;
5476         }
5477
5478         device_printf(dev,"PCI Express Bus: Speed %s %s\n",
5479             ((hw->bus.speed == i40e_bus_speed_8000) ? "8.0GT/s":
5480             (hw->bus.speed == i40e_bus_speed_5000) ? "5.0GT/s":
5481             (hw->bus.speed == i40e_bus_speed_2500) ? "2.5GT/s":"Unknown"),
5482             (hw->bus.width == i40e_bus_width_pcie_x8) ? "Width x8" :
5483             (hw->bus.width == i40e_bus_width_pcie_x4) ? "Width x4" :
5484             (hw->bus.width == i40e_bus_width_pcie_x1) ? "Width x1" :
5485             ("Unknown"));
5486
5487         if ((hw->bus.width <= i40e_bus_width_pcie_x8) &&
5488             (hw->bus.speed < i40e_bus_speed_8000)) {
5489                 device_printf(dev, "PCI-Express bandwidth available"
5490                     " for this device\n     may be insufficient for"
5491                     " optimal performance.\n");
5492                 device_printf(dev, "For expected performance a x8 "
5493                     "PCIE Gen3 slot is required.\n");
5494         }
5495
5496         return (link);
5497 }
5498
5499 static int
5500 ixl_sysctl_show_fw(SYSCTL_HANDLER_ARGS)
5501 {
5502         struct ixl_pf   *pf = (struct ixl_pf *)arg1;
5503         struct i40e_hw  *hw = &pf->hw;
5504         struct sbuf     *sbuf;
5505
5506         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5507         ixl_nvm_version_str(hw, sbuf);
5508         sbuf_finish(sbuf);
5509         sbuf_delete(sbuf);
5510
5511         return 0;
5512 }
5513
5514 #ifdef IXL_DEBUG
5515 static void
5516 ixl_print_nvm_cmd(device_t dev, struct i40e_nvm_access *nvma)
5517 {
5518         if ((nvma->command == I40E_NVM_READ) &&
5519             ((nvma->config & 0xFF) == 0xF) &&
5520             (((nvma->config & 0xF00) >> 8) == 0xF) &&
5521             (nvma->offset == 0) &&
5522             (nvma->data_size == 1)) {
5523                 // device_printf(dev, "- Get Driver Status Command\n");
5524         }
5525         else if (nvma->command == I40E_NVM_READ) {
5526         
5527         }
5528         else {
5529                 switch (nvma->command) {
5530                 case 0xB:
5531                         device_printf(dev, "- command: I40E_NVM_READ\n");
5532                         break;
5533                 case 0xC:
5534                         device_printf(dev, "- command: I40E_NVM_WRITE\n");
5535                         break;
5536                 default:
5537                         device_printf(dev, "- command: unknown 0x%08x\n", nvma->command);
5538                         break;
5539                 }
5540
5541                 device_printf(dev, "- config (ptr)  : 0x%02x\n", nvma->config & 0xFF);
5542                 device_printf(dev, "- config (flags): 0x%01x\n", (nvma->config & 0xF00) >> 8);
5543                 device_printf(dev, "- offset : 0x%08x\n", nvma->offset);
5544                 device_printf(dev, "- data_s : 0x%08x\n", nvma->data_size);
5545         }
5546 }
5547 #endif
5548
5549 static int
5550 ixl_handle_nvmupd_cmd(struct ixl_pf *pf, struct ifdrv *ifd)
5551 {
5552         struct i40e_hw *hw = &pf->hw;
5553         struct i40e_nvm_access *nvma;
5554         device_t dev = pf->dev;
5555         enum i40e_status_code status = 0;
5556         int perrno;
5557
5558         DEBUGFUNC("ixl_handle_nvmupd_cmd");
5559
5560         /* Sanity checks */
5561         if (ifd->ifd_len < sizeof(struct i40e_nvm_access) ||
5562             ifd->ifd_data == NULL) {
5563                 device_printf(dev, "%s: incorrect ifdrv length or data pointer\n",
5564                     __func__);
5565                 device_printf(dev, "%s: ifdrv length: %lu, sizeof(struct i40e_nvm_access): %lu\n",
5566                     __func__, ifd->ifd_len, sizeof(struct i40e_nvm_access));
5567                 device_printf(dev, "%s: data pointer: %p\n", __func__,
5568                     ifd->ifd_data);
5569                 return (EINVAL);
5570         }
5571
5572         nvma = (struct i40e_nvm_access *)ifd->ifd_data;
5573
5574 #ifdef IXL_DEBUG
5575         ixl_print_nvm_cmd(dev, nvma);
5576 #endif
5577
5578         if (pf->state & IXL_PF_STATE_EMPR_RESETTING) {
5579                 int count = 0;
5580                 while (count++ < 100) {
5581                         i40e_msec_delay(100);
5582                         if (!(pf->state & IXL_PF_STATE_EMPR_RESETTING))
5583                                 break;
5584                 }
5585         }
5586
5587         if (!(pf->state & IXL_PF_STATE_EMPR_RESETTING)) {
5588                 IXL_PF_LOCK(pf);
5589                 status = i40e_nvmupd_command(hw, nvma, nvma->data, &perrno);
5590                 IXL_PF_UNLOCK(pf);
5591         } else {
5592                 perrno = -EBUSY;
5593         }
5594
5595         if (status)
5596                 device_printf(dev, "i40e_nvmupd_command status %d, perrno %d\n",
5597                     status, perrno);
5598
5599         /*
5600          * -EPERM is actually ERESTART, which the kernel interprets as it needing
5601          * to run this ioctl again. So use -EACCES for -EPERM instead.
5602          */
5603         if (perrno == -EPERM)
5604                 return (-EACCES);
5605         else
5606                 return (perrno);
5607 }
5608
5609 #ifdef IXL_DEBUG_SYSCTL
5610 static int
5611 ixl_sysctl_link_status(SYSCTL_HANDLER_ARGS)
5612 {
5613         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5614         struct i40e_hw *hw = &pf->hw;
5615         struct i40e_link_status link_status;
5616         char buf[512];
5617
5618         enum i40e_status_code aq_error = 0;
5619
5620         aq_error = i40e_aq_get_link_info(hw, TRUE, &link_status, NULL);
5621         if (aq_error) {
5622                 printf("i40e_aq_get_link_info() error %d\n", aq_error);
5623                 return (EPERM);
5624         }
5625
5626         sprintf(buf, "\n"
5627             "PHY Type : %#04x\n"
5628             "Speed    : %#04x\n" 
5629             "Link info: %#04x\n" 
5630             "AN info  : %#04x\n" 
5631             "Ext info : %#04x\n"
5632             "Max Frame: %d\n"
5633             "Pacing   : %#04x\n"
5634             "CRC En?  : %d",
5635             link_status.phy_type, link_status.link_speed, 
5636             link_status.link_info, link_status.an_info,
5637             link_status.ext_info, link_status.max_frame_size,
5638             link_status.pacing, link_status.crc_enable);
5639
5640         return (sysctl_handle_string(oidp, buf, strlen(buf), req));
5641 }
5642
5643 static int
5644 ixl_sysctl_phy_abilities(SYSCTL_HANDLER_ARGS)
5645 {
5646         struct ixl_pf           *pf = (struct ixl_pf *)arg1;
5647         struct i40e_hw          *hw = &pf->hw;
5648         char                    buf[512];
5649         enum i40e_status_code   aq_error = 0;
5650
5651         struct i40e_aq_get_phy_abilities_resp abilities;
5652
5653         aq_error = i40e_aq_get_phy_capabilities(hw,
5654             TRUE, FALSE, &abilities, NULL);
5655         if (aq_error) {
5656                 printf("i40e_aq_get_phy_capabilities() error %d\n", aq_error);
5657                 return (EPERM);
5658         }
5659
5660         sprintf(buf, "\n"
5661             "PHY Type : %#010x\n"
5662             "Speed    : %#04x\n" 
5663             "Abilities: %#04x\n" 
5664             "EEE cap  : %#06x\n" 
5665             "EEER reg : %#010x\n" 
5666             "D3 Lpan  : %#04x",
5667             abilities.phy_type, abilities.link_speed, 
5668             abilities.abilities, abilities.eee_capability,
5669             abilities.eeer_val, abilities.d3_lpan);
5670
5671         return (sysctl_handle_string(oidp, buf, strlen(buf), req));
5672 }
5673
5674 static int
5675 ixl_sysctl_sw_filter_list(SYSCTL_HANDLER_ARGS)
5676 {
5677         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5678         struct ixl_vsi *vsi = &pf->vsi;
5679         struct ixl_mac_filter *f;
5680         char *buf, *buf_i;
5681
5682         int error = 0;
5683         int ftl_len = 0;
5684         int ftl_counter = 0;
5685         int buf_len = 0;
5686         int entry_len = 42;
5687
5688         SLIST_FOREACH(f, &vsi->ftl, next) {
5689                 ftl_len++;
5690         }
5691
5692         if (ftl_len < 1) {
5693                 sysctl_handle_string(oidp, "(none)", 6, req);
5694                 return (0);
5695         }
5696
5697         buf_len = sizeof(char) * (entry_len + 1) * ftl_len + 2;
5698         buf = buf_i = malloc(buf_len, M_DEVBUF, M_NOWAIT);
5699
5700         sprintf(buf_i++, "\n");
5701         SLIST_FOREACH(f, &vsi->ftl, next) {
5702                 sprintf(buf_i,
5703                     MAC_FORMAT ", vlan %4d, flags %#06x",
5704                     MAC_FORMAT_ARGS(f->macaddr), f->vlan, f->flags);
5705                 buf_i += entry_len;
5706                 /* don't print '\n' for last entry */
5707                 if (++ftl_counter != ftl_len) {
5708                         sprintf(buf_i, "\n");
5709                         buf_i++;
5710                 }
5711         }
5712
5713         error = sysctl_handle_string(oidp, buf, strlen(buf), req);
5714         if (error)
5715                 printf("sysctl error: %d\n", error);
5716         free(buf, M_DEVBUF);
5717         return error;
5718 }
5719
5720 #define IXL_SW_RES_SIZE 0x14
5721 static int
5722 ixl_res_alloc_cmp(const void *a, const void *b)
5723 {
5724         const struct i40e_aqc_switch_resource_alloc_element_resp *one, *two;
5725         one = (const struct i40e_aqc_switch_resource_alloc_element_resp *)a;
5726         two = (const struct i40e_aqc_switch_resource_alloc_element_resp *)b;
5727
5728         return ((int)one->resource_type - (int)two->resource_type);
5729 }
5730
5731 /*
5732  * Longest string length: 25 
5733  */
5734 static char *
5735 ixl_switch_res_type_string(u8 type)
5736 {
5737         static char * ixl_switch_res_type_strings[0x14] = {
5738                 "VEB",
5739                 "VSI",
5740                 "Perfect Match MAC address",
5741                 "S-tag",
5742                 "(Reserved)",
5743                 "Multicast hash entry",
5744                 "Unicast hash entry",
5745                 "VLAN",
5746                 "VSI List entry",
5747                 "(Reserved)",
5748                 "VLAN Statistic Pool",
5749                 "Mirror Rule",
5750                 "Queue Set",
5751                 "Inner VLAN Forward filter",
5752                 "(Reserved)",
5753                 "Inner MAC",
5754                 "IP",
5755                 "GRE/VN1 Key",
5756                 "VN2 Key",
5757                 "Tunneling Port"
5758         };
5759
5760         if (type < 0x14)
5761                 return ixl_switch_res_type_strings[type];
5762         else
5763                 return "(Reserved)";
5764 }
5765
5766 static int
5767 ixl_sysctl_hw_res_alloc(SYSCTL_HANDLER_ARGS)
5768 {
5769         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5770         struct i40e_hw *hw = &pf->hw;
5771         device_t dev = pf->dev;
5772         struct sbuf *buf;
5773         int error = 0;
5774
5775         u8 num_entries;
5776         struct i40e_aqc_switch_resource_alloc_element_resp resp[IXL_SW_RES_SIZE];
5777
5778         buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5779         if (!buf) {
5780                 device_printf(dev, "Could not allocate sbuf for output.\n");
5781                 return (ENOMEM);
5782         }
5783
5784         bzero(resp, sizeof(resp));
5785         error = i40e_aq_get_switch_resource_alloc(hw, &num_entries,
5786                                 resp,
5787                                 IXL_SW_RES_SIZE,
5788                                 NULL);
5789         if (error) {
5790                 device_printf(dev,
5791                     "%s: get_switch_resource_alloc() error %d, aq error %d\n",
5792                     __func__, error, hw->aq.asq_last_status);
5793                 sbuf_delete(buf);
5794                 return error;
5795         }
5796
5797         /* Sort entries by type for display */
5798         qsort(resp, num_entries,
5799             sizeof(struct i40e_aqc_switch_resource_alloc_element_resp),
5800             &ixl_res_alloc_cmp);
5801
5802         sbuf_cat(buf, "\n");
5803         sbuf_printf(buf, "# of entries: %d\n", num_entries);
5804         sbuf_printf(buf,
5805             "                     Type | Guaranteed | Total | Used   | Un-allocated\n"
5806             "                          | (this)     | (all) | (this) | (all)       \n");
5807         for (int i = 0; i < num_entries; i++) {
5808                 sbuf_printf(buf,
5809                     "%25s | %10d   %5d   %6d   %12d",
5810                     ixl_switch_res_type_string(resp[i].resource_type),
5811                     resp[i].guaranteed,
5812                     resp[i].total,
5813                     resp[i].used,
5814                     resp[i].total_unalloced);
5815                 if (i < num_entries - 1)
5816                         sbuf_cat(buf, "\n");
5817         }
5818
5819         error = sbuf_finish(buf);
5820         if (error)
5821                 device_printf(dev, "Error finishing sbuf: %d\n", error);
5822
5823         sbuf_delete(buf);
5824         return error;
5825 }
5826
5827 /*
5828 ** Caller must init and delete sbuf; this function will clear and
5829 ** finish it for caller.
5830 **
5831 ** XXX: Cannot use the SEID for this, since there is no longer a 
5832 ** fixed mapping between SEID and element type.
5833 */
5834 static char *
5835 ixl_switch_element_string(struct sbuf *s,
5836     struct i40e_aqc_switch_config_element_resp *element)
5837 {
5838         sbuf_clear(s);
5839
5840         switch (element->element_type) {
5841         case I40E_AQ_SW_ELEM_TYPE_MAC:
5842                 sbuf_printf(s, "MAC %3d", element->element_info);
5843                 break;
5844         case I40E_AQ_SW_ELEM_TYPE_PF:
5845                 sbuf_printf(s, "PF  %3d", element->element_info);
5846                 break;
5847         case I40E_AQ_SW_ELEM_TYPE_VF:
5848                 sbuf_printf(s, "VF  %3d", element->element_info);
5849                 break;
5850         case I40E_AQ_SW_ELEM_TYPE_EMP:
5851                 sbuf_cat(s, "EMP");
5852                 break;
5853         case I40E_AQ_SW_ELEM_TYPE_BMC:
5854                 sbuf_cat(s, "BMC");
5855                 break;
5856         case I40E_AQ_SW_ELEM_TYPE_PV:
5857                 sbuf_cat(s, "PV");
5858                 break;
5859         case I40E_AQ_SW_ELEM_TYPE_VEB:
5860                 sbuf_cat(s, "VEB");
5861                 break;
5862         case I40E_AQ_SW_ELEM_TYPE_PA:
5863                 sbuf_cat(s, "PA");
5864                 break;
5865         case I40E_AQ_SW_ELEM_TYPE_VSI:
5866                 sbuf_printf(s, "VSI %3d", element->element_info);
5867                 break;
5868         default:
5869                 sbuf_cat(s, "?");
5870                 break;
5871         }
5872
5873         sbuf_finish(s);
5874         return sbuf_data(s);
5875 }
5876
5877 static int
5878 ixl_sysctl_switch_config(SYSCTL_HANDLER_ARGS)
5879 {
5880         struct ixl_pf *pf = (struct ixl_pf *)arg1;
5881         struct i40e_hw *hw = &pf->hw;
5882         device_t dev = pf->dev;
5883         struct sbuf *buf;
5884         struct sbuf *nmbuf;
5885         int error = 0;
5886         u16 next = 0;
5887         u8 aq_buf[I40E_AQ_LARGE_BUF];
5888
5889         struct i40e_aqc_get_switch_config_resp *sw_config;
5890         sw_config = (struct i40e_aqc_get_switch_config_resp *)aq_buf;
5891
5892         buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5893         if (!buf) {
5894                 device_printf(dev, "Could not allocate sbuf for sysctl output.\n");
5895                 return (ENOMEM);
5896         }
5897
5898         error = i40e_aq_get_switch_config(hw, sw_config,
5899             sizeof(aq_buf), &next, NULL);
5900         if (error) {
5901                 device_printf(dev,
5902                     "%s: aq_get_switch_config() error %d, aq error %d\n",
5903                     __func__, error, hw->aq.asq_last_status);
5904                 sbuf_delete(buf);
5905                 return error;
5906         }
5907         if (next)
5908                 device_printf(dev, "%s: TODO: get more config with SEID %d\n",
5909                     __func__, next);
5910
5911         nmbuf = sbuf_new_auto();
5912         if (!nmbuf) {
5913                 device_printf(dev, "Could not allocate sbuf for name output.\n");
5914                 sbuf_delete(buf);
5915                 return (ENOMEM);
5916         }
5917
5918         sbuf_cat(buf, "\n");
5919         // Assuming <= 255 elements in switch
5920         sbuf_printf(buf, "# of reported elements: %d\n", sw_config->header.num_reported);
5921         sbuf_printf(buf, "total # of elements: %d\n", sw_config->header.num_total);
5922         /* Exclude:
5923         ** Revision -- all elements are revision 1 for now
5924         */
5925         sbuf_printf(buf,
5926             "SEID (  Name  ) |  Uplink  | Downlink | Conn Type\n"
5927             "                |          |          | (uplink)\n");
5928         for (int i = 0; i < sw_config->header.num_reported; i++) {
5929                 // "%4d (%8s) | %8s   %8s   %#8x",
5930                 sbuf_printf(buf, "%4d", sw_config->element[i].seid);
5931                 sbuf_cat(buf, " ");
5932                 sbuf_printf(buf, "(%8s)", ixl_switch_element_string(nmbuf,
5933                     &sw_config->element[i]));
5934                 sbuf_cat(buf, " | ");
5935                 sbuf_printf(buf, "%8d", sw_config->element[i].uplink_seid);
5936                 sbuf_cat(buf, "   ");
5937                 sbuf_printf(buf, "%8d", sw_config->element[i].downlink_seid);
5938                 sbuf_cat(buf, "   ");
5939                 sbuf_printf(buf, "%#8x", sw_config->element[i].connection_type);
5940                 if (i < sw_config->header.num_reported - 1)
5941                         sbuf_cat(buf, "\n");
5942         }
5943         sbuf_delete(nmbuf);
5944
5945         error = sbuf_finish(buf);
5946         if (error)
5947                 device_printf(dev, "Error finishing sbuf: %d\n", error);
5948
5949         sbuf_delete(buf);
5950
5951         return (error);
5952 }
5953
5954 static int
5955 ixl_debug_info(SYSCTL_HANDLER_ARGS)
5956 {
5957         struct ixl_pf   *pf;
5958         int             error, input = 0;
5959
5960         error = sysctl_handle_int(oidp, &input, 0, req);
5961
5962         if (error || !req->newptr)
5963                 return (error);
5964
5965         if (input == 1) {
5966                 pf = (struct ixl_pf *)arg1;
5967                 ixl_print_debug_info(pf);
5968         }
5969
5970         return (error);
5971 }
5972
5973 static void
5974 ixl_print_debug_info(struct ixl_pf *pf)
5975 {
5976         struct i40e_hw          *hw = &pf->hw;
5977         struct ixl_vsi          *vsi = &pf->vsi;
5978         struct ixl_queue        *que = vsi->queues;
5979         struct rx_ring          *rxr = &que->rxr;
5980         struct tx_ring          *txr = &que->txr;
5981         u32                     reg;    
5982
5983
5984         printf("Queue irqs = %jx\n", (uintmax_t)que->irqs);
5985         printf("AdminQ irqs = %jx\n", (uintmax_t)pf->admin_irq);
5986         printf("RX next check = %x\n", rxr->next_check);
5987         printf("RX not ready = %jx\n", (uintmax_t)rxr->not_done);
5988         printf("RX packets = %jx\n", (uintmax_t)rxr->rx_packets);
5989         printf("TX desc avail = %x\n", txr->avail);
5990
5991         reg = rd32(hw, I40E_GLV_GORCL(0xc));
5992          printf("RX Bytes = %x\n", reg);
5993         reg = rd32(hw, I40E_GLPRT_GORCL(hw->port));
5994          printf("Port RX Bytes = %x\n", reg);
5995         reg = rd32(hw, I40E_GLV_RDPC(0xc));
5996          printf("RX discard = %x\n", reg);
5997         reg = rd32(hw, I40E_GLPRT_RDPC(hw->port));
5998          printf("Port RX discard = %x\n", reg);
5999
6000         reg = rd32(hw, I40E_GLV_TEPC(0xc));
6001          printf("TX errors = %x\n", reg);
6002         reg = rd32(hw, I40E_GLV_GOTCL(0xc));
6003          printf("TX Bytes = %x\n", reg);
6004
6005         reg = rd32(hw, I40E_GLPRT_RUC(hw->port));
6006          printf("RX undersize = %x\n", reg);
6007         reg = rd32(hw, I40E_GLPRT_RFC(hw->port));
6008          printf("RX fragments = %x\n", reg);
6009         reg = rd32(hw, I40E_GLPRT_ROC(hw->port));
6010          printf("RX oversize = %x\n", reg);
6011         reg = rd32(hw, I40E_GLPRT_RLEC(hw->port));
6012          printf("RX length error = %x\n", reg);
6013         reg = rd32(hw, I40E_GLPRT_MRFC(hw->port));
6014          printf("mac remote fault = %x\n", reg);
6015         reg = rd32(hw, I40E_GLPRT_MLFC(hw->port));
6016          printf("mac local fault = %x\n", reg);
6017 }
6018
6019 #endif /* IXL_DEBUG_SYSCTL */
6020
6021 #ifdef PCI_IOV
6022 static int
6023 ixl_vf_alloc_vsi(struct ixl_pf *pf, struct ixl_vf *vf)
6024 {
6025         struct i40e_hw *hw;
6026         struct ixl_vsi *vsi;
6027         struct i40e_vsi_context vsi_ctx;
6028         int i;
6029         uint16_t first_queue;
6030         enum i40e_status_code code;
6031
6032         hw = &pf->hw;
6033         vsi = &pf->vsi;
6034
6035         vsi_ctx.pf_num = hw->pf_id;
6036         vsi_ctx.uplink_seid = pf->veb_seid;
6037         vsi_ctx.connection_type = IXL_VSI_DATA_PORT;
6038         vsi_ctx.vf_num = hw->func_caps.vf_base_id + vf->vf_num;
6039         vsi_ctx.flags = I40E_AQ_VSI_TYPE_VF;
6040
6041         bzero(&vsi_ctx.info, sizeof(vsi_ctx.info));
6042
6043         vsi_ctx.info.valid_sections = htole16(I40E_AQ_VSI_PROP_SWITCH_VALID);
6044         vsi_ctx.info.switch_id = htole16(0);
6045
6046         vsi_ctx.info.valid_sections |= htole16(I40E_AQ_VSI_PROP_SECURITY_VALID);
6047         vsi_ctx.info.sec_flags = 0;
6048         if (vf->vf_flags & VF_FLAG_MAC_ANTI_SPOOF)
6049                 vsi_ctx.info.sec_flags |= I40E_AQ_VSI_SEC_FLAG_ENABLE_MAC_CHK;
6050
6051         /* TODO: If a port VLAN is set, then this needs to be changed */
6052         vsi_ctx.info.valid_sections |= htole16(I40E_AQ_VSI_PROP_VLAN_VALID);
6053         vsi_ctx.info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL |
6054             I40E_AQ_VSI_PVLAN_EMOD_NOTHING;
6055
6056         vsi_ctx.info.valid_sections |=
6057             htole16(I40E_AQ_VSI_PROP_QUEUE_MAP_VALID);
6058         vsi_ctx.info.mapping_flags = htole16(I40E_AQ_VSI_QUE_MAP_NONCONTIG);
6059         first_queue = vsi->num_queues + vf->vf_num * IXLV_MAX_QUEUES;
6060         for (i = 0; i < IXLV_MAX_QUEUES; i++)
6061                 vsi_ctx.info.queue_mapping[i] = htole16(first_queue + i);
6062         for (; i < nitems(vsi_ctx.info.queue_mapping); i++)
6063                 vsi_ctx.info.queue_mapping[i] = htole16(I40E_AQ_VSI_QUEUE_MASK);
6064
6065         vsi_ctx.info.tc_mapping[0] = htole16(
6066             (0 << I40E_AQ_VSI_TC_QUE_OFFSET_SHIFT) |
6067             (1 << I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT));
6068
6069         code = i40e_aq_add_vsi(hw, &vsi_ctx, NULL);
6070         if (code != I40E_SUCCESS)
6071                 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
6072         vf->vsi.seid = vsi_ctx.seid;
6073         vf->vsi.vsi_num = vsi_ctx.vsi_number;
6074         vf->vsi.first_queue = first_queue;
6075         vf->vsi.num_queues = IXLV_MAX_QUEUES;
6076
6077         code = i40e_aq_get_vsi_params(hw, &vsi_ctx, NULL);
6078         if (code != I40E_SUCCESS)
6079                 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
6080
6081         code = i40e_aq_config_vsi_bw_limit(hw, vf->vsi.seid, 0, 0, NULL);
6082         if (code != I40E_SUCCESS) {
6083                 device_printf(pf->dev, "Failed to disable BW limit: %d\n",
6084                     ixl_adminq_err_to_errno(hw->aq.asq_last_status));
6085                 return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
6086         }
6087
6088         memcpy(&vf->vsi.info, &vsi_ctx.info, sizeof(vf->vsi.info));
6089         return (0);
6090 }
6091
6092 static int
6093 ixl_vf_setup_vsi(struct ixl_pf *pf, struct ixl_vf *vf)
6094 {
6095         struct i40e_hw *hw;
6096         int error;
6097
6098         hw = &pf->hw;
6099
6100         error = ixl_vf_alloc_vsi(pf, vf);
6101         if (error != 0)
6102                 return (error);
6103
6104         vf->vsi.hw_filters_add = 0;
6105         vf->vsi.hw_filters_del = 0;
6106         ixl_add_filter(&vf->vsi, ixl_bcast_addr, IXL_VLAN_ANY);
6107         ixl_reconfigure_filters(&vf->vsi);
6108
6109         return (0);
6110 }
6111
6112 static void
6113 ixl_vf_map_vsi_queue(struct i40e_hw *hw, struct ixl_vf *vf, int qnum,
6114     uint32_t val)
6115 {
6116         uint32_t qtable;
6117         int index, shift;
6118
6119         /*
6120          * Two queues are mapped in a single register, so we have to do some
6121          * gymnastics to convert the queue number into a register index and
6122          * shift.
6123          */
6124         index = qnum / 2;
6125         shift = (qnum % 2) * I40E_VSILAN_QTABLE_QINDEX_1_SHIFT;
6126
6127         qtable = i40e_read_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num));
6128         qtable &= ~(I40E_VSILAN_QTABLE_QINDEX_0_MASK << shift);
6129         qtable |= val << shift;
6130         i40e_write_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num), qtable);
6131 }
6132
6133 static void
6134 ixl_vf_map_queues(struct ixl_pf *pf, struct ixl_vf *vf)
6135 {
6136         struct i40e_hw *hw;
6137         uint32_t qtable;
6138         int i;
6139
6140         hw = &pf->hw;
6141
6142         /*
6143          * Contiguous mappings aren't actually supported by the hardware,
6144          * so we have to use non-contiguous mappings.
6145          */
6146         i40e_write_rx_ctl(hw, I40E_VSILAN_QBASE(vf->vsi.vsi_num),
6147              I40E_VSILAN_QBASE_VSIQTABLE_ENA_MASK);
6148
6149         wr32(hw, I40E_VPLAN_MAPENA(vf->vf_num),
6150             I40E_VPLAN_MAPENA_TXRX_ENA_MASK);
6151
6152         for (i = 0; i < vf->vsi.num_queues; i++) {
6153                 qtable = (vf->vsi.first_queue + i) <<
6154                     I40E_VPLAN_QTABLE_QINDEX_SHIFT;
6155
6156                 wr32(hw, I40E_VPLAN_QTABLE(i, vf->vf_num), qtable);
6157         }
6158
6159         /* Map queues allocated to VF to its VSI. */
6160         for (i = 0; i < vf->vsi.num_queues; i++)
6161                 ixl_vf_map_vsi_queue(hw, vf, i, vf->vsi.first_queue + i);
6162
6163         /* Set rest of VSI queues as unused. */
6164         for (; i < IXL_MAX_VSI_QUEUES; i++)
6165                 ixl_vf_map_vsi_queue(hw, vf, i,
6166                     I40E_VSILAN_QTABLE_QINDEX_0_MASK);
6167
6168         ixl_flush(hw);
6169 }
6170
6171 static void
6172 ixl_vf_vsi_release(struct ixl_pf *pf, struct ixl_vsi *vsi)
6173 {
6174         struct i40e_hw *hw;
6175
6176         hw = &pf->hw;
6177
6178         if (vsi->seid == 0)
6179                 return;
6180
6181         i40e_aq_delete_element(hw, vsi->seid, NULL);
6182 }
6183
6184 static void
6185 ixl_vf_disable_queue_intr(struct i40e_hw *hw, uint32_t vfint_reg)
6186 {
6187
6188         wr32(hw, vfint_reg, I40E_VFINT_DYN_CTLN_CLEARPBA_MASK);
6189         ixl_flush(hw);
6190 }
6191
6192 static void
6193 ixl_vf_unregister_intr(struct i40e_hw *hw, uint32_t vpint_reg)
6194 {
6195
6196         wr32(hw, vpint_reg, I40E_VPINT_LNKLSTN_FIRSTQ_TYPE_MASK |
6197             I40E_VPINT_LNKLSTN_FIRSTQ_INDX_MASK);
6198         ixl_flush(hw);
6199 }
6200
6201 static void
6202 ixl_vf_release_resources(struct ixl_pf *pf, struct ixl_vf *vf)
6203 {
6204         struct i40e_hw *hw;
6205         uint32_t vfint_reg, vpint_reg;
6206         int i;
6207
6208         hw = &pf->hw;
6209
6210         ixl_vf_vsi_release(pf, &vf->vsi);
6211
6212         /* Index 0 has a special register. */
6213         ixl_vf_disable_queue_intr(hw, I40E_VFINT_DYN_CTL0(vf->vf_num));
6214
6215         for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) {
6216                 vfint_reg = IXL_VFINT_DYN_CTLN_REG(hw, i , vf->vf_num);
6217                 ixl_vf_disable_queue_intr(hw, vfint_reg);
6218         }
6219
6220         /* Index 0 has a special register. */
6221         ixl_vf_unregister_intr(hw, I40E_VPINT_LNKLST0(vf->vf_num));
6222
6223         for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) {
6224                 vpint_reg = IXL_VPINT_LNKLSTN_REG(hw, i, vf->vf_num);
6225                 ixl_vf_unregister_intr(hw, vpint_reg);
6226         }
6227
6228         vf->vsi.num_queues = 0;
6229 }
6230
6231 static int
6232 ixl_flush_pcie(struct ixl_pf *pf, struct ixl_vf *vf)
6233 {
6234         struct i40e_hw *hw;
6235         int i;
6236         uint16_t global_vf_num;
6237         uint32_t ciad;
6238
6239         hw = &pf->hw;
6240         global_vf_num = hw->func_caps.vf_base_id + vf->vf_num;
6241
6242         wr32(hw, I40E_PF_PCI_CIAA, IXL_PF_PCI_CIAA_VF_DEVICE_STATUS |
6243              (global_vf_num << I40E_PF_PCI_CIAA_VF_NUM_SHIFT));
6244         for (i = 0; i < IXL_VF_RESET_TIMEOUT; i++) {
6245                 ciad = rd32(hw, I40E_PF_PCI_CIAD);
6246                 if ((ciad & IXL_PF_PCI_CIAD_VF_TRANS_PENDING_MASK) == 0)
6247                         return (0);
6248                 DELAY(1);
6249         }
6250
6251         return (ETIMEDOUT);
6252 }
6253
6254 static void
6255 ixl_reset_vf(struct ixl_pf *pf, struct ixl_vf *vf)
6256 {
6257         struct i40e_hw *hw;
6258         uint32_t vfrtrig;
6259
6260         hw = &pf->hw;
6261
6262         vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num));
6263         vfrtrig |= I40E_VPGEN_VFRTRIG_VFSWR_MASK;
6264         wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig);
6265         ixl_flush(hw);
6266
6267         ixl_reinit_vf(pf, vf);
6268 }
6269
6270 static void
6271 ixl_reinit_vf(struct ixl_pf *pf, struct ixl_vf *vf)
6272 {
6273         struct i40e_hw *hw;
6274         uint32_t vfrstat, vfrtrig;
6275         int i, error;
6276
6277         hw = &pf->hw;
6278
6279         error = ixl_flush_pcie(pf, vf);
6280         if (error != 0)
6281                 device_printf(pf->dev,
6282                     "Timed out waiting for PCIe activity to stop on VF-%d\n",
6283                     vf->vf_num);
6284
6285         for (i = 0; i < IXL_VF_RESET_TIMEOUT; i++) {
6286                 DELAY(10);
6287
6288                 vfrstat = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_num));
6289                 if (vfrstat & I40E_VPGEN_VFRSTAT_VFRD_MASK)
6290                         break;
6291         }
6292
6293         if (i == IXL_VF_RESET_TIMEOUT)
6294                 device_printf(pf->dev, "VF %d failed to reset\n", vf->vf_num);
6295
6296         wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), I40E_VFR_COMPLETED);
6297
6298         vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num));
6299         vfrtrig &= ~I40E_VPGEN_VFRTRIG_VFSWR_MASK;
6300         wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig);
6301
6302         if (vf->vsi.seid != 0)
6303                 ixl_disable_rings(&vf->vsi);
6304
6305         ixl_vf_release_resources(pf, vf);
6306         ixl_vf_setup_vsi(pf, vf);
6307         ixl_vf_map_queues(pf, vf);
6308
6309         wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), I40E_VFR_VFACTIVE);
6310         ixl_flush(hw);
6311 }
6312
6313 static const char *
6314 ixl_vc_opcode_str(uint16_t op)
6315 {
6316
6317         switch (op) {
6318         case I40E_VIRTCHNL_OP_VERSION:
6319                 return ("VERSION");
6320         case I40E_VIRTCHNL_OP_RESET_VF:
6321                 return ("RESET_VF");
6322         case I40E_VIRTCHNL_OP_GET_VF_RESOURCES:
6323                 return ("GET_VF_RESOURCES");
6324         case I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE:
6325                 return ("CONFIG_TX_QUEUE");
6326         case I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE:
6327                 return ("CONFIG_RX_QUEUE");
6328         case I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES:
6329                 return ("CONFIG_VSI_QUEUES");
6330         case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP:
6331                 return ("CONFIG_IRQ_MAP");
6332         case I40E_VIRTCHNL_OP_ENABLE_QUEUES:
6333                 return ("ENABLE_QUEUES");
6334         case I40E_VIRTCHNL_OP_DISABLE_QUEUES:
6335                 return ("DISABLE_QUEUES");
6336         case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
6337                 return ("ADD_ETHER_ADDRESS");
6338         case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
6339                 return ("DEL_ETHER_ADDRESS");
6340         case I40E_VIRTCHNL_OP_ADD_VLAN:
6341                 return ("ADD_VLAN");
6342         case I40E_VIRTCHNL_OP_DEL_VLAN:
6343                 return ("DEL_VLAN");
6344         case I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
6345                 return ("CONFIG_PROMISCUOUS_MODE");
6346         case I40E_VIRTCHNL_OP_GET_STATS:
6347                 return ("GET_STATS");
6348         case I40E_VIRTCHNL_OP_FCOE:
6349                 return ("FCOE");
6350         case I40E_VIRTCHNL_OP_EVENT:
6351                 return ("EVENT");
6352         default:
6353                 return ("UNKNOWN");
6354         }
6355 }
6356
6357 static int
6358 ixl_vc_opcode_level(uint16_t opcode)
6359 {
6360         switch (opcode) {
6361         case I40E_VIRTCHNL_OP_GET_STATS:
6362                 return (10);
6363         default:
6364                 return (5);
6365         }
6366 }
6367
6368 static void
6369 ixl_send_vf_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op,
6370     enum i40e_status_code status, void *msg, uint16_t len)
6371 {
6372         struct i40e_hw *hw;
6373         int global_vf_id;
6374
6375         hw = &pf->hw;
6376         global_vf_id = hw->func_caps.vf_base_id + vf->vf_num;
6377
6378         I40E_VC_DEBUG(pf, ixl_vc_opcode_level(op),
6379             "Sending msg (op=%s[%d], status=%d) to VF-%d\n",
6380             ixl_vc_opcode_str(op), op, status, vf->vf_num);
6381
6382         i40e_aq_send_msg_to_vf(hw, global_vf_id, op, status, msg, len, NULL);
6383 }
6384
6385 static void
6386 ixl_send_vf_ack(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op)
6387 {
6388
6389         ixl_send_vf_msg(pf, vf, op, I40E_SUCCESS, NULL, 0);
6390 }
6391
6392 static void
6393 ixl_send_vf_nack_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op,
6394     enum i40e_status_code status, const char *file, int line)
6395 {
6396
6397         I40E_VC_DEBUG(pf, 1,
6398             "Sending NACK (op=%s[%d], err=%d) to VF-%d from %s:%d\n",
6399             ixl_vc_opcode_str(op), op, status, vf->vf_num, file, line);
6400         ixl_send_vf_msg(pf, vf, op, status, NULL, 0);
6401 }
6402
6403 static void
6404 ixl_vf_version_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6405     uint16_t msg_size)
6406 {
6407         struct i40e_virtchnl_version_info reply;
6408
6409         if (msg_size != sizeof(struct i40e_virtchnl_version_info)) {
6410                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_VERSION,
6411                     I40E_ERR_PARAM);
6412                 return;
6413         }
6414
6415         vf->version = ((struct i40e_virtchnl_version_info *)msg)->minor;
6416
6417         reply.major = I40E_VIRTCHNL_VERSION_MAJOR;
6418         reply.minor = I40E_VIRTCHNL_VERSION_MINOR;
6419         ixl_send_vf_msg(pf, vf, I40E_VIRTCHNL_OP_VERSION, I40E_SUCCESS, &reply,
6420             sizeof(reply));
6421 }
6422
6423 static void
6424 ixl_vf_reset_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6425     uint16_t msg_size)
6426 {
6427
6428         if (msg_size != 0) {
6429                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_RESET_VF,
6430                     I40E_ERR_PARAM);
6431                 return;
6432         }
6433
6434         ixl_reset_vf(pf, vf);
6435
6436         /* No response to a reset message. */
6437 }
6438
6439 static void
6440 ixl_vf_get_resources_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6441     uint16_t msg_size)
6442 {
6443         struct i40e_virtchnl_vf_resource reply;
6444
6445         if ((vf->version == 0 && msg_size != 0) ||
6446             (vf->version == 1 && msg_size != 4)) {
6447                 device_printf(pf->dev, "Invalid GET_VF_RESOURCES message size,"
6448                     " for VF version %d.%d\n", I40E_VIRTCHNL_VERSION_MAJOR,
6449                     vf->version);
6450                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
6451                     I40E_ERR_PARAM);
6452                 return;
6453         }
6454
6455         bzero(&reply, sizeof(reply));
6456
6457         if (vf->version == I40E_VIRTCHNL_VERSION_MINOR_NO_VF_CAPS)
6458                 reply.vf_offload_flags = I40E_VIRTCHNL_VF_OFFLOAD_L2 |
6459                                          I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |
6460                                          I40E_VIRTCHNL_VF_OFFLOAD_VLAN;
6461         else
6462                 reply.vf_offload_flags = *(u32 *)msg;
6463
6464         reply.num_vsis = 1;
6465         reply.num_queue_pairs = vf->vsi.num_queues;
6466         reply.max_vectors = pf->hw.func_caps.num_msix_vectors_vf;
6467         reply.vsi_res[0].vsi_id = vf->vsi.vsi_num;
6468         reply.vsi_res[0].vsi_type = I40E_VSI_SRIOV;
6469         reply.vsi_res[0].num_queue_pairs = vf->vsi.num_queues;
6470         memcpy(reply.vsi_res[0].default_mac_addr, vf->mac, ETHER_ADDR_LEN);
6471
6472         ixl_send_vf_msg(pf, vf, I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
6473             I40E_SUCCESS, &reply, sizeof(reply));
6474 }
6475
6476 static int
6477 ixl_vf_config_tx_queue(struct ixl_pf *pf, struct ixl_vf *vf,
6478     struct i40e_virtchnl_txq_info *info)
6479 {
6480         struct i40e_hw *hw;
6481         struct i40e_hmc_obj_txq txq;
6482         uint16_t global_queue_num, global_vf_num;
6483         enum i40e_status_code status;
6484         uint32_t qtx_ctl;
6485
6486         hw = &pf->hw;
6487         global_queue_num = vf->vsi.first_queue + info->queue_id;
6488         global_vf_num = hw->func_caps.vf_base_id + vf->vf_num;
6489         bzero(&txq, sizeof(txq));
6490
6491         status = i40e_clear_lan_tx_queue_context(hw, global_queue_num);
6492         if (status != I40E_SUCCESS)
6493                 return (EINVAL);
6494
6495         txq.base = info->dma_ring_addr / IXL_TX_CTX_BASE_UNITS;
6496
6497         txq.head_wb_ena = info->headwb_enabled;
6498         txq.head_wb_addr = info->dma_headwb_addr;
6499         txq.qlen = info->ring_len;
6500         txq.rdylist = le16_to_cpu(vf->vsi.info.qs_handle[0]);
6501         txq.rdylist_act = 0;
6502
6503         status = i40e_set_lan_tx_queue_context(hw, global_queue_num, &txq);
6504         if (status != I40E_SUCCESS)
6505                 return (EINVAL);
6506
6507         qtx_ctl = I40E_QTX_CTL_VF_QUEUE |
6508             (hw->pf_id << I40E_QTX_CTL_PF_INDX_SHIFT) |
6509             (global_vf_num << I40E_QTX_CTL_VFVM_INDX_SHIFT);
6510         wr32(hw, I40E_QTX_CTL(global_queue_num), qtx_ctl);
6511         ixl_flush(hw);
6512
6513         return (0);
6514 }
6515
6516 static int
6517 ixl_vf_config_rx_queue(struct ixl_pf *pf, struct ixl_vf *vf,
6518     struct i40e_virtchnl_rxq_info *info)
6519 {
6520         struct i40e_hw *hw;
6521         struct i40e_hmc_obj_rxq rxq;
6522         uint16_t global_queue_num;
6523         enum i40e_status_code status;
6524
6525         hw = &pf->hw;
6526         global_queue_num = vf->vsi.first_queue + info->queue_id;
6527         bzero(&rxq, sizeof(rxq));
6528
6529         if (info->databuffer_size > IXL_VF_MAX_BUFFER)
6530                 return (EINVAL);
6531
6532         if (info->max_pkt_size > IXL_VF_MAX_FRAME ||
6533             info->max_pkt_size < ETHER_MIN_LEN)
6534                 return (EINVAL);
6535
6536         if (info->splithdr_enabled) {
6537                 if (info->hdr_size > IXL_VF_MAX_HDR_BUFFER)
6538                         return (EINVAL);
6539
6540                 rxq.hsplit_0 = info->rx_split_pos &
6541                     (I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_L2 |
6542                      I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_IP |
6543                      I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_TCP_UDP |
6544                      I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_SCTP);
6545                 rxq.hbuff = info->hdr_size >> I40E_RXQ_CTX_HBUFF_SHIFT;
6546
6547                 rxq.dtype = 2;
6548         }
6549
6550         status = i40e_clear_lan_rx_queue_context(hw, global_queue_num);
6551         if (status != I40E_SUCCESS)
6552                 return (EINVAL);
6553
6554         rxq.base = info->dma_ring_addr / IXL_RX_CTX_BASE_UNITS;
6555         rxq.qlen = info->ring_len;
6556
6557         rxq.dbuff = info->databuffer_size >> I40E_RXQ_CTX_DBUFF_SHIFT;
6558
6559         rxq.dsize = 1;
6560         rxq.crcstrip = 1;
6561         rxq.l2tsel = 1;
6562
6563         rxq.rxmax = info->max_pkt_size;
6564         rxq.tphrdesc_ena = 1;
6565         rxq.tphwdesc_ena = 1;
6566         rxq.tphdata_ena = 1;
6567         rxq.tphhead_ena = 1;
6568         rxq.lrxqthresh = 2;
6569         rxq.prefena = 1;
6570
6571         status = i40e_set_lan_rx_queue_context(hw, global_queue_num, &rxq);
6572         if (status != I40E_SUCCESS)
6573                 return (EINVAL);
6574
6575         return (0);
6576 }
6577
6578 static void
6579 ixl_vf_config_vsi_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6580     uint16_t msg_size)
6581 {
6582         struct i40e_virtchnl_vsi_queue_config_info *info;
6583         struct i40e_virtchnl_queue_pair_info *pair;
6584         int i;
6585
6586         if (msg_size < sizeof(*info)) {
6587                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
6588                     I40E_ERR_PARAM);
6589                 return;
6590         }
6591
6592         info = msg;
6593         if (info->num_queue_pairs == 0) {
6594                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
6595                     I40E_ERR_PARAM);
6596                 return;
6597         }
6598
6599         if (msg_size != sizeof(*info) + info->num_queue_pairs * sizeof(*pair)) {
6600                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
6601                     I40E_ERR_PARAM);
6602                 return;
6603         }
6604
6605         if (info->vsi_id != vf->vsi.vsi_num) {
6606                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
6607                     I40E_ERR_PARAM);
6608                 return;
6609         }
6610
6611         for (i = 0; i < info->num_queue_pairs; i++) {
6612                 pair = &info->qpair[i];
6613
6614                 if (pair->txq.vsi_id != vf->vsi.vsi_num ||
6615                     pair->rxq.vsi_id != vf->vsi.vsi_num ||
6616                     pair->txq.queue_id != pair->rxq.queue_id ||
6617                     pair->txq.queue_id >= vf->vsi.num_queues) {
6618
6619                         i40e_send_vf_nack(pf, vf,
6620                             I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
6621                         return;
6622                 }
6623
6624                 if (ixl_vf_config_tx_queue(pf, vf, &pair->txq) != 0) {
6625                         i40e_send_vf_nack(pf, vf,
6626                             I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
6627                         return;
6628                 }
6629
6630                 if (ixl_vf_config_rx_queue(pf, vf, &pair->rxq) != 0) {
6631                         i40e_send_vf_nack(pf, vf,
6632                             I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
6633                         return;
6634                 }
6635         }
6636
6637         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES);
6638 }
6639
6640 static void
6641 ixl_vf_set_qctl(struct ixl_pf *pf,
6642     const struct i40e_virtchnl_vector_map *vector,
6643     enum i40e_queue_type cur_type, uint16_t cur_queue,
6644     enum i40e_queue_type *last_type, uint16_t *last_queue)
6645 {
6646         uint32_t offset, qctl;
6647         uint16_t itr_indx;
6648
6649         if (cur_type == I40E_QUEUE_TYPE_RX) {
6650                 offset = I40E_QINT_RQCTL(cur_queue);
6651                 itr_indx = vector->rxitr_idx;
6652         } else {
6653                 offset = I40E_QINT_TQCTL(cur_queue);
6654                 itr_indx = vector->txitr_idx;
6655         }
6656
6657         qctl = htole32((vector->vector_id << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) |
6658             (*last_type << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT) |
6659             (*last_queue << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) |
6660             I40E_QINT_RQCTL_CAUSE_ENA_MASK |
6661             (itr_indx << I40E_QINT_RQCTL_ITR_INDX_SHIFT));
6662
6663         wr32(&pf->hw, offset, qctl);
6664
6665         *last_type = cur_type;
6666         *last_queue = cur_queue;
6667 }
6668
6669 static void
6670 ixl_vf_config_vector(struct ixl_pf *pf, struct ixl_vf *vf,
6671     const struct i40e_virtchnl_vector_map *vector)
6672 {
6673         struct i40e_hw *hw;
6674         u_int qindex;
6675         enum i40e_queue_type type, last_type;
6676         uint32_t lnklst_reg;
6677         uint16_t rxq_map, txq_map, cur_queue, last_queue;
6678
6679         hw = &pf->hw;
6680
6681         rxq_map = vector->rxq_map;
6682         txq_map = vector->txq_map;
6683
6684         last_queue = IXL_END_OF_INTR_LNKLST;
6685         last_type = I40E_QUEUE_TYPE_RX;
6686
6687         /*
6688          * The datasheet says to optimize performance, RX queues and TX queues
6689          * should be interleaved in the interrupt linked list, so we process
6690          * both at once here.
6691          */
6692         while ((rxq_map != 0) || (txq_map != 0)) {
6693                 if (txq_map != 0) {
6694                         qindex = ffs(txq_map) - 1;
6695                         type = I40E_QUEUE_TYPE_TX;
6696                         cur_queue = vf->vsi.first_queue + qindex;
6697                         ixl_vf_set_qctl(pf, vector, type, cur_queue,
6698                             &last_type, &last_queue);
6699                         txq_map &= ~(1 << qindex);
6700                 }
6701
6702                 if (rxq_map != 0) {
6703                         qindex = ffs(rxq_map) - 1;
6704                         type = I40E_QUEUE_TYPE_RX;
6705                         cur_queue = vf->vsi.first_queue + qindex;
6706                         ixl_vf_set_qctl(pf, vector, type, cur_queue,
6707                             &last_type, &last_queue);
6708                         rxq_map &= ~(1 << qindex);
6709                 }
6710         }
6711
6712         if (vector->vector_id == 0)
6713                 lnklst_reg = I40E_VPINT_LNKLST0(vf->vf_num);
6714         else
6715                 lnklst_reg = IXL_VPINT_LNKLSTN_REG(hw, vector->vector_id,
6716                     vf->vf_num);
6717         wr32(hw, lnklst_reg,
6718             (last_queue << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT) |
6719             (last_type << I40E_VPINT_LNKLST0_FIRSTQ_TYPE_SHIFT));
6720
6721         ixl_flush(hw);
6722 }
6723
6724 static void
6725 ixl_vf_config_irq_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6726     uint16_t msg_size)
6727 {
6728         struct i40e_virtchnl_irq_map_info *map;
6729         struct i40e_virtchnl_vector_map *vector;
6730         struct i40e_hw *hw;
6731         int i, largest_txq, largest_rxq;
6732
6733         hw = &pf->hw;
6734
6735         if (msg_size < sizeof(*map)) {
6736                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6737                     I40E_ERR_PARAM);
6738                 return;
6739         }
6740
6741         map = msg;
6742         if (map->num_vectors == 0) {
6743                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6744                     I40E_ERR_PARAM);
6745                 return;
6746         }
6747
6748         if (msg_size != sizeof(*map) + map->num_vectors * sizeof(*vector)) {
6749                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6750                     I40E_ERR_PARAM);
6751                 return;
6752         }
6753
6754         for (i = 0; i < map->num_vectors; i++) {
6755                 vector = &map->vecmap[i];
6756
6757                 if ((vector->vector_id >= hw->func_caps.num_msix_vectors_vf) ||
6758                     vector->vsi_id != vf->vsi.vsi_num) {
6759                         i40e_send_vf_nack(pf, vf,
6760                             I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP, I40E_ERR_PARAM);
6761                         return;
6762                 }
6763
6764                 if (vector->rxq_map != 0) {
6765                         largest_rxq = fls(vector->rxq_map) - 1;
6766                         if (largest_rxq >= vf->vsi.num_queues) {
6767                                 i40e_send_vf_nack(pf, vf,
6768                                     I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6769                                     I40E_ERR_PARAM);
6770                                 return;
6771                         }
6772                 }
6773
6774                 if (vector->txq_map != 0) {
6775                         largest_txq = fls(vector->txq_map) - 1;
6776                         if (largest_txq >= vf->vsi.num_queues) {
6777                                 i40e_send_vf_nack(pf, vf,
6778                                     I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6779                                     I40E_ERR_PARAM);
6780                                 return;
6781                         }
6782                 }
6783
6784                 if (vector->rxitr_idx > IXL_MAX_ITR_IDX ||
6785                     vector->txitr_idx > IXL_MAX_ITR_IDX) {
6786                         i40e_send_vf_nack(pf, vf,
6787                             I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
6788                             I40E_ERR_PARAM);
6789                         return;
6790                 }
6791
6792                 ixl_vf_config_vector(pf, vf, vector);
6793         }
6794
6795         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP);
6796 }
6797
6798 static void
6799 ixl_vf_enable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6800     uint16_t msg_size)
6801 {
6802         struct i40e_virtchnl_queue_select *select;
6803         int error;
6804
6805         if (msg_size != sizeof(*select)) {
6806                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ENABLE_QUEUES,
6807                     I40E_ERR_PARAM);
6808                 return;
6809         }
6810
6811         select = msg;
6812         if (select->vsi_id != vf->vsi.vsi_num ||
6813             select->rx_queues == 0 || select->tx_queues == 0) {
6814                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ENABLE_QUEUES,
6815                     I40E_ERR_PARAM);
6816                 return;
6817         }
6818
6819         error = ixl_enable_rings(&vf->vsi);
6820         if (error) {
6821                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ENABLE_QUEUES,
6822                     I40E_ERR_TIMEOUT);
6823                 return;
6824         }
6825
6826         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_ENABLE_QUEUES);
6827 }
6828
6829 static void
6830 ixl_vf_disable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf,
6831     void *msg, uint16_t msg_size)
6832 {
6833         struct i40e_virtchnl_queue_select *select;
6834         int error;
6835
6836         if (msg_size != sizeof(*select)) {
6837                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_DISABLE_QUEUES,
6838                     I40E_ERR_PARAM);
6839                 return;
6840         }
6841
6842         select = msg;
6843         if (select->vsi_id != vf->vsi.vsi_num ||
6844             select->rx_queues == 0 || select->tx_queues == 0) {
6845                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_DISABLE_QUEUES,
6846                     I40E_ERR_PARAM);
6847                 return;
6848         }
6849
6850         error = ixl_disable_rings(&vf->vsi);
6851         if (error) {
6852                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_DISABLE_QUEUES,
6853                     I40E_ERR_TIMEOUT);
6854                 return;
6855         }
6856
6857         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_DISABLE_QUEUES);
6858 }
6859
6860 static boolean_t
6861 ixl_zero_mac(const uint8_t *addr)
6862 {
6863         uint8_t zero[ETHER_ADDR_LEN] = {0, 0, 0, 0, 0, 0};
6864
6865         return (cmp_etheraddr(addr, zero));
6866 }
6867
6868 static boolean_t
6869 ixl_bcast_mac(const uint8_t *addr)
6870 {
6871
6872         return (cmp_etheraddr(addr, ixl_bcast_addr));
6873 }
6874
6875 static int
6876 ixl_vf_mac_valid(struct ixl_vf *vf, const uint8_t *addr)
6877 {
6878
6879         if (ixl_zero_mac(addr) || ixl_bcast_mac(addr))
6880                 return (EINVAL);
6881
6882         /*
6883          * If the VF is not allowed to change its MAC address, don't let it
6884          * set a MAC filter for an address that is not a multicast address and
6885          * is not its assigned MAC.
6886          */
6887         if (!(vf->vf_flags & VF_FLAG_SET_MAC_CAP) &&
6888             !(ETHER_IS_MULTICAST(addr) || cmp_etheraddr(addr, vf->mac)))
6889                 return (EPERM);
6890
6891         return (0);
6892 }
6893
6894 static void
6895 ixl_vf_add_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6896     uint16_t msg_size)
6897 {
6898         struct i40e_virtchnl_ether_addr_list *addr_list;
6899         struct i40e_virtchnl_ether_addr *addr;
6900         struct ixl_vsi *vsi;
6901         int i;
6902         size_t expected_size;
6903
6904         vsi = &vf->vsi;
6905
6906         if (msg_size < sizeof(*addr_list)) {
6907                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
6908                     I40E_ERR_PARAM);
6909                 return;
6910         }
6911
6912         addr_list = msg;
6913         expected_size = sizeof(*addr_list) +
6914             addr_list->num_elements * sizeof(*addr);
6915
6916         if (addr_list->num_elements == 0 ||
6917             addr_list->vsi_id != vsi->vsi_num ||
6918             msg_size != expected_size) {
6919                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
6920                     I40E_ERR_PARAM);
6921                 return;
6922         }
6923
6924         for (i = 0; i < addr_list->num_elements; i++) {
6925                 if (ixl_vf_mac_valid(vf, addr_list->list[i].addr) != 0) {
6926                         i40e_send_vf_nack(pf, vf,
6927                             I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS, I40E_ERR_PARAM);
6928                         return;
6929                 }
6930         }
6931
6932         for (i = 0; i < addr_list->num_elements; i++) {
6933                 addr = &addr_list->list[i];
6934                 ixl_add_filter(vsi, addr->addr, IXL_VLAN_ANY);
6935         }
6936
6937         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS);
6938 }
6939
6940 static void
6941 ixl_vf_del_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
6942     uint16_t msg_size)
6943 {
6944         struct i40e_virtchnl_ether_addr_list *addr_list;
6945         struct i40e_virtchnl_ether_addr *addr;
6946         size_t expected_size;
6947         int i;
6948
6949         if (msg_size < sizeof(*addr_list)) {
6950                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
6951                     I40E_ERR_PARAM);
6952                 return;
6953         }
6954
6955         addr_list = msg;
6956         expected_size = sizeof(*addr_list) +
6957             addr_list->num_elements * sizeof(*addr);
6958
6959         if (addr_list->num_elements == 0 ||
6960             addr_list->vsi_id != vf->vsi.vsi_num ||
6961             msg_size != expected_size) {
6962                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
6963                     I40E_ERR_PARAM);
6964                 return;
6965         }
6966
6967         for (i = 0; i < addr_list->num_elements; i++) {
6968                 addr = &addr_list->list[i];
6969                 if (ixl_zero_mac(addr->addr) || ixl_bcast_mac(addr->addr)) {
6970                         i40e_send_vf_nack(pf, vf,
6971                             I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS, I40E_ERR_PARAM);
6972                         return;
6973                 }
6974         }
6975
6976         for (i = 0; i < addr_list->num_elements; i++) {
6977                 addr = &addr_list->list[i];
6978                 ixl_del_filter(&vf->vsi, addr->addr, IXL_VLAN_ANY);
6979         }
6980
6981         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS);
6982 }
6983
6984 static enum i40e_status_code
6985 ixl_vf_enable_vlan_strip(struct ixl_pf *pf, struct ixl_vf *vf)
6986 {
6987         struct i40e_vsi_context vsi_ctx;
6988
6989         vsi_ctx.seid = vf->vsi.seid;
6990
6991         bzero(&vsi_ctx.info, sizeof(vsi_ctx.info));
6992         vsi_ctx.info.valid_sections = htole16(I40E_AQ_VSI_PROP_VLAN_VALID);
6993         vsi_ctx.info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL |
6994             I40E_AQ_VSI_PVLAN_EMOD_STR_BOTH;
6995         return (i40e_aq_update_vsi_params(&pf->hw, &vsi_ctx, NULL));
6996 }
6997
6998 static void
6999 ixl_vf_add_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
7000     uint16_t msg_size)
7001 {
7002         struct i40e_virtchnl_vlan_filter_list *filter_list;
7003         enum i40e_status_code code;
7004         size_t expected_size;
7005         int i;
7006
7007         if (msg_size < sizeof(*filter_list)) {
7008                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7009                     I40E_ERR_PARAM);
7010                 return;
7011         }
7012
7013         filter_list = msg;
7014         expected_size = sizeof(*filter_list) +
7015             filter_list->num_elements * sizeof(uint16_t);
7016         if (filter_list->num_elements == 0 ||
7017             filter_list->vsi_id != vf->vsi.vsi_num ||
7018             msg_size != expected_size) {
7019                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7020                     I40E_ERR_PARAM);
7021                 return;
7022         }
7023
7024         if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) {
7025                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7026                     I40E_ERR_PARAM);
7027                 return;
7028         }
7029
7030         for (i = 0; i < filter_list->num_elements; i++) {
7031                 if (filter_list->vlan_id[i] > EVL_VLID_MASK) {
7032                         i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7033                             I40E_ERR_PARAM);
7034                         return;
7035                 }
7036         }
7037
7038         code = ixl_vf_enable_vlan_strip(pf, vf);
7039         if (code != I40E_SUCCESS) {
7040                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7041                     I40E_ERR_PARAM);
7042         }
7043
7044         for (i = 0; i < filter_list->num_elements; i++)
7045                 ixl_add_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]);
7046
7047         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN);
7048 }
7049
7050 static void
7051 ixl_vf_del_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
7052     uint16_t msg_size)
7053 {
7054         struct i40e_virtchnl_vlan_filter_list *filter_list;
7055         int i;
7056         size_t expected_size;
7057
7058         if (msg_size < sizeof(*filter_list)) {
7059                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_DEL_VLAN,
7060                     I40E_ERR_PARAM);
7061                 return;
7062         }
7063
7064         filter_list = msg;
7065         expected_size = sizeof(*filter_list) +
7066             filter_list->num_elements * sizeof(uint16_t);
7067         if (filter_list->num_elements == 0 ||
7068             filter_list->vsi_id != vf->vsi.vsi_num ||
7069             msg_size != expected_size) {
7070                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_DEL_VLAN,
7071                     I40E_ERR_PARAM);
7072                 return;
7073         }
7074
7075         for (i = 0; i < filter_list->num_elements; i++) {
7076                 if (filter_list->vlan_id[i] > EVL_VLID_MASK) {
7077                         i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7078                             I40E_ERR_PARAM);
7079                         return;
7080                 }
7081         }
7082
7083         if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) {
7084                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_ADD_VLAN,
7085                     I40E_ERR_PARAM);
7086                 return;
7087         }
7088
7089         for (i = 0; i < filter_list->num_elements; i++)
7090                 ixl_del_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]);
7091
7092         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_DEL_VLAN);
7093 }
7094
7095 static void
7096 ixl_vf_config_promisc_msg(struct ixl_pf *pf, struct ixl_vf *vf,
7097     void *msg, uint16_t msg_size)
7098 {
7099         struct i40e_virtchnl_promisc_info *info;
7100         enum i40e_status_code code;
7101
7102         if (msg_size != sizeof(*info)) {
7103                 i40e_send_vf_nack(pf, vf,
7104                     I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
7105                 return;
7106         }
7107
7108         if (!(vf->vf_flags & VF_FLAG_PROMISC_CAP)) {
7109                 i40e_send_vf_nack(pf, vf,
7110                     I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
7111                 return;
7112         }
7113
7114         info = msg;
7115         if (info->vsi_id != vf->vsi.vsi_num) {
7116                 i40e_send_vf_nack(pf, vf,
7117                     I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
7118                 return;
7119         }
7120
7121         code = i40e_aq_set_vsi_unicast_promiscuous(&pf->hw, info->vsi_id,
7122             info->flags & I40E_FLAG_VF_UNICAST_PROMISC, NULL);
7123         if (code != I40E_SUCCESS) {
7124                 i40e_send_vf_nack(pf, vf,
7125                     I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, code);
7126                 return;
7127         }
7128
7129         code = i40e_aq_set_vsi_multicast_promiscuous(&pf->hw, info->vsi_id,
7130             info->flags & I40E_FLAG_VF_MULTICAST_PROMISC, NULL);
7131         if (code != I40E_SUCCESS) {
7132                 i40e_send_vf_nack(pf, vf,
7133                     I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, code);
7134                 return;
7135         }
7136
7137         ixl_send_vf_ack(pf, vf, I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE);
7138 }
7139
7140 static void
7141 ixl_vf_get_stats_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
7142     uint16_t msg_size)
7143 {
7144         struct i40e_virtchnl_queue_select *queue;
7145
7146         if (msg_size != sizeof(*queue)) {
7147                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_GET_STATS,
7148                     I40E_ERR_PARAM);
7149                 return;
7150         }
7151
7152         queue = msg;
7153         if (queue->vsi_id != vf->vsi.vsi_num) {
7154                 i40e_send_vf_nack(pf, vf, I40E_VIRTCHNL_OP_GET_STATS,
7155                     I40E_ERR_PARAM);
7156                 return;
7157         }
7158
7159         ixl_update_eth_stats(&vf->vsi);
7160
7161         ixl_send_vf_msg(pf, vf, I40E_VIRTCHNL_OP_GET_STATS,
7162             I40E_SUCCESS, &vf->vsi.eth_stats, sizeof(vf->vsi.eth_stats));
7163 }
7164
7165 static void
7166 ixl_handle_vf_msg(struct ixl_pf *pf, struct i40e_arq_event_info *event)
7167 {
7168         struct ixl_vf *vf;
7169         void *msg;
7170         uint16_t vf_num, msg_size;
7171         uint32_t opcode;
7172
7173         vf_num = le16toh(event->desc.retval) - pf->hw.func_caps.vf_base_id;
7174         opcode = le32toh(event->desc.cookie_high);
7175
7176         if (vf_num >= pf->num_vfs) {
7177                 device_printf(pf->dev, "Got msg from illegal VF: %d\n", vf_num);
7178                 return;
7179         }
7180
7181         vf = &pf->vfs[vf_num];
7182         msg = event->msg_buf;
7183         msg_size = event->msg_len;
7184
7185         I40E_VC_DEBUG(pf, ixl_vc_opcode_level(opcode),
7186             "Got msg %s(%d) from VF-%d of size %d\n",
7187             ixl_vc_opcode_str(opcode), opcode, vf_num, msg_size);
7188
7189         switch (opcode) {
7190         case I40E_VIRTCHNL_OP_VERSION:
7191                 ixl_vf_version_msg(pf, vf, msg, msg_size);
7192                 break;
7193         case I40E_VIRTCHNL_OP_RESET_VF:
7194                 ixl_vf_reset_msg(pf, vf, msg, msg_size);
7195                 break;
7196         case I40E_VIRTCHNL_OP_GET_VF_RESOURCES:
7197                 ixl_vf_get_resources_msg(pf, vf, msg, msg_size);
7198                 break;
7199         case I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES:
7200                 ixl_vf_config_vsi_msg(pf, vf, msg, msg_size);
7201                 break;
7202         case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP:
7203                 ixl_vf_config_irq_msg(pf, vf, msg, msg_size);
7204                 break;
7205         case I40E_VIRTCHNL_OP_ENABLE_QUEUES:
7206                 ixl_vf_enable_queues_msg(pf, vf, msg, msg_size);
7207                 break;
7208         case I40E_VIRTCHNL_OP_DISABLE_QUEUES:
7209                 ixl_vf_disable_queues_msg(pf, vf, msg, msg_size);
7210                 break;
7211         case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
7212                 ixl_vf_add_mac_msg(pf, vf, msg, msg_size);
7213                 break;
7214         case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
7215                 ixl_vf_del_mac_msg(pf, vf, msg, msg_size);
7216                 break;
7217         case I40E_VIRTCHNL_OP_ADD_VLAN:
7218                 ixl_vf_add_vlan_msg(pf, vf, msg, msg_size);
7219                 break;
7220         case I40E_VIRTCHNL_OP_DEL_VLAN:
7221                 ixl_vf_del_vlan_msg(pf, vf, msg, msg_size);
7222                 break;
7223         case I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
7224                 ixl_vf_config_promisc_msg(pf, vf, msg, msg_size);
7225                 break;
7226         case I40E_VIRTCHNL_OP_GET_STATS:
7227                 ixl_vf_get_stats_msg(pf, vf, msg, msg_size);
7228                 break;
7229
7230         /* These two opcodes have been superseded by CONFIG_VSI_QUEUES. */
7231         case I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE:
7232         case I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE:
7233         default:
7234                 i40e_send_vf_nack(pf, vf, opcode, I40E_ERR_NOT_IMPLEMENTED);
7235                 break;
7236         }
7237 }
7238
7239 /* Handle any VFs that have reset themselves via a Function Level Reset(FLR). */
7240 static void
7241 ixl_handle_vflr(void *arg, int pending)
7242 {
7243         struct ixl_pf *pf;
7244         struct i40e_hw *hw;
7245         uint16_t global_vf_num;
7246         uint32_t vflrstat_index, vflrstat_mask, vflrstat, icr0;
7247         int i;
7248
7249         pf = arg;
7250         hw = &pf->hw;
7251
7252         IXL_PF_LOCK(pf);
7253         for (i = 0; i < pf->num_vfs; i++) {
7254                 global_vf_num = hw->func_caps.vf_base_id + i;
7255
7256                 vflrstat_index = IXL_GLGEN_VFLRSTAT_INDEX(global_vf_num);
7257                 vflrstat_mask = IXL_GLGEN_VFLRSTAT_MASK(global_vf_num);
7258                 vflrstat = rd32(hw, I40E_GLGEN_VFLRSTAT(vflrstat_index));
7259                 if (vflrstat & vflrstat_mask) {
7260                         wr32(hw, I40E_GLGEN_VFLRSTAT(vflrstat_index),
7261                             vflrstat_mask);
7262
7263                         ixl_reinit_vf(pf, &pf->vfs[i]);
7264                 }
7265         }
7266
7267         icr0 = rd32(hw, I40E_PFINT_ICR0_ENA);
7268         icr0 |= I40E_PFINT_ICR0_ENA_VFLR_MASK;
7269         wr32(hw, I40E_PFINT_ICR0_ENA, icr0);
7270         ixl_flush(hw);
7271
7272         IXL_PF_UNLOCK(pf);
7273 }
7274
7275 static int
7276 ixl_adminq_err_to_errno(enum i40e_admin_queue_err err)
7277 {
7278
7279         switch (err) {
7280         case I40E_AQ_RC_EPERM:
7281                 return (EPERM);
7282         case I40E_AQ_RC_ENOENT:
7283                 return (ENOENT);
7284         case I40E_AQ_RC_ESRCH:
7285                 return (ESRCH);
7286         case I40E_AQ_RC_EINTR:
7287                 return (EINTR);
7288         case I40E_AQ_RC_EIO:
7289                 return (EIO);
7290         case I40E_AQ_RC_ENXIO:
7291                 return (ENXIO);
7292         case I40E_AQ_RC_E2BIG:
7293                 return (E2BIG);
7294         case I40E_AQ_RC_EAGAIN:
7295                 return (EAGAIN);
7296         case I40E_AQ_RC_ENOMEM:
7297                 return (ENOMEM);
7298         case I40E_AQ_RC_EACCES:
7299                 return (EACCES);
7300         case I40E_AQ_RC_EFAULT:
7301                 return (EFAULT);
7302         case I40E_AQ_RC_EBUSY:
7303                 return (EBUSY);
7304         case I40E_AQ_RC_EEXIST:
7305                 return (EEXIST);
7306         case I40E_AQ_RC_EINVAL:
7307                 return (EINVAL);
7308         case I40E_AQ_RC_ENOTTY:
7309                 return (ENOTTY);
7310         case I40E_AQ_RC_ENOSPC:
7311                 return (ENOSPC);
7312         case I40E_AQ_RC_ENOSYS:
7313                 return (ENOSYS);
7314         case I40E_AQ_RC_ERANGE:
7315                 return (ERANGE);
7316         case I40E_AQ_RC_EFLUSHED:
7317                 return (EINVAL);        /* No exact equivalent in errno.h */
7318         case I40E_AQ_RC_BAD_ADDR:
7319                 return (EFAULT);
7320         case I40E_AQ_RC_EMODE:
7321                 return (EPERM);
7322         case I40E_AQ_RC_EFBIG:
7323                 return (EFBIG);
7324         default:
7325                 return (EINVAL);
7326         }
7327 }
7328
7329 static int
7330 ixl_iov_init(device_t dev, uint16_t num_vfs, const nvlist_t *params)
7331 {
7332         struct ixl_pf *pf;
7333         struct i40e_hw *hw;
7334         struct ixl_vsi *pf_vsi;
7335         enum i40e_status_code ret;
7336         int i, error;
7337
7338         pf = device_get_softc(dev);
7339         hw = &pf->hw;
7340         pf_vsi = &pf->vsi;
7341
7342         IXL_PF_LOCK(pf);
7343         pf->vfs = malloc(sizeof(struct ixl_vf) * num_vfs, M_IXL, M_NOWAIT |
7344             M_ZERO);
7345
7346         if (pf->vfs == NULL) {
7347                 error = ENOMEM;
7348                 goto fail;
7349         }
7350
7351         for (i = 0; i < num_vfs; i++)
7352                 sysctl_ctx_init(&pf->vfs[i].ctx);
7353
7354         ret = i40e_aq_add_veb(hw, pf_vsi->uplink_seid, pf_vsi->seid,
7355             1, FALSE, &pf->veb_seid, FALSE, NULL);
7356         if (ret != I40E_SUCCESS) {
7357                 error = ixl_adminq_err_to_errno(hw->aq.asq_last_status);
7358                 device_printf(dev, "add_veb failed; code=%d error=%d", ret,
7359                     error);
7360                 goto fail;
7361         }
7362
7363         // TODO: [Configure MSI-X here]
7364         ixl_enable_adminq(hw);
7365
7366         pf->num_vfs = num_vfs;
7367         IXL_PF_UNLOCK(pf);
7368         return (0);
7369
7370 fail:
7371         free(pf->vfs, M_IXL);
7372         pf->vfs = NULL;
7373         IXL_PF_UNLOCK(pf);
7374         return (error);
7375 }
7376
7377 static void
7378 ixl_iov_uninit(device_t dev)
7379 {
7380         struct ixl_pf *pf;
7381         struct i40e_hw *hw;
7382         struct ixl_vsi *vsi;
7383         struct ifnet *ifp;
7384         struct ixl_vf *vfs;
7385         int i, num_vfs;
7386
7387         pf = device_get_softc(dev);
7388         hw = &pf->hw;
7389         vsi = &pf->vsi;
7390         ifp = vsi->ifp;
7391
7392         IXL_PF_LOCK(pf);
7393         for (i = 0; i < pf->num_vfs; i++) {
7394                 if (pf->vfs[i].vsi.seid != 0)
7395                         i40e_aq_delete_element(hw, pf->vfs[i].vsi.seid, NULL);
7396         }
7397
7398         if (pf->veb_seid != 0) {
7399                 i40e_aq_delete_element(hw, pf->veb_seid, NULL);
7400                 pf->veb_seid = 0;
7401         }
7402
7403         if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
7404                 ixl_disable_intr(vsi);
7405
7406         vfs = pf->vfs;
7407         num_vfs = pf->num_vfs;
7408
7409         pf->vfs = NULL;
7410         pf->num_vfs = 0;
7411         IXL_PF_UNLOCK(pf);
7412
7413         /* Do this after the unlock as sysctl_ctx_free might sleep. */
7414         for (i = 0; i < num_vfs; i++)
7415                 sysctl_ctx_free(&vfs[i].ctx);
7416         free(vfs, M_IXL);
7417 }
7418
7419 static int
7420 ixl_add_vf(device_t dev, uint16_t vfnum, const nvlist_t *params)
7421 {
7422         char sysctl_name[QUEUE_NAME_LEN];
7423         struct ixl_pf *pf;
7424         struct ixl_vf *vf;
7425         const void *mac;
7426         size_t size;
7427         int error;
7428
7429         pf = device_get_softc(dev);
7430         vf = &pf->vfs[vfnum];
7431
7432         IXL_PF_LOCK(pf);
7433         vf->vf_num = vfnum;
7434
7435         vf->vsi.back = pf;
7436         vf->vf_flags = VF_FLAG_ENABLED;
7437         SLIST_INIT(&vf->vsi.ftl);
7438
7439         error = ixl_vf_setup_vsi(pf, vf);
7440         if (error != 0)
7441                 goto out;
7442
7443         if (nvlist_exists_binary(params, "mac-addr")) {
7444                 mac = nvlist_get_binary(params, "mac-addr", &size);
7445                 bcopy(mac, vf->mac, ETHER_ADDR_LEN);
7446
7447                 if (nvlist_get_bool(params, "allow-set-mac"))
7448                         vf->vf_flags |= VF_FLAG_SET_MAC_CAP;
7449         } else
7450                 /*
7451                  * If the administrator has not specified a MAC address then
7452                  * we must allow the VF to choose one.
7453                  */
7454                 vf->vf_flags |= VF_FLAG_SET_MAC_CAP;
7455
7456         if (nvlist_get_bool(params, "mac-anti-spoof"))
7457                 vf->vf_flags |= VF_FLAG_MAC_ANTI_SPOOF;
7458
7459         if (nvlist_get_bool(params, "allow-promisc"))
7460                 vf->vf_flags |= VF_FLAG_PROMISC_CAP;
7461
7462         /* TODO: Get VLAN that PF has set for the VF */
7463
7464         vf->vf_flags |= VF_FLAG_VLAN_CAP;
7465
7466         ixl_reset_vf(pf, vf);
7467 out:
7468         IXL_PF_UNLOCK(pf);
7469         if (error == 0) {
7470                 snprintf(sysctl_name, sizeof(sysctl_name), "vf%d", vfnum);
7471                 ixl_add_vsi_sysctls(pf, &vf->vsi, &vf->ctx, sysctl_name);
7472         }
7473
7474         return (error);
7475 }
7476 #endif /* PCI_IOV */