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