]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixgbe/if_ix.c
ntb: Revert r290130 now that r290156 has landed
[FreeBSD/FreeBSD.git] / sys / dev / ixgbe / if_ix.c
1 /******************************************************************************
2
3   Copyright (c) 2001-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
36 #ifndef IXGBE_STANDALONE_BUILD
37 #include "opt_inet.h"
38 #include "opt_inet6.h"
39 #include "opt_rss.h"
40 #endif
41
42 #include "ixgbe.h"
43
44 #ifdef  RSS
45 #include <net/rss_config.h>
46 #include <netinet/in_rss.h>
47 #endif
48
49 /*********************************************************************
50  *  Set this to one to display debug statistics
51  *********************************************************************/
52 int             ixgbe_display_debug_stats = 0;
53
54 /*********************************************************************
55  *  Driver version
56  *********************************************************************/
57 char ixgbe_driver_version[] = "3.1.0";
58
59 /*********************************************************************
60  *  PCI Device ID Table
61  *
62  *  Used by probe to select devices to load on
63  *  Last field stores an index into ixgbe_strings
64  *  Last entry must be all 0s
65  *
66  *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
67  *********************************************************************/
68
69 static ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
70 {
71         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
72         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
73         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
74         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
75         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
76         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
77         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
78         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
79         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
80         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
81         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
82         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
83         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
84         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
85         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
86         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
87         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
88         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
89         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
90         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0},
91         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
92         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0},
93         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF_QP, 0, 0, 0},
94         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_QSFP_SF_QP, 0, 0, 0},
95         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0},
96         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1, 0, 0, 0},
97         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T, 0, 0, 0},
98         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KR, 0, 0, 0},
99         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KX4, 0, 0, 0},
100         {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_10G_T, 0, 0, 0},
101         /* required last entry */
102         {0, 0, 0, 0, 0}
103 };
104
105 /*********************************************************************
106  *  Table of branding strings
107  *********************************************************************/
108
109 static char    *ixgbe_strings[] = {
110         "Intel(R) PRO/10GbE PCI-Express Network Driver"
111 };
112
113 /*********************************************************************
114  *  Function prototypes
115  *********************************************************************/
116 static int      ixgbe_probe(device_t);
117 static int      ixgbe_attach(device_t);
118 static int      ixgbe_detach(device_t);
119 static int      ixgbe_shutdown(device_t);
120 static int      ixgbe_suspend(device_t);
121 static int      ixgbe_resume(device_t);
122 static int      ixgbe_ioctl(struct ifnet *, u_long, caddr_t);
123 static void     ixgbe_init(void *);
124 static void     ixgbe_init_locked(struct adapter *);
125 static void     ixgbe_stop(void *);
126 #if __FreeBSD_version >= 1100036
127 static uint64_t ixgbe_get_counter(struct ifnet *, ift_counter);
128 #endif
129 static void     ixgbe_add_media_types(struct adapter *);
130 static void     ixgbe_media_status(struct ifnet *, struct ifmediareq *);
131 static int      ixgbe_media_change(struct ifnet *);
132 static void     ixgbe_identify_hardware(struct adapter *);
133 static int      ixgbe_allocate_pci_resources(struct adapter *);
134 static void     ixgbe_get_slot_info(struct ixgbe_hw *);
135 static int      ixgbe_allocate_msix(struct adapter *);
136 static int      ixgbe_allocate_legacy(struct adapter *);
137 static int      ixgbe_setup_msix(struct adapter *);
138 static void     ixgbe_free_pci_resources(struct adapter *);
139 static void     ixgbe_local_timer(void *);
140 static int      ixgbe_setup_interface(device_t, struct adapter *);
141 static void     ixgbe_config_gpie(struct adapter *);
142 static void     ixgbe_config_dmac(struct adapter *);
143 static void     ixgbe_config_delay_values(struct adapter *);
144 static void     ixgbe_config_link(struct adapter *);
145 static void     ixgbe_check_eee_support(struct adapter *);
146 static void     ixgbe_check_wol_support(struct adapter *);
147 static int      ixgbe_setup_low_power_mode(struct adapter *);
148 static void     ixgbe_rearm_queues(struct adapter *, u64);
149
150 static void     ixgbe_initialize_transmit_units(struct adapter *);
151 static void     ixgbe_initialize_receive_units(struct adapter *);
152 static void     ixgbe_enable_rx_drop(struct adapter *);
153 static void     ixgbe_disable_rx_drop(struct adapter *);
154
155 static void     ixgbe_enable_intr(struct adapter *);
156 static void     ixgbe_disable_intr(struct adapter *);
157 static void     ixgbe_update_stats_counters(struct adapter *);
158 static void     ixgbe_set_promisc(struct adapter *);
159 static void     ixgbe_set_multi(struct adapter *);
160 static void     ixgbe_update_link_status(struct adapter *);
161 static void     ixgbe_set_ivar(struct adapter *, u8, u8, s8);
162 static void     ixgbe_configure_ivars(struct adapter *);
163 static u8 *     ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
164
165 static void     ixgbe_setup_vlan_hw_support(struct adapter *);
166 static void     ixgbe_register_vlan(void *, struct ifnet *, u16);
167 static void     ixgbe_unregister_vlan(void *, struct ifnet *, u16);
168
169 static void     ixgbe_add_device_sysctls(struct adapter *);
170 static void     ixgbe_add_hw_stats(struct adapter *);
171
172 /* Sysctl handlers */
173 static void     ixgbe_set_sysctl_value(struct adapter *, const char *,
174                     const char *, int *, int);
175 static int      ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
176 static int      ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
177 static int      ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
178 static int      ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
179 static int      ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
180 static int      ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
181 static int      ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
182 static int      ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
183 static int      ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS);
184 static int      ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS);
185 static int      ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS);
186 static int      ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS);
187
188 /* Support for pluggable optic modules */
189 static bool     ixgbe_sfp_probe(struct adapter *);
190 static void     ixgbe_setup_optics(struct adapter *);
191
192 /* Legacy (single vector interrupt handler */
193 static void     ixgbe_legacy_irq(void *);
194
195 /* The MSI/X Interrupt handlers */
196 static void     ixgbe_msix_que(void *);
197 static void     ixgbe_msix_link(void *);
198
199 /* Deferred interrupt tasklets */
200 static void     ixgbe_handle_que(void *, int);
201 static void     ixgbe_handle_link(void *, int);
202 static void     ixgbe_handle_msf(void *, int);
203 static void     ixgbe_handle_mod(void *, int);
204 static void     ixgbe_handle_phy(void *, int);
205
206 #ifdef IXGBE_FDIR
207 static void     ixgbe_reinit_fdir(void *, int);
208 #endif
209
210 #ifdef PCI_IOV
211 static void     ixgbe_ping_all_vfs(struct adapter *);
212 static void     ixgbe_handle_mbx(void *, int);
213 static int      ixgbe_init_iov(device_t, u16, const nvlist_t *);
214 static void     ixgbe_uninit_iov(device_t);
215 static int      ixgbe_add_vf(device_t, u16, const nvlist_t *);
216 static void     ixgbe_initialize_iov(struct adapter *);
217 static void     ixgbe_recalculate_max_frame(struct adapter *);
218 static void     ixgbe_init_vf(struct adapter *, struct ixgbe_vf *);
219 #endif /* PCI_IOV */
220
221
222 /*********************************************************************
223  *  FreeBSD Device Interface Entry Points
224  *********************************************************************/
225
226 static device_method_t ix_methods[] = {
227         /* Device interface */
228         DEVMETHOD(device_probe, ixgbe_probe),
229         DEVMETHOD(device_attach, ixgbe_attach),
230         DEVMETHOD(device_detach, ixgbe_detach),
231         DEVMETHOD(device_shutdown, ixgbe_shutdown),
232         DEVMETHOD(device_suspend, ixgbe_suspend),
233         DEVMETHOD(device_resume, ixgbe_resume),
234 #ifdef PCI_IOV
235         DEVMETHOD(pci_iov_init, ixgbe_init_iov),
236         DEVMETHOD(pci_iov_uninit, ixgbe_uninit_iov),
237         DEVMETHOD(pci_iov_add_vf, ixgbe_add_vf),
238 #endif /* PCI_IOV */
239         DEVMETHOD_END
240 };
241
242 static driver_t ix_driver = {
243         "ix", ix_methods, sizeof(struct adapter),
244 };
245
246 devclass_t ix_devclass;
247 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
248
249 MODULE_DEPEND(ix, pci, 1, 1, 1);
250 MODULE_DEPEND(ix, ether, 1, 1, 1);
251 #ifdef DEV_NETMAP
252 MODULE_DEPEND(ix, netmap, 1, 1, 1);
253 #endif /* DEV_NETMAP */
254
255 /*
256 ** TUNEABLE PARAMETERS:
257 */
258
259 static SYSCTL_NODE(_hw, OID_AUTO, ix, CTLFLAG_RD, 0,
260                    "IXGBE driver parameters");
261
262 /*
263 ** AIM: Adaptive Interrupt Moderation
264 ** which means that the interrupt rate
265 ** is varied over time based on the
266 ** traffic for that interrupt vector
267 */
268 static int ixgbe_enable_aim = TRUE;
269 SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RWTUN, &ixgbe_enable_aim, 0,
270     "Enable adaptive interrupt moderation");
271
272 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
273 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
274     &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
275
276 /* How many packets rxeof tries to clean at a time */
277 static int ixgbe_rx_process_limit = 256;
278 SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
279     &ixgbe_rx_process_limit, 0,
280     "Maximum number of received packets to process at a time,"
281     "-1 means unlimited");
282
283 /* How many packets txeof tries to clean at a time */
284 static int ixgbe_tx_process_limit = 256;
285 SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
286     &ixgbe_tx_process_limit, 0,
287     "Maximum number of sent packets to process at a time,"
288     "-1 means unlimited");
289
290 /*
291 ** Smart speed setting, default to on
292 ** this only works as a compile option
293 ** right now as its during attach, set
294 ** this to 'ixgbe_smart_speed_off' to
295 ** disable.
296 */
297 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
298
299 /*
300  * MSIX should be the default for best performance,
301  * but this allows it to be forced off for testing.
302  */
303 static int ixgbe_enable_msix = 1;
304 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
305     "Enable MSI-X interrupts");
306
307 /*
308  * Number of Queues, can be set to 0,
309  * it then autoconfigures based on the
310  * number of cpus with a max of 8. This
311  * can be overriden manually here.
312  */
313 static int ixgbe_num_queues = 0;
314 SYSCTL_INT(_hw_ix, OID_AUTO, num_queues, CTLFLAG_RDTUN, &ixgbe_num_queues, 0,
315     "Number of queues to configure, 0 indicates autoconfigure");
316
317 /*
318 ** Number of TX descriptors per ring,
319 ** setting higher than RX as this seems
320 ** the better performing choice.
321 */
322 static int ixgbe_txd = PERFORM_TXD;
323 SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
324     "Number of transmit descriptors per queue");
325
326 /* Number of RX descriptors per ring */
327 static int ixgbe_rxd = PERFORM_RXD;
328 SYSCTL_INT(_hw_ix, OID_AUTO, rxd, CTLFLAG_RDTUN, &ixgbe_rxd, 0,
329     "Number of receive descriptors per queue");
330
331 /*
332 ** Defining this on will allow the use
333 ** of unsupported SFP+ modules, note that
334 ** doing so you are on your own :)
335 */
336 static int allow_unsupported_sfp = FALSE;
337 TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
338
339 /* Keep running tab on them for sanity check */
340 static int ixgbe_total_ports;
341
342 #ifdef IXGBE_FDIR
343 /* 
344 ** Flow Director actually 'steals'
345 ** part of the packet buffer as its
346 ** filter pool, this variable controls
347 ** how much it uses:
348 **  0 = 64K, 1 = 128K, 2 = 256K
349 */
350 static int fdir_pballoc = 1;
351 #endif
352
353 #ifdef DEV_NETMAP
354 /*
355  * The #ifdef DEV_NETMAP / #endif blocks in this file are meant to
356  * be a reference on how to implement netmap support in a driver.
357  * Additional comments are in ixgbe_netmap.h .
358  *
359  * <dev/netmap/ixgbe_netmap.h> contains functions for netmap support
360  * that extend the standard driver.
361  */
362 #include <dev/netmap/ixgbe_netmap.h>
363 #endif /* DEV_NETMAP */
364
365 static MALLOC_DEFINE(M_IXGBE, "ix", "ix driver allocations");
366
367 /*********************************************************************
368  *  Device identification routine
369  *
370  *  ixgbe_probe determines if the driver should be loaded on
371  *  adapter based on PCI vendor/device id of the adapter.
372  *
373  *  return BUS_PROBE_DEFAULT on success, positive on failure
374  *********************************************************************/
375
376 static int
377 ixgbe_probe(device_t dev)
378 {
379         ixgbe_vendor_info_t *ent;
380
381         u16     pci_vendor_id = 0;
382         u16     pci_device_id = 0;
383         u16     pci_subvendor_id = 0;
384         u16     pci_subdevice_id = 0;
385         char    adapter_name[256];
386
387         INIT_DEBUGOUT("ixgbe_probe: begin");
388
389         pci_vendor_id = pci_get_vendor(dev);
390         if (pci_vendor_id != IXGBE_INTEL_VENDOR_ID)
391                 return (ENXIO);
392
393         pci_device_id = pci_get_device(dev);
394         pci_subvendor_id = pci_get_subvendor(dev);
395         pci_subdevice_id = pci_get_subdevice(dev);
396
397         ent = ixgbe_vendor_info_array;
398         while (ent->vendor_id != 0) {
399                 if ((pci_vendor_id == ent->vendor_id) &&
400                     (pci_device_id == ent->device_id) &&
401
402                     ((pci_subvendor_id == ent->subvendor_id) ||
403                      (ent->subvendor_id == 0)) &&
404
405                     ((pci_subdevice_id == ent->subdevice_id) ||
406                      (ent->subdevice_id == 0))) {
407                         sprintf(adapter_name, "%s, Version - %s",
408                                 ixgbe_strings[ent->index],
409                                 ixgbe_driver_version);
410                         device_set_desc_copy(dev, adapter_name);
411                         ++ixgbe_total_ports;
412                         return (BUS_PROBE_DEFAULT);
413                 }
414                 ent++;
415         }
416         return (ENXIO);
417 }
418
419 /*********************************************************************
420  *  Device initialization routine
421  *
422  *  The attach entry point is called when the driver is being loaded.
423  *  This routine identifies the type of hardware, allocates all resources
424  *  and initializes the hardware.
425  *
426  *  return 0 on success, positive on failure
427  *********************************************************************/
428
429 static int
430 ixgbe_attach(device_t dev)
431 {
432         struct adapter *adapter;
433         struct ixgbe_hw *hw;
434         int             error = 0;
435         u16             csum;
436         u32             ctrl_ext;
437
438         INIT_DEBUGOUT("ixgbe_attach: begin");
439
440         /* Allocate, clear, and link in our adapter structure */
441         adapter = device_get_softc(dev);
442         adapter->dev = adapter->osdep.dev = dev;
443         hw = &adapter->hw;
444
445 #ifdef DEV_NETMAP
446         adapter->init_locked = ixgbe_init_locked;
447         adapter->stop_locked = ixgbe_stop;
448 #endif
449
450         /* Core Lock Init*/
451         IXGBE_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
452
453         /* Set up the timer callout */
454         callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
455
456         /* Determine hardware revision */
457         ixgbe_identify_hardware(adapter);
458
459         /* Do base PCI setup - map BAR0 */
460         if (ixgbe_allocate_pci_resources(adapter)) {
461                 device_printf(dev, "Allocation of PCI resources failed\n");
462                 error = ENXIO;
463                 goto err_out;
464         }
465
466         /* Sysctls for limiting the amount of work done in the taskqueues */
467         ixgbe_set_sysctl_value(adapter, "rx_processing_limit",
468             "max number of rx packets to process",
469             &adapter->rx_process_limit, ixgbe_rx_process_limit);
470
471         ixgbe_set_sysctl_value(adapter, "tx_processing_limit",
472             "max number of tx packets to process",
473         &adapter->tx_process_limit, ixgbe_tx_process_limit);
474
475         /* Do descriptor calc and sanity checks */
476         if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
477             ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
478                 device_printf(dev, "TXD config issue, using default!\n");
479                 adapter->num_tx_desc = DEFAULT_TXD;
480         } else
481                 adapter->num_tx_desc = ixgbe_txd;
482
483         /*
484         ** With many RX rings it is easy to exceed the
485         ** system mbuf allocation. Tuning nmbclusters
486         ** can alleviate this.
487         */
488         if (nmbclusters > 0) {
489                 int s;
490                 s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
491                 if (s > nmbclusters) {
492                         device_printf(dev, "RX Descriptors exceed "
493                             "system mbuf max, using default instead!\n");
494                         ixgbe_rxd = DEFAULT_RXD;
495                 }
496         }
497
498         if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
499             ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
500                 device_printf(dev, "RXD config issue, using default!\n");
501                 adapter->num_rx_desc = DEFAULT_RXD;
502         } else
503                 adapter->num_rx_desc = ixgbe_rxd;
504
505         /* Allocate our TX/RX Queues */
506         if (ixgbe_allocate_queues(adapter)) {
507                 error = ENOMEM;
508                 goto err_out;
509         }
510
511         /* Allocate multicast array memory. */
512         adapter->mta = malloc(sizeof(*adapter->mta) *
513             MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
514         if (adapter->mta == NULL) {
515                 device_printf(dev, "Can not allocate multicast setup array\n");
516                 error = ENOMEM;
517                 goto err_late;
518         }
519
520         /* Initialize the shared code */
521         hw->allow_unsupported_sfp = allow_unsupported_sfp;
522         error = ixgbe_init_shared_code(hw);
523         if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
524                 /*
525                 ** No optics in this port, set up
526                 ** so the timer routine will probe 
527                 ** for later insertion.
528                 */
529                 adapter->sfp_probe = TRUE;
530                 error = 0;
531         } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
532                 device_printf(dev,"Unsupported SFP+ module detected!\n");
533                 error = EIO;
534                 goto err_late;
535         } else if (error) {
536                 device_printf(dev,"Unable to initialize the shared code\n");
537                 error = EIO;
538                 goto err_late;
539         }
540
541         /* Make sure we have a good EEPROM before we read from it */
542         if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) {
543                 device_printf(dev,"The EEPROM Checksum Is Not Valid\n");
544                 error = EIO;
545                 goto err_late;
546         }
547
548         error = ixgbe_init_hw(hw);
549         switch (error) {
550         case IXGBE_ERR_EEPROM_VERSION:
551                 device_printf(dev, "This device is a pre-production adapter/"
552                     "LOM.  Please be aware there may be issues associated "
553                     "with your hardware.\n If you are experiencing problems "
554                     "please contact your Intel or hardware representative "
555                     "who provided you with this hardware.\n");
556                 break;
557         case IXGBE_ERR_SFP_NOT_SUPPORTED:
558                 device_printf(dev,"Unsupported SFP+ Module\n");
559                 error = EIO;
560                 goto err_late;
561         case IXGBE_ERR_SFP_NOT_PRESENT:
562                 device_printf(dev,"No SFP+ Module found\n");
563                 /* falls thru */
564         default:
565                 break;
566         }
567
568         /* Detect and set physical type */
569         ixgbe_setup_optics(adapter);
570
571         if ((adapter->msix > 1) && (ixgbe_enable_msix))
572                 error = ixgbe_allocate_msix(adapter); 
573         else
574                 error = ixgbe_allocate_legacy(adapter); 
575         if (error) 
576                 goto err_late;
577
578         /* Setup OS specific network interface */
579         if (ixgbe_setup_interface(dev, adapter) != 0)
580                 goto err_late;
581
582         /* Initialize statistics */
583         ixgbe_update_stats_counters(adapter);
584
585         /* Register for VLAN events */
586         adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
587             ixgbe_register_vlan, adapter, EVENTHANDLER_PRI_FIRST);
588         adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
589             ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
590
591         /* Check PCIE slot type/speed/width */
592         ixgbe_get_slot_info(hw);
593
594
595         /* Set an initial default flow control value */
596         adapter->fc = ixgbe_fc_full;
597
598 #ifdef PCI_IOV
599         if ((hw->mac.type != ixgbe_mac_82598EB) && (adapter->msix > 1)) {
600                 nvlist_t *pf_schema, *vf_schema;
601
602                 hw->mbx.ops.init_params(hw);
603                 pf_schema = pci_iov_schema_alloc_node();
604                 vf_schema = pci_iov_schema_alloc_node();
605                 pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
606                 pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
607                     IOV_SCHEMA_HASDEFAULT, TRUE);
608                 pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
609                     IOV_SCHEMA_HASDEFAULT, FALSE);
610                 pci_iov_schema_add_bool(vf_schema, "allow-promisc",
611                     IOV_SCHEMA_HASDEFAULT, FALSE);
612                 error = pci_iov_attach(dev, pf_schema, vf_schema);
613                 if (error != 0) {
614                         device_printf(dev,
615                             "Error %d setting up SR-IOV\n", error);
616                 }
617         }
618 #endif /* PCI_IOV */
619
620         /* Check for certain supported features */
621         ixgbe_check_wol_support(adapter);
622         ixgbe_check_eee_support(adapter);
623
624         /* Add sysctls */
625         ixgbe_add_device_sysctls(adapter);
626         ixgbe_add_hw_stats(adapter);
627
628         /* let hardware know driver is loaded */
629         ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
630         ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
631         IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
632
633 #ifdef DEV_NETMAP
634         ixgbe_netmap_attach(adapter);
635 #endif /* DEV_NETMAP */
636         INIT_DEBUGOUT("ixgbe_attach: end");
637         return (0);
638
639 err_late:
640         ixgbe_free_transmit_structures(adapter);
641         ixgbe_free_receive_structures(adapter);
642 err_out:
643         if (adapter->ifp != NULL)
644                 if_free(adapter->ifp);
645         ixgbe_free_pci_resources(adapter);
646         free(adapter->mta, M_DEVBUF);
647         return (error);
648 }
649
650 /*********************************************************************
651  *  Device removal routine
652  *
653  *  The detach entry point is called when the driver is being removed.
654  *  This routine stops the adapter and deallocates all the resources
655  *  that were allocated for driver operation.
656  *
657  *  return 0 on success, positive on failure
658  *********************************************************************/
659
660 static int
661 ixgbe_detach(device_t dev)
662 {
663         struct adapter *adapter = device_get_softc(dev);
664         struct ix_queue *que = adapter->queues;
665         struct tx_ring *txr = adapter->tx_rings;
666         u32     ctrl_ext;
667
668         INIT_DEBUGOUT("ixgbe_detach: begin");
669
670         /* Make sure VLANS are not using driver */
671         if (adapter->ifp->if_vlantrunk != NULL) {
672                 device_printf(dev,"Vlan in use, detach first\n");
673                 return (EBUSY);
674         }
675
676 #ifdef PCI_IOV
677         if (pci_iov_detach(dev) != 0) {
678                 device_printf(dev, "SR-IOV in use; detach first.\n");
679                 return (EBUSY);
680         }
681 #endif /* PCI_IOV */
682
683         /* Stop the adapter */
684         IXGBE_CORE_LOCK(adapter);
685         ixgbe_setup_low_power_mode(adapter);
686         IXGBE_CORE_UNLOCK(adapter);
687
688         for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
689                 if (que->tq) {
690 #ifndef IXGBE_LEGACY_TX
691                         taskqueue_drain(que->tq, &txr->txq_task);
692 #endif
693                         taskqueue_drain(que->tq, &que->que_task);
694                         taskqueue_free(que->tq);
695                 }
696         }
697
698         /* Drain the Link queue */
699         if (adapter->tq) {
700                 taskqueue_drain(adapter->tq, &adapter->link_task);
701                 taskqueue_drain(adapter->tq, &adapter->mod_task);
702                 taskqueue_drain(adapter->tq, &adapter->msf_task);
703 #ifdef PCI_IOV
704                 taskqueue_drain(adapter->tq, &adapter->mbx_task);
705 #endif
706                 taskqueue_drain(adapter->tq, &adapter->phy_task);
707 #ifdef IXGBE_FDIR
708                 taskqueue_drain(adapter->tq, &adapter->fdir_task);
709 #endif
710                 taskqueue_free(adapter->tq);
711         }
712
713         /* let hardware know driver is unloading */
714         ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
715         ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
716         IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
717
718         /* Unregister VLAN events */
719         if (adapter->vlan_attach != NULL)
720                 EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach);
721         if (adapter->vlan_detach != NULL)
722                 EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
723
724         ether_ifdetach(adapter->ifp);
725         callout_drain(&adapter->timer);
726 #ifdef DEV_NETMAP
727         netmap_detach(adapter->ifp);
728 #endif /* DEV_NETMAP */
729         ixgbe_free_pci_resources(adapter);
730         bus_generic_detach(dev);
731         if_free(adapter->ifp);
732
733         ixgbe_free_transmit_structures(adapter);
734         ixgbe_free_receive_structures(adapter);
735         free(adapter->mta, M_DEVBUF);
736
737         IXGBE_CORE_LOCK_DESTROY(adapter);
738         return (0);
739 }
740
741 /*********************************************************************
742  *
743  *  Shutdown entry point
744  *
745  **********************************************************************/
746
747 static int
748 ixgbe_shutdown(device_t dev)
749 {
750         struct adapter *adapter = device_get_softc(dev);
751         int error = 0;
752
753         INIT_DEBUGOUT("ixgbe_shutdown: begin");
754
755         IXGBE_CORE_LOCK(adapter);
756         error = ixgbe_setup_low_power_mode(adapter);
757         IXGBE_CORE_UNLOCK(adapter);
758
759         return (error);
760 }
761
762 /**
763  * Methods for going from:
764  * D0 -> D3: ixgbe_suspend
765  * D3 -> D0: ixgbe_resume
766  */
767 static int
768 ixgbe_suspend(device_t dev)
769 {
770         struct adapter *adapter = device_get_softc(dev);
771         int error = 0;
772
773         INIT_DEBUGOUT("ixgbe_suspend: begin");
774
775         IXGBE_CORE_LOCK(adapter);
776
777         error = ixgbe_setup_low_power_mode(adapter);
778
779         /* Save state and power down */
780         pci_save_state(dev);
781         pci_set_powerstate(dev, PCI_POWERSTATE_D3);
782
783         IXGBE_CORE_UNLOCK(adapter);
784
785         return (error);
786 }
787
788 static int
789 ixgbe_resume(device_t dev)
790 {
791         struct adapter *adapter = device_get_softc(dev);
792         struct ifnet *ifp = adapter->ifp;
793         struct ixgbe_hw *hw = &adapter->hw;
794         u32 wus;
795
796         INIT_DEBUGOUT("ixgbe_resume: begin");
797
798         IXGBE_CORE_LOCK(adapter);
799
800         pci_set_powerstate(dev, PCI_POWERSTATE_D0);
801         pci_restore_state(dev);
802
803         /* Read & clear WUS register */
804         wus = IXGBE_READ_REG(hw, IXGBE_WUS);
805         if (wus)
806                 device_printf(dev, "Woken up by (WUS): %#010x\n",
807                     IXGBE_READ_REG(hw, IXGBE_WUS));
808         IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
809         /* And clear WUFC until next low-power transition */
810         IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
811
812         /*
813          * Required after D3->D0 transition;
814          * will re-advertise all previous advertised speeds
815          */
816         if (ifp->if_flags & IFF_UP)
817                 ixgbe_init_locked(adapter);
818
819         IXGBE_CORE_UNLOCK(adapter);
820
821         INIT_DEBUGOUT("ixgbe_resume: end");
822         return (0);
823 }
824
825
826 /*********************************************************************
827  *  Ioctl entry point
828  *
829  *  ixgbe_ioctl is called when the user wants to configure the
830  *  interface.
831  *
832  *  return 0 on success, positive on failure
833  **********************************************************************/
834
835 static int
836 ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
837 {
838         struct adapter  *adapter = ifp->if_softc;
839         struct ifreq    *ifr = (struct ifreq *) data;
840 #if defined(INET) || defined(INET6)
841         struct ifaddr *ifa = (struct ifaddr *)data;
842 #endif
843         int             error = 0;
844         bool            avoid_reset = FALSE;
845
846         switch (command) {
847
848         case SIOCSIFADDR:
849 #ifdef INET
850                 if (ifa->ifa_addr->sa_family == AF_INET)
851                         avoid_reset = TRUE;
852 #endif
853 #ifdef INET6
854                 if (ifa->ifa_addr->sa_family == AF_INET6)
855                         avoid_reset = TRUE;
856 #endif
857                 /*
858                 ** Calling init results in link renegotiation,
859                 ** so we avoid doing it when possible.
860                 */
861                 if (avoid_reset) {
862                         ifp->if_flags |= IFF_UP;
863                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
864                                 ixgbe_init(adapter);
865 #if defined(INET)
866                         if (!(ifp->if_flags & IFF_NOARP))
867                                 arp_ifinit(ifp, ifa);
868 #endif
869                 } else
870                         error = ether_ioctl(ifp, command, data);
871                 break;
872         case SIOCSIFMTU:
873                 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
874                 if (ifr->ifr_mtu > IXGBE_MAX_MTU) {
875                         error = EINVAL;
876                 } else {
877                         IXGBE_CORE_LOCK(adapter);
878                         ifp->if_mtu = ifr->ifr_mtu;
879                         adapter->max_frame_size =
880                                 ifp->if_mtu + IXGBE_MTU_HDR;
881                         ixgbe_init_locked(adapter);
882 #ifdef PCI_IOV
883                         ixgbe_recalculate_max_frame(adapter);
884 #endif
885                         IXGBE_CORE_UNLOCK(adapter);
886                 }
887                 break;
888         case SIOCSIFFLAGS:
889                 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
890                 IXGBE_CORE_LOCK(adapter);
891                 if (ifp->if_flags & IFF_UP) {
892                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) {
893                                 if ((ifp->if_flags ^ adapter->if_flags) &
894                                     (IFF_PROMISC | IFF_ALLMULTI)) {
895                                         ixgbe_set_promisc(adapter);
896                                 }
897                         } else
898                                 ixgbe_init_locked(adapter);
899                 } else
900                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
901                                 ixgbe_stop(adapter);
902                 adapter->if_flags = ifp->if_flags;
903                 IXGBE_CORE_UNLOCK(adapter);
904                 break;
905         case SIOCADDMULTI:
906         case SIOCDELMULTI:
907                 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
908                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
909                         IXGBE_CORE_LOCK(adapter);
910                         ixgbe_disable_intr(adapter);
911                         ixgbe_set_multi(adapter);
912                         ixgbe_enable_intr(adapter);
913                         IXGBE_CORE_UNLOCK(adapter);
914                 }
915                 break;
916         case SIOCSIFMEDIA:
917         case SIOCGIFMEDIA:
918                 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
919                 error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
920                 break;
921         case SIOCSIFCAP:
922         {
923                 int mask = ifr->ifr_reqcap ^ ifp->if_capenable;
924                 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
925                 if (mask & IFCAP_HWCSUM)
926                         ifp->if_capenable ^= IFCAP_HWCSUM;
927                 if (mask & IFCAP_TSO4)
928                         ifp->if_capenable ^= IFCAP_TSO4;
929                 if (mask & IFCAP_TSO6)
930                         ifp->if_capenable ^= IFCAP_TSO6;
931                 if (mask & IFCAP_LRO)
932                         ifp->if_capenable ^= IFCAP_LRO;
933                 if (mask & IFCAP_VLAN_HWTAGGING)
934                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
935                 if (mask & IFCAP_VLAN_HWFILTER)
936                         ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
937                 if (mask & IFCAP_VLAN_HWTSO)
938                         ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
939                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
940                         IXGBE_CORE_LOCK(adapter);
941                         ixgbe_init_locked(adapter);
942                         IXGBE_CORE_UNLOCK(adapter);
943                 }
944                 VLAN_CAPABILITIES(ifp);
945                 break;
946         }
947 #if __FreeBSD_version >= 1100036
948         case SIOCGI2C:
949         {
950                 struct ixgbe_hw *hw = &adapter->hw;
951                 struct ifi2creq i2c;
952                 int i;
953                 IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
954                 error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
955                 if (error != 0)
956                         break;
957                 if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
958                         error = EINVAL;
959                         break;
960                 }
961                 if (i2c.len > sizeof(i2c.data)) {
962                         error = EINVAL;
963                         break;
964                 }
965
966                 for (i = 0; i < i2c.len; i++)
967                         hw->phy.ops.read_i2c_byte(hw, i2c.offset + i,
968                             i2c.dev_addr, &i2c.data[i]);
969                 error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
970                 break;
971         }
972 #endif
973         default:
974                 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
975                 error = ether_ioctl(ifp, command, data);
976                 break;
977         }
978
979         return (error);
980 }
981
982 /*********************************************************************
983  *  Init entry point
984  *
985  *  This routine is used in two ways. It is used by the stack as
986  *  init entry point in network interface structure. It is also used
987  *  by the driver as a hw/sw initialization routine to get to a
988  *  consistent state.
989  *
990  *  return 0 on success, positive on failure
991  **********************************************************************/
992 #define IXGBE_MHADD_MFS_SHIFT 16
993
994 static void
995 ixgbe_init_locked(struct adapter *adapter)
996 {
997         struct ifnet   *ifp = adapter->ifp;
998         device_t        dev = adapter->dev;
999         struct ixgbe_hw *hw = &adapter->hw;
1000         struct tx_ring  *txr;
1001         struct rx_ring  *rxr;
1002         u32             txdctl, mhadd;
1003         u32             rxdctl, rxctrl;
1004 #ifdef PCI_IOV
1005         enum ixgbe_iov_mode mode;
1006 #endif
1007
1008         mtx_assert(&adapter->core_mtx, MA_OWNED);
1009         INIT_DEBUGOUT("ixgbe_init_locked: begin");
1010
1011         hw->adapter_stopped = FALSE;
1012         ixgbe_stop_adapter(hw);
1013         callout_stop(&adapter->timer);
1014
1015 #ifdef PCI_IOV
1016         mode = ixgbe_get_iov_mode(adapter);
1017         adapter->pool = ixgbe_max_vfs(mode);
1018         /* Queue indices may change with IOV mode */
1019         for (int i = 0; i < adapter->num_queues; i++) {
1020                 adapter->rx_rings[i].me = ixgbe_pf_que_index(mode, i);
1021                 adapter->tx_rings[i].me = ixgbe_pf_que_index(mode, i);
1022         }
1023 #endif
1024         /* reprogram the RAR[0] in case user changed it. */
1025         ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
1026
1027         /* Get the latest mac address, User can use a LAA */
1028         bcopy(IF_LLADDR(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
1029         ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
1030         hw->addr_ctrl.rar_used_count = 1;
1031
1032         /* Set the various hardware offload abilities */
1033         ifp->if_hwassist = 0;
1034         if (ifp->if_capenable & IFCAP_TSO)
1035                 ifp->if_hwassist |= CSUM_TSO;
1036         if (ifp->if_capenable & IFCAP_TXCSUM) {
1037                 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
1038 #if __FreeBSD_version >= 800000
1039                 if (hw->mac.type != ixgbe_mac_82598EB)
1040                         ifp->if_hwassist |= CSUM_SCTP;
1041 #endif
1042         }
1043
1044         /* Prepare transmit descriptors and buffers */
1045         if (ixgbe_setup_transmit_structures(adapter)) {
1046                 device_printf(dev, "Could not setup transmit structures\n");
1047                 ixgbe_stop(adapter);
1048                 return;
1049         }
1050
1051         ixgbe_init_hw(hw);
1052 #ifdef PCI_IOV
1053         ixgbe_initialize_iov(adapter);
1054 #endif
1055         ixgbe_initialize_transmit_units(adapter);
1056
1057         /* Setup Multicast table */
1058         ixgbe_set_multi(adapter);
1059
1060         /*
1061         ** Determine the correct mbuf pool
1062         ** for doing jumbo frames
1063         */
1064         if (adapter->max_frame_size <= MCLBYTES)
1065                 adapter->rx_mbuf_sz = MCLBYTES;
1066         else
1067                 adapter->rx_mbuf_sz = MJUMPAGESIZE;
1068
1069         /* Prepare receive descriptors and buffers */
1070         if (ixgbe_setup_receive_structures(adapter)) {
1071                 device_printf(dev, "Could not setup receive structures\n");
1072                 ixgbe_stop(adapter);
1073                 return;
1074         }
1075
1076         /* Configure RX settings */
1077         ixgbe_initialize_receive_units(adapter);
1078
1079         /* Enable SDP & MSIX interrupts based on adapter */
1080         ixgbe_config_gpie(adapter);
1081
1082         /* Set MTU size */
1083         if (ifp->if_mtu > ETHERMTU) {
1084                 /* aka IXGBE_MAXFRS on 82599 and newer */
1085                 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
1086                 mhadd &= ~IXGBE_MHADD_MFS_MASK;
1087                 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
1088                 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
1089         }
1090         
1091         /* Now enable all the queues */
1092         for (int i = 0; i < adapter->num_queues; i++) {
1093                 txr = &adapter->tx_rings[i];
1094                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
1095                 txdctl |= IXGBE_TXDCTL_ENABLE;
1096                 /* Set WTHRESH to 8, burst writeback */
1097                 txdctl |= (8 << 16);
1098                 /*
1099                  * When the internal queue falls below PTHRESH (32),
1100                  * start prefetching as long as there are at least
1101                  * HTHRESH (1) buffers ready. The values are taken
1102                  * from the Intel linux driver 3.8.21.
1103                  * Prefetching enables tx line rate even with 1 queue.
1104                  */
1105                 txdctl |= (32 << 0) | (1 << 8);
1106                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
1107         }
1108
1109         for (int i = 0, j = 0; i < adapter->num_queues; i++) {
1110                 rxr = &adapter->rx_rings[i];
1111                 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
1112                 if (hw->mac.type == ixgbe_mac_82598EB) {
1113                         /*
1114                         ** PTHRESH = 21
1115                         ** HTHRESH = 4
1116                         ** WTHRESH = 8
1117                         */
1118                         rxdctl &= ~0x3FFFFF;
1119                         rxdctl |= 0x080420;
1120                 }
1121                 rxdctl |= IXGBE_RXDCTL_ENABLE;
1122                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
1123                 for (; j < 10; j++) {
1124                         if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
1125                             IXGBE_RXDCTL_ENABLE)
1126                                 break;
1127                         else
1128                                 msec_delay(1);
1129                 }
1130                 wmb();
1131 #ifdef DEV_NETMAP
1132                 /*
1133                  * In netmap mode, we must preserve the buffers made
1134                  * available to userspace before the if_init()
1135                  * (this is true by default on the TX side, because
1136                  * init makes all buffers available to userspace).
1137                  *
1138                  * netmap_reset() and the device specific routines
1139                  * (e.g. ixgbe_setup_receive_rings()) map these
1140                  * buffers at the end of the NIC ring, so here we
1141                  * must set the RDT (tail) register to make sure
1142                  * they are not overwritten.
1143                  *
1144                  * In this driver the NIC ring starts at RDH = 0,
1145                  * RDT points to the last slot available for reception (?),
1146                  * so RDT = num_rx_desc - 1 means the whole ring is available.
1147                  */
1148                 if (ifp->if_capenable & IFCAP_NETMAP) {
1149                         struct netmap_adapter *na = NA(adapter->ifp);
1150                         struct netmap_kring *kring = &na->rx_rings[i];
1151                         int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
1152
1153                         IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
1154                 } else
1155 #endif /* DEV_NETMAP */
1156                 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), adapter->num_rx_desc - 1);
1157         }
1158
1159         /* Enable Receive engine */
1160         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
1161         if (hw->mac.type == ixgbe_mac_82598EB)
1162                 rxctrl |= IXGBE_RXCTRL_DMBYPS;
1163         rxctrl |= IXGBE_RXCTRL_RXEN;
1164         ixgbe_enable_rx_dma(hw, rxctrl);
1165
1166         callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
1167
1168         /* Set up MSI/X routing */
1169         if (ixgbe_enable_msix)  {
1170                 ixgbe_configure_ivars(adapter);
1171                 /* Set up auto-mask */
1172                 if (hw->mac.type == ixgbe_mac_82598EB)
1173                         IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1174                 else {
1175                         IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
1176                         IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
1177                 }
1178         } else {  /* Simple settings for Legacy/MSI */
1179                 ixgbe_set_ivar(adapter, 0, 0, 0);
1180                 ixgbe_set_ivar(adapter, 0, 0, 1);
1181                 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1182         }
1183
1184 #ifdef IXGBE_FDIR
1185         /* Init Flow director */
1186         if (hw->mac.type != ixgbe_mac_82598EB) {
1187                 u32 hdrm = 32 << fdir_pballoc;
1188
1189                 hw->mac.ops.setup_rxpba(hw, 0, hdrm, PBA_STRATEGY_EQUAL);
1190                 ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc);
1191         }
1192 #endif
1193
1194         /*
1195          * Check on any SFP devices that
1196          * need to be kick-started
1197          */
1198         if (hw->phy.type == ixgbe_phy_none) {
1199                 int err = hw->phy.ops.identify(hw);
1200                 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
1201                         device_printf(dev,
1202                             "Unsupported SFP+ module type was detected.\n");
1203                         return;
1204                 }
1205         }
1206
1207         /* Set moderation on the Link interrupt */
1208         IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->vector), IXGBE_LINK_ITR);
1209
1210         /* Configure Energy Efficient Ethernet for supported devices */
1211         ixgbe_setup_eee(hw, adapter->eee_enabled);
1212
1213         /* Config/Enable Link */
1214         ixgbe_config_link(adapter);
1215
1216         /* Hardware Packet Buffer & Flow Control setup */
1217         ixgbe_config_delay_values(adapter);
1218
1219         /* Initialize the FC settings */
1220         ixgbe_start_hw(hw);
1221
1222         /* Set up VLAN support and filter */
1223         ixgbe_setup_vlan_hw_support(adapter);
1224
1225         /* Setup DMA Coalescing */
1226         ixgbe_config_dmac(adapter);
1227
1228         /* And now turn on interrupts */
1229         ixgbe_enable_intr(adapter);
1230
1231 #ifdef PCI_IOV
1232         /* Enable the use of the MBX by the VF's */
1233         {
1234                 u32 reg = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
1235                 reg |= IXGBE_CTRL_EXT_PFRSTD;
1236                 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, reg);
1237         }
1238 #endif
1239
1240         /* Now inform the stack we're ready */
1241         ifp->if_drv_flags |= IFF_DRV_RUNNING;
1242
1243         return;
1244 }
1245
1246 static void
1247 ixgbe_init(void *arg)
1248 {
1249         struct adapter *adapter = arg;
1250
1251         IXGBE_CORE_LOCK(adapter);
1252         ixgbe_init_locked(adapter);
1253         IXGBE_CORE_UNLOCK(adapter);
1254         return;
1255 }
1256
1257 static void
1258 ixgbe_config_gpie(struct adapter *adapter)
1259 {
1260         struct ixgbe_hw *hw = &adapter->hw;
1261         u32 gpie;
1262
1263         gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
1264
1265         /* Fan Failure Interrupt */
1266         if (hw->device_id == IXGBE_DEV_ID_82598AT)
1267                 gpie |= IXGBE_SDP1_GPIEN;
1268
1269         /*
1270          * Module detection (SDP2)
1271          * Media ready (SDP1)
1272          */
1273         if (hw->mac.type == ixgbe_mac_82599EB) {
1274                 gpie |= IXGBE_SDP2_GPIEN;
1275                 if (hw->device_id != IXGBE_DEV_ID_82599_QSFP_SF_QP)
1276                         gpie |= IXGBE_SDP1_GPIEN;
1277         }
1278
1279         /*
1280          * Thermal Failure Detection (X540)
1281          * Link Detection (X557)
1282          */
1283         if (hw->mac.type == ixgbe_mac_X540 ||
1284             hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
1285             hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
1286                 gpie |= IXGBE_SDP0_GPIEN_X540;
1287
1288         if (adapter->msix > 1) {
1289                 /* Enable Enhanced MSIX mode */
1290                 gpie |= IXGBE_GPIE_MSIX_MODE;
1291                 gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT |
1292                     IXGBE_GPIE_OCD;
1293         }
1294
1295         IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
1296         return;
1297 }
1298
1299 /*
1300  * Requires adapter->max_frame_size to be set.
1301  */
1302 static void
1303 ixgbe_config_delay_values(struct adapter *adapter)
1304 {
1305         struct ixgbe_hw *hw = &adapter->hw;
1306         u32 rxpb, frame, size, tmp;
1307
1308         frame = adapter->max_frame_size;
1309
1310         /* Calculate High Water */
1311         switch (hw->mac.type) {
1312         case ixgbe_mac_X540:
1313         case ixgbe_mac_X550:
1314         case ixgbe_mac_X550EM_x:
1315                 tmp = IXGBE_DV_X540(frame, frame);
1316                 break;
1317         default:
1318                 tmp = IXGBE_DV(frame, frame);
1319                 break;
1320         }
1321         size = IXGBE_BT2KB(tmp);
1322         rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
1323         hw->fc.high_water[0] = rxpb - size;
1324
1325         /* Now calculate Low Water */
1326         switch (hw->mac.type) {
1327         case ixgbe_mac_X540:
1328         case ixgbe_mac_X550:
1329         case ixgbe_mac_X550EM_x:
1330                 tmp = IXGBE_LOW_DV_X540(frame);
1331                 break;
1332         default:
1333                 tmp = IXGBE_LOW_DV(frame);
1334                 break;
1335         }
1336         hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
1337
1338         hw->fc.requested_mode = adapter->fc;
1339         hw->fc.pause_time = IXGBE_FC_PAUSE;
1340         hw->fc.send_xon = TRUE;
1341 }
1342
1343 /*
1344 **
1345 ** MSIX Interrupt Handlers and Tasklets
1346 **
1347 */
1348
1349 static inline void
1350 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
1351 {
1352         struct ixgbe_hw *hw = &adapter->hw;
1353         u64     queue = (u64)(1 << vector);
1354         u32     mask;
1355
1356         if (hw->mac.type == ixgbe_mac_82598EB) {
1357                 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1358                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
1359         } else {
1360                 mask = (queue & 0xFFFFFFFF);
1361                 if (mask)
1362                         IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
1363                 mask = (queue >> 32);
1364                 if (mask)
1365                         IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
1366         }
1367 }
1368
1369 static inline void
1370 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
1371 {
1372         struct ixgbe_hw *hw = &adapter->hw;
1373         u64     queue = (u64)(1 << vector);
1374         u32     mask;
1375
1376         if (hw->mac.type == ixgbe_mac_82598EB) {
1377                 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1378                 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
1379         } else {
1380                 mask = (queue & 0xFFFFFFFF);
1381                 if (mask)
1382                         IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
1383                 mask = (queue >> 32);
1384                 if (mask)
1385                         IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
1386         }
1387 }
1388
1389 static void
1390 ixgbe_handle_que(void *context, int pending)
1391 {
1392         struct ix_queue *que = context;
1393         struct adapter  *adapter = que->adapter;
1394         struct tx_ring  *txr = que->txr;
1395         struct ifnet    *ifp = adapter->ifp;
1396
1397         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1398                 ixgbe_rxeof(que);
1399                 IXGBE_TX_LOCK(txr);
1400                 ixgbe_txeof(txr);
1401 #ifndef IXGBE_LEGACY_TX
1402                 if (!drbr_empty(ifp, txr->br))
1403                         ixgbe_mq_start_locked(ifp, txr);
1404 #else
1405                 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1406                         ixgbe_start_locked(txr, ifp);
1407 #endif
1408                 IXGBE_TX_UNLOCK(txr);
1409         }
1410
1411         /* Reenable this interrupt */
1412         if (que->res != NULL)
1413                 ixgbe_enable_queue(adapter, que->msix);
1414         else
1415                 ixgbe_enable_intr(adapter);
1416         return;
1417 }
1418
1419
1420 /*********************************************************************
1421  *
1422  *  Legacy Interrupt Service routine
1423  *
1424  **********************************************************************/
1425
1426 static void
1427 ixgbe_legacy_irq(void *arg)
1428 {
1429         struct ix_queue *que = arg;
1430         struct adapter  *adapter = que->adapter;
1431         struct ixgbe_hw *hw = &adapter->hw;
1432         struct ifnet    *ifp = adapter->ifp;
1433         struct          tx_ring *txr = adapter->tx_rings;
1434         bool            more;
1435         u32             reg_eicr;
1436
1437
1438         reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
1439
1440         ++que->irqs;
1441         if (reg_eicr == 0) {
1442                 ixgbe_enable_intr(adapter);
1443                 return;
1444         }
1445
1446         more = ixgbe_rxeof(que);
1447
1448         IXGBE_TX_LOCK(txr);
1449         ixgbe_txeof(txr);
1450 #ifdef IXGBE_LEGACY_TX
1451         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1452                 ixgbe_start_locked(txr, ifp);
1453 #else
1454         if (!drbr_empty(ifp, txr->br))
1455                 ixgbe_mq_start_locked(ifp, txr);
1456 #endif
1457         IXGBE_TX_UNLOCK(txr);
1458
1459         /* Check for fan failure */
1460         if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
1461             (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1462                 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1463                     "REPLACE IMMEDIATELY!!\n");
1464                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
1465         }
1466
1467         /* Link status change */
1468         if (reg_eicr & IXGBE_EICR_LSC)
1469                 taskqueue_enqueue(adapter->tq, &adapter->link_task);
1470
1471         /* External PHY interrupt */
1472         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
1473             (reg_eicr & IXGBE_EICR_GPI_SDP0_X540))
1474                 taskqueue_enqueue(adapter->tq, &adapter->phy_task);
1475
1476         if (more)
1477                 taskqueue_enqueue(que->tq, &que->que_task);
1478         else
1479                 ixgbe_enable_intr(adapter);
1480         return;
1481 }
1482
1483
1484 /*********************************************************************
1485  *
1486  *  MSIX Queue Interrupt Service routine
1487  *
1488  **********************************************************************/
1489 void
1490 ixgbe_msix_que(void *arg)
1491 {
1492         struct ix_queue *que = arg;
1493         struct adapter  *adapter = que->adapter;
1494         struct ifnet    *ifp = adapter->ifp;
1495         struct tx_ring  *txr = que->txr;
1496         struct rx_ring  *rxr = que->rxr;
1497         bool            more;
1498         u32             newitr = 0;
1499
1500
1501         /* Protect against spurious interrupts */
1502         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1503                 return;
1504
1505         ixgbe_disable_queue(adapter, que->msix);
1506         ++que->irqs;
1507
1508         more = ixgbe_rxeof(que);
1509
1510         IXGBE_TX_LOCK(txr);
1511         ixgbe_txeof(txr);
1512 #ifdef IXGBE_LEGACY_TX
1513         if (!IFQ_DRV_IS_EMPTY(ifp->if_snd))
1514                 ixgbe_start_locked(txr, ifp);
1515 #else
1516         if (!drbr_empty(ifp, txr->br))
1517                 ixgbe_mq_start_locked(ifp, txr);
1518 #endif
1519         IXGBE_TX_UNLOCK(txr);
1520
1521         /* Do AIM now? */
1522
1523         if (ixgbe_enable_aim == FALSE)
1524                 goto no_calc;
1525         /*
1526         ** Do Adaptive Interrupt Moderation:
1527         **  - Write out last calculated setting
1528         **  - Calculate based on average size over
1529         **    the last interval.
1530         */
1531         if (que->eitr_setting)
1532                 IXGBE_WRITE_REG(&adapter->hw,
1533                     IXGBE_EITR(que->msix), que->eitr_setting);
1534  
1535         que->eitr_setting = 0;
1536
1537         /* Idle, do nothing */
1538         if ((txr->bytes == 0) && (rxr->bytes == 0))
1539                 goto no_calc;
1540                                 
1541         if ((txr->bytes) && (txr->packets))
1542                 newitr = txr->bytes/txr->packets;
1543         if ((rxr->bytes) && (rxr->packets))
1544                 newitr = max(newitr,
1545                     (rxr->bytes / rxr->packets));
1546         newitr += 24; /* account for hardware frame, crc */
1547
1548         /* set an upper boundary */
1549         newitr = min(newitr, 3000);
1550
1551         /* Be nice to the mid range */
1552         if ((newitr > 300) && (newitr < 1200))
1553                 newitr = (newitr / 3);
1554         else
1555                 newitr = (newitr / 2);
1556
1557         if (adapter->hw.mac.type == ixgbe_mac_82598EB)
1558                 newitr |= newitr << 16;
1559         else
1560                 newitr |= IXGBE_EITR_CNT_WDIS;
1561                  
1562         /* save for next interrupt */
1563         que->eitr_setting = newitr;
1564
1565         /* Reset state */
1566         txr->bytes = 0;
1567         txr->packets = 0;
1568         rxr->bytes = 0;
1569         rxr->packets = 0;
1570
1571 no_calc:
1572         if (more)
1573                 taskqueue_enqueue(que->tq, &que->que_task);
1574         else
1575                 ixgbe_enable_queue(adapter, que->msix);
1576         return;
1577 }
1578
1579
1580 static void
1581 ixgbe_msix_link(void *arg)
1582 {
1583         struct adapter  *adapter = arg;
1584         struct ixgbe_hw *hw = &adapter->hw;
1585         u32             reg_eicr, mod_mask;
1586
1587         ++adapter->link_irq;
1588
1589         /* First get the cause */
1590         reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
1591         /* Be sure the queue bits are not cleared */
1592         reg_eicr &= ~IXGBE_EICR_RTX_QUEUE;
1593         /* Clear interrupt with write */
1594         IXGBE_WRITE_REG(hw, IXGBE_EICR, reg_eicr);
1595
1596         /* Link status change */
1597         if (reg_eicr & IXGBE_EICR_LSC)
1598                 taskqueue_enqueue(adapter->tq, &adapter->link_task);
1599
1600         if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
1601 #ifdef IXGBE_FDIR
1602                 if (reg_eicr & IXGBE_EICR_FLOW_DIR) {
1603                         /* This is probably overkill :) */
1604                         if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
1605                                 return;
1606                         /* Disable the interrupt */
1607                         IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
1608                         taskqueue_enqueue(adapter->tq, &adapter->fdir_task);
1609                 } else
1610 #endif
1611                 if (reg_eicr & IXGBE_EICR_ECC) {
1612                         device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
1613                             "Please Reboot!!\n");
1614                         IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
1615                 }
1616
1617                 /* Check for over temp condition */
1618                 if (reg_eicr & IXGBE_EICR_TS) {
1619                         device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
1620                             "PHY IS SHUT DOWN!!\n");
1621                         device_printf(adapter->dev, "System shutdown required!\n");
1622                         IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
1623                 }
1624 #ifdef PCI_IOV
1625                 if (reg_eicr & IXGBE_EICR_MAILBOX)
1626                         taskqueue_enqueue(adapter->tq, &adapter->mbx_task);
1627 #endif
1628         }
1629
1630         /* Pluggable optics-related interrupt */
1631         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
1632                 mod_mask = IXGBE_EICR_GPI_SDP0_X540;
1633         else
1634                 mod_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
1635
1636         if (ixgbe_is_sfp(hw)) {
1637                 if (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
1638                         IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
1639                         taskqueue_enqueue(adapter->tq, &adapter->msf_task);
1640                 } else if (reg_eicr & mod_mask) {
1641                         IXGBE_WRITE_REG(hw, IXGBE_EICR, mod_mask);
1642                         taskqueue_enqueue(adapter->tq, &adapter->mod_task);
1643                 }
1644         }
1645
1646         /* Check for fan failure */
1647         if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
1648             (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1649                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
1650                 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1651                     "REPLACE IMMEDIATELY!!\n");
1652         }
1653
1654         /* External PHY interrupt */
1655         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
1656             (reg_eicr & IXGBE_EICR_GPI_SDP0_X540)) {
1657                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
1658                 taskqueue_enqueue(adapter->tq, &adapter->phy_task);
1659         }
1660
1661         IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
1662         return;
1663 }
1664
1665 /*********************************************************************
1666  *
1667  *  Media Ioctl callback
1668  *
1669  *  This routine is called whenever the user queries the status of
1670  *  the interface using ifconfig.
1671  *
1672  **********************************************************************/
1673 static void
1674 ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
1675 {
1676         struct adapter *adapter = ifp->if_softc;
1677         struct ixgbe_hw *hw = &adapter->hw;
1678         int layer;
1679
1680         INIT_DEBUGOUT("ixgbe_media_status: begin");
1681         IXGBE_CORE_LOCK(adapter);
1682         ixgbe_update_link_status(adapter);
1683
1684         ifmr->ifm_status = IFM_AVALID;
1685         ifmr->ifm_active = IFM_ETHER;
1686
1687         if (!adapter->link_active) {
1688                 IXGBE_CORE_UNLOCK(adapter);
1689                 return;
1690         }
1691
1692         ifmr->ifm_status |= IFM_ACTIVE;
1693         layer = adapter->phy_layer;
1694
1695         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
1696             layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
1697             layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
1698                 switch (adapter->link_speed) {
1699                 case IXGBE_LINK_SPEED_10GB_FULL:
1700                         ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
1701                         break;
1702                 case IXGBE_LINK_SPEED_1GB_FULL:
1703                         ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1704                         break;
1705                 case IXGBE_LINK_SPEED_100_FULL:
1706                         ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
1707                         break;
1708                 }
1709         if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
1710             layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
1711                 switch (adapter->link_speed) {
1712                 case IXGBE_LINK_SPEED_10GB_FULL:
1713                         ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
1714                         break;
1715                 }
1716         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
1717                 switch (adapter->link_speed) {
1718                 case IXGBE_LINK_SPEED_10GB_FULL:
1719                         ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
1720                         break;
1721                 case IXGBE_LINK_SPEED_1GB_FULL:
1722                         ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
1723                         break;
1724                 }
1725         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
1726                 switch (adapter->link_speed) {
1727                 case IXGBE_LINK_SPEED_10GB_FULL:
1728                         ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
1729                         break;
1730                 case IXGBE_LINK_SPEED_1GB_FULL:
1731                         ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
1732                         break;
1733                 }
1734         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
1735             layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
1736                 switch (adapter->link_speed) {
1737                 case IXGBE_LINK_SPEED_10GB_FULL:
1738                         ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
1739                         break;
1740                 case IXGBE_LINK_SPEED_1GB_FULL:
1741                         ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
1742                         break;
1743                 }
1744         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
1745                 switch (adapter->link_speed) {
1746                 case IXGBE_LINK_SPEED_10GB_FULL:
1747                         ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
1748                         break;
1749                 }
1750         /*
1751         ** XXX: These need to use the proper media types once
1752         ** they're added.
1753         */
1754         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
1755                 switch (adapter->link_speed) {
1756                 case IXGBE_LINK_SPEED_10GB_FULL:
1757                         ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
1758                         break;
1759                 case IXGBE_LINK_SPEED_2_5GB_FULL:
1760                         ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
1761                         break;
1762                 case IXGBE_LINK_SPEED_1GB_FULL:
1763                         ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
1764                         break;
1765                 }
1766         else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
1767             || layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
1768                 switch (adapter->link_speed) {
1769                 case IXGBE_LINK_SPEED_10GB_FULL:
1770                         ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
1771                         break;
1772                 case IXGBE_LINK_SPEED_2_5GB_FULL:
1773                         ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
1774                         break;
1775                 case IXGBE_LINK_SPEED_1GB_FULL:
1776                         ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
1777                         break;
1778                 }
1779         
1780         /* If nothing is recognized... */
1781         if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
1782                 ifmr->ifm_active |= IFM_UNKNOWN;
1783         
1784 #if __FreeBSD_version >= 900025
1785         /* Display current flow control setting used on link */
1786         if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
1787             hw->fc.current_mode == ixgbe_fc_full)
1788                 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
1789         if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
1790             hw->fc.current_mode == ixgbe_fc_full)
1791                 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
1792 #endif
1793
1794         IXGBE_CORE_UNLOCK(adapter);
1795
1796         return;
1797 }
1798
1799 /*********************************************************************
1800  *
1801  *  Media Ioctl callback
1802  *
1803  *  This routine is called when the user changes speed/duplex using
1804  *  media/mediopt option with ifconfig.
1805  *
1806  **********************************************************************/
1807 static int
1808 ixgbe_media_change(struct ifnet * ifp)
1809 {
1810         struct adapter *adapter = ifp->if_softc;
1811         struct ifmedia *ifm = &adapter->media;
1812         struct ixgbe_hw *hw = &adapter->hw;
1813         ixgbe_link_speed speed = 0;
1814
1815         INIT_DEBUGOUT("ixgbe_media_change: begin");
1816
1817         if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1818                 return (EINVAL);
1819
1820         if (hw->phy.media_type == ixgbe_media_type_backplane)
1821                 return (EPERM);
1822
1823         /*
1824         ** We don't actually need to check against the supported
1825         ** media types of the adapter; ifmedia will take care of
1826         ** that for us.
1827         */
1828         switch (IFM_SUBTYPE(ifm->ifm_media)) {
1829                 case IFM_AUTO:
1830                 case IFM_10G_T:
1831                         speed |= IXGBE_LINK_SPEED_100_FULL;
1832                 case IFM_10G_LRM:
1833                 case IFM_10G_SR: /* KR, too */
1834                 case IFM_10G_LR:
1835                 case IFM_10G_CX4: /* KX4 */
1836                         speed |= IXGBE_LINK_SPEED_1GB_FULL;
1837                 case IFM_10G_TWINAX:
1838                         speed |= IXGBE_LINK_SPEED_10GB_FULL;
1839                         break;
1840                 case IFM_1000_T:
1841                         speed |= IXGBE_LINK_SPEED_100_FULL;
1842                 case IFM_1000_LX:
1843                 case IFM_1000_SX:
1844                 case IFM_1000_CX: /* KX */
1845                         speed |= IXGBE_LINK_SPEED_1GB_FULL;
1846                         break;
1847                 case IFM_100_TX:
1848                         speed |= IXGBE_LINK_SPEED_100_FULL;
1849                         break;
1850                 default:
1851                         goto invalid;
1852         }
1853
1854         hw->mac.autotry_restart = TRUE;
1855         hw->mac.ops.setup_link(hw, speed, TRUE);
1856         adapter->advertise =
1857                 ((speed & IXGBE_LINK_SPEED_10GB_FULL) << 2) |
1858                 ((speed & IXGBE_LINK_SPEED_1GB_FULL) << 1) |
1859                 ((speed & IXGBE_LINK_SPEED_100_FULL) << 0);
1860
1861         return (0);
1862
1863 invalid:
1864         device_printf(adapter->dev, "Invalid media type!\n");
1865         return (EINVAL);
1866 }
1867
1868 static void
1869 ixgbe_set_promisc(struct adapter *adapter)
1870 {
1871         u_int32_t       reg_rctl;
1872         struct ifnet   *ifp = adapter->ifp;
1873         int             mcnt = 0;
1874
1875         reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1876         reg_rctl &= (~IXGBE_FCTRL_UPE);
1877         if (ifp->if_flags & IFF_ALLMULTI)
1878                 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
1879         else {
1880                 struct  ifmultiaddr *ifma;
1881 #if __FreeBSD_version < 800000
1882                 IF_ADDR_LOCK(ifp);
1883 #else
1884                 if_maddr_rlock(ifp);
1885 #endif
1886                 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1887                         if (ifma->ifma_addr->sa_family != AF_LINK)
1888                                 continue;
1889                         if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1890                                 break;
1891                         mcnt++;
1892                 }
1893 #if __FreeBSD_version < 800000
1894                 IF_ADDR_UNLOCK(ifp);
1895 #else
1896                 if_maddr_runlock(ifp);
1897 #endif
1898         }
1899         if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
1900                 reg_rctl &= (~IXGBE_FCTRL_MPE);
1901         IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1902
1903         if (ifp->if_flags & IFF_PROMISC) {
1904                 reg_rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1905                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1906         } else if (ifp->if_flags & IFF_ALLMULTI) {
1907                 reg_rctl |= IXGBE_FCTRL_MPE;
1908                 reg_rctl &= ~IXGBE_FCTRL_UPE;
1909                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1910         }
1911         return;
1912 }
1913
1914
1915 /*********************************************************************
1916  *  Multicast Update
1917  *
1918  *  This routine is called whenever multicast address list is updated.
1919  *
1920  **********************************************************************/
1921 #define IXGBE_RAR_ENTRIES 16
1922
1923 static void
1924 ixgbe_set_multi(struct adapter *adapter)
1925 {
1926         u32                     fctrl;
1927         u8                      *update_ptr;
1928         struct ifmultiaddr      *ifma;
1929         struct ixgbe_mc_addr    *mta;
1930         int                     mcnt = 0;
1931         struct ifnet            *ifp = adapter->ifp;
1932
1933         IOCTL_DEBUGOUT("ixgbe_set_multi: begin");
1934
1935         mta = adapter->mta;
1936         bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
1937
1938 #if __FreeBSD_version < 800000
1939         IF_ADDR_LOCK(ifp);
1940 #else
1941         if_maddr_rlock(ifp);
1942 #endif
1943         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1944                 if (ifma->ifma_addr->sa_family != AF_LINK)
1945                         continue;
1946                 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1947                         break;
1948                 bcopy(LLADDR((struct sockaddr_dl *) ifma->ifma_addr),
1949                     mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
1950                 mta[mcnt].vmdq = adapter->pool;
1951                 mcnt++;
1952         }
1953 #if __FreeBSD_version < 800000
1954         IF_ADDR_UNLOCK(ifp);
1955 #else
1956         if_maddr_runlock(ifp);
1957 #endif
1958
1959         fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1960         fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1961         if (ifp->if_flags & IFF_PROMISC)
1962                 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1963         else if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES ||
1964             ifp->if_flags & IFF_ALLMULTI) {
1965                 fctrl |= IXGBE_FCTRL_MPE;
1966                 fctrl &= ~IXGBE_FCTRL_UPE;
1967         } else
1968                 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1969         
1970         IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
1971
1972         if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
1973                 update_ptr = (u8 *)mta;
1974                 ixgbe_update_mc_addr_list(&adapter->hw,
1975                     update_ptr, mcnt, ixgbe_mc_array_itr, TRUE);
1976         }
1977
1978         return;
1979 }
1980
1981 /*
1982  * This is an iterator function now needed by the multicast
1983  * shared code. It simply feeds the shared code routine the
1984  * addresses in the array of ixgbe_set_multi() one by one.
1985  */
1986 static u8 *
1987 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1988 {
1989         struct ixgbe_mc_addr *mta;
1990
1991         mta = (struct ixgbe_mc_addr *)*update_ptr;
1992         *vmdq = mta->vmdq;
1993
1994         *update_ptr = (u8*)(mta + 1);;
1995         return (mta->addr);
1996 }
1997
1998
1999 /*********************************************************************
2000  *  Timer routine
2001  *
2002  *  This routine checks for link status,updates statistics,
2003  *  and runs the watchdog check.
2004  *
2005  **********************************************************************/
2006
2007 static void
2008 ixgbe_local_timer(void *arg)
2009 {
2010         struct adapter  *adapter = arg;
2011         device_t        dev = adapter->dev;
2012         struct ix_queue *que = adapter->queues;
2013         u64             queues = 0;
2014         int             hung = 0;
2015
2016         mtx_assert(&adapter->core_mtx, MA_OWNED);
2017
2018         /* Check for pluggable optics */
2019         if (adapter->sfp_probe)
2020                 if (!ixgbe_sfp_probe(adapter))
2021                         goto out; /* Nothing to do */
2022
2023         ixgbe_update_link_status(adapter);
2024         ixgbe_update_stats_counters(adapter);
2025
2026         /*
2027         ** Check the TX queues status
2028         **      - mark hung queues so we don't schedule on them
2029         **      - watchdog only if all queues show hung
2030         */          
2031         for (int i = 0; i < adapter->num_queues; i++, que++) {
2032                 /* Keep track of queues with work for soft irq */
2033                 if (que->txr->busy)
2034                         queues |= ((u64)1 << que->me);
2035                 /*
2036                 ** Each time txeof runs without cleaning, but there
2037                 ** are uncleaned descriptors it increments busy. If
2038                 ** we get to the MAX we declare it hung.
2039                 */
2040                 if (que->busy == IXGBE_QUEUE_HUNG) {
2041                         ++hung;
2042                         /* Mark the queue as inactive */
2043                         adapter->active_queues &= ~((u64)1 << que->me);
2044                         continue;
2045                 } else {
2046                         /* Check if we've come back from hung */
2047                         if ((adapter->active_queues & ((u64)1 << que->me)) == 0)
2048                                 adapter->active_queues |= ((u64)1 << que->me);
2049                 }
2050                 if (que->busy >= IXGBE_MAX_TX_BUSY) {
2051                         device_printf(dev,"Warning queue %d "
2052                             "appears to be hung!\n", i);
2053                         que->txr->busy = IXGBE_QUEUE_HUNG;
2054                         ++hung;
2055                 }
2056
2057         }
2058
2059         /* Only truly watchdog if all queues show hung */
2060         if (hung == adapter->num_queues)
2061                 goto watchdog;
2062         else if (queues != 0) { /* Force an IRQ on queues with work */
2063                 ixgbe_rearm_queues(adapter, queues);
2064         }
2065
2066 out:
2067         callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
2068         return;
2069
2070 watchdog:
2071         device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
2072         adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2073         adapter->watchdog_events++;
2074         ixgbe_init_locked(adapter);
2075 }
2076
2077
2078 /*
2079 ** Note: this routine updates the OS on the link state
2080 **      the real check of the hardware only happens with
2081 **      a link interrupt.
2082 */
2083 static void
2084 ixgbe_update_link_status(struct adapter *adapter)
2085 {
2086         struct ifnet    *ifp = adapter->ifp;
2087         device_t dev = adapter->dev;
2088
2089         if (adapter->link_up){ 
2090                 if (adapter->link_active == FALSE) {
2091                         if (bootverbose)
2092                                 device_printf(dev,"Link is up %d Gbps %s \n",
2093                                     ((adapter->link_speed == 128)? 10:1),
2094                                     "Full Duplex");
2095                         adapter->link_active = TRUE;
2096                         /* Update any Flow Control changes */
2097                         ixgbe_fc_enable(&adapter->hw);
2098                         /* Update DMA coalescing config */
2099                         ixgbe_config_dmac(adapter);
2100                         if_link_state_change(ifp, LINK_STATE_UP);
2101 #ifdef PCI_IOV
2102                         ixgbe_ping_all_vfs(adapter);
2103 #endif
2104                 }
2105         } else { /* Link down */
2106                 if (adapter->link_active == TRUE) {
2107                         if (bootverbose)
2108                                 device_printf(dev,"Link is Down\n");
2109                         if_link_state_change(ifp, LINK_STATE_DOWN);
2110                         adapter->link_active = FALSE;
2111 #ifdef PCI_IOV
2112                         ixgbe_ping_all_vfs(adapter);
2113 #endif
2114                 }
2115         }
2116
2117         return;
2118 }
2119
2120
2121 /*********************************************************************
2122  *
2123  *  This routine disables all traffic on the adapter by issuing a
2124  *  global reset on the MAC and deallocates TX/RX buffers.
2125  *
2126  **********************************************************************/
2127
2128 static void
2129 ixgbe_stop(void *arg)
2130 {
2131         struct ifnet   *ifp;
2132         struct adapter *adapter = arg;
2133         struct ixgbe_hw *hw = &adapter->hw;
2134         ifp = adapter->ifp;
2135
2136         mtx_assert(&adapter->core_mtx, MA_OWNED);
2137
2138         INIT_DEBUGOUT("ixgbe_stop: begin\n");
2139         ixgbe_disable_intr(adapter);
2140         callout_stop(&adapter->timer);
2141
2142         /* Let the stack know...*/
2143         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2144
2145         ixgbe_reset_hw(hw);
2146         hw->adapter_stopped = FALSE;
2147         ixgbe_stop_adapter(hw);
2148         if (hw->mac.type == ixgbe_mac_82599EB)
2149                 ixgbe_stop_mac_link_on_d3_82599(hw);
2150         /* Turn off the laser - noop with no optics */
2151         ixgbe_disable_tx_laser(hw);
2152
2153         /* Update the stack */
2154         adapter->link_up = FALSE;
2155         ixgbe_update_link_status(adapter);
2156
2157         /* reprogram the RAR[0] in case user changed it. */
2158         ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
2159
2160         return;
2161 }
2162
2163
2164 /*********************************************************************
2165  *
2166  *  Determine hardware revision.
2167  *
2168  **********************************************************************/
2169 static void
2170 ixgbe_identify_hardware(struct adapter *adapter)
2171 {
2172         device_t        dev = adapter->dev;
2173         struct ixgbe_hw *hw = &adapter->hw;
2174
2175         /* Save off the information about this board */
2176         hw->vendor_id = pci_get_vendor(dev);
2177         hw->device_id = pci_get_device(dev);
2178         hw->revision_id = pci_read_config(dev, PCIR_REVID, 1);
2179         hw->subsystem_vendor_id =
2180             pci_read_config(dev, PCIR_SUBVEND_0, 2);
2181         hw->subsystem_device_id =
2182             pci_read_config(dev, PCIR_SUBDEV_0, 2);
2183
2184         /*
2185         ** Make sure BUSMASTER is set
2186         */
2187         pci_enable_busmaster(dev);
2188
2189         /* We need this here to set the num_segs below */
2190         ixgbe_set_mac_type(hw);
2191
2192         /* Pick up the 82599 settings */
2193         if (hw->mac.type != ixgbe_mac_82598EB) {
2194                 hw->phy.smart_speed = ixgbe_smart_speed;
2195                 adapter->num_segs = IXGBE_82599_SCATTER;
2196         } else
2197                 adapter->num_segs = IXGBE_82598_SCATTER;
2198
2199         return;
2200 }
2201
2202 /*********************************************************************
2203  *
2204  *  Determine optic type
2205  *
2206  **********************************************************************/
2207 static void
2208 ixgbe_setup_optics(struct adapter *adapter)
2209 {
2210         struct ixgbe_hw *hw = &adapter->hw;
2211         int             layer;
2212
2213         layer = adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
2214
2215         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T) {
2216                 adapter->optics = IFM_10G_T;
2217                 return;
2218         }
2219
2220         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T) {
2221                 adapter->optics = IFM_1000_T;
2222                 return;
2223         }
2224
2225         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX) {
2226                 adapter->optics = IFM_1000_SX;
2227                 return;
2228         }
2229
2230         if (layer & (IXGBE_PHYSICAL_LAYER_10GBASE_LR |
2231             IXGBE_PHYSICAL_LAYER_10GBASE_LRM)) {
2232                 adapter->optics = IFM_10G_LR;
2233                 return;
2234         }
2235
2236         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
2237                 adapter->optics = IFM_10G_SR;
2238                 return;
2239         }
2240
2241         if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU) {
2242                 adapter->optics = IFM_10G_TWINAX;
2243                 return;
2244         }
2245
2246         if (layer & (IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
2247             IXGBE_PHYSICAL_LAYER_10GBASE_CX4)) {
2248                 adapter->optics = IFM_10G_CX4;
2249                 return;
2250         }
2251
2252         /* If we get here just set the default */
2253         adapter->optics = IFM_ETHER | IFM_AUTO;
2254         return;
2255 }
2256
2257 /*********************************************************************
2258  *
2259  *  Setup the Legacy or MSI Interrupt handler
2260  *
2261  **********************************************************************/
2262 static int
2263 ixgbe_allocate_legacy(struct adapter *adapter)
2264 {
2265         device_t        dev = adapter->dev;
2266         struct          ix_queue *que = adapter->queues;
2267 #ifndef IXGBE_LEGACY_TX
2268         struct tx_ring          *txr = adapter->tx_rings;
2269 #endif
2270         int             error, rid = 0;
2271
2272         /* MSI RID at 1 */
2273         if (adapter->msix == 1)
2274                 rid = 1;
2275
2276         /* We allocate a single interrupt resource */
2277         adapter->res = bus_alloc_resource_any(dev,
2278             SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
2279         if (adapter->res == NULL) {
2280                 device_printf(dev, "Unable to allocate bus resource: "
2281                     "interrupt\n");
2282                 return (ENXIO);
2283         }
2284
2285         /*
2286          * Try allocating a fast interrupt and the associated deferred
2287          * processing contexts.
2288          */
2289 #ifndef IXGBE_LEGACY_TX
2290         TASK_INIT(&txr->txq_task, 0, ixgbe_deferred_mq_start, txr);
2291 #endif
2292         TASK_INIT(&que->que_task, 0, ixgbe_handle_que, que);
2293         que->tq = taskqueue_create_fast("ixgbe_que", M_NOWAIT,
2294             taskqueue_thread_enqueue, &que->tq);
2295         taskqueue_start_threads(&que->tq, 1, PI_NET, "%s ixq",
2296             device_get_nameunit(adapter->dev));
2297
2298         /* Tasklets for Link, SFP and Multispeed Fiber */
2299         TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
2300         TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
2301         TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
2302         TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
2303 #ifdef IXGBE_FDIR
2304         TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
2305 #endif
2306         adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT,
2307             taskqueue_thread_enqueue, &adapter->tq);
2308         taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq",
2309             device_get_nameunit(adapter->dev));
2310
2311         if ((error = bus_setup_intr(dev, adapter->res,
2312             INTR_TYPE_NET | INTR_MPSAFE, NULL, ixgbe_legacy_irq,
2313             que, &adapter->tag)) != 0) {
2314                 device_printf(dev, "Failed to register fast interrupt "
2315                     "handler: %d\n", error);
2316                 taskqueue_free(que->tq);
2317                 taskqueue_free(adapter->tq);
2318                 que->tq = NULL;
2319                 adapter->tq = NULL;
2320                 return (error);
2321         }
2322         /* For simplicity in the handlers */
2323         adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
2324
2325         return (0);
2326 }
2327
2328
2329 /*********************************************************************
2330  *
2331  *  Setup MSIX Interrupt resources and handlers 
2332  *
2333  **********************************************************************/
2334 static int
2335 ixgbe_allocate_msix(struct adapter *adapter)
2336 {
2337         device_t        dev = adapter->dev;
2338         struct          ix_queue *que = adapter->queues;
2339         struct          tx_ring *txr = adapter->tx_rings;
2340         int             error, rid, vector = 0;
2341         int             cpu_id = 0;
2342 #ifdef  RSS
2343         cpuset_t        cpu_mask;
2344 #endif
2345
2346 #ifdef  RSS
2347         /*
2348          * If we're doing RSS, the number of queues needs to
2349          * match the number of RSS buckets that are configured.
2350          *
2351          * + If there's more queues than RSS buckets, we'll end
2352          *   up with queues that get no traffic.
2353          *
2354          * + If there's more RSS buckets than queues, we'll end
2355          *   up having multiple RSS buckets map to the same queue,
2356          *   so there'll be some contention.
2357          */
2358         if (adapter->num_queues != rss_getnumbuckets()) {
2359                 device_printf(dev,
2360                     "%s: number of queues (%d) != number of RSS buckets (%d)"
2361                     "; performance will be impacted.\n",
2362                     __func__,
2363                     adapter->num_queues,
2364                     rss_getnumbuckets());
2365         }
2366 #endif
2367
2368         for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
2369                 rid = vector + 1;
2370                 que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
2371                     RF_SHAREABLE | RF_ACTIVE);
2372                 if (que->res == NULL) {
2373                         device_printf(dev,"Unable to allocate"
2374                             " bus resource: que interrupt [%d]\n", vector);
2375                         return (ENXIO);
2376                 }
2377                 /* Set the handler function */
2378                 error = bus_setup_intr(dev, que->res,
2379                     INTR_TYPE_NET | INTR_MPSAFE, NULL,
2380                     ixgbe_msix_que, que, &que->tag);
2381                 if (error) {
2382                         que->res = NULL;
2383                         device_printf(dev, "Failed to register QUE handler");
2384                         return (error);
2385                 }
2386 #if __FreeBSD_version >= 800504
2387                 bus_describe_intr(dev, que->res, que->tag, "que %d", i);
2388 #endif
2389                 que->msix = vector;
2390                 adapter->active_queues |= (u64)(1 << que->msix);
2391 #ifdef  RSS
2392                 /*
2393                  * The queue ID is used as the RSS layer bucket ID.
2394                  * We look up the queue ID -> RSS CPU ID and select
2395                  * that.
2396                  */
2397                 cpu_id = rss_getcpu(i % rss_getnumbuckets());
2398 #else
2399                 /*
2400                  * Bind the msix vector, and thus the
2401                  * rings to the corresponding cpu.
2402                  *
2403                  * This just happens to match the default RSS round-robin
2404                  * bucket -> queue -> CPU allocation.
2405                  */
2406                 if (adapter->num_queues > 1)
2407                         cpu_id = i;
2408 #endif
2409                 if (adapter->num_queues > 1)
2410                         bus_bind_intr(dev, que->res, cpu_id);
2411 #ifdef IXGBE_DEBUG
2412 #ifdef  RSS
2413                 device_printf(dev,
2414                     "Bound RSS bucket %d to CPU %d\n",
2415                     i, cpu_id);
2416 #else
2417                 device_printf(dev,
2418                     "Bound queue %d to cpu %d\n",
2419                     i, cpu_id);
2420 #endif
2421 #endif /* IXGBE_DEBUG */
2422
2423
2424 #ifndef IXGBE_LEGACY_TX
2425                 TASK_INIT(&txr->txq_task, 0, ixgbe_deferred_mq_start, txr);
2426 #endif
2427                 TASK_INIT(&que->que_task, 0, ixgbe_handle_que, que);
2428                 que->tq = taskqueue_create_fast("ixgbe_que", M_NOWAIT,
2429                     taskqueue_thread_enqueue, &que->tq);
2430 #ifdef  RSS
2431                 CPU_SETOF(cpu_id, &cpu_mask);
2432                 taskqueue_start_threads_cpuset(&que->tq, 1, PI_NET,
2433                     &cpu_mask,
2434                     "%s (bucket %d)",
2435                     device_get_nameunit(adapter->dev),
2436                     cpu_id);
2437 #else
2438                 taskqueue_start_threads(&que->tq, 1, PI_NET, "%s que",
2439                     device_get_nameunit(adapter->dev));
2440 #endif
2441         }
2442
2443         /* and Link */
2444         rid = vector + 1;
2445         adapter->res = bus_alloc_resource_any(dev,
2446             SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
2447         if (!adapter->res) {
2448                 device_printf(dev,"Unable to allocate"
2449             " bus resource: Link interrupt [%d]\n", rid);
2450                 return (ENXIO);
2451         }
2452         /* Set the link handler function */
2453         error = bus_setup_intr(dev, adapter->res,
2454             INTR_TYPE_NET | INTR_MPSAFE, NULL,
2455             ixgbe_msix_link, adapter, &adapter->tag);
2456         if (error) {
2457                 adapter->res = NULL;
2458                 device_printf(dev, "Failed to register LINK handler");
2459                 return (error);
2460         }
2461 #if __FreeBSD_version >= 800504
2462         bus_describe_intr(dev, adapter->res, adapter->tag, "link");
2463 #endif
2464         adapter->vector = vector;
2465         /* Tasklets for Link, SFP and Multispeed Fiber */
2466         TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
2467         TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
2468         TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
2469 #ifdef PCI_IOV
2470         TASK_INIT(&adapter->mbx_task, 0, ixgbe_handle_mbx, adapter);
2471 #endif
2472         TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
2473 #ifdef IXGBE_FDIR
2474         TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
2475 #endif
2476         adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT,
2477             taskqueue_thread_enqueue, &adapter->tq);
2478         taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq",
2479             device_get_nameunit(adapter->dev));
2480
2481         return (0);
2482 }
2483
2484 /*
2485  * Setup Either MSI/X or MSI
2486  */
2487 static int
2488 ixgbe_setup_msix(struct adapter *adapter)
2489 {
2490         device_t dev = adapter->dev;
2491         int rid, want, queues, msgs;
2492
2493         /* Override by tuneable */
2494         if (ixgbe_enable_msix == 0)
2495                 goto msi;
2496
2497         /* First try MSI/X */
2498         msgs = pci_msix_count(dev); 
2499         if (msgs == 0)
2500                 goto msi;
2501         rid = PCIR_BAR(MSIX_82598_BAR);
2502         adapter->msix_mem = bus_alloc_resource_any(dev,
2503             SYS_RES_MEMORY, &rid, RF_ACTIVE);
2504         if (adapter->msix_mem == NULL) {
2505                 rid += 4;       /* 82599 maps in higher BAR */
2506                 adapter->msix_mem = bus_alloc_resource_any(dev,
2507                     SYS_RES_MEMORY, &rid, RF_ACTIVE);
2508         }
2509         if (adapter->msix_mem == NULL) {
2510                 /* May not be enabled */
2511                 device_printf(adapter->dev,
2512                     "Unable to map MSIX table \n");
2513                 goto msi;
2514         }
2515
2516         /* Figure out a reasonable auto config value */
2517         queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus;
2518
2519 #ifdef  RSS
2520         /* If we're doing RSS, clamp at the number of RSS buckets */
2521         if (queues > rss_getnumbuckets())
2522                 queues = rss_getnumbuckets();
2523 #endif
2524
2525         if (ixgbe_num_queues != 0)
2526                 queues = ixgbe_num_queues;
2527
2528         /* reflect correct sysctl value */
2529         ixgbe_num_queues = queues;
2530
2531         /*
2532         ** Want one vector (RX/TX pair) per queue
2533         ** plus an additional for Link.
2534         */
2535         want = queues + 1;
2536         if (msgs >= want)
2537                 msgs = want;
2538         else {
2539                 device_printf(adapter->dev,
2540                     "MSIX Configuration Problem, "
2541                     "%d vectors but %d queues wanted!\n",
2542                     msgs, want);
2543                 goto msi;
2544         }
2545         if ((pci_alloc_msix(dev, &msgs) == 0) && (msgs == want)) {
2546                 device_printf(adapter->dev,
2547                     "Using MSIX interrupts with %d vectors\n", msgs);
2548                 adapter->num_queues = queues;
2549                 return (msgs);
2550         }
2551         /*
2552         ** If MSIX alloc failed or provided us with
2553         ** less than needed, free and fall through to MSI
2554         */
2555         pci_release_msi(dev);
2556
2557 msi:
2558         if (adapter->msix_mem != NULL) {
2559                 bus_release_resource(dev, SYS_RES_MEMORY,
2560                     rid, adapter->msix_mem);
2561                 adapter->msix_mem = NULL;
2562         }
2563         msgs = 1;
2564         if (pci_alloc_msi(dev, &msgs) == 0) {
2565                 device_printf(adapter->dev,"Using an MSI interrupt\n");
2566                 return (msgs);
2567         }
2568         device_printf(adapter->dev,"Using a Legacy interrupt\n");
2569         return (0);
2570 }
2571
2572
2573 static int
2574 ixgbe_allocate_pci_resources(struct adapter *adapter)
2575 {
2576         int             rid;
2577         device_t        dev = adapter->dev;
2578
2579         rid = PCIR_BAR(0);
2580         adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
2581             &rid, RF_ACTIVE);
2582
2583         if (!(adapter->pci_mem)) {
2584                 device_printf(dev,"Unable to allocate bus resource: memory\n");
2585                 return (ENXIO);
2586         }
2587
2588         adapter->osdep.mem_bus_space_tag =
2589                 rman_get_bustag(adapter->pci_mem);
2590         adapter->osdep.mem_bus_space_handle =
2591                 rman_get_bushandle(adapter->pci_mem);
2592         adapter->hw.hw_addr = (u8 *) &adapter->osdep.mem_bus_space_handle;
2593
2594         /* Legacy defaults */
2595         adapter->num_queues = 1;
2596         adapter->hw.back = &adapter->osdep;
2597
2598         /*
2599         ** Now setup MSI or MSI/X, should
2600         ** return us the number of supported
2601         ** vectors. (Will be 1 for MSI)
2602         */
2603         adapter->msix = ixgbe_setup_msix(adapter);
2604         return (0);
2605 }
2606
2607 static void
2608 ixgbe_free_pci_resources(struct adapter * adapter)
2609 {
2610         struct          ix_queue *que = adapter->queues;
2611         device_t        dev = adapter->dev;
2612         int             rid, memrid;
2613
2614         if (adapter->hw.mac.type == ixgbe_mac_82598EB)
2615                 memrid = PCIR_BAR(MSIX_82598_BAR);
2616         else
2617                 memrid = PCIR_BAR(MSIX_82599_BAR);
2618
2619         /*
2620         ** There is a slight possibility of a failure mode
2621         ** in attach that will result in entering this function
2622         ** before interrupt resources have been initialized, and
2623         ** in that case we do not want to execute the loops below
2624         ** We can detect this reliably by the state of the adapter
2625         ** res pointer.
2626         */
2627         if (adapter->res == NULL)
2628                 goto mem;
2629
2630         /*
2631         **  Release all msix queue resources:
2632         */
2633         for (int i = 0; i < adapter->num_queues; i++, que++) {
2634                 rid = que->msix + 1;
2635                 if (que->tag != NULL) {
2636                         bus_teardown_intr(dev, que->res, que->tag);
2637                         que->tag = NULL;
2638                 }
2639                 if (que->res != NULL)
2640                         bus_release_resource(dev, SYS_RES_IRQ, rid, que->res);
2641         }
2642
2643
2644         /* Clean the Legacy or Link interrupt last */
2645         if (adapter->vector) /* we are doing MSIX */
2646                 rid = adapter->vector + 1;
2647         else
2648                 (adapter->msix != 0) ? (rid = 1):(rid = 0);
2649
2650         if (adapter->tag != NULL) {
2651                 bus_teardown_intr(dev, adapter->res, adapter->tag);
2652                 adapter->tag = NULL;
2653         }
2654         if (adapter->res != NULL)
2655                 bus_release_resource(dev, SYS_RES_IRQ, rid, adapter->res);
2656
2657 mem:
2658         if (adapter->msix)
2659                 pci_release_msi(dev);
2660
2661         if (adapter->msix_mem != NULL)
2662                 bus_release_resource(dev, SYS_RES_MEMORY,
2663                     memrid, adapter->msix_mem);
2664
2665         if (adapter->pci_mem != NULL)
2666                 bus_release_resource(dev, SYS_RES_MEMORY,
2667                     PCIR_BAR(0), adapter->pci_mem);
2668
2669         return;
2670 }
2671
2672 /*********************************************************************
2673  *
2674  *  Setup networking device structure and register an interface.
2675  *
2676  **********************************************************************/
2677 static int
2678 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
2679 {
2680         struct ifnet   *ifp;
2681
2682         INIT_DEBUGOUT("ixgbe_setup_interface: begin");
2683
2684         ifp = adapter->ifp = if_alloc(IFT_ETHER);
2685         if (ifp == NULL) {
2686                 device_printf(dev, "can not allocate ifnet structure\n");
2687                 return (-1);
2688         }
2689         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
2690         ifp->if_baudrate = IF_Gbps(10);
2691         ifp->if_init = ixgbe_init;
2692         ifp->if_softc = adapter;
2693         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2694         ifp->if_ioctl = ixgbe_ioctl;
2695 #if __FreeBSD_version >= 1100036
2696         if_setgetcounterfn(ifp, ixgbe_get_counter);
2697 #endif
2698 #if __FreeBSD_version >= 1100045
2699         /* TSO parameters */
2700         ifp->if_hw_tsomax = 65518;
2701         ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
2702         ifp->if_hw_tsomaxsegsize = 2048;
2703 #endif
2704 #ifndef IXGBE_LEGACY_TX
2705         ifp->if_transmit = ixgbe_mq_start;
2706         ifp->if_qflush = ixgbe_qflush;
2707 #else
2708         ifp->if_start = ixgbe_start;
2709         IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
2710         ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 2;
2711         IFQ_SET_READY(&ifp->if_snd);
2712 #endif
2713
2714         ether_ifattach(ifp, adapter->hw.mac.addr);
2715
2716         adapter->max_frame_size =
2717             ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
2718
2719         /*
2720          * Tell the upper layer(s) we support long frames.
2721          */
2722         ifp->if_hdrlen = sizeof(struct ether_vlan_header);
2723
2724         ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO | IFCAP_VLAN_HWCSUM;
2725         ifp->if_capabilities |= IFCAP_JUMBO_MTU;
2726         ifp->if_capabilities |= IFCAP_LRO;
2727         ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING
2728                              |  IFCAP_VLAN_HWTSO
2729                              |  IFCAP_VLAN_MTU
2730                              |  IFCAP_HWSTATS;
2731         ifp->if_capenable = ifp->if_capabilities;
2732
2733         /*
2734         ** Don't turn this on by default, if vlans are
2735         ** created on another pseudo device (eg. lagg)
2736         ** then vlan events are not passed thru, breaking
2737         ** operation, but with HW FILTER off it works. If
2738         ** using vlans directly on the ixgbe driver you can
2739         ** enable this and get full hardware tag filtering.
2740         */
2741         ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
2742
2743         /*
2744          * Specify the media types supported by this adapter and register
2745          * callbacks to update media and link information
2746          */
2747         ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
2748                     ixgbe_media_status);
2749
2750         ixgbe_add_media_types(adapter);
2751
2752         /* Autoselect media by default */
2753         ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2754
2755         return (0);
2756 }
2757
2758 static void
2759 ixgbe_add_media_types(struct adapter *adapter)
2760 {
2761         struct ixgbe_hw *hw = &adapter->hw;
2762         device_t dev = adapter->dev;
2763         int layer;
2764
2765         layer = adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
2766
2767         /* Media types with matching FreeBSD media defines */
2768         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
2769                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_T, 0, NULL);
2770         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
2771                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
2772         if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
2773                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX, 0, NULL);
2774         
2775         if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2776             layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2777                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0, NULL);
2778
2779         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2780                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
2781         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR)
2782                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
2783         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2784                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
2785         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2786                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
2787
2788         /*
2789         ** Other (no matching FreeBSD media type):
2790         ** To workaround this, we'll assign these completely
2791         ** inappropriate media types.
2792         */
2793         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
2794                 device_printf(dev, "Media supported: 10GbaseKR\n");
2795                 device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
2796                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
2797         }
2798         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
2799                 device_printf(dev, "Media supported: 10GbaseKX4\n");
2800                 device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
2801                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
2802         }
2803         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
2804                 device_printf(dev, "Media supported: 1000baseKX\n");
2805                 device_printf(dev, "1000baseKX mapped to 1000baseCX\n");
2806                 ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
2807         }
2808         if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX) {
2809                 /* Someday, someone will care about you... */
2810                 device_printf(dev, "Media supported: 1000baseBX\n");
2811         }
2812         
2813         if (hw->device_id == IXGBE_DEV_ID_82598AT) {
2814                 ifmedia_add(&adapter->media,
2815                     IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
2816                 ifmedia_add(&adapter->media,
2817                     IFM_ETHER | IFM_1000_T, 0, NULL);
2818         }
2819
2820         ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2821 }
2822
2823 static void
2824 ixgbe_config_link(struct adapter *adapter)
2825 {
2826         struct ixgbe_hw *hw = &adapter->hw;
2827         u32     autoneg, err = 0;
2828         bool    sfp, negotiate;
2829
2830         sfp = ixgbe_is_sfp(hw);
2831
2832         if (sfp) { 
2833                 if (hw->phy.multispeed_fiber) {
2834                         hw->mac.ops.setup_sfp(hw);
2835                         ixgbe_enable_tx_laser(hw);
2836                         taskqueue_enqueue(adapter->tq, &adapter->msf_task);
2837                 } else
2838                         taskqueue_enqueue(adapter->tq, &adapter->mod_task);
2839         } else {
2840                 if (hw->mac.ops.check_link)
2841                         err = ixgbe_check_link(hw, &adapter->link_speed,
2842                             &adapter->link_up, FALSE);
2843                 if (err)
2844                         goto out;
2845                 autoneg = hw->phy.autoneg_advertised;
2846                 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
2847                         err  = hw->mac.ops.get_link_capabilities(hw,
2848                             &autoneg, &negotiate);
2849                 if (err)
2850                         goto out;
2851                 if (hw->mac.ops.setup_link)
2852                         err = hw->mac.ops.setup_link(hw,
2853                             autoneg, adapter->link_up);
2854         }
2855 out:
2856         return;
2857 }
2858
2859
2860 /*********************************************************************
2861  *
2862  *  Enable transmit units.
2863  *
2864  **********************************************************************/
2865 static void
2866 ixgbe_initialize_transmit_units(struct adapter *adapter)
2867 {
2868         struct tx_ring  *txr = adapter->tx_rings;
2869         struct ixgbe_hw *hw = &adapter->hw;
2870
2871         /* Setup the Base and Length of the Tx Descriptor Ring */
2872
2873         for (int i = 0; i < adapter->num_queues; i++, txr++) {
2874                 u64     tdba = txr->txdma.dma_paddr;
2875                 u32     txctrl = 0;
2876                 int     j = txr->me;
2877
2878                 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
2879                        (tdba & 0x00000000ffffffffULL));
2880                 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
2881                 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
2882                     adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
2883
2884                 /* Setup the HW Tx Head and Tail descriptor pointers */
2885                 IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
2886                 IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
2887
2888                 /* Cache the tail address */
2889                 txr->tail = IXGBE_TDT(j);
2890
2891                 /* Disable Head Writeback */
2892                 switch (hw->mac.type) {
2893                 case ixgbe_mac_82598EB:
2894                         txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
2895                         break;
2896                 case ixgbe_mac_82599EB:
2897                 case ixgbe_mac_X540:
2898                 default:
2899                         txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
2900                         break;
2901                 }
2902                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
2903                 switch (hw->mac.type) {
2904                 case ixgbe_mac_82598EB:
2905                         IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
2906                         break;
2907                 case ixgbe_mac_82599EB:
2908                 case ixgbe_mac_X540:
2909                 default:
2910                         IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
2911                         break;
2912                 }
2913
2914         }
2915
2916         if (hw->mac.type != ixgbe_mac_82598EB) {
2917                 u32 dmatxctl, rttdcs;
2918 #ifdef PCI_IOV
2919                 enum ixgbe_iov_mode mode = ixgbe_get_iov_mode(adapter);
2920 #endif
2921                 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2922                 dmatxctl |= IXGBE_DMATXCTL_TE;
2923                 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
2924                 /* Disable arbiter to set MTQC */
2925                 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2926                 rttdcs |= IXGBE_RTTDCS_ARBDIS;
2927                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
2928 #ifdef PCI_IOV
2929                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, ixgbe_get_mtqc(mode));
2930 #else
2931                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
2932 #endif
2933                 rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
2934                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
2935         }
2936
2937         return;
2938 }
2939
2940 static void
2941 ixgbe_initialise_rss_mapping(struct adapter *adapter)
2942 {
2943         struct ixgbe_hw *hw = &adapter->hw;
2944         u32 reta = 0, mrqc, rss_key[10];
2945         int queue_id, table_size, index_mult;
2946 #ifdef  RSS
2947         u32 rss_hash_config;
2948 #endif
2949 #ifdef PCI_IOV
2950         enum ixgbe_iov_mode mode;
2951 #endif
2952
2953 #ifdef  RSS
2954         /* Fetch the configured RSS key */
2955         rss_getkey((uint8_t *) &rss_key);
2956 #else
2957         /* set up random bits */
2958         arc4rand(&rss_key, sizeof(rss_key), 0);
2959 #endif
2960
2961         /* Set multiplier for RETA setup and table size based on MAC */
2962         index_mult = 0x1;
2963         table_size = 128;
2964         switch (adapter->hw.mac.type) {
2965         case ixgbe_mac_82598EB:
2966                 index_mult = 0x11;
2967                 break;
2968         case ixgbe_mac_X550:
2969         case ixgbe_mac_X550EM_x:
2970                 table_size = 512;
2971                 break;
2972         default:
2973                 break;
2974         }
2975
2976         /* Set up the redirection table */
2977         for (int i = 0, j = 0; i < table_size; i++, j++) {
2978                 if (j == adapter->num_queues) j = 0;
2979 #ifdef  RSS
2980                 /*
2981                  * Fetch the RSS bucket id for the given indirection entry.
2982                  * Cap it at the number of configured buckets (which is
2983                  * num_queues.)
2984                  */
2985                 queue_id = rss_get_indirection_to_bucket(i);
2986                 queue_id = queue_id % adapter->num_queues;
2987 #else
2988                 queue_id = (j * index_mult);
2989 #endif
2990                 /*
2991                  * The low 8 bits are for hash value (n+0);
2992                  * The next 8 bits are for hash value (n+1), etc.
2993                  */
2994                 reta = reta >> 8;
2995                 reta = reta | ( ((uint32_t) queue_id) << 24);
2996                 if ((i & 3) == 3) {
2997                         if (i < 128)
2998                                 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
2999                         else
3000                                 IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32), reta);
3001                         reta = 0;
3002                 }
3003         }
3004
3005         /* Now fill our hash function seeds */
3006         for (int i = 0; i < 10; i++)
3007                 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
3008
3009         /* Perform hash on these packet types */
3010 #ifdef  RSS
3011         mrqc = IXGBE_MRQC_RSSEN;
3012         rss_hash_config = rss_gethashconfig();
3013         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
3014                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
3015         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
3016                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
3017         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
3018                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
3019         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
3020                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
3021         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
3022                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
3023         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
3024                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
3025         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
3026                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
3027         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4_EX)
3028                 device_printf(adapter->dev,
3029                     "%s: RSS_HASHTYPE_RSS_UDP_IPV4_EX defined, "
3030                     "but not supported\n", __func__);
3031         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
3032                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
3033         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
3034                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
3035 #else
3036         /*
3037          * Disable UDP - IP fragments aren't currently being handled
3038          * and so we end up with a mix of 2-tuple and 4-tuple
3039          * traffic.
3040          */
3041         mrqc = IXGBE_MRQC_RSSEN
3042              | IXGBE_MRQC_RSS_FIELD_IPV4
3043              | IXGBE_MRQC_RSS_FIELD_IPV4_TCP
3044              | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP
3045              | IXGBE_MRQC_RSS_FIELD_IPV6_EX
3046              | IXGBE_MRQC_RSS_FIELD_IPV6
3047              | IXGBE_MRQC_RSS_FIELD_IPV6_TCP
3048         ;
3049 #endif /* RSS */
3050 #ifdef PCI_IOV
3051         mode = ixgbe_get_iov_mode(adapter);
3052         mrqc |= ixgbe_get_mrqc(mode);
3053 #endif
3054         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
3055 }
3056
3057
3058 /*********************************************************************
3059  *
3060  *  Setup receive registers and features.
3061  *
3062  **********************************************************************/
3063 #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
3064
3065 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
3066         
3067 static void
3068 ixgbe_initialize_receive_units(struct adapter *adapter)
3069 {
3070         struct  rx_ring *rxr = adapter->rx_rings;
3071         struct ixgbe_hw *hw = &adapter->hw;
3072         struct ifnet   *ifp = adapter->ifp;
3073         u32             bufsz, fctrl, srrctl, rxcsum;
3074         u32             hlreg;
3075
3076
3077         /*
3078          * Make sure receives are disabled while
3079          * setting up the descriptor ring
3080          */
3081         ixgbe_disable_rx(hw);
3082
3083         /* Enable broadcasts */
3084         fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
3085         fctrl |= IXGBE_FCTRL_BAM;
3086         if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
3087                 fctrl |= IXGBE_FCTRL_DPF;
3088                 fctrl |= IXGBE_FCTRL_PMCF;
3089         }
3090         IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
3091
3092         /* Set for Jumbo Frames? */
3093         hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3094         if (ifp->if_mtu > ETHERMTU)
3095                 hlreg |= IXGBE_HLREG0_JUMBOEN;
3096         else
3097                 hlreg &= ~IXGBE_HLREG0_JUMBOEN;
3098 #ifdef DEV_NETMAP
3099         /* crcstrip is conditional in netmap (in RDRXCTL too ?) */
3100         if (ifp->if_capenable & IFCAP_NETMAP && !ix_crcstrip)
3101                 hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
3102         else
3103                 hlreg |= IXGBE_HLREG0_RXCRCSTRP;
3104 #endif /* DEV_NETMAP */
3105         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
3106
3107         bufsz = (adapter->rx_mbuf_sz +
3108             BSIZEPKT_ROUNDUP) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
3109
3110         for (int i = 0; i < adapter->num_queues; i++, rxr++) {
3111                 u64 rdba = rxr->rxdma.dma_paddr;
3112                 int j = rxr->me;
3113
3114                 /* Setup the Base and Length of the Rx Descriptor Ring */
3115                 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
3116                                (rdba & 0x00000000ffffffffULL));
3117                 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
3118                 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
3119                     adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3120
3121                 /* Set up the SRRCTL register */
3122                 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
3123                 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
3124                 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
3125                 srrctl |= bufsz;
3126                 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3127
3128                 /*
3129                  * Set DROP_EN iff we have no flow control and >1 queue.
3130                  * Note that srrctl was cleared shortly before during reset,
3131                  * so we do not need to clear the bit, but do it just in case
3132                  * this code is moved elsewhere.
3133                  */
3134                 if (adapter->num_queues > 1 &&
3135                     adapter->hw.fc.requested_mode == ixgbe_fc_none) {
3136                         srrctl |= IXGBE_SRRCTL_DROP_EN;
3137                 } else {
3138                         srrctl &= ~IXGBE_SRRCTL_DROP_EN;
3139                 }
3140
3141                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
3142
3143                 /* Setup the HW Rx Head and Tail Descriptor Pointers */
3144                 IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
3145                 IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
3146
3147                 /* Set the driver rx tail address */
3148                 rxr->tail =  IXGBE_RDT(rxr->me);
3149         }
3150
3151         if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
3152                 u32 psrtype = IXGBE_PSRTYPE_TCPHDR |
3153                               IXGBE_PSRTYPE_UDPHDR |
3154                               IXGBE_PSRTYPE_IPV4HDR |
3155                               IXGBE_PSRTYPE_IPV6HDR;
3156                 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
3157         }
3158
3159         rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
3160
3161         ixgbe_initialise_rss_mapping(adapter);
3162
3163         if (adapter->num_queues > 1) {
3164                 /* RSS and RX IPP Checksum are mutually exclusive */
3165                 rxcsum |= IXGBE_RXCSUM_PCSD;
3166         }
3167
3168         if (ifp->if_capenable & IFCAP_RXCSUM)
3169                 rxcsum |= IXGBE_RXCSUM_PCSD;
3170
3171         if (!(rxcsum & IXGBE_RXCSUM_PCSD))
3172                 rxcsum |= IXGBE_RXCSUM_IPPCSE;
3173
3174         IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
3175
3176         return;
3177 }
3178
3179
3180 /*
3181 ** This routine is run via an vlan config EVENT,
3182 ** it enables us to use the HW Filter table since
3183 ** we can get the vlan id. This just creates the
3184 ** entry in the soft version of the VFTA, init will
3185 ** repopulate the real table.
3186 */
3187 static void
3188 ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3189 {
3190         struct adapter  *adapter = ifp->if_softc;
3191         u16             index, bit;
3192
3193         if (ifp->if_softc !=  arg)   /* Not our event */
3194                 return;
3195
3196         if ((vtag == 0) || (vtag > 4095))       /* Invalid */
3197                 return;
3198
3199         IXGBE_CORE_LOCK(adapter);
3200         index = (vtag >> 5) & 0x7F;
3201         bit = vtag & 0x1F;
3202         adapter->shadow_vfta[index] |= (1 << bit);
3203         ++adapter->num_vlans;
3204         ixgbe_setup_vlan_hw_support(adapter);
3205         IXGBE_CORE_UNLOCK(adapter);
3206 }
3207
3208 /*
3209 ** This routine is run via an vlan
3210 ** unconfig EVENT, remove our entry
3211 ** in the soft vfta.
3212 */
3213 static void
3214 ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3215 {
3216         struct adapter  *adapter = ifp->if_softc;
3217         u16             index, bit;
3218
3219         if (ifp->if_softc !=  arg)
3220                 return;
3221
3222         if ((vtag == 0) || (vtag > 4095))       /* Invalid */
3223                 return;
3224
3225         IXGBE_CORE_LOCK(adapter);
3226         index = (vtag >> 5) & 0x7F;
3227         bit = vtag & 0x1F;
3228         adapter->shadow_vfta[index] &= ~(1 << bit);
3229         --adapter->num_vlans;
3230         /* Re-init to load the changes */
3231         ixgbe_setup_vlan_hw_support(adapter);
3232         IXGBE_CORE_UNLOCK(adapter);
3233 }
3234
3235 static void
3236 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
3237 {
3238         struct ifnet    *ifp = adapter->ifp;
3239         struct ixgbe_hw *hw = &adapter->hw;
3240         struct rx_ring  *rxr;
3241         u32             ctrl;
3242
3243
3244         /*
3245         ** We get here thru init_locked, meaning
3246         ** a soft reset, this has already cleared
3247         ** the VFTA and other state, so if there
3248         ** have been no vlan's registered do nothing.
3249         */
3250         if (adapter->num_vlans == 0)
3251                 return;
3252
3253         /* Setup the queues for vlans */
3254         for (int i = 0; i < adapter->num_queues; i++) {
3255                 rxr = &adapter->rx_rings[i];
3256                 /* On 82599 the VLAN enable is per/queue in RXDCTL */
3257                 if (hw->mac.type != ixgbe_mac_82598EB) {
3258                         ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
3259                         ctrl |= IXGBE_RXDCTL_VME;
3260                         IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
3261                 }
3262                 rxr->vtag_strip = TRUE;
3263         }
3264
3265         if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
3266                 return;
3267         /*
3268         ** A soft reset zero's out the VFTA, so
3269         ** we need to repopulate it now.
3270         */
3271         for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
3272                 if (adapter->shadow_vfta[i] != 0)
3273                         IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
3274                             adapter->shadow_vfta[i]);
3275
3276         ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
3277         /* Enable the Filter Table if enabled */
3278         if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) {
3279                 ctrl &= ~IXGBE_VLNCTRL_CFIEN;
3280                 ctrl |= IXGBE_VLNCTRL_VFE;
3281         }
3282         if (hw->mac.type == ixgbe_mac_82598EB)
3283                 ctrl |= IXGBE_VLNCTRL_VME;
3284         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
3285 }
3286
3287 static void
3288 ixgbe_enable_intr(struct adapter *adapter)
3289 {
3290         struct ixgbe_hw *hw = &adapter->hw;
3291         struct ix_queue *que = adapter->queues;
3292         u32             mask, fwsm;
3293
3294         mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3295         /* Enable Fan Failure detection */
3296         if (hw->device_id == IXGBE_DEV_ID_82598AT)
3297                     mask |= IXGBE_EIMS_GPI_SDP1;
3298
3299         switch (adapter->hw.mac.type) {
3300                 case ixgbe_mac_82599EB:
3301                         mask |= IXGBE_EIMS_ECC;
3302                         /* Temperature sensor on some adapters */
3303                         mask |= IXGBE_EIMS_GPI_SDP0;
3304                         /* SFP+ (RX_LOS_N & MOD_ABS_N) */
3305                         mask |= IXGBE_EIMS_GPI_SDP1;
3306                         mask |= IXGBE_EIMS_GPI_SDP2;
3307 #ifdef IXGBE_FDIR
3308                         mask |= IXGBE_EIMS_FLOW_DIR;
3309 #endif
3310 #ifdef PCI_IOV
3311                         mask |= IXGBE_EIMS_MAILBOX;
3312 #endif
3313                         break;
3314                 case ixgbe_mac_X540:
3315                         /* Detect if Thermal Sensor is enabled */
3316                         fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
3317                         if (fwsm & IXGBE_FWSM_TS_ENABLED)
3318                                 mask |= IXGBE_EIMS_TS;
3319                         mask |= IXGBE_EIMS_ECC;
3320 #ifdef IXGBE_FDIR
3321                         mask |= IXGBE_EIMS_FLOW_DIR;
3322 #endif
3323                         break;
3324                 case ixgbe_mac_X550:
3325                 case ixgbe_mac_X550EM_x:
3326                         /* MAC thermal sensor is automatically enabled */
3327                         mask |= IXGBE_EIMS_TS;
3328                         /* Some devices use SDP0 for important information */
3329                         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
3330                             hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
3331                                 mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
3332                         mask |= IXGBE_EIMS_ECC;
3333 #ifdef IXGBE_FDIR
3334                         mask |= IXGBE_EIMS_FLOW_DIR;
3335 #endif
3336 #ifdef PCI_IOV
3337                         mask |= IXGBE_EIMS_MAILBOX;
3338 #endif
3339                 /* falls through */
3340                 default:
3341                         break;
3342         }
3343
3344         IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3345
3346         /* With MSI-X we use auto clear */
3347         if (adapter->msix_mem) {
3348                 mask = IXGBE_EIMS_ENABLE_MASK;
3349                 /* Don't autoclear Link */
3350                 mask &= ~IXGBE_EIMS_OTHER;
3351                 mask &= ~IXGBE_EIMS_LSC;
3352 #ifdef PCI_IOV
3353                 mask &= ~IXGBE_EIMS_MAILBOX;
3354 #endif
3355                 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
3356         }
3357
3358         /*
3359         ** Now enable all queues, this is done separately to
3360         ** allow for handling the extended (beyond 32) MSIX
3361         ** vectors that can be used by 82599
3362         */
3363         for (int i = 0; i < adapter->num_queues; i++, que++)
3364                 ixgbe_enable_queue(adapter, que->msix);
3365
3366         IXGBE_WRITE_FLUSH(hw);
3367
3368         return;
3369 }
3370
3371 static void
3372 ixgbe_disable_intr(struct adapter *adapter)
3373 {
3374         if (adapter->msix_mem)
3375                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
3376         if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
3377                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
3378         } else {
3379                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
3380                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
3381                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
3382         }
3383         IXGBE_WRITE_FLUSH(&adapter->hw);
3384         return;
3385 }
3386
3387 /*
3388 ** Get the width and transaction speed of
3389 ** the slot this adapter is plugged into.
3390 */
3391 static void
3392 ixgbe_get_slot_info(struct ixgbe_hw *hw)
3393 {
3394         device_t                dev = ((struct ixgbe_osdep *)hw->back)->dev;
3395         struct ixgbe_mac_info   *mac = &hw->mac;
3396         u16                     link;
3397         u32                     offset;
3398
3399         /* For most devices simply call the shared code routine */
3400         if (hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) {
3401                 ixgbe_get_bus_info(hw);
3402                 /* These devices don't use PCI-E */
3403                 switch (hw->mac.type) {
3404                 case ixgbe_mac_X550EM_x:
3405                         return;
3406                 default:
3407                         goto display;
3408                 }
3409         }
3410
3411         /*
3412         ** For the Quad port adapter we need to parse back
3413         ** up the PCI tree to find the speed of the expansion
3414         ** slot into which this adapter is plugged. A bit more work.
3415         */
3416         dev = device_get_parent(device_get_parent(dev));
3417 #ifdef IXGBE_DEBUG
3418         device_printf(dev, "parent pcib = %x,%x,%x\n",
3419             pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
3420 #endif
3421         dev = device_get_parent(device_get_parent(dev));
3422 #ifdef IXGBE_DEBUG
3423         device_printf(dev, "slot pcib = %x,%x,%x\n",
3424             pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
3425 #endif
3426         /* Now get the PCI Express Capabilities offset */
3427         pci_find_cap(dev, PCIY_EXPRESS, &offset);
3428         /* ...and read the Link Status Register */
3429         link = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
3430         switch (link & IXGBE_PCI_LINK_WIDTH) {
3431         case IXGBE_PCI_LINK_WIDTH_1:
3432                 hw->bus.width = ixgbe_bus_width_pcie_x1;
3433                 break;
3434         case IXGBE_PCI_LINK_WIDTH_2:
3435                 hw->bus.width = ixgbe_bus_width_pcie_x2;
3436                 break;
3437         case IXGBE_PCI_LINK_WIDTH_4:
3438                 hw->bus.width = ixgbe_bus_width_pcie_x4;
3439                 break;
3440         case IXGBE_PCI_LINK_WIDTH_8:
3441                 hw->bus.width = ixgbe_bus_width_pcie_x8;
3442                 break;
3443         default:
3444                 hw->bus.width = ixgbe_bus_width_unknown;
3445                 break;
3446         }
3447
3448         switch (link & IXGBE_PCI_LINK_SPEED) {
3449         case IXGBE_PCI_LINK_SPEED_2500:
3450                 hw->bus.speed = ixgbe_bus_speed_2500;
3451                 break;
3452         case IXGBE_PCI_LINK_SPEED_5000:
3453                 hw->bus.speed = ixgbe_bus_speed_5000;
3454                 break;
3455         case IXGBE_PCI_LINK_SPEED_8000:
3456                 hw->bus.speed = ixgbe_bus_speed_8000;
3457                 break;
3458         default:
3459                 hw->bus.speed = ixgbe_bus_speed_unknown;
3460                 break;
3461         }
3462
3463         mac->ops.set_lan_id(hw);
3464
3465 display:
3466         device_printf(dev,"PCI Express Bus: Speed %s %s\n",
3467             ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s":
3468             (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s":
3469             (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s":"Unknown"),
3470             (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
3471             (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
3472             (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
3473             ("Unknown"));
3474
3475         if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
3476             ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
3477             (hw->bus.speed == ixgbe_bus_speed_2500))) {
3478                 device_printf(dev, "PCI-Express bandwidth available"
3479                     " for this card\n     is not sufficient for"
3480                     " optimal performance.\n");
3481                 device_printf(dev, "For optimal performance a x8 "
3482                     "PCIE, or x4 PCIE Gen2 slot is required.\n");
3483         }
3484         if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
3485             ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
3486             (hw->bus.speed < ixgbe_bus_speed_8000))) {
3487                 device_printf(dev, "PCI-Express bandwidth available"
3488                     " for this card\n     is not sufficient for"
3489                     " optimal performance.\n");
3490                 device_printf(dev, "For optimal performance a x8 "
3491                     "PCIE Gen3 slot is required.\n");
3492         }
3493
3494         return;
3495 }
3496
3497
3498 /*
3499 ** Setup the correct IVAR register for a particular MSIX interrupt
3500 **   (yes this is all very magic and confusing :)
3501 **  - entry is the register array entry
3502 **  - vector is the MSIX vector for this queue
3503 **  - type is RX/TX/MISC
3504 */
3505 static void
3506 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
3507 {
3508         struct ixgbe_hw *hw = &adapter->hw;
3509         u32 ivar, index;
3510
3511         vector |= IXGBE_IVAR_ALLOC_VAL;
3512
3513         switch (hw->mac.type) {
3514
3515         case ixgbe_mac_82598EB:
3516                 if (type == -1)
3517                         entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
3518                 else
3519                         entry += (type * 64);
3520                 index = (entry >> 2) & 0x1F;
3521                 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
3522                 ivar &= ~(0xFF << (8 * (entry & 0x3)));
3523                 ivar |= (vector << (8 * (entry & 0x3)));
3524                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
3525                 break;
3526
3527         case ixgbe_mac_82599EB:
3528         case ixgbe_mac_X540:
3529         case ixgbe_mac_X550:
3530         case ixgbe_mac_X550EM_x:
3531                 if (type == -1) { /* MISC IVAR */
3532                         index = (entry & 1) * 8;
3533                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
3534                         ivar &= ~(0xFF << index);
3535                         ivar |= (vector << index);
3536                         IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
3537                 } else {        /* RX/TX IVARS */
3538                         index = (16 * (entry & 1)) + (8 * type);
3539                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
3540                         ivar &= ~(0xFF << index);
3541                         ivar |= (vector << index);
3542                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
3543                 }
3544
3545         default:
3546                 break;
3547         }
3548 }
3549
3550 static void
3551 ixgbe_configure_ivars(struct adapter *adapter)
3552 {
3553         struct  ix_queue        *que = adapter->queues;
3554         u32                     newitr;
3555
3556         if (ixgbe_max_interrupt_rate > 0)
3557                 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
3558         else {
3559                 /*
3560                 ** Disable DMA coalescing if interrupt moderation is
3561                 ** disabled.
3562                 */
3563                 adapter->dmac = 0;
3564                 newitr = 0;
3565         }
3566
3567         for (int i = 0; i < adapter->num_queues; i++, que++) {
3568                 struct rx_ring *rxr = &adapter->rx_rings[i];
3569                 struct tx_ring *txr = &adapter->tx_rings[i];
3570                 /* First the RX queue entry */
3571                 ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
3572                 /* ... and the TX */
3573                 ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
3574                 /* Set an Initial EITR value */
3575                 IXGBE_WRITE_REG(&adapter->hw,
3576                     IXGBE_EITR(que->msix), newitr);
3577         }
3578
3579         /* For the Link interrupt */
3580         ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
3581 }
3582
3583 /*
3584 ** ixgbe_sfp_probe - called in the local timer to
3585 ** determine if a port had optics inserted.
3586 */  
3587 static bool
3588 ixgbe_sfp_probe(struct adapter *adapter)
3589 {
3590         struct ixgbe_hw *hw = &adapter->hw;
3591         device_t        dev = adapter->dev;
3592         bool            result = FALSE;
3593
3594         if ((hw->phy.type == ixgbe_phy_nl) &&
3595             (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
3596                 s32 ret = hw->phy.ops.identify_sfp(hw);
3597                 if (ret)
3598                         goto out;
3599                 ret = hw->phy.ops.reset(hw);
3600                 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3601                         device_printf(dev,"Unsupported SFP+ module detected!");
3602                         printf(" Reload driver with supported module.\n");
3603                         adapter->sfp_probe = FALSE;
3604                         goto out;
3605                 } else
3606                         device_printf(dev,"SFP+ module detected!\n");
3607                 /* We now have supported optics */
3608                 adapter->sfp_probe = FALSE;
3609                 /* Set the optics type so system reports correctly */
3610                 ixgbe_setup_optics(adapter);
3611                 result = TRUE;
3612         }
3613 out:
3614         return (result);
3615 }
3616
3617 /*
3618 ** Tasklet handler for MSIX Link interrupts
3619 **  - do outside interrupt since it might sleep
3620 */
3621 static void
3622 ixgbe_handle_link(void *context, int pending)
3623 {
3624         struct adapter  *adapter = context;
3625
3626         ixgbe_check_link(&adapter->hw,
3627             &adapter->link_speed, &adapter->link_up, 0);
3628         ixgbe_update_link_status(adapter);
3629 }
3630
3631 /*
3632 ** Tasklet for handling SFP module interrupts
3633 */
3634 static void
3635 ixgbe_handle_mod(void *context, int pending)
3636 {
3637         struct adapter  *adapter = context;
3638         struct ixgbe_hw *hw = &adapter->hw;
3639         device_t        dev = adapter->dev;
3640         u32 err;
3641
3642         err = hw->phy.ops.identify_sfp(hw);
3643         if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3644                 device_printf(dev,
3645                     "Unsupported SFP+ module type was detected.\n");
3646                 return;
3647         }
3648
3649         err = hw->mac.ops.setup_sfp(hw);
3650         if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3651                 device_printf(dev,
3652                     "Setup failure - unsupported SFP+ module type.\n");
3653                 return;
3654         }
3655         taskqueue_enqueue(adapter->tq, &adapter->msf_task);
3656         return;
3657 }
3658
3659
3660 /*
3661 ** Tasklet for handling MSF (multispeed fiber) interrupts
3662 */
3663 static void
3664 ixgbe_handle_msf(void *context, int pending)
3665 {
3666         struct adapter  *adapter = context;
3667         struct ixgbe_hw *hw = &adapter->hw;
3668         u32 autoneg;
3669         bool negotiate;
3670         int err;
3671
3672         err = hw->phy.ops.identify_sfp(hw);
3673         if (!err) {
3674                 ixgbe_setup_optics(adapter);
3675                 INIT_DEBUGOUT1("ixgbe_sfp_probe: flags: %X\n", adapter->optics);
3676         }
3677
3678         autoneg = hw->phy.autoneg_advertised;
3679         if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
3680                 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
3681         if (hw->mac.ops.setup_link)
3682                 hw->mac.ops.setup_link(hw, autoneg, TRUE);
3683
3684         ifmedia_removeall(&adapter->media);
3685         ixgbe_add_media_types(adapter);
3686         return;
3687 }
3688
3689 /*
3690 ** Tasklet for handling interrupts from an external PHY
3691 */
3692 static void
3693 ixgbe_handle_phy(void *context, int pending)
3694 {
3695         struct adapter  *adapter = context;
3696         struct ixgbe_hw *hw = &adapter->hw;
3697         int error;
3698
3699         error = hw->phy.ops.handle_lasi(hw);
3700         if (error == IXGBE_ERR_OVERTEMP)
3701                 device_printf(adapter->dev,
3702                     "CRITICAL: EXTERNAL PHY OVER TEMP!! "
3703                     " PHY will downshift to lower power state!\n");
3704         else if (error)
3705                 device_printf(adapter->dev,
3706                     "Error handling LASI interrupt: %d\n",
3707                     error);
3708         return;
3709 }
3710
3711 #ifdef IXGBE_FDIR
3712 /*
3713 ** Tasklet for reinitializing the Flow Director filter table
3714 */
3715 static void
3716 ixgbe_reinit_fdir(void *context, int pending)
3717 {
3718         struct adapter  *adapter = context;
3719         struct ifnet   *ifp = adapter->ifp;
3720
3721         if (adapter->fdir_reinit != 1) /* Shouldn't happen */
3722                 return;
3723         ixgbe_reinit_fdir_tables_82599(&adapter->hw);
3724         adapter->fdir_reinit = 0;
3725         /* re-enable flow director interrupts */
3726         IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_FLOW_DIR);
3727         /* Restart the interface */
3728         ifp->if_drv_flags |= IFF_DRV_RUNNING;
3729         return;
3730 }
3731 #endif
3732
3733 /*********************************************************************
3734  *
3735  *  Configure DMA Coalescing
3736  *
3737  **********************************************************************/
3738 static void
3739 ixgbe_config_dmac(struct adapter *adapter)
3740 {
3741         struct ixgbe_hw *hw = &adapter->hw;
3742         struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
3743
3744         if (hw->mac.type < ixgbe_mac_X550 ||
3745             !hw->mac.ops.dmac_config)
3746                 return;
3747
3748         if (dcfg->watchdog_timer ^ adapter->dmac ||
3749             dcfg->link_speed ^ adapter->link_speed) {
3750                 dcfg->watchdog_timer = adapter->dmac;
3751                 dcfg->fcoe_en = false;
3752                 dcfg->link_speed = adapter->link_speed;
3753                 dcfg->num_tcs = 1;
3754                 
3755                 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
3756                     dcfg->watchdog_timer, dcfg->link_speed);
3757
3758                 hw->mac.ops.dmac_config(hw);
3759         }
3760 }
3761
3762 /*
3763  * Checks whether the adapter supports Energy Efficient Ethernet
3764  * or not, based on device ID.
3765  */
3766 static void
3767 ixgbe_check_eee_support(struct adapter *adapter)
3768 {
3769         struct ixgbe_hw *hw = &adapter->hw;
3770
3771         adapter->eee_enabled = !!(hw->mac.ops.setup_eee);
3772 }
3773
3774 /*
3775  * Checks whether the adapter's ports are capable of
3776  * Wake On LAN by reading the adapter's NVM.
3777  *
3778  * Sets each port's hw->wol_enabled value depending
3779  * on the value read here.
3780  */
3781 static void
3782 ixgbe_check_wol_support(struct adapter *adapter)
3783 {
3784         struct ixgbe_hw *hw = &adapter->hw;
3785         u16 dev_caps = 0;
3786
3787         /* Find out WoL support for port */
3788         adapter->wol_support = hw->wol_enabled = 0;
3789         ixgbe_get_device_caps(hw, &dev_caps);
3790         if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
3791             ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
3792                 hw->bus.func == 0))
3793             adapter->wol_support = hw->wol_enabled = 1;
3794
3795         /* Save initial wake up filter configuration */
3796         adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
3797
3798         return;
3799 }
3800
3801 /*
3802  * Prepare the adapter/port for LPLU and/or WoL
3803  */
3804 static int
3805 ixgbe_setup_low_power_mode(struct adapter *adapter)
3806 {
3807         struct ixgbe_hw *hw = &adapter->hw;
3808         device_t dev = adapter->dev;
3809         s32 error = 0;
3810
3811         mtx_assert(&adapter->core_mtx, MA_OWNED);
3812
3813         /* Limit power management flow to X550EM baseT */
3814         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T
3815             && hw->phy.ops.enter_lplu) {
3816                 /* Turn off support for APM wakeup. (Using ACPI instead) */
3817                 IXGBE_WRITE_REG(hw, IXGBE_GRC,
3818                     IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
3819
3820                 /*
3821                  * Clear Wake Up Status register to prevent any previous wakeup
3822                  * events from waking us up immediately after we suspend.
3823                  */
3824                 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3825
3826                 /*
3827                  * Program the Wakeup Filter Control register with user filter
3828                  * settings
3829                  */
3830                 IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
3831
3832                 /* Enable wakeups and power management in Wakeup Control */
3833                 IXGBE_WRITE_REG(hw, IXGBE_WUC,
3834                     IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
3835
3836                 /* X550EM baseT adapters need a special LPLU flow */
3837                 hw->phy.reset_disable = true;
3838                 ixgbe_stop(adapter);
3839                 error = hw->phy.ops.enter_lplu(hw);
3840                 if (error)
3841                         device_printf(dev,
3842                             "Error entering LPLU: %d\n", error);
3843                 hw->phy.reset_disable = false;
3844         } else {
3845                 /* Just stop for other adapters */
3846                 ixgbe_stop(adapter);
3847         }
3848
3849         return error;
3850 }
3851
3852 /**********************************************************************
3853  *
3854  *  Update the board statistics counters.
3855  *
3856  **********************************************************************/
3857 static void
3858 ixgbe_update_stats_counters(struct adapter *adapter)
3859 {
3860         struct ixgbe_hw *hw = &adapter->hw;
3861         u32 missed_rx = 0, bprc, lxon, lxoff, total;
3862         u64 total_missed_rx = 0;
3863
3864         adapter->stats.pf.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
3865         adapter->stats.pf.illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
3866         adapter->stats.pf.errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC);
3867         adapter->stats.pf.mspdc += IXGBE_READ_REG(hw, IXGBE_MSPDC);
3868
3869         for (int i = 0; i < 16; i++) {
3870                 adapter->stats.pf.qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
3871                 adapter->stats.pf.qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
3872                 adapter->stats.pf.qprdc[i] += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
3873         }
3874         adapter->stats.pf.mlfc += IXGBE_READ_REG(hw, IXGBE_MLFC);
3875         adapter->stats.pf.mrfc += IXGBE_READ_REG(hw, IXGBE_MRFC);
3876         adapter->stats.pf.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
3877
3878         /* Hardware workaround, gprc counts missed packets */
3879         adapter->stats.pf.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
3880         adapter->stats.pf.gprc -= missed_rx;
3881
3882         if (hw->mac.type != ixgbe_mac_82598EB) {
3883                 adapter->stats.pf.gorc += IXGBE_READ_REG(hw, IXGBE_GORCL) +
3884                     ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
3885                 adapter->stats.pf.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
3886                     ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32);
3887                 adapter->stats.pf.tor += IXGBE_READ_REG(hw, IXGBE_TORL) +
3888                     ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
3889                 adapter->stats.pf.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
3890                 adapter->stats.pf.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
3891         } else {
3892                 adapter->stats.pf.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
3893                 adapter->stats.pf.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
3894                 /* 82598 only has a counter in the high register */
3895                 adapter->stats.pf.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
3896                 adapter->stats.pf.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
3897                 adapter->stats.pf.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
3898         }
3899
3900         /*
3901          * Workaround: mprc hardware is incorrectly counting
3902          * broadcasts, so for now we subtract those.
3903          */
3904         bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
3905         adapter->stats.pf.bprc += bprc;
3906         adapter->stats.pf.mprc += IXGBE_READ_REG(hw, IXGBE_MPRC);
3907         if (hw->mac.type == ixgbe_mac_82598EB)
3908                 adapter->stats.pf.mprc -= bprc;
3909
3910         adapter->stats.pf.prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64);
3911         adapter->stats.pf.prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127);
3912         adapter->stats.pf.prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255);
3913         adapter->stats.pf.prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511);
3914         adapter->stats.pf.prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023);
3915         adapter->stats.pf.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
3916
3917         lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
3918         adapter->stats.pf.lxontxc += lxon;
3919         lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
3920         adapter->stats.pf.lxofftxc += lxoff;
3921         total = lxon + lxoff;
3922
3923         adapter->stats.pf.gptc += IXGBE_READ_REG(hw, IXGBE_GPTC);
3924         adapter->stats.pf.mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
3925         adapter->stats.pf.ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64);
3926         adapter->stats.pf.gptc -= total;
3927         adapter->stats.pf.mptc -= total;
3928         adapter->stats.pf.ptc64 -= total;
3929         adapter->stats.pf.gotc -= total * ETHER_MIN_LEN;
3930
3931         adapter->stats.pf.ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
3932         adapter->stats.pf.rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
3933         adapter->stats.pf.roc += IXGBE_READ_REG(hw, IXGBE_ROC);
3934         adapter->stats.pf.rjc += IXGBE_READ_REG(hw, IXGBE_RJC);
3935         adapter->stats.pf.mngprc += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
3936         adapter->stats.pf.mngpdc += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
3937         adapter->stats.pf.mngptc += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
3938         adapter->stats.pf.tpr += IXGBE_READ_REG(hw, IXGBE_TPR);
3939         adapter->stats.pf.tpt += IXGBE_READ_REG(hw, IXGBE_TPT);
3940         adapter->stats.pf.ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127);
3941         adapter->stats.pf.ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255);
3942         adapter->stats.pf.ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511);
3943         adapter->stats.pf.ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023);
3944         adapter->stats.pf.ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522);
3945         adapter->stats.pf.bptc += IXGBE_READ_REG(hw, IXGBE_BPTC);
3946         adapter->stats.pf.xec += IXGBE_READ_REG(hw, IXGBE_XEC);
3947         adapter->stats.pf.fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC);
3948         adapter->stats.pf.fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST);
3949         /* Only read FCOE on 82599 */
3950         if (hw->mac.type != ixgbe_mac_82598EB) {
3951                 adapter->stats.pf.fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
3952                 adapter->stats.pf.fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
3953                 adapter->stats.pf.fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
3954                 adapter->stats.pf.fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
3955                 adapter->stats.pf.fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
3956         }
3957
3958         /* Fill out the OS statistics structure */
3959         IXGBE_SET_IPACKETS(adapter, adapter->stats.pf.gprc);
3960         IXGBE_SET_OPACKETS(adapter, adapter->stats.pf.gptc);
3961         IXGBE_SET_IBYTES(adapter, adapter->stats.pf.gorc);
3962         IXGBE_SET_OBYTES(adapter, adapter->stats.pf.gotc);
3963         IXGBE_SET_IMCASTS(adapter, adapter->stats.pf.mprc);
3964         IXGBE_SET_OMCASTS(adapter, adapter->stats.pf.mptc);
3965         IXGBE_SET_COLLISIONS(adapter, 0);
3966         IXGBE_SET_IQDROPS(adapter, total_missed_rx);
3967         IXGBE_SET_IERRORS(adapter, adapter->stats.pf.crcerrs
3968             + adapter->stats.pf.rlec);
3969 }
3970
3971 #if __FreeBSD_version >= 1100036
3972 static uint64_t
3973 ixgbe_get_counter(struct ifnet *ifp, ift_counter cnt)
3974 {
3975         struct adapter *adapter;
3976         struct tx_ring *txr;
3977         uint64_t rv;
3978
3979         adapter = if_getsoftc(ifp);
3980
3981         switch (cnt) {
3982         case IFCOUNTER_IPACKETS:
3983                 return (adapter->ipackets);
3984         case IFCOUNTER_OPACKETS:
3985                 return (adapter->opackets);
3986         case IFCOUNTER_IBYTES:
3987                 return (adapter->ibytes);
3988         case IFCOUNTER_OBYTES:
3989                 return (adapter->obytes);
3990         case IFCOUNTER_IMCASTS:
3991                 return (adapter->imcasts);
3992         case IFCOUNTER_OMCASTS:
3993                 return (adapter->omcasts);
3994         case IFCOUNTER_COLLISIONS:
3995                 return (0);
3996         case IFCOUNTER_IQDROPS:
3997                 return (adapter->iqdrops);
3998         case IFCOUNTER_OQDROPS:
3999                 rv = 0;
4000                 txr = adapter->tx_rings;
4001                 for (int i = 0; i < adapter->num_queues; i++, txr++)
4002                         rv += txr->br->br_drops;
4003                 return (rv);
4004         case IFCOUNTER_IERRORS:
4005                 return (adapter->ierrors);
4006         default:
4007                 return (if_get_counter_default(ifp, cnt));
4008         }
4009 }
4010 #endif
4011
4012 /** ixgbe_sysctl_tdh_handler - Handler function
4013  *  Retrieves the TDH value from the hardware
4014  */
4015 static int 
4016 ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS)
4017 {
4018         int error;
4019
4020         struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
4021         if (!txr) return 0;
4022
4023         unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
4024         error = sysctl_handle_int(oidp, &val, 0, req);
4025         if (error || !req->newptr)
4026                 return error;
4027         return 0;
4028 }
4029
4030 /** ixgbe_sysctl_tdt_handler - Handler function
4031  *  Retrieves the TDT value from the hardware
4032  */
4033 static int 
4034 ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS)
4035 {
4036         int error;
4037
4038         struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
4039         if (!txr) return 0;
4040
4041         unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
4042         error = sysctl_handle_int(oidp, &val, 0, req);
4043         if (error || !req->newptr)
4044                 return error;
4045         return 0;
4046 }
4047
4048 /** ixgbe_sysctl_rdh_handler - Handler function
4049  *  Retrieves the RDH value from the hardware
4050  */
4051 static int 
4052 ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS)
4053 {
4054         int error;
4055
4056         struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
4057         if (!rxr) return 0;
4058
4059         unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
4060         error = sysctl_handle_int(oidp, &val, 0, req);
4061         if (error || !req->newptr)
4062                 return error;
4063         return 0;
4064 }
4065
4066 /** ixgbe_sysctl_rdt_handler - Handler function
4067  *  Retrieves the RDT value from the hardware
4068  */
4069 static int 
4070 ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS)
4071 {
4072         int error;
4073
4074         struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
4075         if (!rxr) return 0;
4076
4077         unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
4078         error = sysctl_handle_int(oidp, &val, 0, req);
4079         if (error || !req->newptr)
4080                 return error;
4081         return 0;
4082 }
4083
4084 static int
4085 ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
4086 {
4087         int error;
4088         struct ix_queue *que = ((struct ix_queue *)oidp->oid_arg1);
4089         unsigned int reg, usec, rate;
4090
4091         reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
4092         usec = ((reg & 0x0FF8) >> 3);
4093         if (usec > 0)
4094                 rate = 500000 / usec;
4095         else
4096                 rate = 0;
4097         error = sysctl_handle_int(oidp, &rate, 0, req);
4098         if (error || !req->newptr)
4099                 return error;
4100         reg &= ~0xfff; /* default, no limitation */
4101         ixgbe_max_interrupt_rate = 0;
4102         if (rate > 0 && rate < 500000) {
4103                 if (rate < 1000)
4104                         rate = 1000;
4105                 ixgbe_max_interrupt_rate = rate;
4106                 reg |= ((4000000/rate) & 0xff8 );
4107         }
4108         IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
4109         return 0;
4110 }
4111
4112 static void
4113 ixgbe_add_device_sysctls(struct adapter *adapter)
4114 {
4115         device_t dev = adapter->dev;
4116         struct ixgbe_hw *hw = &adapter->hw;
4117         struct sysctl_oid_list *child;
4118         struct sysctl_ctx_list *ctx;
4119
4120         ctx = device_get_sysctl_ctx(dev);
4121         child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
4122
4123         /* Sysctls for all devices */
4124         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fc",
4125                         CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4126                         ixgbe_set_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
4127
4128         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "enable_aim",
4129                         CTLFLAG_RW,
4130                         &ixgbe_enable_aim, 1, "Interrupt Moderation");
4131
4132         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "advertise_speed",
4133                         CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4134                         ixgbe_set_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
4135
4136         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "thermal_test",
4137                         CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4138                         ixgbe_sysctl_thermal_test, "I", "Thermal Test");
4139
4140         /* for X550 devices */
4141         if (hw->mac.type >= ixgbe_mac_X550)
4142                 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "dmac",
4143                                 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4144                                 ixgbe_sysctl_dmac, "I", "DMA Coalesce");
4145
4146         /* for X550T and X550EM backplane devices */
4147         if (hw->mac.ops.setup_eee) {
4148                 struct sysctl_oid *eee_node;
4149                 struct sysctl_oid_list *eee_list;
4150
4151                 eee_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "eee",
4152                                            CTLFLAG_RD, NULL,
4153                                            "Energy Efficient Ethernet sysctls");
4154                 eee_list = SYSCTL_CHILDREN(eee_node);
4155
4156                 SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "enable",
4157                                 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4158                                 ixgbe_sysctl_eee_enable, "I",
4159                                 "Enable or Disable EEE");
4160
4161                 SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "negotiated",
4162                                 CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
4163                                 ixgbe_sysctl_eee_negotiated, "I",
4164                                 "EEE negotiated on link");
4165
4166                 SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "tx_lpi_status",
4167                                 CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
4168                                 ixgbe_sysctl_eee_tx_lpi_status, "I",
4169                                 "Whether or not TX link is in LPI state");
4170
4171                 SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "rx_lpi_status",
4172                                 CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
4173                                 ixgbe_sysctl_eee_rx_lpi_status, "I",
4174                                 "Whether or not RX link is in LPI state");
4175         }
4176
4177         /* for certain 10GBaseT devices */
4178         if (hw->device_id == IXGBE_DEV_ID_X550T ||
4179             hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
4180                 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wol_enable",
4181                                 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4182                                 ixgbe_sysctl_wol_enable, "I",
4183                                 "Enable/Disable Wake on LAN");
4184
4185                 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wufc",
4186                                 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
4187                                 ixgbe_sysctl_wufc, "I",
4188                                 "Enable/Disable Wake Up Filters");
4189         }
4190
4191         /* for X550EM 10GBaseT devices */
4192         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
4193                 struct sysctl_oid *phy_node;
4194                 struct sysctl_oid_list *phy_list;
4195
4196                 phy_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "phy",
4197                                            CTLFLAG_RD, NULL,
4198                                            "External PHY sysctls");
4199                 phy_list = SYSCTL_CHILDREN(phy_node);
4200
4201                 SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "temp",
4202                                 CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
4203                                 ixgbe_sysctl_phy_temp, "I",
4204                                 "Current External PHY Temperature (Celsius)");
4205
4206                 SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "overtemp_occurred",
4207                                 CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
4208                                 ixgbe_sysctl_phy_overtemp_occurred, "I",
4209                                 "External PHY High Temperature Event Occurred");
4210         }
4211 }
4212
4213 /*
4214  * Add sysctl variables, one per statistic, to the system.
4215  */
4216 static void
4217 ixgbe_add_hw_stats(struct adapter *adapter)
4218 {
4219         device_t dev = adapter->dev;
4220
4221         struct tx_ring *txr = adapter->tx_rings;
4222         struct rx_ring *rxr = adapter->rx_rings;
4223
4224         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
4225         struct sysctl_oid *tree = device_get_sysctl_tree(dev);
4226         struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
4227         struct ixgbe_hw_stats *stats = &adapter->stats.pf;
4228
4229         struct sysctl_oid *stat_node, *queue_node;
4230         struct sysctl_oid_list *stat_list, *queue_list;
4231
4232 #define QUEUE_NAME_LEN 32
4233         char namebuf[QUEUE_NAME_LEN];
4234
4235         /* Driver Statistics */
4236         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
4237                         CTLFLAG_RD, &adapter->dropped_pkts,
4238                         "Driver dropped packets");
4239         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_defrag_failed",
4240                         CTLFLAG_RD, &adapter->mbuf_defrag_failed,
4241                         "m_defrag() failed");
4242         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
4243                         CTLFLAG_RD, &adapter->watchdog_events,
4244                         "Watchdog timeouts");
4245         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
4246                         CTLFLAG_RD, &adapter->link_irq,
4247                         "Link MSIX IRQ Handled");
4248
4249         for (int i = 0; i < adapter->num_queues; i++, txr++) {
4250                 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
4251                 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
4252                                             CTLFLAG_RD, NULL, "Queue Name");
4253                 queue_list = SYSCTL_CHILDREN(queue_node);
4254
4255                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "interrupt_rate",
4256                                 CTLTYPE_UINT | CTLFLAG_RW, &adapter->queues[i],
4257                                 sizeof(&adapter->queues[i]),
4258                                 ixgbe_sysctl_interrupt_rate_handler, "IU",
4259                                 "Interrupt Rate");
4260                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
4261                                 CTLFLAG_RD, &(adapter->queues[i].irqs),
4262                                 "irqs on this queue");
4263                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head", 
4264                                 CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
4265                                 ixgbe_sysctl_tdh_handler, "IU",
4266                                 "Transmit Descriptor Head");
4267                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail", 
4268                                 CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
4269                                 ixgbe_sysctl_tdt_handler, "IU",
4270                                 "Transmit Descriptor Tail");
4271                 SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "tso_tx",
4272                                 CTLFLAG_RD, &txr->tso_tx,
4273                                 "TSO");
4274                 SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "no_tx_dma_setup",
4275                                 CTLFLAG_RD, &txr->no_tx_dma_setup,
4276                                 "Driver tx dma failure in xmit");
4277                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "no_desc_avail",
4278                                 CTLFLAG_RD, &txr->no_desc_avail,
4279                                 "Queue No Descriptor Available");
4280                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
4281                                 CTLFLAG_RD, &txr->total_packets,
4282                                 "Queue Packets Transmitted");
4283                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "br_drops",
4284                                 CTLFLAG_RD, &txr->br->br_drops,
4285                                 "Packets dropped in buf_ring");
4286         }
4287
4288         for (int i = 0; i < adapter->num_queues; i++, rxr++) {
4289                 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
4290                 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, 
4291                                             CTLFLAG_RD, NULL, "Queue Name");
4292                 queue_list = SYSCTL_CHILDREN(queue_node);
4293
4294                 struct lro_ctrl *lro = &rxr->lro;
4295
4296                 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
4297                 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, 
4298                                             CTLFLAG_RD, NULL, "Queue Name");
4299                 queue_list = SYSCTL_CHILDREN(queue_node);
4300
4301                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head", 
4302                                 CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
4303                                 ixgbe_sysctl_rdh_handler, "IU",
4304                                 "Receive Descriptor Head");
4305                 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail", 
4306                                 CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
4307                                 ixgbe_sysctl_rdt_handler, "IU",
4308                                 "Receive Descriptor Tail");
4309                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
4310                                 CTLFLAG_RD, &rxr->rx_packets,
4311                                 "Queue Packets Received");
4312                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
4313                                 CTLFLAG_RD, &rxr->rx_bytes,
4314                                 "Queue Bytes Received");
4315                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_copies",
4316                                 CTLFLAG_RD, &rxr->rx_copies,
4317                                 "Copied RX Frames");
4318                 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
4319                                 CTLFLAG_RD, &lro->lro_queued, 0,
4320                                 "LRO Queued");
4321                 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
4322                                 CTLFLAG_RD, &lro->lro_flushed, 0,
4323                                 "LRO Flushed");
4324         }
4325
4326         /* MAC stats get the own sub node */
4327
4328         stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats", 
4329                                     CTLFLAG_RD, NULL, "MAC Statistics");
4330         stat_list = SYSCTL_CHILDREN(stat_node);
4331
4332         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "crc_errs",
4333                         CTLFLAG_RD, &stats->crcerrs,
4334                         "CRC Errors");
4335         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "ill_errs",
4336                         CTLFLAG_RD, &stats->illerrc,
4337                         "Illegal Byte Errors");
4338         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "byte_errs",
4339                         CTLFLAG_RD, &stats->errbc,
4340                         "Byte Errors");
4341         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "short_discards",
4342                         CTLFLAG_RD, &stats->mspdc,
4343                         "MAC Short Packets Discarded");
4344         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "local_faults",
4345                         CTLFLAG_RD, &stats->mlfc,
4346                         "MAC Local Faults");
4347         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "remote_faults",
4348                         CTLFLAG_RD, &stats->mrfc,
4349                         "MAC Remote Faults");
4350         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rec_len_errs",
4351                         CTLFLAG_RD, &stats->rlec,
4352                         "Receive Length Errors");
4353
4354         /* Flow Control stats */
4355         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_txd",
4356                         CTLFLAG_RD, &stats->lxontxc,
4357                         "Link XON Transmitted");
4358         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_recvd",
4359                         CTLFLAG_RD, &stats->lxonrxc,
4360                         "Link XON Received");
4361         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_txd",
4362                         CTLFLAG_RD, &stats->lxofftxc,
4363                         "Link XOFF Transmitted");
4364         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_recvd",
4365                         CTLFLAG_RD, &stats->lxoffrxc,
4366                         "Link XOFF Received");
4367
4368         /* Packet Reception Stats */
4369         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_octets_rcvd",
4370                         CTLFLAG_RD, &stats->tor, 
4371                         "Total Octets Received"); 
4372         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_rcvd",
4373                         CTLFLAG_RD, &stats->gorc, 
4374                         "Good Octets Received"); 
4375         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_rcvd",
4376                         CTLFLAG_RD, &stats->tpr,
4377                         "Total Packets Received");
4378         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_rcvd",
4379                         CTLFLAG_RD, &stats->gprc,
4380                         "Good Packets Received");
4381         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_rcvd",
4382                         CTLFLAG_RD, &stats->mprc,
4383                         "Multicast Packets Received");
4384         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_rcvd",
4385                         CTLFLAG_RD, &stats->bprc,
4386                         "Broadcast Packets Received");
4387         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_64",
4388                         CTLFLAG_RD, &stats->prc64,
4389                         "64 byte frames received ");
4390         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_65_127",
4391                         CTLFLAG_RD, &stats->prc127,
4392                         "65-127 byte frames received");
4393         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_128_255",
4394                         CTLFLAG_RD, &stats->prc255,
4395                         "128-255 byte frames received");
4396         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_256_511",
4397                         CTLFLAG_RD, &stats->prc511,
4398                         "256-511 byte frames received");
4399         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_512_1023",
4400                         CTLFLAG_RD, &stats->prc1023,
4401                         "512-1023 byte frames received");
4402         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
4403                         CTLFLAG_RD, &stats->prc1522,
4404                         "1023-1522 byte frames received");
4405         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_undersized",
4406                         CTLFLAG_RD, &stats->ruc,
4407                         "Receive Undersized");
4408         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_fragmented",
4409                         CTLFLAG_RD, &stats->rfc,
4410                         "Fragmented Packets Received ");
4411         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_oversized",
4412                         CTLFLAG_RD, &stats->roc,
4413                         "Oversized Packets Received");
4414         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabberd",
4415                         CTLFLAG_RD, &stats->rjc,
4416                         "Received Jabber");
4417         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_rcvd",
4418                         CTLFLAG_RD, &stats->mngprc,
4419                         "Management Packets Received");
4420         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_drpd",
4421                         CTLFLAG_RD, &stats->mngptc,
4422                         "Management Packets Dropped");
4423         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "checksum_errs",
4424                         CTLFLAG_RD, &stats->xec,
4425                         "Checksum Errors");
4426
4427         /* Packet Transmission Stats */
4428         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
4429                         CTLFLAG_RD, &stats->gotc, 
4430                         "Good Octets Transmitted"); 
4431         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
4432                         CTLFLAG_RD, &stats->tpt,
4433                         "Total Packets Transmitted");
4434         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
4435                         CTLFLAG_RD, &stats->gptc,
4436                         "Good Packets Transmitted");
4437         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_txd",
4438                         CTLFLAG_RD, &stats->bptc,
4439                         "Broadcast Packets Transmitted");
4440         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_txd",
4441                         CTLFLAG_RD, &stats->mptc,
4442                         "Multicast Packets Transmitted");
4443         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_txd",
4444                         CTLFLAG_RD, &stats->mngptc,
4445                         "Management Packets Transmitted");
4446         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_64",
4447                         CTLFLAG_RD, &stats->ptc64,
4448                         "64 byte frames transmitted ");
4449         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_65_127",
4450                         CTLFLAG_RD, &stats->ptc127,
4451                         "65-127 byte frames transmitted");
4452         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_128_255",
4453                         CTLFLAG_RD, &stats->ptc255,
4454                         "128-255 byte frames transmitted");
4455         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_256_511",
4456                         CTLFLAG_RD, &stats->ptc511,
4457                         "256-511 byte frames transmitted");
4458         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_512_1023",
4459                         CTLFLAG_RD, &stats->ptc1023,
4460                         "512-1023 byte frames transmitted");
4461         SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_1024_1522",
4462                         CTLFLAG_RD, &stats->ptc1522,
4463                         "1024-1522 byte frames transmitted");
4464 }
4465
4466 static void
4467 ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
4468     const char *description, int *limit, int value)
4469 {
4470         *limit = value;
4471         SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
4472             SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
4473             OID_AUTO, name, CTLFLAG_RW, limit, value, description);
4474 }
4475
4476 /*
4477 ** Set flow control using sysctl:
4478 ** Flow control values:
4479 **      0 - off
4480 **      1 - rx pause
4481 **      2 - tx pause
4482 **      3 - full
4483 */
4484 static int
4485 ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS)
4486 {
4487         int error, last;
4488         struct adapter *adapter = (struct adapter *) arg1;
4489
4490         last = adapter->fc;
4491         error = sysctl_handle_int(oidp, &adapter->fc, 0, req);
4492         if ((error) || (req->newptr == NULL))
4493                 return (error);
4494
4495         /* Don't bother if it's not changed */
4496         if (adapter->fc == last)
4497                 return (0);
4498
4499         switch (adapter->fc) {
4500                 case ixgbe_fc_rx_pause:
4501                 case ixgbe_fc_tx_pause:
4502                 case ixgbe_fc_full:
4503                         adapter->hw.fc.requested_mode = adapter->fc;
4504                         if (adapter->num_queues > 1)
4505                                 ixgbe_disable_rx_drop(adapter);
4506                         break;
4507                 case ixgbe_fc_none:
4508                         adapter->hw.fc.requested_mode = ixgbe_fc_none;
4509                         if (adapter->num_queues > 1)
4510                                 ixgbe_enable_rx_drop(adapter);
4511                         break;
4512                 default:
4513                         adapter->fc = last;
4514                         return (EINVAL);
4515         }
4516         /* Don't autoneg if forcing a value */
4517         adapter->hw.fc.disable_fc_autoneg = TRUE;
4518         ixgbe_fc_enable(&adapter->hw);
4519         return error;
4520 }
4521
4522 /*
4523 ** Control advertised link speed:
4524 **      Flags:
4525 **      0x1 - advertise 100 Mb
4526 **      0x2 - advertise 1G
4527 **      0x4 - advertise 10G
4528 */
4529 static int
4530 ixgbe_set_advertise(SYSCTL_HANDLER_ARGS)
4531 {
4532         int                     error = 0, requested;
4533         struct adapter          *adapter;
4534         device_t                dev;
4535         struct ixgbe_hw         *hw;
4536         ixgbe_link_speed        speed = 0;
4537
4538         adapter = (struct adapter *) arg1;
4539         dev = adapter->dev;
4540         hw = &adapter->hw;
4541
4542         requested = adapter->advertise;
4543         error = sysctl_handle_int(oidp, &requested, 0, req);
4544         if ((error) || (req->newptr == NULL))
4545                 return (error);
4546
4547         /* Checks to validate new value */
4548         if (adapter->advertise == requested) /* no change */
4549                 return (0);
4550
4551         if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
4552             (hw->phy.multispeed_fiber))) {
4553                 device_printf(dev,
4554                     "Advertised speed can only be set on copper or "
4555                     "multispeed fiber media types.\n");
4556                 return (EINVAL);
4557         }
4558
4559         if (requested < 0x1 || requested > 0x7) {
4560                 device_printf(dev,
4561                     "Invalid advertised speed; valid modes are 0x1 through 0x7\n");
4562                 return (EINVAL);
4563         }
4564
4565         if ((requested & 0x1)
4566             && (hw->mac.type != ixgbe_mac_X540)
4567             && (hw->mac.type != ixgbe_mac_X550)) {
4568                 device_printf(dev, "Set Advertise: 100Mb on X540/X550 only\n");
4569                 return (EINVAL);
4570         }
4571
4572         /* Set new value and report new advertised mode */
4573         if (requested & 0x1)
4574                 speed |= IXGBE_LINK_SPEED_100_FULL;
4575         if (requested & 0x2)
4576                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
4577         if (requested & 0x4)
4578                 speed |= IXGBE_LINK_SPEED_10GB_FULL;
4579
4580         hw->mac.autotry_restart = TRUE;
4581         hw->mac.ops.setup_link(hw, speed, TRUE);
4582         adapter->advertise = requested;
4583
4584         return (error);
4585 }
4586
4587 /*
4588  * The following two sysctls are for X550 BaseT devices;
4589  * they deal with the external PHY used in them.
4590  */
4591 static int
4592 ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
4593 {
4594         struct adapter  *adapter = (struct adapter *) arg1;
4595         struct ixgbe_hw *hw = &adapter->hw;
4596         u16 reg;
4597
4598         if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4599                 device_printf(adapter->dev,
4600                     "Device has no supported external thermal sensor.\n");
4601                 return (ENODEV);
4602         }
4603
4604         if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
4605                                       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
4606                                       &reg)) {
4607                 device_printf(adapter->dev,
4608                     "Error reading from PHY's current temperature register\n");
4609                 return (EAGAIN);
4610         }
4611
4612         /* Shift temp for output */
4613         reg = reg >> 8;
4614
4615         return (sysctl_handle_int(oidp, NULL, reg, req));
4616 }
4617
4618 /*
4619  * Reports whether the current PHY temperature is over
4620  * the overtemp threshold.
4621  *  - This is reported directly from the PHY
4622  */
4623 static int
4624 ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
4625 {
4626         struct adapter  *adapter = (struct adapter *) arg1;
4627         struct ixgbe_hw *hw = &adapter->hw;
4628         u16 reg;
4629
4630         if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4631                 device_printf(adapter->dev,
4632                     "Device has no supported external thermal sensor.\n");
4633                 return (ENODEV);
4634         }
4635
4636         if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
4637                                       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
4638                                       &reg)) {
4639                 device_printf(adapter->dev,
4640                     "Error reading from PHY's temperature status register\n");
4641                 return (EAGAIN);
4642         }
4643
4644         /* Get occurrence bit */
4645         reg = !!(reg & 0x4000);
4646         return (sysctl_handle_int(oidp, 0, reg, req));
4647 }
4648
4649 /*
4650 ** Thermal Shutdown Trigger (internal MAC)
4651 **   - Set this to 1 to cause an overtemp event to occur
4652 */
4653 static int
4654 ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS)
4655 {
4656         struct adapter  *adapter = (struct adapter *) arg1;
4657         struct ixgbe_hw *hw = &adapter->hw;
4658         int error, fire = 0;
4659
4660         error = sysctl_handle_int(oidp, &fire, 0, req);
4661         if ((error) || (req->newptr == NULL))
4662                 return (error);
4663
4664         if (fire) {
4665                 u32 reg = IXGBE_READ_REG(hw, IXGBE_EICS);
4666                 reg |= IXGBE_EICR_TS;
4667                 IXGBE_WRITE_REG(hw, IXGBE_EICS, reg);
4668         }
4669
4670         return (0);
4671 }
4672
4673 /*
4674 ** Manage DMA Coalescing.
4675 ** Control values:
4676 **      0/1 - off / on (use default value of 1000)
4677 **
4678 **      Legal timer values are:
4679 **      50,100,250,500,1000,2000,5000,10000
4680 **
4681 **      Turning off interrupt moderation will also turn this off.
4682 */
4683 static int
4684 ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
4685 {
4686         struct adapter *adapter = (struct adapter *) arg1;
4687         struct ixgbe_hw *hw = &adapter->hw;
4688         struct ifnet *ifp = adapter->ifp;
4689         int             error;
4690         u16             oldval;
4691
4692         oldval = adapter->dmac;
4693         error = sysctl_handle_int(oidp, &adapter->dmac, 0, req);
4694         if ((error) || (req->newptr == NULL))
4695                 return (error);
4696
4697         switch (hw->mac.type) {
4698         case ixgbe_mac_X550:
4699         case ixgbe_mac_X550EM_x:
4700                 break;
4701         default:
4702                 device_printf(adapter->dev,
4703                     "DMA Coalescing is only supported on X550 devices\n");
4704                 return (ENODEV);
4705         }
4706
4707         switch (adapter->dmac) {
4708         case 0:
4709                 /* Disabled */
4710                 break;
4711         case 1: /* Enable and use default */
4712                 adapter->dmac = 1000;
4713                 break;
4714         case 50:
4715         case 100:
4716         case 250:
4717         case 500:
4718         case 1000:
4719         case 2000:
4720         case 5000:
4721         case 10000:
4722                 /* Legal values - allow */
4723                 break;
4724         default:
4725                 /* Do nothing, illegal value */
4726                 adapter->dmac = oldval;
4727                 return (EINVAL);
4728         }
4729
4730         /* Re-initialize hardware if it's already running */
4731         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4732                 ixgbe_init(adapter);
4733
4734         return (0);
4735 }
4736
4737 /*
4738  * Sysctl to enable/disable the WoL capability, if supported by the adapter.
4739  * Values:
4740  *      0 - disabled
4741  *      1 - enabled
4742  */
4743 static int
4744 ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
4745 {
4746         struct adapter *adapter = (struct adapter *) arg1;
4747         struct ixgbe_hw *hw = &adapter->hw;
4748         int new_wol_enabled;
4749         int error = 0;
4750
4751         new_wol_enabled = hw->wol_enabled;
4752         error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
4753         if ((error) || (req->newptr == NULL))
4754                 return (error);
4755         if (new_wol_enabled == hw->wol_enabled)
4756                 return (0);
4757
4758         if (new_wol_enabled > 0 && !adapter->wol_support)
4759                 return (ENODEV);
4760         else
4761                 hw->wol_enabled = !!(new_wol_enabled);
4762
4763         return (0);
4764 }
4765
4766 /*
4767  * Sysctl to enable/disable the Energy Efficient Ethernet capability,
4768  * if supported by the adapter.
4769  * Values:
4770  *      0 - disabled
4771  *      1 - enabled
4772  */
4773 static int
4774 ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS)
4775 {
4776         struct adapter *adapter = (struct adapter *) arg1;
4777         struct ixgbe_hw *hw = &adapter->hw;
4778         struct ifnet *ifp = adapter->ifp;
4779         int new_eee_enabled, error = 0;
4780
4781         new_eee_enabled = adapter->eee_enabled;
4782         error = sysctl_handle_int(oidp, &new_eee_enabled, 0, req);
4783         if ((error) || (req->newptr == NULL))
4784                 return (error);
4785         if (new_eee_enabled == adapter->eee_enabled)
4786                 return (0);
4787
4788         if (new_eee_enabled > 0 && !hw->mac.ops.setup_eee)
4789                 return (ENODEV);
4790         else
4791                 adapter->eee_enabled = !!(new_eee_enabled);
4792
4793         /* Re-initialize hardware if it's already running */
4794         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4795                 ixgbe_init(adapter);
4796
4797         return (0);
4798 }
4799
4800 /*
4801  * Read-only sysctl indicating whether EEE support was negotiated
4802  * on the link.
4803  */
4804 static int
4805 ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS)
4806 {
4807         struct adapter *adapter = (struct adapter *) arg1;
4808         struct ixgbe_hw *hw = &adapter->hw;
4809         bool status;
4810
4811         status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) & IXGBE_EEE_STAT_NEG);
4812
4813         return (sysctl_handle_int(oidp, 0, status, req));
4814 }
4815
4816 /*
4817  * Read-only sysctl indicating whether RX Link is in LPI state.
4818  */
4819 static int
4820 ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS)
4821 {
4822         struct adapter *adapter = (struct adapter *) arg1;
4823         struct ixgbe_hw *hw = &adapter->hw;
4824         bool status;
4825
4826         status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) &
4827             IXGBE_EEE_RX_LPI_STATUS);
4828
4829         return (sysctl_handle_int(oidp, 0, status, req));
4830 }
4831
4832 /*
4833  * Read-only sysctl indicating whether TX Link is in LPI state.
4834  */
4835 static int
4836 ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS)
4837 {
4838         struct adapter *adapter = (struct adapter *) arg1;
4839         struct ixgbe_hw *hw = &adapter->hw;
4840         bool status;
4841
4842         status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) &
4843             IXGBE_EEE_TX_LPI_STATUS);
4844
4845         return (sysctl_handle_int(oidp, 0, status, req));
4846 }
4847
4848 /*
4849  * Sysctl to enable/disable the types of packets that the
4850  * adapter will wake up on upon receipt.
4851  * WUFC - Wake Up Filter Control
4852  * Flags:
4853  *      0x1  - Link Status Change
4854  *      0x2  - Magic Packet
4855  *      0x4  - Direct Exact
4856  *      0x8  - Directed Multicast
4857  *      0x10 - Broadcast
4858  *      0x20 - ARP/IPv4 Request Packet
4859  *      0x40 - Direct IPv4 Packet
4860  *      0x80 - Direct IPv6 Packet
4861  *
4862  * Setting another flag will cause the sysctl to return an
4863  * error.
4864  */
4865 static int
4866 ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
4867 {
4868         struct adapter *adapter = (struct adapter *) arg1;
4869         int error = 0;
4870         u32 new_wufc;
4871
4872         new_wufc = adapter->wufc;
4873
4874         error = sysctl_handle_int(oidp, &new_wufc, 0, req);
4875         if ((error) || (req->newptr == NULL))
4876                 return (error);
4877         if (new_wufc == adapter->wufc)
4878                 return (0);
4879
4880         if (new_wufc & 0xffffff00)
4881                 return (EINVAL);
4882         else {
4883                 new_wufc &= 0xff;
4884                 new_wufc |= (0xffffff & adapter->wufc);
4885                 adapter->wufc = new_wufc;
4886         }
4887
4888         return (0);
4889 }
4890
4891 /*
4892 ** Enable the hardware to drop packets when the buffer is
4893 ** full. This is useful when multiqueue,so that no single
4894 ** queue being full stalls the entire RX engine. We only
4895 ** enable this when Multiqueue AND when Flow Control is 
4896 ** disabled.
4897 */
4898 static void
4899 ixgbe_enable_rx_drop(struct adapter *adapter)
4900 {
4901         struct ixgbe_hw *hw = &adapter->hw;
4902
4903         for (int i = 0; i < adapter->num_queues; i++) {
4904                 struct rx_ring *rxr = &adapter->rx_rings[i];
4905                 u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
4906                 srrctl |= IXGBE_SRRCTL_DROP_EN;
4907                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
4908         }
4909 #ifdef PCI_IOV
4910         /* enable drop for each vf */
4911         for (int i = 0; i < adapter->num_vfs; i++) {
4912                 IXGBE_WRITE_REG(hw, IXGBE_QDE,
4913                     (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
4914                     IXGBE_QDE_ENABLE));
4915         }
4916 #endif
4917 }
4918
4919 static void
4920 ixgbe_disable_rx_drop(struct adapter *adapter)
4921 {
4922         struct ixgbe_hw *hw = &adapter->hw;
4923
4924         for (int i = 0; i < adapter->num_queues; i++) {
4925                 struct rx_ring *rxr = &adapter->rx_rings[i];
4926                 u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
4927                 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
4928                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
4929         }
4930 #ifdef PCI_IOV
4931         /* disable drop for each vf */
4932         for (int i = 0; i < adapter->num_vfs; i++) {
4933                 IXGBE_WRITE_REG(hw, IXGBE_QDE,
4934                     (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
4935         }
4936 #endif
4937 }
4938
4939 static void
4940 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
4941 {
4942         u32 mask;
4943
4944         switch (adapter->hw.mac.type) {
4945         case ixgbe_mac_82598EB:
4946                 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
4947                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
4948                 break;
4949         case ixgbe_mac_82599EB:
4950         case ixgbe_mac_X540:
4951         case ixgbe_mac_X550:
4952         case ixgbe_mac_X550EM_x:
4953                 mask = (queues & 0xFFFFFFFF);
4954                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
4955                 mask = (queues >> 32);
4956                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
4957                 break;
4958         default:
4959                 break;
4960         }
4961 }
4962
4963 #ifdef PCI_IOV
4964
4965 /*
4966 ** Support functions for SRIOV/VF management
4967 */
4968
4969 static void
4970 ixgbe_ping_all_vfs(struct adapter *adapter)
4971 {
4972         struct ixgbe_vf *vf;
4973
4974         for (int i = 0; i < adapter->num_vfs; i++) {
4975                 vf = &adapter->vfs[i];
4976                 if (vf->flags & IXGBE_VF_ACTIVE)
4977                         ixgbe_send_vf_msg(adapter, vf, IXGBE_PF_CONTROL_MSG);
4978         }
4979 }
4980
4981
4982 static void
4983 ixgbe_vf_set_default_vlan(struct adapter *adapter, struct ixgbe_vf *vf,
4984     uint16_t tag)
4985 {
4986         struct ixgbe_hw *hw;
4987         uint32_t vmolr, vmvir;
4988
4989         hw = &adapter->hw;
4990
4991         vf->vlan_tag = tag;
4992         
4993         vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf->pool));
4994
4995         /* Do not receive packets that pass inexact filters. */
4996         vmolr &= ~(IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_ROPE);
4997
4998         /* Disable Multicast Promicuous Mode. */
4999         vmolr &= ~IXGBE_VMOLR_MPE;
5000
5001         /* Accept broadcasts. */
5002         vmolr |= IXGBE_VMOLR_BAM;
5003
5004         if (tag == 0) {
5005                 /* Accept non-vlan tagged traffic. */
5006                 //vmolr |= IXGBE_VMOLR_AUPE;
5007
5008                 /* Allow VM to tag outgoing traffic; no default tag. */
5009                 vmvir = 0;
5010         } else {
5011                 /* Require vlan-tagged traffic. */
5012                 vmolr &= ~IXGBE_VMOLR_AUPE;
5013
5014                 /* Tag all traffic with provided vlan tag. */
5015                 vmvir = (tag | IXGBE_VMVIR_VLANA_DEFAULT);
5016         }
5017         IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf->pool), vmolr);
5018         IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf->pool), vmvir);
5019 }
5020
5021
5022 static boolean_t
5023 ixgbe_vf_frame_size_compatible(struct adapter *adapter, struct ixgbe_vf *vf)
5024 {
5025
5026         /*
5027          * Frame size compatibility between PF and VF is only a problem on
5028          * 82599-based cards.  X540 and later support any combination of jumbo
5029          * frames on PFs and VFs.
5030          */
5031         if (adapter->hw.mac.type != ixgbe_mac_82599EB)
5032                 return (TRUE);
5033
5034         switch (vf->api_ver) {
5035         case IXGBE_API_VER_1_0:
5036         case IXGBE_API_VER_UNKNOWN:
5037                 /*
5038                  * On legacy (1.0 and older) VF versions, we don't support jumbo
5039                  * frames on either the PF or the VF.
5040                  */
5041                 if (adapter->max_frame_size > ETHER_MAX_LEN ||
5042                     vf->max_frame_size > ETHER_MAX_LEN)
5043                     return (FALSE);
5044
5045                 return (TRUE);
5046
5047                 break;
5048         case IXGBE_API_VER_1_1:
5049         default:
5050                 /*
5051                  * 1.1 or later VF versions always work if they aren't using
5052                  * jumbo frames.
5053                  */
5054                 if (vf->max_frame_size <= ETHER_MAX_LEN)
5055                         return (TRUE);
5056
5057                 /*
5058                  * Jumbo frames only work with VFs if the PF is also using jumbo
5059                  * frames.
5060                  */
5061                 if (adapter->max_frame_size <= ETHER_MAX_LEN)
5062                         return (TRUE);
5063
5064                 return (FALSE);
5065         
5066         }
5067 }
5068
5069
5070 static void
5071 ixgbe_process_vf_reset(struct adapter *adapter, struct ixgbe_vf *vf)
5072 {
5073         ixgbe_vf_set_default_vlan(adapter, vf, vf->default_vlan);
5074
5075         // XXX clear multicast addresses
5076
5077         ixgbe_clear_rar(&adapter->hw, vf->rar_index);
5078
5079         vf->api_ver = IXGBE_API_VER_UNKNOWN;
5080 }
5081
5082
5083 static void
5084 ixgbe_vf_enable_transmit(struct adapter *adapter, struct ixgbe_vf *vf)
5085 {
5086         struct ixgbe_hw *hw;
5087         uint32_t vf_index, vfte;
5088
5089         hw = &adapter->hw;
5090
5091         vf_index = IXGBE_VF_INDEX(vf->pool);
5092         vfte = IXGBE_READ_REG(hw, IXGBE_VFTE(vf_index));
5093         vfte |= IXGBE_VF_BIT(vf->pool);
5094         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_index), vfte);
5095 }
5096
5097
5098 static void
5099 ixgbe_vf_enable_receive(struct adapter *adapter, struct ixgbe_vf *vf)
5100 {
5101         struct ixgbe_hw *hw;
5102         uint32_t vf_index, vfre;
5103
5104         hw = &adapter->hw;
5105         
5106         vf_index = IXGBE_VF_INDEX(vf->pool);
5107         vfre = IXGBE_READ_REG(hw, IXGBE_VFRE(vf_index));
5108         if (ixgbe_vf_frame_size_compatible(adapter, vf))
5109                 vfre |= IXGBE_VF_BIT(vf->pool);
5110         else
5111                 vfre &= ~IXGBE_VF_BIT(vf->pool);
5112         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_index), vfre);
5113 }
5114
5115
5116 static void
5117 ixgbe_vf_reset_msg(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
5118 {
5119         struct ixgbe_hw *hw;
5120         uint32_t ack;
5121         uint32_t resp[IXGBE_VF_PERMADDR_MSG_LEN];
5122
5123         hw = &adapter->hw;
5124
5125         ixgbe_process_vf_reset(adapter, vf);
5126
5127         if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
5128                 ixgbe_set_rar(&adapter->hw, vf->rar_index,
5129                     vf->ether_addr, vf->pool, TRUE);
5130                 ack = IXGBE_VT_MSGTYPE_ACK;
5131         } else
5132                 ack = IXGBE_VT_MSGTYPE_NACK;
5133
5134         ixgbe_vf_enable_transmit(adapter, vf);
5135         ixgbe_vf_enable_receive(adapter, vf);
5136
5137         vf->flags |= IXGBE_VF_CTS;
5138
5139         resp[0] = IXGBE_VF_RESET | ack | IXGBE_VT_MSGTYPE_CTS;
5140         bcopy(vf->ether_addr, &resp[1], ETHER_ADDR_LEN);
5141         resp[3] = hw->mac.mc_filter_type;
5142         ixgbe_write_mbx(hw, resp, IXGBE_VF_PERMADDR_MSG_LEN, vf->pool);
5143 }
5144
5145
5146 static void
5147 ixgbe_vf_set_mac(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
5148 {
5149         uint8_t *mac;
5150
5151         mac = (uint8_t*)&msg[1];
5152
5153         /* Check that the VF has permission to change the MAC address. */
5154         if (!(vf->flags & IXGBE_VF_CAP_MAC) && ixgbe_vf_mac_changed(vf, mac)) {
5155                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5156                 return;
5157         }
5158
5159         if (ixgbe_validate_mac_addr(mac) != 0) {
5160                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5161                 return;
5162         }
5163
5164         bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
5165
5166         ixgbe_set_rar(&adapter->hw, vf->rar_index, vf->ether_addr, 
5167             vf->pool, TRUE);
5168
5169         ixgbe_send_vf_ack(adapter, vf, msg[0]);
5170 }
5171
5172
5173 /*
5174 ** VF multicast addresses are set by using the appropriate bit in
5175 ** 1 of 128 32 bit addresses (4096 possible).
5176 */
5177 static void
5178 ixgbe_vf_set_mc_addr(struct adapter *adapter, struct ixgbe_vf *vf, u32 *msg)
5179 {
5180         u16     *list = (u16*)&msg[1];
5181         int     entries;
5182         u32     vmolr, vec_bit, vec_reg, mta_reg;
5183
5184         entries = (msg[0] & IXGBE_VT_MSGINFO_MASK) >> IXGBE_VT_MSGINFO_SHIFT;
5185         entries = min(entries, IXGBE_MAX_VF_MC);
5186
5187         vmolr = IXGBE_READ_REG(&adapter->hw, IXGBE_VMOLR(vf->pool));
5188
5189         vf->num_mc_hashes = entries;
5190
5191         /* Set the appropriate MTA bit */
5192         for (int i = 0; i < entries; i++) {
5193                 vf->mc_hash[i] = list[i];
5194                 vec_reg = (vf->mc_hash[i] >> 5) & 0x7F;
5195                 vec_bit = vf->mc_hash[i] & 0x1F;
5196                 mta_reg = IXGBE_READ_REG(&adapter->hw, IXGBE_MTA(vec_reg));
5197                 mta_reg |= (1 << vec_bit);
5198                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_MTA(vec_reg), mta_reg);
5199         }
5200
5201         vmolr |= IXGBE_VMOLR_ROMPE;
5202         IXGBE_WRITE_REG(&adapter->hw, IXGBE_VMOLR(vf->pool), vmolr);
5203         ixgbe_send_vf_ack(adapter, vf, msg[0]);
5204         return;
5205 }
5206
5207
5208 static void
5209 ixgbe_vf_set_vlan(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
5210 {
5211         struct ixgbe_hw *hw;
5212         int enable;
5213         uint16_t tag;
5214
5215         hw = &adapter->hw;
5216         enable = IXGBE_VT_MSGINFO(msg[0]);
5217         tag = msg[1] & IXGBE_VLVF_VLANID_MASK;
5218
5219         if (!(vf->flags & IXGBE_VF_CAP_VLAN)) {
5220                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5221                 return;
5222         }
5223
5224         /* It is illegal to enable vlan tag 0. */
5225         if (tag == 0 && enable != 0){
5226                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5227                 return;
5228         }
5229         
5230         ixgbe_set_vfta(hw, tag, vf->pool, enable);
5231         ixgbe_send_vf_ack(adapter, vf, msg[0]);
5232 }
5233
5234
5235 static void
5236 ixgbe_vf_set_lpe(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
5237 {
5238         struct ixgbe_hw *hw;
5239         uint32_t vf_max_size, pf_max_size, mhadd;
5240
5241         hw = &adapter->hw;
5242         vf_max_size = msg[1];
5243
5244         if (vf_max_size < ETHER_CRC_LEN) {
5245                 /* We intentionally ACK invalid LPE requests. */
5246                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
5247                 return;
5248         }
5249
5250         vf_max_size -= ETHER_CRC_LEN;
5251
5252         if (vf_max_size > IXGBE_MAX_FRAME_SIZE) {
5253                 /* We intentionally ACK invalid LPE requests. */
5254                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
5255                 return;
5256         }
5257
5258         vf->max_frame_size = vf_max_size;
5259         ixgbe_update_max_frame(adapter, vf->max_frame_size);
5260
5261         /*
5262          * We might have to disable reception to this VF if the frame size is
5263          * not compatible with the config on the PF.
5264          */
5265         ixgbe_vf_enable_receive(adapter, vf);
5266
5267         mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
5268         pf_max_size = (mhadd & IXGBE_MHADD_MFS_MASK) >> IXGBE_MHADD_MFS_SHIFT;
5269
5270         if (pf_max_size < adapter->max_frame_size) {
5271                 mhadd &= ~IXGBE_MHADD_MFS_MASK;
5272                 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
5273                 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
5274         }
5275
5276         ixgbe_send_vf_ack(adapter, vf, msg[0]);
5277 }
5278
5279
5280 static void
5281 ixgbe_vf_set_macvlan(struct adapter *adapter, struct ixgbe_vf *vf,
5282     uint32_t *msg)
5283 {
5284         //XXX implement this
5285         ixgbe_send_vf_nack(adapter, vf, msg[0]);
5286 }
5287
5288
5289 static void
5290 ixgbe_vf_api_negotiate(struct adapter *adapter, struct ixgbe_vf *vf,
5291     uint32_t *msg)
5292 {
5293
5294         switch (msg[1]) {
5295         case IXGBE_API_VER_1_0:
5296         case IXGBE_API_VER_1_1:
5297                 vf->api_ver = msg[1];
5298                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
5299                 break;
5300         default:
5301                 vf->api_ver = IXGBE_API_VER_UNKNOWN;
5302                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5303                 break;
5304         }
5305 }
5306
5307
5308 static void
5309 ixgbe_vf_get_queues(struct adapter *adapter, struct ixgbe_vf *vf,
5310     uint32_t *msg)
5311 {
5312         struct ixgbe_hw *hw;
5313         uint32_t resp[IXGBE_VF_GET_QUEUES_RESP_LEN];
5314         int num_queues;
5315
5316         hw = &adapter->hw;
5317
5318         /* GET_QUEUES is not supported on pre-1.1 APIs. */
5319         switch (msg[0]) {
5320         case IXGBE_API_VER_1_0:
5321         case IXGBE_API_VER_UNKNOWN:
5322                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5323                 return;
5324         }
5325
5326         resp[0] = IXGBE_VF_GET_QUEUES | IXGBE_VT_MSGTYPE_ACK | 
5327             IXGBE_VT_MSGTYPE_CTS;
5328
5329         num_queues = ixgbe_vf_queues(ixgbe_get_iov_mode(adapter));
5330         resp[IXGBE_VF_TX_QUEUES] = num_queues;
5331         resp[IXGBE_VF_RX_QUEUES] = num_queues;
5332         resp[IXGBE_VF_TRANS_VLAN] = (vf->default_vlan != 0);
5333         resp[IXGBE_VF_DEF_QUEUE] = 0;
5334
5335         ixgbe_write_mbx(hw, resp, IXGBE_VF_GET_QUEUES_RESP_LEN, vf->pool);
5336 }
5337
5338
5339 static void
5340 ixgbe_process_vf_msg(struct adapter *adapter, struct ixgbe_vf *vf)
5341 {
5342         struct ixgbe_hw *hw;
5343         uint32_t msg[IXGBE_VFMAILBOX_SIZE];
5344         int error;
5345
5346         hw = &adapter->hw;
5347
5348         error = ixgbe_read_mbx(hw, msg, IXGBE_VFMAILBOX_SIZE, vf->pool);
5349
5350         if (error != 0)
5351                 return;
5352
5353         CTR3(KTR_MALLOC, "%s: received msg %x from %d",
5354             adapter->ifp->if_xname, msg[0], vf->pool);
5355         if (msg[0] == IXGBE_VF_RESET) {
5356                 ixgbe_vf_reset_msg(adapter, vf, msg);
5357                 return;
5358         }
5359
5360         if (!(vf->flags & IXGBE_VF_CTS)) {
5361                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5362                 return;
5363         }
5364
5365         switch (msg[0] & IXGBE_VT_MSG_MASK) {
5366         case IXGBE_VF_SET_MAC_ADDR:
5367                 ixgbe_vf_set_mac(adapter, vf, msg);
5368                 break;
5369         case IXGBE_VF_SET_MULTICAST:
5370                 ixgbe_vf_set_mc_addr(adapter, vf, msg);
5371                 break;
5372         case IXGBE_VF_SET_VLAN:
5373                 ixgbe_vf_set_vlan(adapter, vf, msg);
5374                 break;
5375         case IXGBE_VF_SET_LPE:
5376                 ixgbe_vf_set_lpe(adapter, vf, msg);
5377                 break;
5378         case IXGBE_VF_SET_MACVLAN:
5379                 ixgbe_vf_set_macvlan(adapter, vf, msg);
5380                 break;
5381         case IXGBE_VF_API_NEGOTIATE:
5382                 ixgbe_vf_api_negotiate(adapter, vf, msg);
5383                 break;
5384         case IXGBE_VF_GET_QUEUES:
5385                 ixgbe_vf_get_queues(adapter, vf, msg);
5386                 break;
5387         default:
5388                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
5389         }
5390 }
5391
5392
5393 /*
5394  * Tasklet for handling VF -> PF mailbox messages.
5395  */
5396 static void
5397 ixgbe_handle_mbx(void *context, int pending)
5398 {
5399         struct adapter *adapter;
5400         struct ixgbe_hw *hw;
5401         struct ixgbe_vf *vf;
5402         int i;
5403
5404         adapter = context;
5405         hw = &adapter->hw;
5406
5407         IXGBE_CORE_LOCK(adapter);
5408         for (i = 0; i < adapter->num_vfs; i++) {
5409                 vf = &adapter->vfs[i];
5410
5411                 if (vf->flags & IXGBE_VF_ACTIVE) {
5412                         if (ixgbe_check_for_rst(hw, vf->pool) == 0)
5413                                 ixgbe_process_vf_reset(adapter, vf);
5414
5415                         if (ixgbe_check_for_msg(hw, vf->pool) == 0)
5416                                 ixgbe_process_vf_msg(adapter, vf);
5417
5418                         if (ixgbe_check_for_ack(hw, vf->pool) == 0)
5419                                 ixgbe_process_vf_ack(adapter, vf);
5420                 }
5421         }
5422         IXGBE_CORE_UNLOCK(adapter);
5423 }
5424
5425
5426 static int
5427 ixgbe_init_iov(device_t dev, u16 num_vfs, const nvlist_t *config)
5428 {
5429         struct adapter *adapter;
5430         enum ixgbe_iov_mode mode;
5431
5432         adapter = device_get_softc(dev);
5433         adapter->num_vfs = num_vfs;
5434         mode = ixgbe_get_iov_mode(adapter);
5435
5436         if (num_vfs > ixgbe_max_vfs(mode)) {
5437                 adapter->num_vfs = 0;
5438                 return (ENOSPC);
5439         }
5440
5441         IXGBE_CORE_LOCK(adapter);
5442
5443         adapter->vfs = malloc(sizeof(*adapter->vfs) * num_vfs, M_IXGBE, 
5444             M_NOWAIT | M_ZERO);
5445
5446         if (adapter->vfs == NULL) {
5447                 adapter->num_vfs = 0;
5448                 IXGBE_CORE_UNLOCK(adapter);
5449                 return (ENOMEM);
5450         }
5451
5452         ixgbe_init_locked(adapter);
5453
5454         IXGBE_CORE_UNLOCK(adapter);
5455
5456         return (0);
5457 }
5458
5459
5460 static void
5461 ixgbe_uninit_iov(device_t dev)
5462 {
5463         struct ixgbe_hw *hw;
5464         struct adapter *adapter;
5465         uint32_t pf_reg, vf_reg;
5466
5467         adapter = device_get_softc(dev);
5468         hw = &adapter->hw;
5469
5470         IXGBE_CORE_LOCK(adapter);
5471
5472         /* Enable rx/tx for the PF and disable it for all VFs. */
5473         pf_reg = IXGBE_VF_INDEX(adapter->pool);
5474         IXGBE_WRITE_REG(hw, IXGBE_VFRE(pf_reg),
5475             IXGBE_VF_BIT(adapter->pool));
5476         IXGBE_WRITE_REG(hw, IXGBE_VFTE(pf_reg),
5477             IXGBE_VF_BIT(adapter->pool));
5478
5479         if (pf_reg == 0)
5480                 vf_reg = 1;
5481         else
5482                 vf_reg = 0;
5483         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), 0);
5484         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), 0);
5485
5486         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
5487
5488         free(adapter->vfs, M_IXGBE);
5489         adapter->vfs = NULL;
5490         adapter->num_vfs = 0;
5491
5492         IXGBE_CORE_UNLOCK(adapter);
5493 }
5494
5495
5496 static void
5497 ixgbe_initialize_iov(struct adapter *adapter)
5498 {
5499         struct ixgbe_hw *hw = &adapter->hw;
5500         uint32_t mrqc, mtqc, vt_ctl, vf_reg, gcr_ext, gpie;
5501         enum ixgbe_iov_mode mode;
5502         int i;
5503
5504         mode = ixgbe_get_iov_mode(adapter);
5505         if (mode == IXGBE_NO_VM)
5506                 return;
5507
5508         IXGBE_CORE_LOCK_ASSERT(adapter);
5509
5510         mrqc = IXGBE_READ_REG(hw, IXGBE_MRQC);
5511         mrqc &= ~IXGBE_MRQC_MRQE_MASK;
5512
5513         switch (mode) {
5514         case IXGBE_64_VM:
5515                 mrqc |= IXGBE_MRQC_VMDQRSS64EN;
5516                 break;
5517         case IXGBE_32_VM:
5518                 mrqc |= IXGBE_MRQC_VMDQRSS32EN;
5519                 break;
5520         default:
5521                 panic("Unexpected SR-IOV mode %d", mode);
5522         }
5523         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
5524
5525         mtqc = IXGBE_MTQC_VT_ENA;
5526         switch (mode) {
5527         case IXGBE_64_VM:
5528                 mtqc |= IXGBE_MTQC_64VF;
5529                 break;
5530         case IXGBE_32_VM:
5531                 mtqc |= IXGBE_MTQC_32VF;
5532                 break;
5533         default:
5534                 panic("Unexpected SR-IOV mode %d", mode);
5535         }
5536         IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
5537         
5538
5539         gcr_ext = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
5540         gcr_ext |= IXGBE_GCR_EXT_MSIX_EN;
5541         gcr_ext &= ~IXGBE_GCR_EXT_VT_MODE_MASK;
5542         switch (mode) {
5543         case IXGBE_64_VM:
5544                 gcr_ext |= IXGBE_GCR_EXT_VT_MODE_64;
5545                 break;
5546         case IXGBE_32_VM:
5547                 gcr_ext |= IXGBE_GCR_EXT_VT_MODE_32;
5548                 break;
5549         default:
5550                 panic("Unexpected SR-IOV mode %d", mode);
5551         }
5552         IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext);
5553         
5554
5555         gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
5556         gcr_ext &= ~IXGBE_GPIE_VTMODE_MASK;
5557         switch (mode) {
5558         case IXGBE_64_VM:
5559                 gpie |= IXGBE_GPIE_VTMODE_64;
5560                 break;
5561         case IXGBE_32_VM:
5562                 gpie |= IXGBE_GPIE_VTMODE_32;
5563                 break;
5564         default:
5565                 panic("Unexpected SR-IOV mode %d", mode);
5566         }
5567         IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
5568
5569         /* Enable rx/tx for the PF. */
5570         vf_reg = IXGBE_VF_INDEX(adapter->pool);
5571         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), 
5572             IXGBE_VF_BIT(adapter->pool));
5573         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), 
5574             IXGBE_VF_BIT(adapter->pool));
5575
5576         /* Allow VM-to-VM communication. */
5577         IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
5578
5579         vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
5580         vt_ctl |= (adapter->pool << IXGBE_VT_CTL_POOL_SHIFT);
5581         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
5582
5583         for (i = 0; i < adapter->num_vfs; i++)
5584                 ixgbe_init_vf(adapter, &adapter->vfs[i]);
5585 }
5586
5587
5588 /*
5589 ** Check the max frame setting of all active VF's
5590 */
5591 static void
5592 ixgbe_recalculate_max_frame(struct adapter *adapter)
5593 {
5594         struct ixgbe_vf *vf;
5595
5596         IXGBE_CORE_LOCK_ASSERT(adapter);
5597
5598         for (int i = 0; i < adapter->num_vfs; i++) {
5599                 vf = &adapter->vfs[i];
5600                 if (vf->flags & IXGBE_VF_ACTIVE)
5601                         ixgbe_update_max_frame(adapter, vf->max_frame_size);
5602         }
5603 }
5604
5605
5606 static void
5607 ixgbe_init_vf(struct adapter *adapter, struct ixgbe_vf *vf)
5608 {
5609         struct ixgbe_hw *hw;
5610         uint32_t vf_index, pfmbimr;
5611
5612         IXGBE_CORE_LOCK_ASSERT(adapter);
5613
5614         hw = &adapter->hw;
5615
5616         if (!(vf->flags & IXGBE_VF_ACTIVE))
5617                 return;
5618
5619         vf_index = IXGBE_VF_INDEX(vf->pool);
5620         pfmbimr = IXGBE_READ_REG(hw, IXGBE_PFMBIMR(vf_index));
5621         pfmbimr |= IXGBE_VF_BIT(vf->pool);
5622         IXGBE_WRITE_REG(hw, IXGBE_PFMBIMR(vf_index), pfmbimr);
5623
5624         ixgbe_vf_set_default_vlan(adapter, vf, vf->vlan_tag);
5625
5626         // XXX multicast addresses
5627
5628         if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
5629                 ixgbe_set_rar(&adapter->hw, vf->rar_index,
5630                     vf->ether_addr, vf->pool, TRUE);
5631         }
5632
5633         ixgbe_vf_enable_transmit(adapter, vf);
5634         ixgbe_vf_enable_receive(adapter, vf);
5635         
5636         ixgbe_send_vf_msg(adapter, vf, IXGBE_PF_CONTROL_MSG);
5637 }
5638
5639 static int
5640 ixgbe_add_vf(device_t dev, u16 vfnum, const nvlist_t *config)
5641 {
5642         struct adapter *adapter;
5643         struct ixgbe_vf *vf;
5644         const void *mac;
5645
5646         adapter = device_get_softc(dev);
5647
5648         KASSERT(vfnum < adapter->num_vfs, ("VF index %d is out of range %d",
5649             vfnum, adapter->num_vfs));
5650
5651         IXGBE_CORE_LOCK(adapter);
5652         vf = &adapter->vfs[vfnum];
5653         vf->pool= vfnum;
5654
5655         /* RAR[0] is used by the PF so use vfnum + 1 for VF RAR. */
5656         vf->rar_index = vfnum + 1;
5657         vf->default_vlan = 0;
5658         vf->max_frame_size = ETHER_MAX_LEN;
5659         ixgbe_update_max_frame(adapter, vf->max_frame_size);
5660
5661         if (nvlist_exists_binary(config, "mac-addr")) {
5662                 mac = nvlist_get_binary(config, "mac-addr", NULL);
5663                 bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
5664                 if (nvlist_get_bool(config, "allow-set-mac"))
5665                         vf->flags |= IXGBE_VF_CAP_MAC;
5666         } else
5667                 /*
5668                  * If the administrator has not specified a MAC address then
5669                  * we must allow the VF to choose one.
5670                  */
5671                 vf->flags |= IXGBE_VF_CAP_MAC;
5672
5673         vf->flags = IXGBE_VF_ACTIVE;
5674
5675         ixgbe_init_vf(adapter, vf);
5676         IXGBE_CORE_UNLOCK(adapter);
5677
5678         return (0);
5679 }
5680 #endif /* PCI_IOV */
5681