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