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