xref: /netbsd-src/sys/dev/pci/ixgbe/ixgbe.c (revision d16b7486a53dcb8072b60ec6fcb4373a2d0c27b7)
1 /* $NetBSD: ixgbe.c,v 1.326 2023/05/15 08:01:22 msaitoh Exp $ */
2 
3 /******************************************************************************
4 
5   Copyright (c) 2001-2017, Intel Corporation
6   All rights reserved.
7 
8   Redistribution and use in source and binary forms, with or without
9   modification, are permitted provided that the following conditions are met:
10 
11    1. Redistributions of source code must retain the above copyright notice,
12       this list of conditions and the following disclaimer.
13 
14    2. Redistributions in binary form must reproduce the above copyright
15       notice, this list of conditions and the following disclaimer in the
16       documentation and/or other materials provided with the distribution.
17 
18    3. Neither the name of the Intel Corporation nor the names of its
19       contributors may be used to endorse or promote products derived from
20       this software without specific prior written permission.
21 
22   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32   POSSIBILITY OF SUCH DAMAGE.
33 
34 ******************************************************************************/
35 /*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 331224 2018-03-19 20:55:05Z erj $*/
36 
37 /*
38  * Copyright (c) 2011 The NetBSD Foundation, Inc.
39  * All rights reserved.
40  *
41  * This code is derived from software contributed to The NetBSD Foundation
42  * by Coyote Point Systems, Inc.
43  *
44  * Redistribution and use in source and binary forms, with or without
45  * modification, are permitted provided that the following conditions
46  * are met:
47  * 1. Redistributions of source code must retain the above copyright
48  *    notice, this list of conditions and the following disclaimer.
49  * 2. Redistributions in binary form must reproduce the above copyright
50  *    notice, this list of conditions and the following disclaimer in the
51  *    documentation and/or other materials provided with the distribution.
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
54  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
55  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
57  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
58  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
59  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
60  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
61  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
62  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
63  * POSSIBILITY OF SUCH DAMAGE.
64  */
65 
66 #include <sys/cdefs.h>
67 __KERNEL_RCSID(0, "$NetBSD: ixgbe.c,v 1.326 2023/05/15 08:01:22 msaitoh Exp $");
68 
69 #ifdef _KERNEL_OPT
70 #include "opt_inet.h"
71 #include "opt_inet6.h"
72 #include "opt_net_mpsafe.h"
73 #endif
74 
75 #include "ixgbe.h"
76 #include "ixgbe_phy.h"
77 #include "ixgbe_sriov.h"
78 
79 #include <sys/cprng.h>
80 #include <dev/mii/mii.h>
81 #include <dev/mii/miivar.h>
82 
83 /************************************************************************
84  * Driver version
85  ************************************************************************/
86 static const char ixgbe_driver_version[] = "4.0.1-k";
87 /* XXX NetBSD: + 3.3.24 */
88 
89 /************************************************************************
90  * PCI Device ID Table
91  *
92  *   Used by probe to select devices to load on
93  *   Last field stores an index into ixgbe_strings
94  *   Last entry must be all 0s
95  *
96  *   { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
97  ************************************************************************/
98 static const ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
99 {
100 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
101 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
102 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
103 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
104 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
105 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
106 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_BX, 0, 0, 0},
107 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
108 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
109 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
110 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
111 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
112 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KR, 0, 0, 0},
113 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
114 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
115 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
116 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_EM, 0, 0, 0},
117 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
118 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
119 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
120 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
121 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
122 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0},
123 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
124 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0},
125 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF_QP, 0, 0, 0},
126 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_QSFP_SF_QP, 0, 0, 0},
127 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0},
128 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1, 0, 0, 0},
129 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T, 0, 0, 0},
130 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T1, 0, 0, 0},
131 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KR, 0, 0, 0},
132 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KX4, 0, 0, 0},
133 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_10G_T, 0, 0, 0},
134 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_1G_T, 0, 0, 0},
135 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_SFP, 0, 0, 0},
136 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_XFI, 0, 0, 0},
137 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR, 0, 0, 0},
138 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR_L, 0, 0, 0},
139 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP, 0, 0, 0},
140 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP_N, 0, 0, 0},
141 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP, 0, 0, 0},
142 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP_N, 0, 0, 0},
143 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII, 0, 0, 0},
144 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII_L, 0, 0, 0},
145 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_10G_T, 0, 0, 0},
146 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T, 0, 0, 0},
147 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L, 0, 0, 0},
148 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_BYPASS, 0, 0, 0},
149 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS, 0, 0, 0},
150 	/* required last entry */
151 	{0, 0, 0, 0, 0}
152 };
153 
154 /************************************************************************
155  * Table of branding strings
156  ************************************************************************/
157 static const char    *ixgbe_strings[] = {
158 	"Intel(R) PRO/10GbE PCI-Express Network Driver"
159 };
160 
161 /************************************************************************
162  * Function prototypes
163  ************************************************************************/
164 static int	ixgbe_probe(device_t, cfdata_t, void *);
165 static void	ixgbe_quirks(struct adapter *);
166 static void	ixgbe_attach(device_t, device_t, void *);
167 static int	ixgbe_detach(device_t, int);
168 #if 0
169 static int	ixgbe_shutdown(device_t);
170 #endif
171 static bool	ixgbe_suspend(device_t, const pmf_qual_t *);
172 static bool	ixgbe_resume(device_t, const pmf_qual_t *);
173 static int	ixgbe_ifflags_cb(struct ethercom *);
174 static int	ixgbe_ioctl(struct ifnet *, u_long, void *);
175 static int	ixgbe_init(struct ifnet *);
176 static void	ixgbe_init_locked(struct adapter *);
177 static void	ixgbe_ifstop(struct ifnet *, int);
178 static void	ixgbe_stop_locked(void *);
179 static void	ixgbe_init_device_features(struct adapter *);
180 static int	ixgbe_check_fan_failure(struct adapter *, u32, bool);
181 static void	ixgbe_add_media_types(struct adapter *);
182 static void	ixgbe_media_status(struct ifnet *, struct ifmediareq *);
183 static int	ixgbe_media_change(struct ifnet *);
184 static int	ixgbe_allocate_pci_resources(struct adapter *,
185 		    const struct pci_attach_args *);
186 static void	ixgbe_free_deferred_handlers(struct adapter *);
187 static void	ixgbe_get_slot_info(struct adapter *);
188 static int	ixgbe_allocate_msix(struct adapter *,
189 		    const struct pci_attach_args *);
190 static int	ixgbe_allocate_legacy(struct adapter *,
191 		    const struct pci_attach_args *);
192 static int	ixgbe_configure_interrupts(struct adapter *);
193 static void	ixgbe_free_pciintr_resources(struct adapter *);
194 static void	ixgbe_free_pci_resources(struct adapter *);
195 static void	ixgbe_local_timer(void *);
196 static void	ixgbe_handle_timer(struct work *, void *);
197 static void	ixgbe_recovery_mode_timer(void *);
198 static void	ixgbe_handle_recovery_mode_timer(struct work *, void *);
199 static int	ixgbe_setup_interface(device_t, struct adapter *);
200 static void	ixgbe_config_gpie(struct adapter *);
201 static void	ixgbe_config_dmac(struct adapter *);
202 static void	ixgbe_config_delay_values(struct adapter *);
203 static void	ixgbe_schedule_admin_tasklet(struct adapter *);
204 static void	ixgbe_config_link(struct adapter *);
205 static void	ixgbe_check_wol_support(struct adapter *);
206 static int	ixgbe_setup_low_power_mode(struct adapter *);
207 #if 0
208 static void	ixgbe_rearm_queues(struct adapter *, u64);
209 #endif
210 
211 static void	ixgbe_initialize_transmit_units(struct adapter *);
212 static void	ixgbe_initialize_receive_units(struct adapter *);
213 static void	ixgbe_enable_rx_drop(struct adapter *);
214 static void	ixgbe_disable_rx_drop(struct adapter *);
215 static void	ixgbe_initialize_rss_mapping(struct adapter *);
216 
217 static void	ixgbe_enable_intr(struct adapter *);
218 static void	ixgbe_disable_intr(struct adapter *);
219 static void	ixgbe_update_stats_counters(struct adapter *);
220 static void	ixgbe_set_rxfilter(struct adapter *);
221 static void	ixgbe_update_link_status(struct adapter *);
222 static void	ixgbe_set_ivar(struct adapter *, u8, u8, s8);
223 static void	ixgbe_configure_ivars(struct adapter *);
224 static u8 *	ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
225 static void	ixgbe_eitr_write(struct adapter *, uint32_t, uint32_t);
226 
227 static void	ixgbe_setup_vlan_hw_tagging(struct adapter *);
228 static void	ixgbe_setup_vlan_hw_support(struct adapter *);
229 static int	ixgbe_vlan_cb(struct ethercom *, uint16_t, bool);
230 static int	ixgbe_register_vlan(struct adapter *, u16);
231 static int	ixgbe_unregister_vlan(struct adapter *, u16);
232 
233 static void	ixgbe_add_device_sysctls(struct adapter *);
234 static void	ixgbe_add_hw_stats(struct adapter *);
235 static void	ixgbe_clear_evcnt(struct adapter *);
236 static int	ixgbe_set_flowcntl(struct adapter *, int);
237 static int	ixgbe_set_advertise(struct adapter *, int);
238 static int	ixgbe_get_default_advertise(struct adapter *);
239 
240 /* Sysctl handlers */
241 static int	ixgbe_sysctl_flowcntl(SYSCTLFN_PROTO);
242 static int	ixgbe_sysctl_advertise(SYSCTLFN_PROTO);
243 static int	ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
244 static int	ixgbe_sysctl_dmac(SYSCTLFN_PROTO);
245 static int	ixgbe_sysctl_phy_temp(SYSCTLFN_PROTO);
246 static int	ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_PROTO);
247 #ifdef IXGBE_DEBUG
248 static int	ixgbe_sysctl_power_state(SYSCTLFN_PROTO);
249 static int	ixgbe_sysctl_print_rss_config(SYSCTLFN_PROTO);
250 #endif
251 static int	ixgbe_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
252 static int	ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
253 static int	ixgbe_sysctl_rdh_handler(SYSCTLFN_PROTO);
254 static int	ixgbe_sysctl_rdt_handler(SYSCTLFN_PROTO);
255 static int	ixgbe_sysctl_tdt_handler(SYSCTLFN_PROTO);
256 static int	ixgbe_sysctl_tdh_handler(SYSCTLFN_PROTO);
257 static int	ixgbe_sysctl_eee_state(SYSCTLFN_PROTO);
258 static int	ixgbe_sysctl_debug(SYSCTLFN_PROTO);
259 static int	ixgbe_sysctl_rx_copy_len(SYSCTLFN_PROTO);
260 static int	ixgbe_sysctl_tx_process_limit(SYSCTLFN_PROTO);
261 static int	ixgbe_sysctl_rx_process_limit(SYSCTLFN_PROTO);
262 static int	ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
263 static int	ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
264 
265 /* Interrupt functions */
266 static int	ixgbe_msix_que(void *);
267 static int	ixgbe_msix_admin(void *);
268 static void	ixgbe_intr_admin_common(struct adapter *, u32, u32 *);
269 static int	ixgbe_legacy_irq(void *);
270 
271 /* Event handlers running on workqueue */
272 static void	ixgbe_handle_que(void *);
273 static void	ixgbe_handle_link(void *);
274 static void	ixgbe_handle_msf(void *);
275 static void	ixgbe_handle_mod(void *, bool);
276 static void	ixgbe_handle_phy(void *);
277 
278 /* Deferred workqueue handlers */
279 static void	ixgbe_handle_admin(struct work *, void *);
280 static void	ixgbe_handle_que_work(struct work *, void *);
281 
282 static const ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
283 
284 /************************************************************************
285  *  NetBSD Device Interface Entry Points
286  ************************************************************************/
287 CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
288     ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
289     DVF_DETACH_SHUTDOWN);
290 
291 #if 0
292 devclass_t ix_devclass;
293 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
294 
295 MODULE_DEPEND(ix, pci, 1, 1, 1);
296 MODULE_DEPEND(ix, ether, 1, 1, 1);
297 #ifdef DEV_NETMAP
298 MODULE_DEPEND(ix, netmap, 1, 1, 1);
299 #endif
300 #endif
301 
302 /*
303  * TUNEABLE PARAMETERS:
304  */
305 
306 /*
307  * AIM: Adaptive Interrupt Moderation
308  * which means that the interrupt rate
309  * is varied over time based on the
310  * traffic for that interrupt vector
311  */
312 static bool ixgbe_enable_aim = true;
313 #define SYSCTL_INT(_a1, _a2, _a3, _a4, _a5, _a6, _a7)
314 SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RDTUN, &ixgbe_enable_aim, 0,
315     "Enable adaptive interrupt moderation");
316 
317 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
318 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
319     &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
320 
321 /* How many packets rxeof tries to clean at a time */
322 static int ixgbe_rx_process_limit = 256;
323 SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
324     &ixgbe_rx_process_limit, 0, "Maximum number of received packets to process at a time, -1 means unlimited");
325 
326 /* How many packets txeof tries to clean at a time */
327 static int ixgbe_tx_process_limit = 256;
328 SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
329     &ixgbe_tx_process_limit, 0,
330     "Maximum number of sent packets to process at a time, -1 means unlimited");
331 
332 /* Flow control setting, default to full */
333 static int ixgbe_flow_control = ixgbe_fc_full;
334 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
335     &ixgbe_flow_control, 0, "Default flow control used for all adapters");
336 
337 /* Which packet processing uses workqueue or softint */
338 static bool ixgbe_txrx_workqueue = false;
339 
340 /*
341  * Smart speed setting, default to on
342  * this only works as a compile option
343  * right now as its during attach, set
344  * this to 'ixgbe_smart_speed_off' to
345  * disable.
346  */
347 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
348 
349 /*
350  * MSI-X should be the default for best performance,
351  * but this allows it to be forced off for testing.
352  */
353 static int ixgbe_enable_msix = 1;
354 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
355     "Enable MSI-X interrupts");
356 
357 /*
358  * Number of Queues, can be set to 0,
359  * it then autoconfigures based on the
360  * number of cpus with a max of 8. This
361  * can be overridden manually here.
362  */
363 static int ixgbe_num_queues = 0;
364 SYSCTL_INT(_hw_ix, OID_AUTO, num_queues, CTLFLAG_RDTUN, &ixgbe_num_queues, 0,
365     "Number of queues to configure, 0 indicates autoconfigure");
366 
367 /*
368  * Number of TX descriptors per ring,
369  * setting higher than RX as this seems
370  * the better performing choice.
371  */
372 static int ixgbe_txd = PERFORM_TXD;
373 SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
374     "Number of transmit descriptors per queue");
375 
376 /* Number of RX descriptors per ring */
377 static int ixgbe_rxd = PERFORM_RXD;
378 SYSCTL_INT(_hw_ix, OID_AUTO, rxd, CTLFLAG_RDTUN, &ixgbe_rxd, 0,
379     "Number of receive descriptors per queue");
380 
381 /*
382  * Defining this on will allow the use
383  * of unsupported SFP+ modules, note that
384  * doing so you are on your own :)
385  */
386 static int allow_unsupported_sfp = false;
387 #define TUNABLE_INT(__x, __y)
388 TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
389 
390 /*
391  * Not sure if Flow Director is fully baked,
392  * so we'll default to turning it off.
393  */
394 static int ixgbe_enable_fdir = 0;
395 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
396     "Enable Flow Director");
397 
398 /* Legacy Transmit (single queue) */
399 static int ixgbe_enable_legacy_tx = 0;
400 SYSCTL_INT(_hw_ix, OID_AUTO, enable_legacy_tx, CTLFLAG_RDTUN,
401     &ixgbe_enable_legacy_tx, 0, "Enable Legacy TX flow");
402 
403 /* Receive-Side Scaling */
404 static int ixgbe_enable_rss = 1;
405 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
406     "Enable Receive-Side Scaling (RSS)");
407 
408 #if 0
409 static int (*ixgbe_start_locked)(struct ifnet *, struct tx_ring *);
410 static int (*ixgbe_ring_empty)(struct ifnet *, pcq_t *);
411 #endif
412 
413 #ifdef NET_MPSAFE
414 #define IXGBE_MPSAFE		1
415 #define IXGBE_CALLOUT_FLAGS	CALLOUT_MPSAFE
416 #define IXGBE_SOFTINT_FLAGS	SOFTINT_MPSAFE
417 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU | WQ_MPSAFE
418 #define IXGBE_TASKLET_WQ_FLAGS	WQ_MPSAFE
419 #else
420 #define IXGBE_CALLOUT_FLAGS	0
421 #define IXGBE_SOFTINT_FLAGS	0
422 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU
423 #define IXGBE_TASKLET_WQ_FLAGS	0
424 #endif
425 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
426 
427 /* Interval between reports of errors */
428 static const struct timeval ixgbe_errlog_intrvl = { 60, 0 };	/* 60s */
429 
430 /************************************************************************
431  * ixgbe_initialize_rss_mapping
432  ************************************************************************/
433 static void
434 ixgbe_initialize_rss_mapping(struct adapter *adapter)
435 {
436 	struct ixgbe_hw	*hw = &adapter->hw;
437 	u32		reta = 0, mrqc, rss_key[10];
438 	int		queue_id, table_size, index_mult;
439 	int		i, j;
440 	u32		rss_hash_config;
441 
442 	/* force use default RSS key. */
443 #ifdef __NetBSD__
444 	rss_getkey((uint8_t *) &rss_key);
445 #else
446 	if (adapter->feat_en & IXGBE_FEATURE_RSS) {
447 		/* Fetch the configured RSS key */
448 		rss_getkey((uint8_t *) &rss_key);
449 	} else {
450 		/* set up random bits */
451 		cprng_fast(&rss_key, sizeof(rss_key));
452 	}
453 #endif
454 
455 	/* Set multiplier for RETA setup and table size based on MAC */
456 	index_mult = 0x1;
457 	table_size = 128;
458 	switch (adapter->hw.mac.type) {
459 	case ixgbe_mac_82598EB:
460 		index_mult = 0x11;
461 		break;
462 	case ixgbe_mac_X550:
463 	case ixgbe_mac_X550EM_x:
464 	case ixgbe_mac_X550EM_a:
465 		table_size = 512;
466 		break;
467 	default:
468 		break;
469 	}
470 
471 	/* Set up the redirection table */
472 	for (i = 0, j = 0; i < table_size; i++, j++) {
473 		if (j == adapter->num_queues)
474 			j = 0;
475 
476 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
477 			/*
478 			 * Fetch the RSS bucket id for the given indirection
479 			 * entry. Cap it at the number of configured buckets
480 			 * (which is num_queues.)
481 			 */
482 			queue_id = rss_get_indirection_to_bucket(i);
483 			queue_id = queue_id % adapter->num_queues;
484 		} else
485 			queue_id = (j * index_mult);
486 
487 		/*
488 		 * The low 8 bits are for hash value (n+0);
489 		 * The next 8 bits are for hash value (n+1), etc.
490 		 */
491 		reta = reta >> 8;
492 		reta = reta | (((uint32_t) queue_id) << 24);
493 		if ((i & 3) == 3) {
494 			if (i < 128)
495 				IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
496 			else
497 				IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
498 				    reta);
499 			reta = 0;
500 		}
501 	}
502 
503 	/* Now fill our hash function seeds */
504 	for (i = 0; i < 10; i++)
505 		IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
506 
507 	/* Perform hash on these packet types */
508 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
509 		rss_hash_config = rss_gethashconfig();
510 	else {
511 		/*
512 		 * Disable UDP - IP fragments aren't currently being handled
513 		 * and so we end up with a mix of 2-tuple and 4-tuple
514 		 * traffic.
515 		 */
516 		rss_hash_config = RSS_HASHTYPE_RSS_IPV4
517 				| RSS_HASHTYPE_RSS_TCP_IPV4
518 				| RSS_HASHTYPE_RSS_IPV6
519 				| RSS_HASHTYPE_RSS_TCP_IPV6
520 				| RSS_HASHTYPE_RSS_IPV6_EX
521 				| RSS_HASHTYPE_RSS_TCP_IPV6_EX;
522 	}
523 
524 	mrqc = IXGBE_MRQC_RSSEN;
525 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
526 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
527 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
528 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
529 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
530 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
531 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
532 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
533 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
534 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
535 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
536 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
537 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
538 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
539 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
540 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
541 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
542 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
543 	mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
544 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
545 } /* ixgbe_initialize_rss_mapping */
546 
547 /************************************************************************
548  * ixgbe_initialize_receive_units - Setup receive registers and features.
549  ************************************************************************/
550 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
551 
552 static void
553 ixgbe_initialize_receive_units(struct adapter *adapter)
554 {
555 	struct	rx_ring	*rxr = adapter->rx_rings;
556 	struct ixgbe_hw	*hw = &adapter->hw;
557 	struct ifnet	*ifp = adapter->ifp;
558 	int		i, j;
559 	u32		bufsz, fctrl, srrctl, rxcsum;
560 	u32		hlreg;
561 
562 	/*
563 	 * Make sure receives are disabled while
564 	 * setting up the descriptor ring
565 	 */
566 	ixgbe_disable_rx(hw);
567 
568 	/* Enable broadcasts */
569 	fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
570 	fctrl |= IXGBE_FCTRL_BAM;
571 	if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
572 		fctrl |= IXGBE_FCTRL_DPF;
573 		fctrl |= IXGBE_FCTRL_PMCF;
574 	}
575 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
576 
577 	/* Set for Jumbo Frames? */
578 	hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
579 	if (ifp->if_mtu > ETHERMTU)
580 		hlreg |= IXGBE_HLREG0_JUMBOEN;
581 	else
582 		hlreg &= ~IXGBE_HLREG0_JUMBOEN;
583 
584 #ifdef DEV_NETMAP
585 	/* CRC stripping is conditional in Netmap */
586 	if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
587 	    (ifp->if_capenable & IFCAP_NETMAP) &&
588 	    !ix_crcstrip)
589 		hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
590 	else
591 #endif /* DEV_NETMAP */
592 		hlreg |= IXGBE_HLREG0_RXCRCSTRP;
593 
594 	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
595 
596 	bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
597 	    IXGBE_SRRCTL_BSIZEPKT_SHIFT;
598 
599 	for (i = 0; i < adapter->num_queues; i++, rxr++) {
600 		u64 rdba = rxr->rxdma.dma_paddr;
601 		u32 reg;
602 		int regnum = i / 4;	/* 1 register per 4 queues */
603 		int regshift = i % 4;	/* 4 bits per 1 queue */
604 		j = rxr->me;
605 
606 		/* Setup the Base and Length of the Rx Descriptor Ring */
607 		IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
608 		    (rdba & 0x00000000ffffffffULL));
609 		IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
610 		IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
611 		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
612 
613 		/* Set up the SRRCTL register */
614 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
615 		srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
616 		srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
617 		srrctl |= bufsz;
618 		srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
619 
620 		/* Set RQSMR (Receive Queue Statistic Mapping) register */
621 		reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(regnum));
622 		reg &= ~(0x000000ffUL << (regshift * 8));
623 		reg |= i << (regshift * 8);
624 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(regnum), reg);
625 
626 		/*
627 		 * Set DROP_EN iff we have no flow control and >1 queue.
628 		 * Note that srrctl was cleared shortly before during reset,
629 		 * so we do not need to clear the bit, but do it just in case
630 		 * this code is moved elsewhere.
631 		 */
632 		if ((adapter->num_queues > 1) &&
633 		    (adapter->hw.fc.requested_mode == ixgbe_fc_none))
634 			srrctl |= IXGBE_SRRCTL_DROP_EN;
635 		else
636 			srrctl &= ~IXGBE_SRRCTL_DROP_EN;
637 
638 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
639 
640 		/* Setup the HW Rx Head and Tail Descriptor Pointers */
641 		IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
642 		IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
643 
644 		/* Set the driver rx tail address */
645 		rxr->tail =  IXGBE_RDT(rxr->me);
646 	}
647 
648 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
649 		u32 psrtype = IXGBE_PSRTYPE_TCPHDR
650 			    | IXGBE_PSRTYPE_UDPHDR
651 			    | IXGBE_PSRTYPE_IPV4HDR
652 			    | IXGBE_PSRTYPE_IPV6HDR;
653 		IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
654 	}
655 
656 	rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
657 
658 	ixgbe_initialize_rss_mapping(adapter);
659 
660 	if (adapter->num_queues > 1) {
661 		/* RSS and RX IPP Checksum are mutually exclusive */
662 		rxcsum |= IXGBE_RXCSUM_PCSD;
663 	}
664 
665 	if (ifp->if_capenable & IFCAP_RXCSUM)
666 		rxcsum |= IXGBE_RXCSUM_PCSD;
667 
668 	/* This is useful for calculating UDP/IP fragment checksums */
669 	if (!(rxcsum & IXGBE_RXCSUM_PCSD))
670 		rxcsum |= IXGBE_RXCSUM_IPPCSE;
671 
672 	IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
673 
674 } /* ixgbe_initialize_receive_units */
675 
676 /************************************************************************
677  * ixgbe_initialize_transmit_units - Enable transmit units.
678  ************************************************************************/
679 static void
680 ixgbe_initialize_transmit_units(struct adapter *adapter)
681 {
682 	struct tx_ring	*txr = adapter->tx_rings;
683 	struct ixgbe_hw	*hw = &adapter->hw;
684 	int i;
685 
686 	INIT_DEBUGOUT("ixgbe_initialize_transmit_units");
687 
688 	/* Setup the Base and Length of the Tx Descriptor Ring */
689 	for (i = 0; i < adapter->num_queues; i++, txr++) {
690 		u64 tdba = txr->txdma.dma_paddr;
691 		u32 txctrl = 0;
692 		u32 tqsmreg, reg;
693 		int regnum = i / 4;	/* 1 register per 4 queues */
694 		int regshift = i % 4;	/* 4 bits per 1 queue */
695 		int j = txr->me;
696 
697 		IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
698 		    (tdba & 0x00000000ffffffffULL));
699 		IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
700 		IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
701 		    adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
702 
703 		/*
704 		 * Set TQSMR (Transmit Queue Statistic Mapping) register.
705 		 * Register location is different between 82598 and others.
706 		 */
707 		if (adapter->hw.mac.type == ixgbe_mac_82598EB)
708 			tqsmreg = IXGBE_TQSMR(regnum);
709 		else
710 			tqsmreg = IXGBE_TQSM(regnum);
711 		reg = IXGBE_READ_REG(hw, tqsmreg);
712 		reg &= ~(0x000000ffUL << (regshift * 8));
713 		reg |= i << (regshift * 8);
714 		IXGBE_WRITE_REG(hw, tqsmreg, reg);
715 
716 		/* Setup the HW Tx Head and Tail descriptor pointers */
717 		IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
718 		IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
719 
720 		/* Cache the tail address */
721 		txr->tail = IXGBE_TDT(j);
722 
723 		txr->txr_no_space = false;
724 
725 		/* Disable Head Writeback */
726 		/*
727 		 * Note: for X550 series devices, these registers are actually
728 		 * prefixed with TPH_ instead of DCA_, but the addresses and
729 		 * fields remain the same.
730 		 */
731 		switch (hw->mac.type) {
732 		case ixgbe_mac_82598EB:
733 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
734 			break;
735 		default:
736 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
737 			break;
738 		}
739 		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
740 		switch (hw->mac.type) {
741 		case ixgbe_mac_82598EB:
742 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
743 			break;
744 		default:
745 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
746 			break;
747 		}
748 
749 	}
750 
751 	if (hw->mac.type != ixgbe_mac_82598EB) {
752 		u32 dmatxctl, rttdcs;
753 
754 		dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
755 		dmatxctl |= IXGBE_DMATXCTL_TE;
756 		IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
757 		/* Disable arbiter to set MTQC */
758 		rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
759 		rttdcs |= IXGBE_RTTDCS_ARBDIS;
760 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
761 		IXGBE_WRITE_REG(hw, IXGBE_MTQC,
762 		    ixgbe_get_mtqc(adapter->iov_mode));
763 		rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
764 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
765 	}
766 
767 	return;
768 } /* ixgbe_initialize_transmit_units */
769 
770 static void
771 ixgbe_quirks(struct adapter *adapter)
772 {
773 	device_t dev = adapter->dev;
774 	struct ixgbe_hw *hw = &adapter->hw;
775 	const char *vendor, *product;
776 
777 	if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) {
778 		/*
779 		 * Quirk for inverted logic of SFP+'s MOD_ABS on GIGABYTE
780 		 * MA10-ST0.
781 		 */
782 		vendor = pmf_get_platform("system-vendor");
783 		product = pmf_get_platform("system-product");
784 
785 		if ((vendor == NULL) || (product == NULL))
786 			return;
787 
788 		if ((strcmp(vendor, "GIGABYTE") == 0) &&
789 		    (strcmp(product, "MA10-ST0") == 0)) {
790 			aprint_verbose_dev(dev,
791 			    "Enable SFP+ MOD_ABS inverse quirk\n");
792 			adapter->hw.quirks |= IXGBE_QUIRK_MOD_ABS_INVERT;
793 		}
794 	}
795 }
796 
797 /************************************************************************
798  * ixgbe_attach - Device initialization routine
799  *
800  *   Called when the driver is being loaded.
801  *   Identifies the type of hardware, allocates all resources
802  *   and initializes the hardware.
803  *
804  *   return 0 on success, positive on failure
805  ************************************************************************/
806 static void
807 ixgbe_attach(device_t parent, device_t dev, void *aux)
808 {
809 	struct adapter	*adapter;
810 	struct ixgbe_hw *hw;
811 	int		error = -1;
812 	u32		ctrl_ext;
813 	u16		high, low, nvmreg;
814 	pcireg_t	id, subid;
815 	const ixgbe_vendor_info_t *ent;
816 	struct pci_attach_args *pa = aux;
817 	bool unsupported_sfp = false;
818 	const char *str;
819 	char wqname[MAXCOMLEN];
820 	char buf[256];
821 
822 	INIT_DEBUGOUT("ixgbe_attach: begin");
823 
824 	/* Allocate, clear, and link in our adapter structure */
825 	adapter = device_private(dev);
826 	adapter->hw.back = adapter;
827 	adapter->dev = dev;
828 	hw = &adapter->hw;
829 	adapter->osdep.pc = pa->pa_pc;
830 	adapter->osdep.tag = pa->pa_tag;
831 	if (pci_dma64_available(pa))
832 		adapter->osdep.dmat = pa->pa_dmat64;
833 	else
834 		adapter->osdep.dmat = pa->pa_dmat;
835 	adapter->osdep.attached = false;
836 	adapter->osdep.detaching = false;
837 
838 	ent = ixgbe_lookup(pa);
839 
840 	KASSERT(ent != NULL);
841 
842 	aprint_normal(": %s, Version - %s\n",
843 	    ixgbe_strings[ent->index], ixgbe_driver_version);
844 
845 	/* Core Lock Init */
846 	IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
847 
848 	/* Set up the timer callout and workqueue */
849 	callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
850 	snprintf(wqname, sizeof(wqname), "%s-timer", device_xname(dev));
851 	error = workqueue_create(&adapter->timer_wq, wqname,
852 	    ixgbe_handle_timer, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
853 	    IXGBE_TASKLET_WQ_FLAGS);
854 	if (error) {
855 		aprint_error_dev(dev,
856 		    "could not create timer workqueue (%d)\n", error);
857 		goto err_out;
858 	}
859 
860 	/* Determine hardware revision */
861 	id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
862 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
863 
864 	hw->vendor_id = PCI_VENDOR(id);
865 	hw->device_id = PCI_PRODUCT(id);
866 	hw->revision_id =
867 	    PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
868 	hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
869 	hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
870 
871 	/* Set quirk flags */
872 	ixgbe_quirks(adapter);
873 
874 	/*
875 	 * Make sure BUSMASTER is set
876 	 */
877 	ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
878 
879 	/* Do base PCI setup - map BAR0 */
880 	if (ixgbe_allocate_pci_resources(adapter, pa)) {
881 		aprint_error_dev(dev, "Allocation of PCI resources failed\n");
882 		error = ENXIO;
883 		goto err_out;
884 	}
885 
886 	/* let hardware know driver is loaded */
887 	ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
888 	ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
889 	IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
890 
891 	/*
892 	 * Initialize the shared code
893 	 */
894 	if (ixgbe_init_shared_code(hw) != 0) {
895 		aprint_error_dev(dev,
896 		    "Unable to initialize the shared code\n");
897 		error = ENXIO;
898 		goto err_out;
899 	}
900 
901 	switch (hw->mac.type) {
902 	case ixgbe_mac_82598EB:
903 		str = "82598EB";
904 		break;
905 	case ixgbe_mac_82599EB:
906 		str = "82599EB";
907 		break;
908 	case ixgbe_mac_X540:
909 		str = "X540";
910 		break;
911 	case ixgbe_mac_X550:
912 		str = "X550";
913 		break;
914 	case ixgbe_mac_X550EM_x:
915 		str = "X550EM X";
916 		break;
917 	case ixgbe_mac_X550EM_a:
918 		str = "X550EM A";
919 		break;
920 	default:
921 		str = "Unknown";
922 		break;
923 	}
924 	aprint_normal_dev(dev, "device %s\n", str);
925 
926 	hw->allow_unsupported_sfp = allow_unsupported_sfp;
927 
928 	/* Pick up the 82599 settings */
929 	if (hw->mac.type != ixgbe_mac_82598EB)
930 		hw->phy.smart_speed = ixgbe_smart_speed;
931 
932 	/* Set the right number of segments */
933 	KASSERT(IXGBE_82599_SCATTER_MAX >= IXGBE_SCATTER_DEFAULT);
934 	adapter->num_segs = IXGBE_SCATTER_DEFAULT;
935 
936 	/* Ensure SW/FW semaphore is free */
937 	ixgbe_init_swfw_semaphore(hw);
938 
939 	hw->mac.ops.set_lan_id(hw);
940 	ixgbe_init_device_features(adapter);
941 
942 	if (ixgbe_configure_interrupts(adapter)) {
943 		error = ENXIO;
944 		goto err_out;
945 	}
946 
947 	/* Allocate multicast array memory. */
948 	adapter->mta = malloc(sizeof(*adapter->mta) *
949 	    MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_WAITOK);
950 
951 	/* Enable WoL (if supported) */
952 	ixgbe_check_wol_support(adapter);
953 
954 	/* Register for VLAN events */
955 	ether_set_vlan_cb(&adapter->osdep.ec, ixgbe_vlan_cb);
956 
957 	/* Verify adapter fan is still functional (if applicable) */
958 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
959 		u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
960 		ixgbe_check_fan_failure(adapter, esdp, FALSE);
961 	}
962 
963 	/* Set an initial default flow control value */
964 	hw->fc.requested_mode = ixgbe_flow_control;
965 
966 	/* Do descriptor calc and sanity checks */
967 	if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
968 	    ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
969 		aprint_error_dev(dev, "TXD config issue, using default!\n");
970 		adapter->num_tx_desc = DEFAULT_TXD;
971 	} else
972 		adapter->num_tx_desc = ixgbe_txd;
973 
974 	if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
975 	    ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
976 		aprint_error_dev(dev, "RXD config issue, using default!\n");
977 		adapter->num_rx_desc = DEFAULT_RXD;
978 	} else
979 		adapter->num_rx_desc = ixgbe_rxd;
980 
981 	/* Sysctls for limiting the amount of work done in the taskqueues */
982 	adapter->rx_process_limit
983 	    = (ixgbe_rx_process_limit <= adapter->num_rx_desc)
984 	    ? ixgbe_rx_process_limit : adapter->num_rx_desc;
985 	adapter->tx_process_limit
986 	    = (ixgbe_tx_process_limit <= adapter->num_tx_desc)
987 	    ? ixgbe_tx_process_limit : adapter->num_tx_desc;
988 
989 	/* Set default high limit of copying mbuf in rxeof */
990 	adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
991 
992 	/* Allocate our TX/RX Queues */
993 	if (ixgbe_allocate_queues(adapter)) {
994 		error = ENOMEM;
995 		goto err_out;
996 	}
997 
998 	hw->phy.reset_if_overtemp = TRUE;
999 	error = ixgbe_reset_hw(hw);
1000 	hw->phy.reset_if_overtemp = FALSE;
1001 	if (error == IXGBE_ERR_SFP_NOT_PRESENT)
1002 		error = IXGBE_SUCCESS;
1003 	else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
1004 		aprint_error_dev(dev,
1005 		    "Unsupported SFP+ module type was detected.\n");
1006 		unsupported_sfp = true;
1007 		error = IXGBE_SUCCESS;
1008 	} else if (error) {
1009 		aprint_error_dev(dev,
1010 		    "Hardware initialization failed(error = %d)\n", error);
1011 		error = EIO;
1012 		goto err_late;
1013 	}
1014 
1015 	/* Make sure we have a good EEPROM before we read from it */
1016 	if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
1017 		aprint_error_dev(dev, "The EEPROM Checksum Is Not Valid\n");
1018 		error = EIO;
1019 		goto err_late;
1020 	}
1021 
1022 	aprint_normal("%s:", device_xname(dev));
1023 	/* NVM Image Version */
1024 	high = low = 0;
1025 	switch (hw->mac.type) {
1026 	case ixgbe_mac_82598EB:
1027 		/*
1028 		 * Print version from the dev starter version (0x29). The
1029 		 * location is the same as newer device's IXGBE_NVM_MAP_VER.
1030 		 */
1031 		hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
1032 		if (nvmreg == 0xffff)
1033 			break;
1034 		high = (nvmreg >> 12) & 0x0f;
1035 		low = (nvmreg >> 4) & 0xff;
1036 		id = nvmreg & 0x0f;
1037 		/*
1038 		 * The following output might not be correct. Some 82598 cards
1039 		 * have 0x1070 or 0x2090. 82598 spec update notes about 2.9.0.
1040 		 */
1041 		aprint_normal(" NVM Image Version %u.%u.%u,", high, low, id);
1042 		break;
1043 	case ixgbe_mac_X540:
1044 	case ixgbe_mac_X550EM_a:
1045 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
1046 		if (nvmreg == 0xffff)
1047 			break;
1048 		high = (nvmreg >> 12) & 0x0f;
1049 		low = (nvmreg >> 4) & 0xff;
1050 		id = nvmreg & 0x0f;
1051 		aprint_normal(" NVM Image Version %u.", high);
1052 		if (hw->mac.type == ixgbe_mac_X540)
1053 			str = "%x";
1054 		else
1055 			str = "%02x";
1056 		aprint_normal(str, low);
1057 		aprint_normal(" ID 0x%x,", id);
1058 		break;
1059 	case ixgbe_mac_X550EM_x:
1060 	case ixgbe_mac_X550:
1061 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
1062 		if (nvmreg == 0xffff)
1063 			break;
1064 		high = (nvmreg >> 12) & 0x0f;
1065 		low = nvmreg & 0xff;
1066 		aprint_normal(" NVM Image Version %u.%02x,", high, low);
1067 		break;
1068 	default:
1069 		break;
1070 	}
1071 	hw->eeprom.nvm_image_ver_high = high;
1072 	hw->eeprom.nvm_image_ver_low = low;
1073 
1074 	/* PHY firmware revision */
1075 	switch (hw->mac.type) {
1076 	case ixgbe_mac_X540:
1077 	case ixgbe_mac_X550:
1078 		hw->eeprom.ops.read(hw, IXGBE_PHYFW_REV, &nvmreg);
1079 		if (nvmreg == 0xffff)
1080 			break;
1081 		high = (nvmreg >> 12) & 0x0f;
1082 		low = (nvmreg >> 4) & 0xff;
1083 		id = nvmreg & 0x000f;
1084 		aprint_normal(" PHY FW Revision %u.", high);
1085 		if (hw->mac.type == ixgbe_mac_X540)
1086 			str = "%x";
1087 		else
1088 			str = "%02x";
1089 		aprint_normal(str, low);
1090 		aprint_normal(" ID 0x%x,", id);
1091 		break;
1092 	default:
1093 		break;
1094 	}
1095 
1096 	/* NVM Map version & OEM NVM Image version */
1097 	switch (hw->mac.type) {
1098 	case ixgbe_mac_X550:
1099 	case ixgbe_mac_X550EM_x:
1100 	case ixgbe_mac_X550EM_a:
1101 		hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
1102 		if (nvmreg != 0xffff) {
1103 			high = (nvmreg >> 12) & 0x0f;
1104 			low = nvmreg & 0x00ff;
1105 			aprint_normal(" NVM Map version %u.%02x,", high, low);
1106 		}
1107 		hw->eeprom.ops.read(hw, IXGBE_OEM_NVM_IMAGE_VER, &nvmreg);
1108 		if (nvmreg != 0xffff) {
1109 			high = (nvmreg >> 12) & 0x0f;
1110 			low = nvmreg & 0x00ff;
1111 			aprint_verbose(" OEM NVM Image version %u.%02x,", high,
1112 			    low);
1113 		}
1114 		break;
1115 	default:
1116 		break;
1117 	}
1118 
1119 	/* Print the ETrackID */
1120 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_H, &high);
1121 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_L, &low);
1122 	aprint_normal(" ETrackID %08x\n", ((uint32_t)high << 16) | low);
1123 
1124 	/* Printed Board Assembly number */
1125 	error = ixgbe_read_pba_string(hw, buf, IXGBE_PBANUM_LENGTH);
1126 	aprint_normal_dev(dev, "PBA number %s\n", error ? "unknown" : buf);
1127 
1128 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
1129 		error = ixgbe_allocate_msix(adapter, pa);
1130 		if (error) {
1131 			/* Free allocated queue structures first */
1132 			ixgbe_free_queues(adapter);
1133 
1134 			/* Fallback to legacy interrupt */
1135 			if (adapter->feat_cap & IXGBE_FEATURE_MSI)
1136 				adapter->feat_en |= IXGBE_FEATURE_MSI;
1137 			adapter->num_queues = 1;
1138 
1139 			/* Allocate our TX/RX Queues again */
1140 			if (ixgbe_allocate_queues(adapter)) {
1141 				error = ENOMEM;
1142 				goto err_out;
1143 			}
1144 		}
1145 	}
1146 
1147 	/* Recovery mode */
1148 	switch (adapter->hw.mac.type) {
1149 	case ixgbe_mac_X550:
1150 	case ixgbe_mac_X550EM_x:
1151 	case ixgbe_mac_X550EM_a:
1152 		/* >= 2.00 */
1153 		if (hw->eeprom.nvm_image_ver_high >= 2) {
1154 			adapter->feat_cap |= IXGBE_FEATURE_RECOVERY_MODE;
1155 			adapter->feat_en |= IXGBE_FEATURE_RECOVERY_MODE;
1156 		}
1157 		break;
1158 	default:
1159 		break;
1160 	}
1161 
1162 	if ((adapter->feat_en & IXGBE_FEATURE_MSIX) == 0)
1163 		error = ixgbe_allocate_legacy(adapter, pa);
1164 	if (error)
1165 		goto err_late;
1166 
1167 	/* Tasklets for Link, SFP, Multispeed Fiber and Flow Director */
1168 	mutex_init(&(adapter)->admin_mtx, MUTEX_DEFAULT, IPL_NET);
1169 	snprintf(wqname, sizeof(wqname), "%s-admin", device_xname(dev));
1170 	error = workqueue_create(&adapter->admin_wq, wqname,
1171 	    ixgbe_handle_admin, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
1172 	    IXGBE_TASKLET_WQ_FLAGS);
1173 	if (error) {
1174 		aprint_error_dev(dev,
1175 		    "could not create admin workqueue (%d)\n", error);
1176 		goto err_out;
1177 	}
1178 
1179 	error = ixgbe_start_hw(hw);
1180 	switch (error) {
1181 	case IXGBE_ERR_EEPROM_VERSION:
1182 		aprint_error_dev(dev,
1183 		    "This device is a pre-production adapter/"
1184 		    "LOM.  Please be aware there may be issues associated "
1185 		    "with your hardware.\nIf you are experiencing problems "
1186 		    "please contact your Intel or hardware representative "
1187 		    "who provided you with this hardware.\n");
1188 		break;
1189 	default:
1190 		break;
1191 	}
1192 
1193 	/* Setup OS specific network interface */
1194 	if (ixgbe_setup_interface(dev, adapter) != 0)
1195 		goto err_late;
1196 
1197 	/*
1198 	 *  Print PHY ID only for copper PHY. On device which has SFP(+) cage
1199 	 * and a module is inserted, phy.id is not MII PHY id but SFF 8024 ID.
1200 	 */
1201 	if (hw->phy.media_type == ixgbe_media_type_copper) {
1202 		uint16_t id1, id2;
1203 		int oui, model, rev;
1204 		char descr[MII_MAX_DESCR_LEN];
1205 
1206 		id1 = hw->phy.id >> 16;
1207 		id2 = hw->phy.id & 0xffff;
1208 		oui = MII_OUI(id1, id2);
1209 		model = MII_MODEL(id2);
1210 		rev = MII_REV(id2);
1211 		mii_get_descr(descr, sizeof(descr), oui, model);
1212 		if (descr[0])
1213 			aprint_normal_dev(dev, "PHY: %s, rev. %d\n",
1214 			    descr, rev);
1215 		else
1216 			aprint_normal_dev(dev,
1217 			    "PHY OUI 0x%06x, model 0x%04x, rev. %d\n",
1218 			    oui, model, rev);
1219 	}
1220 
1221 	/* Enable EEE power saving */
1222 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
1223 		hw->mac.ops.setup_eee(hw,
1224 		    adapter->feat_en & IXGBE_FEATURE_EEE);
1225 
1226 	/* Enable power to the phy. */
1227 	if (!unsupported_sfp) {
1228 		/* Enable the optics for 82599 SFP+ fiber */
1229 		ixgbe_enable_tx_laser(hw);
1230 
1231 		/*
1232 		 * XXX Currently, ixgbe_set_phy_power() supports only copper
1233 		 * PHY, so it's not required to test with !unsupported_sfp.
1234 		 */
1235 		ixgbe_set_phy_power(hw, TRUE);
1236 	}
1237 
1238 	/* Initialize statistics */
1239 	ixgbe_update_stats_counters(adapter);
1240 
1241 	/* Check PCIE slot type/speed/width */
1242 	ixgbe_get_slot_info(adapter);
1243 
1244 	/*
1245 	 * Do time init and sysctl init here, but
1246 	 * only on the first port of a bypass adapter.
1247 	 */
1248 	ixgbe_bypass_init(adapter);
1249 
1250 	/* Set an initial dmac value */
1251 	adapter->dmac = 0;
1252 	/* Set initial advertised speeds (if applicable) */
1253 	adapter->advertise = ixgbe_get_default_advertise(adapter);
1254 
1255 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
1256 		ixgbe_define_iov_schemas(dev, &error);
1257 
1258 	/* Add sysctls */
1259 	ixgbe_add_device_sysctls(adapter);
1260 	ixgbe_add_hw_stats(adapter);
1261 
1262 	/* For Netmap */
1263 	adapter->init_locked = ixgbe_init_locked;
1264 	adapter->stop_locked = ixgbe_stop_locked;
1265 
1266 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
1267 		ixgbe_netmap_attach(adapter);
1268 
1269 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
1270 	aprint_verbose_dev(dev, "feature cap %s\n", buf);
1271 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
1272 	aprint_verbose_dev(dev, "feature ena %s\n", buf);
1273 
1274 	if (pmf_device_register(dev, ixgbe_suspend, ixgbe_resume))
1275 		pmf_class_network_register(dev, adapter->ifp);
1276 	else
1277 		aprint_error_dev(dev, "couldn't establish power handler\n");
1278 
1279 	/* Init recovery mode timer and state variable */
1280 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE) {
1281 		adapter->recovery_mode = 0;
1282 
1283 		/* Set up the timer callout */
1284 		callout_init(&adapter->recovery_mode_timer,
1285 		    IXGBE_CALLOUT_FLAGS);
1286 		snprintf(wqname, sizeof(wqname), "%s-recovery",
1287 		    device_xname(dev));
1288 		error = workqueue_create(&adapter->recovery_mode_timer_wq,
1289 		    wqname, ixgbe_handle_recovery_mode_timer, adapter,
1290 		    IXGBE_WORKQUEUE_PRI, IPL_NET, IXGBE_TASKLET_WQ_FLAGS);
1291 		if (error) {
1292 			aprint_error_dev(dev, "could not create "
1293 			    "recovery_mode_timer workqueue (%d)\n", error);
1294 			goto err_out;
1295 		}
1296 
1297 		/* Start the task */
1298 		callout_reset(&adapter->recovery_mode_timer, hz,
1299 		    ixgbe_recovery_mode_timer, adapter);
1300 	}
1301 
1302 	INIT_DEBUGOUT("ixgbe_attach: end");
1303 	adapter->osdep.attached = true;
1304 
1305 	return;
1306 
1307 err_late:
1308 	ixgbe_free_queues(adapter);
1309 err_out:
1310 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
1311 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
1312 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
1313 	ixgbe_free_deferred_handlers(adapter);
1314 	ixgbe_free_pci_resources(adapter);
1315 	if (adapter->mta != NULL)
1316 		free(adapter->mta, M_DEVBUF);
1317 	mutex_destroy(&(adapter)->admin_mtx); /* XXX appropriate order? */
1318 	IXGBE_CORE_LOCK_DESTROY(adapter);
1319 
1320 	return;
1321 } /* ixgbe_attach */
1322 
1323 /************************************************************************
1324  * ixgbe_check_wol_support
1325  *
1326  *   Checks whether the adapter's ports are capable of
1327  *   Wake On LAN by reading the adapter's NVM.
1328  *
1329  *   Sets each port's hw->wol_enabled value depending
1330  *   on the value read here.
1331  ************************************************************************/
1332 static void
1333 ixgbe_check_wol_support(struct adapter *adapter)
1334 {
1335 	struct ixgbe_hw *hw = &adapter->hw;
1336 	u16		dev_caps = 0;
1337 
1338 	/* Find out WoL support for port */
1339 	adapter->wol_support = hw->wol_enabled = 0;
1340 	ixgbe_get_device_caps(hw, &dev_caps);
1341 	if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
1342 	    ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
1343 	     hw->bus.func == 0))
1344 		adapter->wol_support = hw->wol_enabled = 1;
1345 
1346 	/* Save initial wake up filter configuration */
1347 	adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
1348 
1349 	return;
1350 } /* ixgbe_check_wol_support */
1351 
1352 /************************************************************************
1353  * ixgbe_setup_interface
1354  *
1355  *   Setup networking device structure and register an interface.
1356  ************************************************************************/
1357 static int
1358 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
1359 {
1360 	struct ethercom *ec = &adapter->osdep.ec;
1361 	struct ifnet   *ifp;
1362 
1363 	INIT_DEBUGOUT("ixgbe_setup_interface: begin");
1364 
1365 	ifp = adapter->ifp = &ec->ec_if;
1366 	strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
1367 	ifp->if_baudrate = IF_Gbps(10);
1368 	ifp->if_init = ixgbe_init;
1369 	ifp->if_stop = ixgbe_ifstop;
1370 	ifp->if_softc = adapter;
1371 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1372 #ifdef IXGBE_MPSAFE
1373 	ifp->if_extflags = IFEF_MPSAFE;
1374 #endif
1375 	ifp->if_ioctl = ixgbe_ioctl;
1376 #if __FreeBSD_version >= 1100045
1377 	/* TSO parameters */
1378 	ifp->if_hw_tsomax = 65518;
1379 	ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
1380 	ifp->if_hw_tsomaxsegsize = 2048;
1381 #endif
1382 	if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
1383 #if 0
1384 		ixgbe_start_locked = ixgbe_legacy_start_locked;
1385 #endif
1386 	} else {
1387 		ifp->if_transmit = ixgbe_mq_start;
1388 #if 0
1389 		ixgbe_start_locked = ixgbe_mq_start_locked;
1390 #endif
1391 	}
1392 	ifp->if_start = ixgbe_legacy_start;
1393 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
1394 	IFQ_SET_READY(&ifp->if_snd);
1395 
1396 	if_initialize(ifp);
1397 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
1398 	ether_ifattach(ifp, adapter->hw.mac.addr);
1399 	aprint_normal_dev(dev, "Ethernet address %s\n",
1400 	    ether_sprintf(adapter->hw.mac.addr));
1401 	/*
1402 	 * We use per TX queue softint, so if_deferred_start_init() isn't
1403 	 * used.
1404 	 */
1405 	ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
1406 
1407 	adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1408 
1409 	/*
1410 	 * Tell the upper layer(s) we support long frames.
1411 	 */
1412 	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1413 
1414 	/* Set capability flags */
1415 	ifp->if_capabilities |= IFCAP_RXCSUM
1416 			     |	IFCAP_TXCSUM
1417 			     |	IFCAP_TSOv4
1418 			     |	IFCAP_TSOv6;
1419 	ifp->if_capenable = 0;
1420 
1421 	ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
1422 			    |  ETHERCAP_VLAN_HWCSUM
1423 			    |  ETHERCAP_JUMBO_MTU
1424 			    |  ETHERCAP_VLAN_MTU;
1425 
1426 	/* Enable the above capabilities by default */
1427 	ec->ec_capenable = ec->ec_capabilities;
1428 
1429 	/*
1430 	 * Don't turn this on by default, if vlans are
1431 	 * created on another pseudo device (eg. lagg)
1432 	 * then vlan events are not passed thru, breaking
1433 	 * operation, but with HW FILTER off it works. If
1434 	 * using vlans directly on the ixgbe driver you can
1435 	 * enable this and get full hardware tag filtering.
1436 	 */
1437 	ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
1438 
1439 	/*
1440 	 * Specify the media types supported by this adapter and register
1441 	 * callbacks to update media and link information
1442 	 */
1443 	ec->ec_ifmedia = &adapter->media;
1444 	ifmedia_init_with_lock(&adapter->media, IFM_IMASK, ixgbe_media_change,
1445 	    ixgbe_media_status, &adapter->core_mtx);
1446 
1447 	adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
1448 	ixgbe_add_media_types(adapter);
1449 
1450 	/* Set autoselect media by default */
1451 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1452 
1453 	if_register(ifp);
1454 
1455 	return (0);
1456 } /* ixgbe_setup_interface */
1457 
1458 /************************************************************************
1459  * ixgbe_add_media_types
1460  ************************************************************************/
1461 static void
1462 ixgbe_add_media_types(struct adapter *adapter)
1463 {
1464 	struct ixgbe_hw *hw = &adapter->hw;
1465 	u64		layer;
1466 
1467 	layer = adapter->phy_layer;
1468 
1469 #define	ADD(mm, dd)							\
1470 	ifmedia_add(&adapter->media, IFM_ETHER | (mm), (dd), NULL);
1471 
1472 	ADD(IFM_NONE, 0);
1473 
1474 	/* Media types with matching NetBSD media defines */
1475 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
1476 		ADD(IFM_10G_T | IFM_FDX, 0);
1477 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
1478 		ADD(IFM_1000_T | IFM_FDX, 0);
1479 	if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
1480 		ADD(IFM_100_TX | IFM_FDX, 0);
1481 	if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
1482 		ADD(IFM_10_T | IFM_FDX, 0);
1483 
1484 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
1485 	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
1486 		ADD(IFM_10G_TWINAX | IFM_FDX, 0);
1487 
1488 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
1489 		ADD(IFM_10G_LR | IFM_FDX, 0);
1490 		if (hw->phy.multispeed_fiber)
1491 			ADD(IFM_1000_LX | IFM_FDX, 0);
1492 	}
1493 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
1494 		ADD(IFM_10G_SR | IFM_FDX, 0);
1495 		if (hw->phy.multispeed_fiber)
1496 			ADD(IFM_1000_SX | IFM_FDX, 0);
1497 	} else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
1498 		ADD(IFM_1000_SX | IFM_FDX, 0);
1499 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
1500 		ADD(IFM_10G_CX4 | IFM_FDX, 0);
1501 
1502 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
1503 		ADD(IFM_10G_KR | IFM_FDX, 0);
1504 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4)
1505 		ADD(IFM_10G_KX4 | IFM_FDX, 0);
1506 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
1507 		ADD(IFM_1000_KX | IFM_FDX, 0);
1508 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX)
1509 		ADD(IFM_2500_KX | IFM_FDX, 0);
1510 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_T)
1511 		ADD(IFM_2500_T | IFM_FDX, 0);
1512 	if (layer & IXGBE_PHYSICAL_LAYER_5GBASE_T)
1513 		ADD(IFM_5000_T | IFM_FDX, 0);
1514 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
1515 		ADD(IFM_1000_BX10 | IFM_FDX, 0);
1516 	/* XXX no ifmedia_set? */
1517 
1518 	ADD(IFM_AUTO, 0);
1519 
1520 #undef ADD
1521 } /* ixgbe_add_media_types */
1522 
1523 /************************************************************************
1524  * ixgbe_is_sfp
1525  ************************************************************************/
1526 static inline bool
1527 ixgbe_is_sfp(struct ixgbe_hw *hw)
1528 {
1529 	switch (hw->mac.type) {
1530 	case ixgbe_mac_82598EB:
1531 		if (hw->phy.type == ixgbe_phy_nl)
1532 			return (TRUE);
1533 		return (FALSE);
1534 	case ixgbe_mac_82599EB:
1535 	case ixgbe_mac_X550EM_x:
1536 	case ixgbe_mac_X550EM_a:
1537 		switch (hw->mac.ops.get_media_type(hw)) {
1538 		case ixgbe_media_type_fiber:
1539 		case ixgbe_media_type_fiber_qsfp:
1540 			return (TRUE);
1541 		default:
1542 			return (FALSE);
1543 		}
1544 	default:
1545 		return (FALSE);
1546 	}
1547 } /* ixgbe_is_sfp */
1548 
1549 static void
1550 ixgbe_schedule_admin_tasklet(struct adapter *adapter)
1551 {
1552 
1553 	KASSERT(mutex_owned(&adapter->admin_mtx));
1554 
1555 	if (__predict_true(adapter->osdep.detaching == false)) {
1556 		if (adapter->admin_pending == 0)
1557 			workqueue_enqueue(adapter->admin_wq,
1558 			    &adapter->admin_wc, NULL);
1559 		adapter->admin_pending = 1;
1560 	}
1561 }
1562 
1563 /************************************************************************
1564  * ixgbe_config_link
1565  ************************************************************************/
1566 static void
1567 ixgbe_config_link(struct adapter *adapter)
1568 {
1569 	struct ixgbe_hw *hw = &adapter->hw;
1570 	u32		autoneg, err = 0;
1571 	u32		task_requests = 0;
1572 	bool		sfp, negotiate = false;
1573 
1574 	sfp = ixgbe_is_sfp(hw);
1575 
1576 	if (sfp) {
1577 		if (hw->phy.multispeed_fiber) {
1578 			ixgbe_enable_tx_laser(hw);
1579 			task_requests |= IXGBE_REQUEST_TASK_MSF_WOI;
1580 		}
1581 		task_requests |= IXGBE_REQUEST_TASK_MOD_WOI;
1582 
1583 		mutex_enter(&adapter->admin_mtx);
1584 		adapter->task_requests |= task_requests;
1585 		ixgbe_schedule_admin_tasklet(adapter);
1586 		mutex_exit(&adapter->admin_mtx);
1587 	} else {
1588 		struct ifmedia	*ifm = &adapter->media;
1589 
1590 		if (hw->mac.ops.check_link)
1591 			err = ixgbe_check_link(hw, &adapter->link_speed,
1592 			    &adapter->link_up, FALSE);
1593 		if (err)
1594 			return;
1595 
1596 		/*
1597 		 * Check if it's the first call. If it's the first call,
1598 		 * get value for auto negotiation.
1599 		 */
1600 		autoneg = hw->phy.autoneg_advertised;
1601 		if ((IFM_SUBTYPE(ifm->ifm_cur->ifm_media) != IFM_NONE)
1602 		    && ((!autoneg) && (hw->mac.ops.get_link_capabilities)))
1603 			err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
1604 			    &negotiate);
1605 		if (err)
1606 			return;
1607 		if (hw->mac.ops.setup_link)
1608 			err = hw->mac.ops.setup_link(hw, autoneg,
1609 			    adapter->link_up);
1610 	}
1611 } /* ixgbe_config_link */
1612 
1613 /************************************************************************
1614  * ixgbe_update_stats_counters - Update board statistics counters.
1615  ************************************************************************/
1616 static void
1617 ixgbe_update_stats_counters(struct adapter *adapter)
1618 {
1619 	struct ifnet	      *ifp = adapter->ifp;
1620 	struct ixgbe_hw	      *hw = &adapter->hw;
1621 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1622 	u32		      missed_rx = 0, bprc, lxontxc, lxofftxc;
1623 	u64		      total, total_missed_rx = 0;
1624 	uint64_t	      crcerrs, illerrc, rlec, ruc, rfc, roc, rjc;
1625 	unsigned int	      queue_counters;
1626 	int		      i;
1627 
1628 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_CRCERRS, crcerrs);
1629 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_ILLERRC, illerrc);
1630 
1631 	IXGBE_EVC_REGADD(hw, stats, IXGBE_ERRBC, errbc);
1632 	IXGBE_EVC_REGADD(hw, stats, IXGBE_MSPDC, mspdc);
1633 	if (hw->mac.type >= ixgbe_mac_X550)
1634 		IXGBE_EVC_REGADD(hw, stats, IXGBE_MBSDC, mbsdc);
1635 
1636 	/* 16 registers exist */
1637 	queue_counters = uimin(__arraycount(stats->qprc), adapter->num_queues);
1638 	for (i = 0; i < queue_counters; i++) {
1639 		IXGBE_EVC_REGADD(hw, stats, IXGBE_QPRC(i), qprc[i]);
1640 		IXGBE_EVC_REGADD(hw, stats, IXGBE_QPTC(i), qptc[i]);
1641 		if (hw->mac.type >= ixgbe_mac_82599EB)
1642 			IXGBE_EVC_REGADD(hw, stats, IXGBE_QPRDC(i), qprdc[i]);
1643 	}
1644 
1645 	/* 8 registers exist */
1646 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1647 		uint32_t mp;
1648 
1649 		/* MPC */
1650 		mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
1651 		/* global total per queue */
1652 		IXGBE_EVC_ADD(&stats->mpc[i], mp);
1653 		/* running comprehensive total for stats display */
1654 		total_missed_rx += mp;
1655 
1656 		if (hw->mac.type == ixgbe_mac_82598EB)
1657 			IXGBE_EVC_REGADD(hw, stats, IXGBE_RNBC(i), rnbc[i]);
1658 
1659 		IXGBE_EVC_REGADD(hw, stats, IXGBE_PXONTXC(i), pxontxc[i]);
1660 		IXGBE_EVC_REGADD(hw, stats, IXGBE_PXOFFTXC(i), pxofftxc[i]);
1661 		if (hw->mac.type >= ixgbe_mac_82599EB) {
1662 			IXGBE_EVC_REGADD(hw, stats,
1663 			    IXGBE_PXONRXCNT(i), pxonrxc[i]);
1664 			IXGBE_EVC_REGADD(hw, stats,
1665 			    IXGBE_PXOFFRXCNT(i), pxoffrxc[i]);
1666 			IXGBE_EVC_REGADD(hw, stats,
1667 			    IXGBE_PXON2OFFCNT(i), pxon2offc[i]);
1668 		} else {
1669 			IXGBE_EVC_REGADD(hw, stats,
1670 			    IXGBE_PXONRXC(i), pxonrxc[i]);
1671 			IXGBE_EVC_REGADD(hw, stats,
1672 			    IXGBE_PXOFFRXC(i), pxoffrxc[i]);
1673 		}
1674 	}
1675 	IXGBE_EVC_ADD(&stats->mpctotal, total_missed_rx);
1676 
1677 	/* Document says M[LR]FC are valid when link is up and 10Gbps */
1678 	if ((adapter->link_active == LINK_STATE_UP)
1679 	    && (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)) {
1680 		IXGBE_EVC_REGADD(hw, stats, IXGBE_MLFC, mlfc);
1681 		IXGBE_EVC_REGADD(hw, stats, IXGBE_MRFC, mrfc);
1682 	}
1683 	if (hw->mac.type == ixgbe_mac_X550EM_a)
1684 		IXGBE_EVC_REGADD(hw, stats, IXGBE_LINK_DN_CNT, link_dn_cnt);
1685 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_RLEC, rlec);
1686 
1687 	/* Hardware workaround, gprc counts missed packets */
1688 	IXGBE_EVC_ADD(&stats->gprc,
1689 	    IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx);
1690 
1691 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_LXONTXC, lxontxc);
1692 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_LXOFFTXC, lxofftxc);
1693 	total = lxontxc + lxofftxc;
1694 
1695 	if (hw->mac.type != ixgbe_mac_82598EB) {
1696 		IXGBE_EVC_ADD(&stats->gorc, IXGBE_READ_REG(hw, IXGBE_GORCL) +
1697 		    ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32));
1698 		IXGBE_EVC_ADD(&stats->gotc, IXGBE_READ_REG(hw, IXGBE_GOTCL) +
1699 		    ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32)
1700 		    - total * ETHER_MIN_LEN);
1701 		IXGBE_EVC_ADD(&stats->tor, IXGBE_READ_REG(hw, IXGBE_TORL) +
1702 		    ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32));
1703 		IXGBE_EVC_REGADD(hw, stats, IXGBE_LXONRXCNT, lxonrxc);
1704 		IXGBE_EVC_REGADD(hw, stats, IXGBE_LXOFFRXCNT, lxoffrxc);
1705 	} else {
1706 		IXGBE_EVC_REGADD(hw, stats, IXGBE_LXONRXC, lxonrxc);
1707 		IXGBE_EVC_REGADD(hw, stats, IXGBE_LXOFFRXC, lxoffrxc);
1708 		/* 82598 only has a counter in the high register */
1709 		IXGBE_EVC_REGADD(hw, stats, IXGBE_GORCH, gorc);
1710 		IXGBE_EVC_ADD(&stats->gotc, IXGBE_READ_REG(hw, IXGBE_GOTCH)
1711 		    - total * ETHER_MIN_LEN);
1712 		IXGBE_EVC_REGADD(hw, stats, IXGBE_TORH, tor);
1713 	}
1714 
1715 	/*
1716 	 * Workaround: mprc hardware is incorrectly counting
1717 	 * broadcasts, so for now we subtract those.
1718 	 */
1719 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_BPRC, bprc);
1720 	IXGBE_EVC_ADD(&stats->mprc, IXGBE_READ_REG(hw, IXGBE_MPRC)
1721 	    - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0));
1722 
1723 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC64, prc64);
1724 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC127, prc127);
1725 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC255, prc255);
1726 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC511, prc511);
1727 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC1023, prc1023);
1728 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PRC1522, prc1522);
1729 
1730 	IXGBE_EVC_ADD(&stats->gptc, IXGBE_READ_REG(hw, IXGBE_GPTC) - total);
1731 	IXGBE_EVC_ADD(&stats->mptc, IXGBE_READ_REG(hw, IXGBE_MPTC) - total);
1732 	IXGBE_EVC_ADD(&stats->ptc64, IXGBE_READ_REG(hw, IXGBE_PTC64) - total);
1733 
1734 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_RUC, ruc);
1735 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_RFC, rfc);
1736 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_ROC, roc);
1737 	IXGBE_EVC_REGADD2(hw, stats, IXGBE_RJC, rjc);
1738 
1739 	IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPRC, mngprc);
1740 	IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPDC, mngpdc);
1741 	IXGBE_EVC_REGADD(hw, stats, IXGBE_MNGPTC, mngptc);
1742 	IXGBE_EVC_REGADD(hw, stats, IXGBE_TPR, tpr);
1743 	IXGBE_EVC_REGADD(hw, stats, IXGBE_TPT, tpt);
1744 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC127, ptc127);
1745 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC255, ptc255);
1746 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC511, ptc511);
1747 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC1023, ptc1023);
1748 	IXGBE_EVC_REGADD(hw, stats, IXGBE_PTC1522, ptc1522);
1749 	IXGBE_EVC_REGADD(hw, stats, IXGBE_BPTC, bptc);
1750 	IXGBE_EVC_REGADD(hw, stats, IXGBE_XEC, xec);
1751 	IXGBE_EVC_REGADD(hw, stats, IXGBE_FCCRC, fccrc);
1752 	IXGBE_EVC_REGADD(hw, stats, IXGBE_FCLAST, fclast);
1753 	/* Only read FCOE on 82599 */
1754 	if (hw->mac.type != ixgbe_mac_82598EB) {
1755 		IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOERPDC, fcoerpdc);
1756 		IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEPRC, fcoeprc);
1757 		IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEPTC, fcoeptc);
1758 		IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEDWRC, fcoedwrc);
1759 		IXGBE_EVC_REGADD(hw, stats, IXGBE_FCOEDWTC, fcoedwtc);
1760 	}
1761 
1762 	/*
1763 	 * Fill out the OS statistics structure. Only RX errors are required
1764 	 * here because all TX counters are incremented in the TX path and
1765 	 * normal RX counters are prepared in ether_input().
1766 	 */
1767 	net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
1768 	if_statadd_ref(nsr, if_iqdrops, total_missed_rx);
1769 
1770 	/*
1771 	 * Aggregate following types of errors as RX errors:
1772 	 * - CRC error count,
1773 	 * - illegal byte error count,
1774 	 * - length error count,
1775 	 * - undersized packets count,
1776 	 * - fragmented packets count,
1777 	 * - oversized packets count,
1778 	 * - jabber count.
1779 	 */
1780 	if_statadd_ref(nsr, if_ierrors,
1781 	    crcerrs + illerrc + rlec + ruc + rfc + roc + rjc);
1782 
1783 	IF_STAT_PUTREF(ifp);
1784 } /* ixgbe_update_stats_counters */
1785 
1786 /************************************************************************
1787  * ixgbe_add_hw_stats
1788  *
1789  *   Add sysctl variables, one per statistic, to the system.
1790  ************************************************************************/
1791 static void
1792 ixgbe_add_hw_stats(struct adapter *adapter)
1793 {
1794 	device_t dev = adapter->dev;
1795 	const struct sysctlnode *rnode, *cnode;
1796 	struct sysctllog **log = &adapter->sysctllog;
1797 	struct tx_ring *txr = adapter->tx_rings;
1798 	struct rx_ring *rxr = adapter->rx_rings;
1799 	struct ixgbe_hw *hw = &adapter->hw;
1800 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1801 	const char *xname = device_xname(dev);
1802 	int i;
1803 
1804 	/* Driver Statistics */
1805 	evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
1806 	    NULL, xname, "Driver tx dma soft fail EFBIG");
1807 	evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
1808 	    NULL, xname, "m_defrag() failed");
1809 	evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
1810 	    NULL, xname, "Driver tx dma hard fail EFBIG");
1811 	evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
1812 	    NULL, xname, "Driver tx dma hard fail EINVAL");
1813 	evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
1814 	    NULL, xname, "Driver tx dma hard fail other");
1815 	evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
1816 	    NULL, xname, "Driver tx dma soft fail EAGAIN");
1817 	evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
1818 	    NULL, xname, "Driver tx dma soft fail ENOMEM");
1819 	evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
1820 	    NULL, xname, "Watchdog timeouts");
1821 	evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
1822 	    NULL, xname, "TSO errors");
1823 	evcnt_attach_dynamic(&adapter->admin_irqev, EVCNT_TYPE_INTR,
1824 	    NULL, xname, "Admin MSI-X IRQ Handled");
1825 	evcnt_attach_dynamic(&adapter->link_workev, EVCNT_TYPE_INTR,
1826 	    NULL, xname, "Link event");
1827 	evcnt_attach_dynamic(&adapter->mod_workev, EVCNT_TYPE_INTR,
1828 	    NULL, xname, "SFP+ module event");
1829 	evcnt_attach_dynamic(&adapter->msf_workev, EVCNT_TYPE_INTR,
1830 	    NULL, xname, "Multispeed event");
1831 	evcnt_attach_dynamic(&adapter->phy_workev, EVCNT_TYPE_INTR,
1832 	    NULL, xname, "External PHY event");
1833 
1834 	/* Max number of traffic class is 8 */
1835 	KASSERT(IXGBE_DCB_MAX_TRAFFIC_CLASS == 8);
1836 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
1837 		snprintf(adapter->tcs[i].evnamebuf,
1838 		    sizeof(adapter->tcs[i].evnamebuf), "%s tc%d", xname, i);
1839 		if (i < __arraycount(stats->mpc)) {
1840 			evcnt_attach_dynamic(&stats->mpc[i],
1841 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1842 			    "RX Missed Packet Count");
1843 			if (hw->mac.type == ixgbe_mac_82598EB)
1844 				evcnt_attach_dynamic(&stats->rnbc[i],
1845 				    EVCNT_TYPE_MISC, NULL,
1846 				    adapter->tcs[i].evnamebuf,
1847 				    "Receive No Buffers");
1848 		}
1849 		if (i < __arraycount(stats->pxontxc)) {
1850 			evcnt_attach_dynamic(&stats->pxontxc[i],
1851 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1852 			    "pxontxc");
1853 			evcnt_attach_dynamic(&stats->pxonrxc[i],
1854 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1855 			    "pxonrxc");
1856 			evcnt_attach_dynamic(&stats->pxofftxc[i],
1857 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1858 			    "pxofftxc");
1859 			evcnt_attach_dynamic(&stats->pxoffrxc[i],
1860 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
1861 			    "pxoffrxc");
1862 			if (hw->mac.type >= ixgbe_mac_82599EB)
1863 				evcnt_attach_dynamic(&stats->pxon2offc[i],
1864 				    EVCNT_TYPE_MISC, NULL,
1865 				    adapter->tcs[i].evnamebuf,
1866 				    "pxon2offc");
1867 		}
1868 	}
1869 
1870 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
1871 #ifdef LRO
1872 		struct lro_ctrl *lro = &rxr->lro;
1873 #endif /* LRO */
1874 
1875 		snprintf(adapter->queues[i].evnamebuf,
1876 		    sizeof(adapter->queues[i].evnamebuf), "%s q%d", xname, i);
1877 		snprintf(adapter->queues[i].namebuf,
1878 		    sizeof(adapter->queues[i].namebuf), "q%d", i);
1879 
1880 		if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
1881 			aprint_error_dev(dev,
1882 			    "could not create sysctl root\n");
1883 			break;
1884 		}
1885 
1886 		if (sysctl_createv(log, 0, &rnode, &rnode,
1887 		    0, CTLTYPE_NODE,
1888 		    adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
1889 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
1890 			break;
1891 
1892 		if (sysctl_createv(log, 0, &rnode, &cnode,
1893 		    CTLFLAG_READWRITE, CTLTYPE_INT,
1894 		    "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
1895 		    ixgbe_sysctl_interrupt_rate_handler, 0,
1896 		    (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
1897 			break;
1898 
1899 		if (sysctl_createv(log, 0, &rnode, &cnode,
1900 		    CTLFLAG_READONLY, CTLTYPE_INT,
1901 		    "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
1902 		    ixgbe_sysctl_tdh_handler, 0, (void *)txr,
1903 		    0, CTL_CREATE, CTL_EOL) != 0)
1904 			break;
1905 
1906 		if (sysctl_createv(log, 0, &rnode, &cnode,
1907 		    CTLFLAG_READONLY, CTLTYPE_INT,
1908 		    "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
1909 		    ixgbe_sysctl_tdt_handler, 0, (void *)txr,
1910 		    0, CTL_CREATE, CTL_EOL) != 0)
1911 			break;
1912 
1913 		evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
1914 		    NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
1915 		evcnt_attach_dynamic(&adapter->queues[i].handleq,
1916 		    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
1917 		    "Handled queue in softint");
1918 		evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
1919 		    NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
1920 		evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
1921 		    NULL, adapter->queues[i].evnamebuf, "TSO");
1922 		evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
1923 		    NULL, adapter->queues[i].evnamebuf,
1924 		    "TX Queue No Descriptor Available");
1925 		evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
1926 		    NULL, adapter->queues[i].evnamebuf,
1927 		    "Queue Packets Transmitted");
1928 #ifndef IXGBE_LEGACY_TX
1929 		evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
1930 		    NULL, adapter->queues[i].evnamebuf,
1931 		    "Packets dropped in pcq");
1932 #endif
1933 
1934 		if (sysctl_createv(log, 0, &rnode, &cnode,
1935 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
1936 		    SYSCTL_DESCR("Receive Descriptor next to check"),
1937 		    ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
1938 		    CTL_CREATE, CTL_EOL) != 0)
1939 			break;
1940 
1941 		if (sysctl_createv(log, 0, &rnode, &cnode,
1942 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
1943 		    SYSCTL_DESCR("Receive Descriptor next to refresh"),
1944 		    ixgbe_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
1945 		    CTL_CREATE, CTL_EOL) != 0)
1946 			break;
1947 
1948 		if (sysctl_createv(log, 0, &rnode, &cnode,
1949 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
1950 		    SYSCTL_DESCR("Receive Descriptor Head"),
1951 		    ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
1952 		    CTL_CREATE, CTL_EOL) != 0)
1953 			break;
1954 
1955 		if (sysctl_createv(log, 0, &rnode, &cnode,
1956 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
1957 		    SYSCTL_DESCR("Receive Descriptor Tail"),
1958 		    ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
1959 		    CTL_CREATE, CTL_EOL) != 0)
1960 			break;
1961 
1962 		if (i < __arraycount(stats->qprc)) {
1963 			evcnt_attach_dynamic(&stats->qprc[i], EVCNT_TYPE_MISC,
1964 			    NULL, adapter->queues[i].evnamebuf, "qprc");
1965 			evcnt_attach_dynamic(&stats->qptc[i], EVCNT_TYPE_MISC,
1966 			    NULL, adapter->queues[i].evnamebuf, "qptc");
1967 			evcnt_attach_dynamic(&stats->qbrc[i], EVCNT_TYPE_MISC,
1968 			    NULL, adapter->queues[i].evnamebuf, "qbrc");
1969 			evcnt_attach_dynamic(&stats->qbtc[i], EVCNT_TYPE_MISC,
1970 			    NULL, adapter->queues[i].evnamebuf, "qbtc");
1971 			if (hw->mac.type >= ixgbe_mac_82599EB)
1972 				evcnt_attach_dynamic(&stats->qprdc[i],
1973 				    EVCNT_TYPE_MISC, NULL,
1974 				    adapter->queues[i].evnamebuf, "qprdc");
1975 		}
1976 
1977 		evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
1978 		    NULL, adapter->queues[i].evnamebuf,
1979 		    "Queue Packets Received");
1980 		evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
1981 		    NULL, adapter->queues[i].evnamebuf,
1982 		    "Queue Bytes Received");
1983 		evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
1984 		    NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
1985 		evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
1986 		    NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
1987 		evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
1988 		    NULL, adapter->queues[i].evnamebuf, "Rx discarded");
1989 #ifdef LRO
1990 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
1991 				CTLFLAG_RD, &lro->lro_queued, 0,
1992 				"LRO Queued");
1993 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
1994 				CTLFLAG_RD, &lro->lro_flushed, 0,
1995 				"LRO Flushed");
1996 #endif /* LRO */
1997 	}
1998 
1999 	/* MAC stats get their own sub node */
2000 
2001 	snprintf(stats->namebuf,
2002 	    sizeof(stats->namebuf), "%s MAC Statistics", xname);
2003 
2004 	evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
2005 	    stats->namebuf, "rx csum offload - IP");
2006 	evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
2007 	    stats->namebuf, "rx csum offload - L4");
2008 	evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
2009 	    stats->namebuf, "rx csum offload - IP bad");
2010 	evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
2011 	    stats->namebuf, "rx csum offload - L4 bad");
2012 	evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
2013 	    stats->namebuf, "Interrupt conditions zero");
2014 	evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
2015 	    stats->namebuf, "Legacy interrupts");
2016 
2017 	evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
2018 	    stats->namebuf, "CRC Errors");
2019 	evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
2020 	    stats->namebuf, "Illegal Byte Errors");
2021 	evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
2022 	    stats->namebuf, "Byte Errors");
2023 	evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
2024 	    stats->namebuf, "MAC Short Packets Discarded");
2025 	if (hw->mac.type >= ixgbe_mac_X550)
2026 		evcnt_attach_dynamic(&stats->mbsdc, EVCNT_TYPE_MISC, NULL,
2027 		    stats->namebuf, "Bad SFD");
2028 	evcnt_attach_dynamic(&stats->mpctotal, EVCNT_TYPE_MISC, NULL,
2029 	    stats->namebuf, "Total Packets Missed");
2030 	evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
2031 	    stats->namebuf, "MAC Local Faults");
2032 	evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
2033 	    stats->namebuf, "MAC Remote Faults");
2034 	if (hw->mac.type == ixgbe_mac_X550EM_a)
2035 		evcnt_attach_dynamic(&stats->link_dn_cnt, EVCNT_TYPE_MISC,
2036 		    NULL, stats->namebuf, "Link down event in the MAC");
2037 	evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
2038 	    stats->namebuf, "Receive Length Errors");
2039 	evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
2040 	    stats->namebuf, "Link XON Transmitted");
2041 	evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
2042 	    stats->namebuf, "Link XON Received");
2043 	evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
2044 	    stats->namebuf, "Link XOFF Transmitted");
2045 	evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
2046 	    stats->namebuf, "Link XOFF Received");
2047 
2048 	/* Packet Reception Stats */
2049 	evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
2050 	    stats->namebuf, "Total Octets Received");
2051 	evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
2052 	    stats->namebuf, "Good Octets Received");
2053 	evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
2054 	    stats->namebuf, "Total Packets Received");
2055 	evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
2056 	    stats->namebuf, "Good Packets Received");
2057 	evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
2058 	    stats->namebuf, "Multicast Packets Received");
2059 	evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
2060 	    stats->namebuf, "Broadcast Packets Received");
2061 	evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
2062 	    stats->namebuf, "64 byte frames received ");
2063 	evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
2064 	    stats->namebuf, "65-127 byte frames received");
2065 	evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
2066 	    stats->namebuf, "128-255 byte frames received");
2067 	evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
2068 	    stats->namebuf, "256-511 byte frames received");
2069 	evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
2070 	    stats->namebuf, "512-1023 byte frames received");
2071 	evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
2072 	    stats->namebuf, "1023-1522 byte frames received");
2073 	evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
2074 	    stats->namebuf, "Receive Undersized");
2075 	evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
2076 	    stats->namebuf, "Fragmented Packets Received ");
2077 	evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
2078 	    stats->namebuf, "Oversized Packets Received");
2079 	evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
2080 	    stats->namebuf, "Received Jabber");
2081 	evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
2082 	    stats->namebuf, "Management Packets Received");
2083 	evcnt_attach_dynamic(&stats->mngpdc, EVCNT_TYPE_MISC, NULL,
2084 	    stats->namebuf, "Management Packets Dropped");
2085 	evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
2086 	    stats->namebuf, "Checksum Errors");
2087 
2088 	/* Packet Transmission Stats */
2089 	evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
2090 	    stats->namebuf, "Good Octets Transmitted");
2091 	evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
2092 	    stats->namebuf, "Total Packets Transmitted");
2093 	evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
2094 	    stats->namebuf, "Good Packets Transmitted");
2095 	evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
2096 	    stats->namebuf, "Broadcast Packets Transmitted");
2097 	evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
2098 	    stats->namebuf, "Multicast Packets Transmitted");
2099 	evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
2100 	    stats->namebuf, "Management Packets Transmitted");
2101 	evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
2102 	    stats->namebuf, "64 byte frames transmitted ");
2103 	evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
2104 	    stats->namebuf, "65-127 byte frames transmitted");
2105 	evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
2106 	    stats->namebuf, "128-255 byte frames transmitted");
2107 	evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
2108 	    stats->namebuf, "256-511 byte frames transmitted");
2109 	evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
2110 	    stats->namebuf, "512-1023 byte frames transmitted");
2111 	evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
2112 	    stats->namebuf, "1024-1522 byte frames transmitted");
2113 } /* ixgbe_add_hw_stats */
2114 
2115 static void
2116 ixgbe_clear_evcnt(struct adapter *adapter)
2117 {
2118 	struct tx_ring *txr = adapter->tx_rings;
2119 	struct rx_ring *rxr = adapter->rx_rings;
2120 	struct ixgbe_hw *hw = &adapter->hw;
2121 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
2122 	int i;
2123 
2124 	IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, 0);
2125 	IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, 0);
2126 	IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, 0);
2127 	IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, 0);
2128 	IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, 0);
2129 	IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, 0);
2130 	IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, 0);
2131 	IXGBE_EVC_STORE(&adapter->tso_err, 0);
2132 	IXGBE_EVC_STORE(&adapter->watchdog_events, 0);
2133 	IXGBE_EVC_STORE(&adapter->admin_irqev, 0);
2134 	IXGBE_EVC_STORE(&adapter->link_workev, 0);
2135 	IXGBE_EVC_STORE(&adapter->mod_workev, 0);
2136 	IXGBE_EVC_STORE(&adapter->msf_workev, 0);
2137 	IXGBE_EVC_STORE(&adapter->phy_workev, 0);
2138 
2139 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
2140 		if (i < __arraycount(stats->mpc)) {
2141 			IXGBE_EVC_STORE(&stats->mpc[i], 0);
2142 			if (hw->mac.type == ixgbe_mac_82598EB)
2143 				IXGBE_EVC_STORE(&stats->rnbc[i], 0);
2144 		}
2145 		if (i < __arraycount(stats->pxontxc)) {
2146 			IXGBE_EVC_STORE(&stats->pxontxc[i], 0);
2147 			IXGBE_EVC_STORE(&stats->pxonrxc[i], 0);
2148 			IXGBE_EVC_STORE(&stats->pxofftxc[i], 0);
2149 			IXGBE_EVC_STORE(&stats->pxoffrxc[i], 0);
2150 			if (hw->mac.type >= ixgbe_mac_82599EB)
2151 				IXGBE_EVC_STORE(&stats->pxon2offc[i], 0);
2152 		}
2153 	}
2154 
2155 	txr = adapter->tx_rings;
2156 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
2157 		IXGBE_EVC_STORE(&adapter->queues[i].irqs, 0);
2158 		IXGBE_EVC_STORE(&adapter->queues[i].handleq, 0);
2159 		IXGBE_EVC_STORE(&adapter->queues[i].req, 0);
2160 		IXGBE_EVC_STORE(&txr->no_desc_avail, 0);
2161 		IXGBE_EVC_STORE(&txr->total_packets, 0);
2162 		IXGBE_EVC_STORE(&txr->tso_tx, 0);
2163 #ifndef IXGBE_LEGACY_TX
2164 		IXGBE_EVC_STORE(&txr->pcq_drops, 0);
2165 #endif
2166 		txr->q_efbig_tx_dma_setup = 0;
2167 		txr->q_mbuf_defrag_failed = 0;
2168 		txr->q_efbig2_tx_dma_setup = 0;
2169 		txr->q_einval_tx_dma_setup = 0;
2170 		txr->q_other_tx_dma_setup = 0;
2171 		txr->q_eagain_tx_dma_setup = 0;
2172 		txr->q_enomem_tx_dma_setup = 0;
2173 		txr->q_tso_err = 0;
2174 
2175 		if (i < __arraycount(stats->qprc)) {
2176 			IXGBE_EVC_STORE(&stats->qprc[i], 0);
2177 			IXGBE_EVC_STORE(&stats->qptc[i], 0);
2178 			IXGBE_EVC_STORE(&stats->qbrc[i], 0);
2179 			IXGBE_EVC_STORE(&stats->qbtc[i], 0);
2180 			if (hw->mac.type >= ixgbe_mac_82599EB)
2181 				IXGBE_EVC_STORE(&stats->qprdc[i], 0);
2182 		}
2183 
2184 		IXGBE_EVC_STORE(&rxr->rx_packets, 0);
2185 		IXGBE_EVC_STORE(&rxr->rx_bytes, 0);
2186 		IXGBE_EVC_STORE(&rxr->rx_copies, 0);
2187 		IXGBE_EVC_STORE(&rxr->no_mbuf, 0);
2188 		IXGBE_EVC_STORE(&rxr->rx_discarded, 0);
2189 	}
2190 	IXGBE_EVC_STORE(&stats->ipcs, 0);
2191 	IXGBE_EVC_STORE(&stats->l4cs, 0);
2192 	IXGBE_EVC_STORE(&stats->ipcs_bad, 0);
2193 	IXGBE_EVC_STORE(&stats->l4cs_bad, 0);
2194 	IXGBE_EVC_STORE(&stats->intzero, 0);
2195 	IXGBE_EVC_STORE(&stats->legint, 0);
2196 	IXGBE_EVC_STORE(&stats->crcerrs, 0);
2197 	IXGBE_EVC_STORE(&stats->illerrc, 0);
2198 	IXGBE_EVC_STORE(&stats->errbc, 0);
2199 	IXGBE_EVC_STORE(&stats->mspdc, 0);
2200 	if (hw->mac.type >= ixgbe_mac_X550)
2201 		IXGBE_EVC_STORE(&stats->mbsdc, 0);
2202 	IXGBE_EVC_STORE(&stats->mpctotal, 0);
2203 	IXGBE_EVC_STORE(&stats->mlfc, 0);
2204 	IXGBE_EVC_STORE(&stats->mrfc, 0);
2205 	if (hw->mac.type == ixgbe_mac_X550EM_a)
2206 		IXGBE_EVC_STORE(&stats->link_dn_cnt, 0);
2207 	IXGBE_EVC_STORE(&stats->rlec, 0);
2208 	IXGBE_EVC_STORE(&stats->lxontxc, 0);
2209 	IXGBE_EVC_STORE(&stats->lxonrxc, 0);
2210 	IXGBE_EVC_STORE(&stats->lxofftxc, 0);
2211 	IXGBE_EVC_STORE(&stats->lxoffrxc, 0);
2212 
2213 	/* Packet Reception Stats */
2214 	IXGBE_EVC_STORE(&stats->tor, 0);
2215 	IXGBE_EVC_STORE(&stats->gorc, 0);
2216 	IXGBE_EVC_STORE(&stats->tpr, 0);
2217 	IXGBE_EVC_STORE(&stats->gprc, 0);
2218 	IXGBE_EVC_STORE(&stats->mprc, 0);
2219 	IXGBE_EVC_STORE(&stats->bprc, 0);
2220 	IXGBE_EVC_STORE(&stats->prc64, 0);
2221 	IXGBE_EVC_STORE(&stats->prc127, 0);
2222 	IXGBE_EVC_STORE(&stats->prc255, 0);
2223 	IXGBE_EVC_STORE(&stats->prc511, 0);
2224 	IXGBE_EVC_STORE(&stats->prc1023, 0);
2225 	IXGBE_EVC_STORE(&stats->prc1522, 0);
2226 	IXGBE_EVC_STORE(&stats->ruc, 0);
2227 	IXGBE_EVC_STORE(&stats->rfc, 0);
2228 	IXGBE_EVC_STORE(&stats->roc, 0);
2229 	IXGBE_EVC_STORE(&stats->rjc, 0);
2230 	IXGBE_EVC_STORE(&stats->mngprc, 0);
2231 	IXGBE_EVC_STORE(&stats->mngpdc, 0);
2232 	IXGBE_EVC_STORE(&stats->xec, 0);
2233 
2234 	/* Packet Transmission Stats */
2235 	IXGBE_EVC_STORE(&stats->gotc, 0);
2236 	IXGBE_EVC_STORE(&stats->tpt, 0);
2237 	IXGBE_EVC_STORE(&stats->gptc, 0);
2238 	IXGBE_EVC_STORE(&stats->bptc, 0);
2239 	IXGBE_EVC_STORE(&stats->mptc, 0);
2240 	IXGBE_EVC_STORE(&stats->mngptc, 0);
2241 	IXGBE_EVC_STORE(&stats->ptc64, 0);
2242 	IXGBE_EVC_STORE(&stats->ptc127, 0);
2243 	IXGBE_EVC_STORE(&stats->ptc255, 0);
2244 	IXGBE_EVC_STORE(&stats->ptc511, 0);
2245 	IXGBE_EVC_STORE(&stats->ptc1023, 0);
2246 	IXGBE_EVC_STORE(&stats->ptc1522, 0);
2247 }
2248 
2249 /************************************************************************
2250  * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
2251  *
2252  *   Retrieves the TDH value from the hardware
2253  ************************************************************************/
2254 static int
2255 ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
2256 {
2257 	struct sysctlnode node = *rnode;
2258 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2259 	struct adapter *adapter;
2260 	uint32_t val;
2261 
2262 	if (!txr)
2263 		return (0);
2264 
2265 	adapter = txr->adapter;
2266 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2267 		return (EPERM);
2268 
2269 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me));
2270 	node.sysctl_data = &val;
2271 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2272 } /* ixgbe_sysctl_tdh_handler */
2273 
2274 /************************************************************************
2275  * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
2276  *
2277  *   Retrieves the TDT value from the hardware
2278  ************************************************************************/
2279 static int
2280 ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
2281 {
2282 	struct sysctlnode node = *rnode;
2283 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
2284 	struct adapter *adapter;
2285 	uint32_t val;
2286 
2287 	if (!txr)
2288 		return (0);
2289 
2290 	adapter = txr->adapter;
2291 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2292 		return (EPERM);
2293 
2294 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me));
2295 	node.sysctl_data = &val;
2296 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2297 } /* ixgbe_sysctl_tdt_handler */
2298 
2299 /************************************************************************
2300  * ixgbe_sysctl_next_to_check_handler - Receive Descriptor next to check
2301  * handler function
2302  *
2303  *   Retrieves the next_to_check value
2304  ************************************************************************/
2305 static int
2306 ixgbe_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
2307 {
2308 	struct sysctlnode node = *rnode;
2309 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2310 	struct adapter *adapter;
2311 	uint32_t val;
2312 
2313 	if (!rxr)
2314 		return (0);
2315 
2316 	adapter = rxr->adapter;
2317 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2318 		return (EPERM);
2319 
2320 	val = rxr->next_to_check;
2321 	node.sysctl_data = &val;
2322 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2323 } /* ixgbe_sysctl_next_to_check_handler */
2324 
2325 /************************************************************************
2326  * ixgbe_sysctl_next_to_refresh_handler - Receive Descriptor next to check
2327  * handler function
2328  *
2329  *   Retrieves the next_to_refresh value
2330  ************************************************************************/
2331 static int
2332 ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
2333 {
2334 	struct sysctlnode node = *rnode;
2335 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2336 	struct adapter *adapter;
2337 	uint32_t val;
2338 
2339 	if (!rxr)
2340 		return (0);
2341 
2342 	adapter = rxr->adapter;
2343 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2344 		return (EPERM);
2345 
2346 	val = rxr->next_to_refresh;
2347 	node.sysctl_data = &val;
2348 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2349 } /* ixgbe_sysctl_next_to_refresh_handler */
2350 
2351 /************************************************************************
2352  * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
2353  *
2354  *   Retrieves the RDH value from the hardware
2355  ************************************************************************/
2356 static int
2357 ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
2358 {
2359 	struct sysctlnode node = *rnode;
2360 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2361 	struct adapter *adapter;
2362 	uint32_t val;
2363 
2364 	if (!rxr)
2365 		return (0);
2366 
2367 	adapter = rxr->adapter;
2368 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2369 		return (EPERM);
2370 
2371 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDH(rxr->me));
2372 	node.sysctl_data = &val;
2373 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2374 } /* ixgbe_sysctl_rdh_handler */
2375 
2376 /************************************************************************
2377  * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
2378  *
2379  *   Retrieves the RDT value from the hardware
2380  ************************************************************************/
2381 static int
2382 ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
2383 {
2384 	struct sysctlnode node = *rnode;
2385 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
2386 	struct adapter *adapter;
2387 	uint32_t val;
2388 
2389 	if (!rxr)
2390 		return (0);
2391 
2392 	adapter = rxr->adapter;
2393 	if (ixgbe_fw_recovery_mode_swflag(adapter))
2394 		return (EPERM);
2395 
2396 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDT(rxr->me));
2397 	node.sysctl_data = &val;
2398 	return sysctl_lookup(SYSCTLFN_CALL(&node));
2399 } /* ixgbe_sysctl_rdt_handler */
2400 
2401 static int
2402 ixgbe_vlan_cb(struct ethercom *ec, uint16_t vid, bool set)
2403 {
2404 	struct ifnet *ifp = &ec->ec_if;
2405 	struct adapter *adapter = ifp->if_softc;
2406 	int rv;
2407 
2408 	if (set)
2409 		rv = ixgbe_register_vlan(adapter, vid);
2410 	else
2411 		rv = ixgbe_unregister_vlan(adapter, vid);
2412 
2413 	if (rv != 0)
2414 		return rv;
2415 
2416 	/*
2417 	 * Control VLAN HW tagging when ec_nvlan is changed from 1 to 0
2418 	 * or 0 to 1.
2419 	 */
2420 	if ((set && (ec->ec_nvlans == 1)) || (!set && (ec->ec_nvlans == 0)))
2421 		ixgbe_setup_vlan_hw_tagging(adapter);
2422 
2423 	return rv;
2424 }
2425 
2426 /************************************************************************
2427  * ixgbe_register_vlan
2428  *
2429  *   Run via vlan config EVENT, it enables us to use the
2430  *   HW Filter table since we can get the vlan id. This
2431  *   just creates the entry in the soft version of the
2432  *   VFTA, init will repopulate the real table.
2433  ************************************************************************/
2434 static int
2435 ixgbe_register_vlan(struct adapter *adapter, u16 vtag)
2436 {
2437 	u16		index, bit;
2438 	int		error;
2439 
2440 	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
2441 		return EINVAL;
2442 
2443 	IXGBE_CORE_LOCK(adapter);
2444 	index = (vtag >> 5) & 0x7F;
2445 	bit = vtag & 0x1F;
2446 	adapter->shadow_vfta[index] |= ((u32)1 << bit);
2447 	error = adapter->hw.mac.ops.set_vfta(&adapter->hw, vtag, 0, true,
2448 	    true);
2449 	IXGBE_CORE_UNLOCK(adapter);
2450 	if (error != 0)
2451 		error = EACCES;
2452 
2453 	return error;
2454 } /* ixgbe_register_vlan */
2455 
2456 /************************************************************************
2457  * ixgbe_unregister_vlan
2458  *
2459  *   Run via vlan unconfig EVENT, remove our entry in the soft vfta.
2460  ************************************************************************/
2461 static int
2462 ixgbe_unregister_vlan(struct adapter *adapter, u16 vtag)
2463 {
2464 	u16		index, bit;
2465 	int		error;
2466 
2467 	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
2468 		return EINVAL;
2469 
2470 	IXGBE_CORE_LOCK(adapter);
2471 	index = (vtag >> 5) & 0x7F;
2472 	bit = vtag & 0x1F;
2473 	adapter->shadow_vfta[index] &= ~((u32)1 << bit);
2474 	error = adapter->hw.mac.ops.set_vfta(&adapter->hw, vtag, 0, false,
2475 	    true);
2476 	IXGBE_CORE_UNLOCK(adapter);
2477 	if (error != 0)
2478 		error = EACCES;
2479 
2480 	return error;
2481 } /* ixgbe_unregister_vlan */
2482 
2483 static void
2484 ixgbe_setup_vlan_hw_tagging(struct adapter *adapter)
2485 {
2486 	struct ethercom *ec = &adapter->osdep.ec;
2487 	struct ixgbe_hw *hw = &adapter->hw;
2488 	struct rx_ring	*rxr;
2489 	u32		ctrl;
2490 	int		i;
2491 	bool		hwtagging;
2492 
2493 	/* Enable HW tagging only if any vlan is attached */
2494 	hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
2495 	    && VLAN_ATTACHED(ec);
2496 
2497 	/* Setup the queues for vlans */
2498 	for (i = 0; i < adapter->num_queues; i++) {
2499 		rxr = &adapter->rx_rings[i];
2500 		/*
2501 		 * On 82599 and later, the VLAN enable is per/queue in RXDCTL.
2502 		 */
2503 		if (hw->mac.type != ixgbe_mac_82598EB) {
2504 			ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
2505 			if (hwtagging)
2506 				ctrl |= IXGBE_RXDCTL_VME;
2507 			else
2508 				ctrl &= ~IXGBE_RXDCTL_VME;
2509 			IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
2510 		}
2511 		rxr->vtag_strip = hwtagging ? TRUE : FALSE;
2512 	}
2513 
2514 	/* VLAN hw tagging for 82598 */
2515 	if (hw->mac.type == ixgbe_mac_82598EB) {
2516 		ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2517 		if (hwtagging)
2518 			ctrl |= IXGBE_VLNCTRL_VME;
2519 		else
2520 			ctrl &= ~IXGBE_VLNCTRL_VME;
2521 		IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
2522 	}
2523 } /* ixgbe_setup_vlan_hw_tagging */
2524 
2525 static void
2526 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
2527 {
2528 	struct ethercom *ec = &adapter->osdep.ec;
2529 	struct ixgbe_hw *hw = &adapter->hw;
2530 	int		i;
2531 	u32		ctrl;
2532 	struct vlanid_list *vlanidp;
2533 
2534 	/*
2535 	 * This function is called from both if_init and ifflags_cb()
2536 	 * on NetBSD.
2537 	 */
2538 
2539 	/*
2540 	 * Part 1:
2541 	 * Setup VLAN HW tagging
2542 	 */
2543 	ixgbe_setup_vlan_hw_tagging(adapter);
2544 
2545 	/*
2546 	 * Part 2:
2547 	 * Setup VLAN HW filter
2548 	 */
2549 	/* Cleanup shadow_vfta */
2550 	for (i = 0; i < IXGBE_VFTA_SIZE; i++)
2551 		adapter->shadow_vfta[i] = 0;
2552 	/* Generate shadow_vfta from ec_vids */
2553 	ETHER_LOCK(ec);
2554 	SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
2555 		uint32_t idx;
2556 
2557 		idx = vlanidp->vid / 32;
2558 		KASSERT(idx < IXGBE_VFTA_SIZE);
2559 		adapter->shadow_vfta[idx] |= (u32)1 << (vlanidp->vid % 32);
2560 	}
2561 	ETHER_UNLOCK(ec);
2562 	for (i = 0; i < IXGBE_VFTA_SIZE; i++)
2563 		IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), adapter->shadow_vfta[i]);
2564 
2565 	ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2566 	/* Enable the Filter Table if enabled */
2567 	if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER)
2568 		ctrl |= IXGBE_VLNCTRL_VFE;
2569 	else
2570 		ctrl &= ~IXGBE_VLNCTRL_VFE;
2571 	IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
2572 } /* ixgbe_setup_vlan_hw_support */
2573 
2574 /************************************************************************
2575  * ixgbe_get_slot_info
2576  *
2577  *   Get the width and transaction speed of
2578  *   the slot this adapter is plugged into.
2579  ************************************************************************/
2580 static void
2581 ixgbe_get_slot_info(struct adapter *adapter)
2582 {
2583 	device_t		dev = adapter->dev;
2584 	struct ixgbe_hw		*hw = &adapter->hw;
2585 	u32		      offset;
2586 	u16			link;
2587 	int		      bus_info_valid = TRUE;
2588 
2589 	/* Some devices are behind an internal bridge */
2590 	switch (hw->device_id) {
2591 	case IXGBE_DEV_ID_82599_SFP_SF_QP:
2592 	case IXGBE_DEV_ID_82599_QSFP_SF_QP:
2593 		goto get_parent_info;
2594 	default:
2595 		break;
2596 	}
2597 
2598 	ixgbe_get_bus_info(hw);
2599 
2600 	/*
2601 	 * Some devices don't use PCI-E, but there is no need
2602 	 * to display "Unknown" for bus speed and width.
2603 	 */
2604 	switch (hw->mac.type) {
2605 	case ixgbe_mac_X550EM_x:
2606 	case ixgbe_mac_X550EM_a:
2607 		return;
2608 	default:
2609 		goto display;
2610 	}
2611 
2612 get_parent_info:
2613 	/*
2614 	 * For the Quad port adapter we need to parse back
2615 	 * up the PCI tree to find the speed of the expansion
2616 	 * slot into which this adapter is plugged. A bit more work.
2617 	 */
2618 	dev = device_parent(device_parent(dev));
2619 #if 0
2620 #ifdef IXGBE_DEBUG
2621 	device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
2622 	    pci_get_slot(dev), pci_get_function(dev));
2623 #endif
2624 	dev = device_parent(device_parent(dev));
2625 #ifdef IXGBE_DEBUG
2626 	device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
2627 	    pci_get_slot(dev), pci_get_function(dev));
2628 #endif
2629 #endif
2630 	/* Now get the PCI Express Capabilities offset */
2631 	if (pci_get_capability(adapter->osdep.pc, adapter->osdep.tag,
2632 	    PCI_CAP_PCIEXPRESS, &offset, NULL)) {
2633 		/*
2634 		 * Hmm...can't get PCI-Express capabilities.
2635 		 * Falling back to default method.
2636 		 */
2637 		bus_info_valid = FALSE;
2638 		ixgbe_get_bus_info(hw);
2639 		goto display;
2640 	}
2641 	/* ...and read the Link Status Register */
2642 	link = pci_conf_read(adapter->osdep.pc, adapter->osdep.tag,
2643 	    offset + PCIE_LCSR) >> 16;
2644 	ixgbe_set_pci_config_data_generic(hw, link);
2645 
2646 display:
2647 	device_printf(dev, "PCI Express Bus: Speed %s Width %s\n",
2648 	    ((hw->bus.speed == ixgbe_bus_speed_8000)	? "8.0GT/s" :
2649 	     (hw->bus.speed == ixgbe_bus_speed_5000)	? "5.0GT/s" :
2650 	     (hw->bus.speed == ixgbe_bus_speed_2500)	? "2.5GT/s" :
2651 	     "Unknown"),
2652 	    ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "x8" :
2653 	     (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "x4" :
2654 	     (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "x1" :
2655 	     "Unknown"));
2656 
2657 	if (bus_info_valid) {
2658 		if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2659 		    ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
2660 			(hw->bus.speed == ixgbe_bus_speed_2500))) {
2661 			device_printf(dev, "PCI-Express bandwidth available"
2662 			    " for this card\n     is not sufficient for"
2663 			    " optimal performance.\n");
2664 			device_printf(dev, "For optimal performance a x8 "
2665 			    "PCIE, or x4 PCIE Gen2 slot is required.\n");
2666 		}
2667 		if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2668 		    ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
2669 			(hw->bus.speed < ixgbe_bus_speed_8000))) {
2670 			device_printf(dev, "PCI-Express bandwidth available"
2671 			    " for this card\n     is not sufficient for"
2672 			    " optimal performance.\n");
2673 			device_printf(dev, "For optimal performance a x8 "
2674 			    "PCIE Gen3 slot is required.\n");
2675 		}
2676 	} else
2677 		device_printf(dev,
2678 		    "Unable to determine slot speed/width. The speed/width "
2679 		    "reported are that of the internal switch.\n");
2680 
2681 	return;
2682 } /* ixgbe_get_slot_info */
2683 
2684 /************************************************************************
2685  * ixgbe_enable_queue - Queue Interrupt Enabler
2686  ************************************************************************/
2687 static inline void
2688 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
2689 {
2690 	struct ixgbe_hw *hw = &adapter->hw;
2691 	struct ix_queue *que = &adapter->queues[vector];
2692 	u64		queue = 1ULL << vector;
2693 	u32		mask;
2694 
2695 	mutex_enter(&que->dc_mtx);
2696 	if (que->disabled_count > 0 && --que->disabled_count > 0)
2697 		goto out;
2698 
2699 	if (hw->mac.type == ixgbe_mac_82598EB) {
2700 		mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2701 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
2702 	} else {
2703 		mask = (queue & 0xFFFFFFFF);
2704 		if (mask)
2705 			IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
2706 		mask = (queue >> 32);
2707 		if (mask)
2708 			IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
2709 	}
2710 out:
2711 	mutex_exit(&que->dc_mtx);
2712 } /* ixgbe_enable_queue */
2713 
2714 /************************************************************************
2715  * ixgbe_disable_queue_internal
2716  ************************************************************************/
2717 static inline void
2718 ixgbe_disable_queue_internal(struct adapter *adapter, u32 vector, bool nestok)
2719 {
2720 	struct ixgbe_hw *hw = &adapter->hw;
2721 	struct ix_queue *que = &adapter->queues[vector];
2722 	u64		queue = 1ULL << vector;
2723 	u32		mask;
2724 
2725 	mutex_enter(&que->dc_mtx);
2726 
2727 	if (que->disabled_count > 0) {
2728 		if (nestok)
2729 			que->disabled_count++;
2730 		goto out;
2731 	}
2732 	que->disabled_count++;
2733 
2734 	if (hw->mac.type == ixgbe_mac_82598EB) {
2735 		mask = (IXGBE_EIMS_RTX_QUEUE & queue);
2736 		IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
2737 	} else {
2738 		mask = (queue & 0xFFFFFFFF);
2739 		if (mask)
2740 			IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
2741 		mask = (queue >> 32);
2742 		if (mask)
2743 			IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
2744 	}
2745 out:
2746 	mutex_exit(&que->dc_mtx);
2747 } /* ixgbe_disable_queue_internal */
2748 
2749 /************************************************************************
2750  * ixgbe_disable_queue
2751  ************************************************************************/
2752 static inline void
2753 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
2754 {
2755 
2756 	ixgbe_disable_queue_internal(adapter, vector, true);
2757 } /* ixgbe_disable_queue */
2758 
2759 /************************************************************************
2760  * ixgbe_sched_handle_que - schedule deferred packet processing
2761  ************************************************************************/
2762 static inline void
2763 ixgbe_sched_handle_que(struct adapter *adapter, struct ix_queue *que)
2764 {
2765 
2766 	if (que->txrx_use_workqueue) {
2767 		/*
2768 		 * adapter->que_wq is bound to each CPU instead of
2769 		 * each NIC queue to reduce workqueue kthread. As we
2770 		 * should consider about interrupt affinity in this
2771 		 * function, the workqueue kthread must be WQ_PERCPU.
2772 		 * If create WQ_PERCPU workqueue kthread for each NIC
2773 		 * queue, that number of created workqueue kthread is
2774 		 * (number of used NIC queue) * (number of CPUs) =
2775 		 * (number of CPUs) ^ 2 most often.
2776 		 *
2777 		 * The same NIC queue's interrupts are avoided by
2778 		 * masking the queue's interrupt. And different
2779 		 * NIC queue's interrupts use different struct work
2780 		 * (que->wq_cookie). So, "enqueued flag" to avoid
2781 		 * twice workqueue_enqueue() is not required .
2782 		 */
2783 		workqueue_enqueue(adapter->que_wq, &que->wq_cookie, curcpu());
2784 	} else
2785 		softint_schedule(que->que_si);
2786 }
2787 
2788 /************************************************************************
2789  * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2790  ************************************************************************/
2791 static int
2792 ixgbe_msix_que(void *arg)
2793 {
2794 	struct ix_queue	*que = arg;
2795 	struct adapter	*adapter = que->adapter;
2796 	struct ifnet	*ifp = adapter->ifp;
2797 	struct tx_ring	*txr = que->txr;
2798 	struct rx_ring	*rxr = que->rxr;
2799 	u32		newitr = 0;
2800 
2801 	/* Protect against spurious interrupts */
2802 	if ((ifp->if_flags & IFF_RUNNING) == 0)
2803 		return 0;
2804 
2805 	ixgbe_disable_queue(adapter, que->msix);
2806 	IXGBE_EVC_ADD(&que->irqs, 1);
2807 
2808 	/*
2809 	 * Don't change "que->txrx_use_workqueue" from this point to avoid
2810 	 * flip-flopping softint/workqueue mode in one deferred processing.
2811 	 */
2812 	que->txrx_use_workqueue = adapter->txrx_use_workqueue;
2813 
2814 	IXGBE_TX_LOCK(txr);
2815 	ixgbe_txeof(txr);
2816 	IXGBE_TX_UNLOCK(txr);
2817 
2818 	/* Do AIM now? */
2819 
2820 	if (adapter->enable_aim == false)
2821 		goto no_calc;
2822 	/*
2823 	 * Do Adaptive Interrupt Moderation:
2824 	 *  - Write out last calculated setting
2825 	 *  - Calculate based on average size over
2826 	 *    the last interval.
2827 	 */
2828 	if (que->eitr_setting)
2829 		ixgbe_eitr_write(adapter, que->msix, que->eitr_setting);
2830 
2831 	que->eitr_setting = 0;
2832 
2833 	/* Idle, do nothing */
2834 	if ((txr->bytes == 0) && (rxr->bytes == 0))
2835 		goto no_calc;
2836 
2837 	if ((txr->bytes) && (txr->packets))
2838 		newitr = txr->bytes/txr->packets;
2839 	if ((rxr->bytes) && (rxr->packets))
2840 		newitr = uimax(newitr, (rxr->bytes / rxr->packets));
2841 	newitr += 24; /* account for hardware frame, crc */
2842 
2843 	/* set an upper boundary */
2844 	newitr = uimin(newitr, 3000);
2845 
2846 	/* Be nice to the mid range */
2847 	if ((newitr > 300) && (newitr < 1200))
2848 		newitr = (newitr / 3);
2849 	else
2850 		newitr = (newitr / 2);
2851 
2852 	/*
2853 	 * When RSC is used, ITR interval must be larger than RSC_DELAY.
2854 	 * Currently, we use 2us for RSC_DELAY. The minimum value is always
2855 	 * greater than 2us on 100M (and 10M?(not documented)), but it's not
2856 	 * on 1G and higher.
2857 	 */
2858 	if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
2859 	    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL))
2860 		if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
2861 			newitr = IXGBE_MIN_RSC_EITR_10G1G;
2862 
2863 	/* save for next interrupt */
2864 	que->eitr_setting = newitr;
2865 
2866 	/* Reset state */
2867 	txr->bytes = 0;
2868 	txr->packets = 0;
2869 	rxr->bytes = 0;
2870 	rxr->packets = 0;
2871 
2872 no_calc:
2873 	ixgbe_sched_handle_que(adapter, que);
2874 
2875 	return 1;
2876 } /* ixgbe_msix_que */
2877 
2878 /************************************************************************
2879  * ixgbe_media_status - Media Ioctl callback
2880  *
2881  *   Called whenever the user queries the status of
2882  *   the interface using ifconfig.
2883  ************************************************************************/
2884 static void
2885 ixgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2886 {
2887 	struct adapter *adapter = ifp->if_softc;
2888 	struct ixgbe_hw *hw = &adapter->hw;
2889 	int layer;
2890 
2891 	INIT_DEBUGOUT("ixgbe_media_status: begin");
2892 	ixgbe_update_link_status(adapter);
2893 
2894 	ifmr->ifm_status = IFM_AVALID;
2895 	ifmr->ifm_active = IFM_ETHER;
2896 
2897 	if (adapter->link_active != LINK_STATE_UP) {
2898 		ifmr->ifm_active |= IFM_NONE;
2899 		return;
2900 	}
2901 
2902 	ifmr->ifm_status |= IFM_ACTIVE;
2903 	layer = adapter->phy_layer;
2904 
2905 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2906 	    layer & IXGBE_PHYSICAL_LAYER_5GBASE_T ||
2907 	    layer & IXGBE_PHYSICAL_LAYER_2500BASE_T ||
2908 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2909 	    layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2910 	    layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2911 		switch (adapter->link_speed) {
2912 		case IXGBE_LINK_SPEED_10GB_FULL:
2913 			ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2914 			break;
2915 		case IXGBE_LINK_SPEED_5GB_FULL:
2916 			ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
2917 			break;
2918 		case IXGBE_LINK_SPEED_2_5GB_FULL:
2919 			ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
2920 			break;
2921 		case IXGBE_LINK_SPEED_1GB_FULL:
2922 			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2923 			break;
2924 		case IXGBE_LINK_SPEED_100_FULL:
2925 			ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2926 			break;
2927 		case IXGBE_LINK_SPEED_10_FULL:
2928 			ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2929 			break;
2930 		}
2931 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2932 	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2933 		switch (adapter->link_speed) {
2934 		case IXGBE_LINK_SPEED_10GB_FULL:
2935 			ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2936 			break;
2937 		}
2938 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2939 		switch (adapter->link_speed) {
2940 		case IXGBE_LINK_SPEED_10GB_FULL:
2941 			ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2942 			break;
2943 		case IXGBE_LINK_SPEED_1GB_FULL:
2944 			ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2945 			break;
2946 		}
2947 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2948 		switch (adapter->link_speed) {
2949 		case IXGBE_LINK_SPEED_10GB_FULL:
2950 			ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2951 			break;
2952 		case IXGBE_LINK_SPEED_1GB_FULL:
2953 			ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2954 			break;
2955 		}
2956 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2957 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2958 		switch (adapter->link_speed) {
2959 		case IXGBE_LINK_SPEED_10GB_FULL:
2960 			ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2961 			break;
2962 		case IXGBE_LINK_SPEED_1GB_FULL:
2963 			ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2964 			break;
2965 		}
2966 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2967 		switch (adapter->link_speed) {
2968 		case IXGBE_LINK_SPEED_10GB_FULL:
2969 			ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2970 			break;
2971 		}
2972 	/*
2973 	 * XXX: These need to use the proper media types once
2974 	 * they're added.
2975 	 */
2976 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2977 		switch (adapter->link_speed) {
2978 		case IXGBE_LINK_SPEED_10GB_FULL:
2979 			ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2980 			break;
2981 		case IXGBE_LINK_SPEED_2_5GB_FULL:
2982 			ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2983 			break;
2984 		case IXGBE_LINK_SPEED_1GB_FULL:
2985 			ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2986 			break;
2987 		}
2988 	else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2989 	    layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2990 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2991 		switch (adapter->link_speed) {
2992 		case IXGBE_LINK_SPEED_10GB_FULL:
2993 			ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
2994 			break;
2995 		case IXGBE_LINK_SPEED_2_5GB_FULL:
2996 			ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2997 			break;
2998 		case IXGBE_LINK_SPEED_1GB_FULL:
2999 			ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
3000 			break;
3001 		}
3002 
3003 	/* If nothing is recognized... */
3004 #if 0
3005 	if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
3006 		ifmr->ifm_active |= IFM_UNKNOWN;
3007 #endif
3008 
3009 	ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
3010 
3011 	/* Display current flow control setting used on link */
3012 	if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
3013 	    hw->fc.current_mode == ixgbe_fc_full)
3014 		ifmr->ifm_active |= IFM_ETH_RXPAUSE;
3015 	if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
3016 	    hw->fc.current_mode == ixgbe_fc_full)
3017 		ifmr->ifm_active |= IFM_ETH_TXPAUSE;
3018 
3019 	return;
3020 } /* ixgbe_media_status */
3021 
3022 /************************************************************************
3023  * ixgbe_media_change - Media Ioctl callback
3024  *
3025  *   Called when the user changes speed/duplex using
3026  *   media/mediopt option with ifconfig.
3027  ************************************************************************/
3028 static int
3029 ixgbe_media_change(struct ifnet *ifp)
3030 {
3031 	struct adapter	 *adapter = ifp->if_softc;
3032 	struct ifmedia	 *ifm = &adapter->media;
3033 	struct ixgbe_hw	 *hw = &adapter->hw;
3034 	ixgbe_link_speed speed = 0;
3035 	ixgbe_link_speed link_caps = 0;
3036 	bool negotiate = false;
3037 	s32 err = IXGBE_NOT_IMPLEMENTED;
3038 
3039 	INIT_DEBUGOUT("ixgbe_media_change: begin");
3040 
3041 	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
3042 		return (EINVAL);
3043 
3044 	if (hw->phy.media_type == ixgbe_media_type_backplane)
3045 		return (EPERM);
3046 
3047 	/*
3048 	 * We don't actually need to check against the supported
3049 	 * media types of the adapter; ifmedia will take care of
3050 	 * that for us.
3051 	 */
3052 	switch (IFM_SUBTYPE(ifm->ifm_media)) {
3053 	case IFM_AUTO:
3054 		err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
3055 		    &negotiate);
3056 		if (err != IXGBE_SUCCESS) {
3057 			device_printf(adapter->dev, "Unable to determine "
3058 			    "supported advertise speeds\n");
3059 			return (ENODEV);
3060 		}
3061 		speed |= link_caps;
3062 		break;
3063 	case IFM_10G_T:
3064 	case IFM_10G_LRM:
3065 	case IFM_10G_LR:
3066 	case IFM_10G_TWINAX:
3067 	case IFM_10G_SR:
3068 	case IFM_10G_CX4:
3069 	case IFM_10G_KR:
3070 	case IFM_10G_KX4:
3071 		speed |= IXGBE_LINK_SPEED_10GB_FULL;
3072 		break;
3073 	case IFM_5000_T:
3074 		speed |= IXGBE_LINK_SPEED_5GB_FULL;
3075 		break;
3076 	case IFM_2500_T:
3077 	case IFM_2500_KX:
3078 		speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
3079 		break;
3080 	case IFM_1000_T:
3081 	case IFM_1000_LX:
3082 	case IFM_1000_SX:
3083 	case IFM_1000_KX:
3084 		speed |= IXGBE_LINK_SPEED_1GB_FULL;
3085 		break;
3086 	case IFM_100_TX:
3087 		speed |= IXGBE_LINK_SPEED_100_FULL;
3088 		break;
3089 	case IFM_10_T:
3090 		speed |= IXGBE_LINK_SPEED_10_FULL;
3091 		break;
3092 	case IFM_NONE:
3093 		break;
3094 	default:
3095 		goto invalid;
3096 	}
3097 
3098 	hw->mac.autotry_restart = TRUE;
3099 	hw->mac.ops.setup_link(hw, speed, TRUE);
3100 	adapter->advertise = 0;
3101 	if (IFM_SUBTYPE(ifm->ifm_media) != IFM_AUTO) {
3102 		if ((speed & IXGBE_LINK_SPEED_10GB_FULL) != 0)
3103 			adapter->advertise |= 1 << 2;
3104 		if ((speed & IXGBE_LINK_SPEED_1GB_FULL) != 0)
3105 			adapter->advertise |= 1 << 1;
3106 		if ((speed & IXGBE_LINK_SPEED_100_FULL) != 0)
3107 			adapter->advertise |= 1 << 0;
3108 		if ((speed & IXGBE_LINK_SPEED_10_FULL) != 0)
3109 			adapter->advertise |= 1 << 3;
3110 		if ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) != 0)
3111 			adapter->advertise |= 1 << 4;
3112 		if ((speed & IXGBE_LINK_SPEED_5GB_FULL) != 0)
3113 			adapter->advertise |= 1 << 5;
3114 	}
3115 
3116 	return (0);
3117 
3118 invalid:
3119 	device_printf(adapter->dev, "Invalid media type!\n");
3120 
3121 	return (EINVAL);
3122 } /* ixgbe_media_change */
3123 
3124 /************************************************************************
3125  * ixgbe_msix_admin - Link status change ISR (MSI-X)
3126  ************************************************************************/
3127 static int
3128 ixgbe_msix_admin(void *arg)
3129 {
3130 	struct adapter	*adapter = arg;
3131 	struct ixgbe_hw *hw = &adapter->hw;
3132 	u32		eicr;
3133 	u32		eims_orig;
3134 	u32		eims_disable = 0;
3135 
3136 	IXGBE_EVC_ADD(&adapter->admin_irqev, 1);
3137 
3138 	eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
3139 	/* Pause other interrupts */
3140 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_MSIX_OTHER_CLEAR_MASK);
3141 
3142 	/*
3143 	 * First get the cause.
3144 	 *
3145 	 * The specifications of 82598, 82599, X540 and X550 say EICS register
3146 	 * is write only. However, Linux says it is a workaround for silicon
3147 	 * errata to read EICS instead of EICR to get interrupt cause.
3148 	 * At least, reading EICR clears lower 16bits of EIMS on 82598.
3149 	 */
3150 	eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
3151 	/* Be sure the queue bits are not cleared */
3152 	eicr &= ~IXGBE_EICR_RTX_QUEUE;
3153 	/* Clear all OTHER interrupts with write */
3154 	IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
3155 
3156 	ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
3157 
3158 	/* Re-enable some OTHER interrupts */
3159 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig & ~eims_disable);
3160 
3161 	return 1;
3162 } /* ixgbe_msix_admin */
3163 
3164 static void
3165 ixgbe_intr_admin_common(struct adapter *adapter, u32 eicr, u32 *eims_disable)
3166 {
3167 	struct ixgbe_hw *hw = &adapter->hw;
3168 	u32		task_requests = 0;
3169 	s32		retval;
3170 
3171 	/* Link status change */
3172 	if (eicr & IXGBE_EICR_LSC) {
3173 		task_requests |= IXGBE_REQUEST_TASK_LSC;
3174 		*eims_disable |= IXGBE_EIMS_LSC;
3175 	}
3176 
3177 	if (ixgbe_is_sfp(hw)) {
3178 		u32 eicr_mask;
3179 
3180 		/* Pluggable optics-related interrupt */
3181 		if (hw->mac.type >= ixgbe_mac_X540)
3182 			eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3183 		else
3184 			eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3185 
3186 		/*
3187 		 *  An interrupt might not arrive when a module is inserted.
3188 		 * When an link status change interrupt occurred and the driver
3189 		 * still regard SFP as unplugged, issue the module softint
3190 		 * and then issue LSC interrupt.
3191 		 */
3192 		if ((eicr & eicr_mask)
3193 		    || ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
3194 			&& (eicr & IXGBE_EICR_LSC))) {
3195 			task_requests |= IXGBE_REQUEST_TASK_MOD;
3196 			*eims_disable |= IXGBE_EIMS_LSC;
3197 		}
3198 
3199 		if ((hw->mac.type == ixgbe_mac_82599EB) &&
3200 		    (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3201 			task_requests |= IXGBE_REQUEST_TASK_MSF;
3202 			*eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
3203 		}
3204 	}
3205 
3206 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
3207 #ifdef IXGBE_FDIR
3208 		if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
3209 		    (eicr & IXGBE_EICR_FLOW_DIR)) {
3210 			if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1)) {
3211 				task_requests |= IXGBE_REQUEST_TASK_FDIR;
3212 				/* Disable the interrupt */
3213 				*eims_disable |= IXGBE_EIMS_FLOW_DIR;
3214 			}
3215 		}
3216 #endif
3217 
3218 		if (eicr & IXGBE_EICR_ECC) {
3219 			if (ratecheck(&adapter->lasterr_time,
3220 			    &ixgbe_errlog_intrvl))
3221 				device_printf(adapter->dev,
3222 				    "CRITICAL: ECC ERROR!! Please Reboot!!\n");
3223 		}
3224 
3225 		/* Check for over temp condition */
3226 		if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
3227 			switch (adapter->hw.mac.type) {
3228 			case ixgbe_mac_X550EM_a:
3229 				if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
3230 					break;
3231 				retval = hw->phy.ops.check_overtemp(hw);
3232 				if (retval != IXGBE_ERR_OVERTEMP)
3233 					break;
3234 				if (ratecheck(&adapter->lasterr_time,
3235 				    &ixgbe_errlog_intrvl)) {
3236 					device_printf(adapter->dev,
3237 					    "CRITICAL: OVER TEMP!! "
3238 					    "PHY IS SHUT DOWN!!\n");
3239 					device_printf(adapter->dev,
3240 					    "System shutdown required!\n");
3241 				}
3242 				break;
3243 			default:
3244 				if (!(eicr & IXGBE_EICR_TS))
3245 					break;
3246 				retval = hw->phy.ops.check_overtemp(hw);
3247 				if (retval != IXGBE_ERR_OVERTEMP)
3248 					break;
3249 				if (ratecheck(&adapter->lasterr_time,
3250 				    &ixgbe_errlog_intrvl)) {
3251 					device_printf(adapter->dev,
3252 					    "CRITICAL: OVER TEMP!! "
3253 					    "PHY IS SHUT DOWN!!\n");
3254 					device_printf(adapter->dev,
3255 					    "System shutdown required!\n");
3256 				}
3257 				break;
3258 			}
3259 		}
3260 
3261 		/* Check for VF message */
3262 		if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
3263 		    (eicr & IXGBE_EICR_MAILBOX)) {
3264 			task_requests |= IXGBE_REQUEST_TASK_MBX;
3265 			*eims_disable |= IXGBE_EIMS_MAILBOX;
3266 		}
3267 	}
3268 
3269 	/* Check for fan failure */
3270 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3271 		ixgbe_check_fan_failure(adapter, eicr, true);
3272 
3273 	/* External PHY interrupt */
3274 	if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3275 	    (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
3276 		task_requests |= IXGBE_REQUEST_TASK_PHY;
3277 		*eims_disable |= IXGBE_EICR_GPI_SDP0_X540;
3278 	}
3279 
3280 	if (task_requests != 0) {
3281 		mutex_enter(&adapter->admin_mtx);
3282 		adapter->task_requests |= task_requests;
3283 		ixgbe_schedule_admin_tasklet(adapter);
3284 		mutex_exit(&adapter->admin_mtx);
3285 	}
3286 }
3287 
3288 static void
3289 ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
3290 {
3291 
3292 	if (adapter->hw.mac.type == ixgbe_mac_82598EB)
3293 		itr |= itr << 16;
3294 	else
3295 		itr |= IXGBE_EITR_CNT_WDIS;
3296 
3297 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(index), itr);
3298 }
3299 
3300 
3301 /************************************************************************
3302  * ixgbe_sysctl_interrupt_rate_handler
3303  ************************************************************************/
3304 static int
3305 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
3306 {
3307 	struct sysctlnode node = *rnode;
3308 	struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
3309 	struct adapter	*adapter;
3310 	uint32_t reg, usec, rate;
3311 	int error;
3312 
3313 	if (que == NULL)
3314 		return 0;
3315 
3316 	adapter = que->adapter;
3317 	if (ixgbe_fw_recovery_mode_swflag(adapter))
3318 		return (EPERM);
3319 
3320 	reg = IXGBE_READ_REG(&adapter->hw, IXGBE_EITR(que->msix));
3321 	usec = ((reg & 0x0FF8) >> 3);
3322 	if (usec > 0)
3323 		rate = 500000 / usec;
3324 	else
3325 		rate = 0;
3326 	node.sysctl_data = &rate;
3327 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
3328 	if (error || newp == NULL)
3329 		return error;
3330 	reg &= ~0xfff; /* default, no limitation */
3331 	if (rate > 0 && rate < 500000) {
3332 		if (rate < 1000)
3333 			rate = 1000;
3334 		reg |= ((4000000 / rate) & 0xff8);
3335 		/*
3336 		 * When RSC is used, ITR interval must be larger than
3337 		 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
3338 		 * The minimum value is always greater than 2us on 100M
3339 		 * (and 10M?(not documented)), but it's not on 1G and higher.
3340 		 */
3341 		if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
3342 		    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
3343 			if ((adapter->num_queues > 1)
3344 			    && (reg < IXGBE_MIN_RSC_EITR_10G1G))
3345 				return EINVAL;
3346 		}
3347 		ixgbe_max_interrupt_rate = rate;
3348 	} else
3349 		ixgbe_max_interrupt_rate = 0;
3350 	ixgbe_eitr_write(adapter, que->msix, reg);
3351 
3352 	return (0);
3353 } /* ixgbe_sysctl_interrupt_rate_handler */
3354 
3355 const struct sysctlnode *
3356 ixgbe_sysctl_instance(struct adapter *adapter)
3357 {
3358 	const char *dvname;
3359 	struct sysctllog **log;
3360 	int rc;
3361 	const struct sysctlnode *rnode;
3362 
3363 	if (adapter->sysctltop != NULL)
3364 		return adapter->sysctltop;
3365 
3366 	log = &adapter->sysctllog;
3367 	dvname = device_xname(adapter->dev);
3368 
3369 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
3370 	    0, CTLTYPE_NODE, dvname,
3371 	    SYSCTL_DESCR("ixgbe information and settings"),
3372 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
3373 		goto err;
3374 
3375 	return rnode;
3376 err:
3377 	device_printf(adapter->dev,
3378 	    "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
3379 	return NULL;
3380 }
3381 
3382 /************************************************************************
3383  * ixgbe_add_device_sysctls
3384  ************************************************************************/
3385 static void
3386 ixgbe_add_device_sysctls(struct adapter *adapter)
3387 {
3388 	device_t	       dev = adapter->dev;
3389 	struct ixgbe_hw	       *hw = &adapter->hw;
3390 	struct sysctllog **log;
3391 	const struct sysctlnode *rnode, *cnode;
3392 
3393 	log = &adapter->sysctllog;
3394 
3395 	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
3396 		aprint_error_dev(dev, "could not create sysctl root\n");
3397 		return;
3398 	}
3399 
3400 	if (sysctl_createv(log, 0, &rnode, &cnode,
3401 	    CTLFLAG_READWRITE, CTLTYPE_INT,
3402 	    "debug", SYSCTL_DESCR("Debug Info"),
3403 	    ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL)
3404 	    != 0)
3405 		aprint_error_dev(dev, "could not create sysctl\n");
3406 
3407 	if (sysctl_createv(log, 0, &rnode, &cnode,
3408 	    CTLFLAG_READWRITE, CTLTYPE_INT,
3409 	    "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
3410 	    ixgbe_sysctl_rx_copy_len, 0,
3411 	    (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
3412 		aprint_error_dev(dev, "could not create sysctl\n");
3413 
3414 	if (sysctl_createv(log, 0, &rnode, &cnode,
3415 	    CTLFLAG_READONLY, CTLTYPE_INT,
3416 	    "num_tx_desc", SYSCTL_DESCR("Number of TX descriptors"),
3417 	    NULL, 0, &adapter->num_tx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
3418 		aprint_error_dev(dev, "could not create sysctl\n");
3419 
3420 	if (sysctl_createv(log, 0, &rnode, &cnode,
3421 	    CTLFLAG_READONLY, CTLTYPE_INT,
3422 	    "num_rx_desc", SYSCTL_DESCR("Number of RX descriptors"),
3423 	    NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
3424 		aprint_error_dev(dev, "could not create sysctl\n");
3425 
3426 	if (sysctl_createv(log, 0, &rnode, &cnode,
3427 	    CTLFLAG_READWRITE, CTLTYPE_INT, "rx_process_limit",
3428 	    SYSCTL_DESCR("max number of RX packets to process"),
3429 	    ixgbe_sysctl_rx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
3430 	    CTL_EOL) != 0)
3431 		aprint_error_dev(dev, "could not create sysctl\n");
3432 
3433 	if (sysctl_createv(log, 0, &rnode, &cnode,
3434 	    CTLFLAG_READWRITE, CTLTYPE_INT, "tx_process_limit",
3435 	    SYSCTL_DESCR("max number of TX packets to process"),
3436 	    ixgbe_sysctl_tx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
3437 	    CTL_EOL) != 0)
3438 		aprint_error_dev(dev, "could not create sysctl\n");
3439 
3440 	if (sysctl_createv(log, 0, &rnode, &cnode,
3441 	    CTLFLAG_READONLY, CTLTYPE_INT,
3442 	    "num_queues", SYSCTL_DESCR("Number of queues"),
3443 	    NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
3444 		aprint_error_dev(dev, "could not create sysctl\n");
3445 
3446 	/* Sysctls for all devices */
3447 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3448 	    CTLTYPE_INT, "fc", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_SET_FC),
3449 	    ixgbe_sysctl_flowcntl, 0, (void *)adapter, 0, CTL_CREATE,
3450 	    CTL_EOL) != 0)
3451 		aprint_error_dev(dev, "could not create sysctl\n");
3452 
3453 	adapter->enable_aim = ixgbe_enable_aim;
3454 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3455 	    CTLTYPE_BOOL, "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
3456 	    NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
3457 		aprint_error_dev(dev, "could not create sysctl\n");
3458 
3459 	if (sysctl_createv(log, 0, &rnode, &cnode,
3460 	    CTLFLAG_READWRITE, CTLTYPE_INT,
3461 	    "advertise_speed", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_ADV_SPEED),
3462 	    ixgbe_sysctl_advertise, 0, (void *)adapter, 0, CTL_CREATE,
3463 	    CTL_EOL) != 0)
3464 		aprint_error_dev(dev, "could not create sysctl\n");
3465 
3466 	/*
3467 	 * If each "que->txrx_use_workqueue" is changed in sysctl handler,
3468 	 * it causesflip-flopping softint/workqueue mode in one deferred
3469 	 * processing. Therefore, preempt_disable()/preempt_enable() are
3470 	 * required in ixgbe_sched_handle_que() to avoid
3471 	 * KASSERT(ixgbe_sched_handle_que()) in softint_schedule().
3472 	 * I think changing "que->txrx_use_workqueue" in interrupt handler
3473 	 * is lighter than doing preempt_disable()/preempt_enable() in every
3474 	 * ixgbe_sched_handle_que().
3475 	 */
3476 	adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
3477 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3478 	    CTLTYPE_BOOL, "txrx_workqueue",
3479 	    SYSCTL_DESCR("Use workqueue for packet processing"),
3480 	    NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE,
3481 	    CTL_EOL) != 0)
3482 		aprint_error_dev(dev, "could not create sysctl\n");
3483 
3484 #ifdef IXGBE_DEBUG
3485 	/* testing sysctls (for all devices) */
3486 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3487 	    CTLTYPE_INT, "power_state", SYSCTL_DESCR("PCI Power State"),
3488 	    ixgbe_sysctl_power_state, 0, (void *)adapter, 0, CTL_CREATE,
3489 	    CTL_EOL) != 0)
3490 		aprint_error_dev(dev, "could not create sysctl\n");
3491 
3492 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READONLY,
3493 	    CTLTYPE_STRING, "print_rss_config",
3494 	    SYSCTL_DESCR("Prints RSS Configuration"),
3495 	    ixgbe_sysctl_print_rss_config, 0, (void *)adapter, 0, CTL_CREATE,
3496 	    CTL_EOL) != 0)
3497 		aprint_error_dev(dev, "could not create sysctl\n");
3498 #endif
3499 	/* for X550 series devices */
3500 	if (hw->mac.type >= ixgbe_mac_X550)
3501 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3502 		    CTLTYPE_INT, "dmac", SYSCTL_DESCR("DMA Coalesce"),
3503 		    ixgbe_sysctl_dmac, 0, (void *)adapter, 0, CTL_CREATE,
3504 		    CTL_EOL) != 0)
3505 			aprint_error_dev(dev, "could not create sysctl\n");
3506 
3507 	/* for WoL-capable devices */
3508 	if (adapter->wol_support) {
3509 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3510 		    CTLTYPE_BOOL, "wol_enable",
3511 		    SYSCTL_DESCR("Enable/Disable Wake on LAN"),
3512 		    ixgbe_sysctl_wol_enable, 0, (void *)adapter, 0, CTL_CREATE,
3513 		    CTL_EOL) != 0)
3514 			aprint_error_dev(dev, "could not create sysctl\n");
3515 
3516 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3517 		    CTLTYPE_INT, "wufc",
3518 		    SYSCTL_DESCR("Enable/Disable Wake Up Filters"),
3519 		    ixgbe_sysctl_wufc, 0, (void *)adapter, 0, CTL_CREATE,
3520 		    CTL_EOL) != 0)
3521 			aprint_error_dev(dev, "could not create sysctl\n");
3522 	}
3523 
3524 	/* for X552/X557-AT devices */
3525 	if ((hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) ||
3526 	    (hw->device_id == IXGBE_DEV_ID_X550EM_A_10G_T)) {
3527 		const struct sysctlnode *phy_node;
3528 
3529 		if (sysctl_createv(log, 0, &rnode, &phy_node, 0, CTLTYPE_NODE,
3530 		    "phy", SYSCTL_DESCR("External PHY sysctls"),
3531 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) {
3532 			aprint_error_dev(dev, "could not create sysctl\n");
3533 			return;
3534 		}
3535 
3536 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3537 		    CTLTYPE_INT, "temp",
3538 		    SYSCTL_DESCR("Current External PHY Temperature (Celsius)"),
3539 		    ixgbe_sysctl_phy_temp, 0, (void *)adapter, 0, CTL_CREATE,
3540 		    CTL_EOL) != 0)
3541 			aprint_error_dev(dev, "could not create sysctl\n");
3542 
3543 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
3544 		    CTLTYPE_INT, "overtemp_occurred",
3545 		    SYSCTL_DESCR(
3546 			    "External PHY High Temperature Event Occurred"),
3547 		    ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
3548 		    CTL_CREATE, CTL_EOL) != 0)
3549 			aprint_error_dev(dev, "could not create sysctl\n");
3550 	}
3551 
3552 	if ((hw->mac.type == ixgbe_mac_X550EM_a)
3553 	    && (hw->phy.type == ixgbe_phy_fw))
3554 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3555 		    CTLTYPE_BOOL, "force_10_100_autonego",
3556 		    SYSCTL_DESCR("Force autonego on 10M and 100M"),
3557 		    NULL, 0, &hw->phy.force_10_100_autonego, 0,
3558 		    CTL_CREATE, CTL_EOL) != 0)
3559 			aprint_error_dev(dev, "could not create sysctl\n");
3560 
3561 	if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
3562 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
3563 		    CTLTYPE_INT, "eee_state",
3564 		    SYSCTL_DESCR("EEE Power Save State"),
3565 		    ixgbe_sysctl_eee_state, 0, (void *)adapter, 0, CTL_CREATE,
3566 		    CTL_EOL) != 0)
3567 			aprint_error_dev(dev, "could not create sysctl\n");
3568 	}
3569 } /* ixgbe_add_device_sysctls */
3570 
3571 /************************************************************************
3572  * ixgbe_allocate_pci_resources
3573  ************************************************************************/
3574 static int
3575 ixgbe_allocate_pci_resources(struct adapter *adapter,
3576     const struct pci_attach_args *pa)
3577 {
3578 	pcireg_t	memtype, csr;
3579 	device_t dev = adapter->dev;
3580 	bus_addr_t addr;
3581 	int flags;
3582 
3583 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
3584 	switch (memtype) {
3585 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
3586 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
3587 		adapter->osdep.mem_bus_space_tag = pa->pa_memt;
3588 		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
3589 		      memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
3590 			goto map_err;
3591 		if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
3592 			aprint_normal_dev(dev, "clearing prefetchable bit\n");
3593 			flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
3594 		}
3595 		if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
3596 		     adapter->osdep.mem_size, flags,
3597 		     &adapter->osdep.mem_bus_space_handle) != 0) {
3598 map_err:
3599 			adapter->osdep.mem_size = 0;
3600 			aprint_error_dev(dev, "unable to map BAR0\n");
3601 			return ENXIO;
3602 		}
3603 		/*
3604 		 * Enable address decoding for memory range in case BIOS or
3605 		 * UEFI don't set it.
3606 		 */
3607 		csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
3608 		    PCI_COMMAND_STATUS_REG);
3609 		csr |= PCI_COMMAND_MEM_ENABLE;
3610 		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
3611 		    csr);
3612 		break;
3613 	default:
3614 		aprint_error_dev(dev, "unexpected type on BAR0\n");
3615 		return ENXIO;
3616 	}
3617 
3618 	return (0);
3619 } /* ixgbe_allocate_pci_resources */
3620 
3621 static void
3622 ixgbe_free_deferred_handlers(struct adapter *adapter)
3623 {
3624 	struct ix_queue *que = adapter->queues;
3625 	struct tx_ring *txr = adapter->tx_rings;
3626 	int i;
3627 
3628 	for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
3629 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
3630 			if (txr->txr_si != NULL)
3631 				softint_disestablish(txr->txr_si);
3632 		}
3633 		if (que->que_si != NULL)
3634 			softint_disestablish(que->que_si);
3635 	}
3636 	if (adapter->txr_wq != NULL)
3637 		workqueue_destroy(adapter->txr_wq);
3638 	if (adapter->txr_wq_enqueued != NULL)
3639 		percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
3640 	if (adapter->que_wq != NULL)
3641 		workqueue_destroy(adapter->que_wq);
3642 
3643 	if (adapter->admin_wq != NULL) {
3644 		workqueue_destroy(adapter->admin_wq);
3645 		adapter->admin_wq = NULL;
3646 	}
3647 	if (adapter->timer_wq != NULL) {
3648 		workqueue_destroy(adapter->timer_wq);
3649 		adapter->timer_wq = NULL;
3650 	}
3651 	if (adapter->recovery_mode_timer_wq != NULL) {
3652 		/*
3653 		 * ixgbe_ifstop() doesn't call the workqueue_wait() for
3654 		 * the recovery_mode_timer workqueue, so call it here.
3655 		 */
3656 		workqueue_wait(adapter->recovery_mode_timer_wq,
3657 		    &adapter->recovery_mode_timer_wc);
3658 		atomic_store_relaxed(&adapter->recovery_mode_timer_pending, 0);
3659 		workqueue_destroy(adapter->recovery_mode_timer_wq);
3660 		adapter->recovery_mode_timer_wq = NULL;
3661 	}
3662 } /* ixgbe_free_deferred_handlers */
3663 
3664 /************************************************************************
3665  * ixgbe_detach - Device removal routine
3666  *
3667  *   Called when the driver is being removed.
3668  *   Stops the adapter and deallocates all the resources
3669  *   that were allocated for driver operation.
3670  *
3671  *   return 0 on success, positive on failure
3672  ************************************************************************/
3673 static int
3674 ixgbe_detach(device_t dev, int flags)
3675 {
3676 	struct adapter *adapter = device_private(dev);
3677 	struct rx_ring *rxr = adapter->rx_rings;
3678 	struct tx_ring *txr = adapter->tx_rings;
3679 	struct ixgbe_hw *hw = &adapter->hw;
3680 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
3681 	u32	ctrl_ext;
3682 	int i;
3683 
3684 	INIT_DEBUGOUT("ixgbe_detach: begin");
3685 	if (adapter->osdep.attached == false)
3686 		return 0;
3687 
3688 	if (ixgbe_pci_iov_detach(dev) != 0) {
3689 		device_printf(dev, "SR-IOV in use; detach first.\n");
3690 		return (EBUSY);
3691 	}
3692 
3693 	if (VLAN_ATTACHED(&adapter->osdep.ec) &&
3694 	    (flags & (DETACH_SHUTDOWN | DETACH_FORCE)) == 0) {
3695 		aprint_error_dev(dev, "VLANs in use, detach first\n");
3696 		return (EBUSY);
3697 	}
3698 
3699 	ether_ifdetach(adapter->ifp);
3700 
3701 	adapter->osdep.detaching = true;
3702 	/*
3703 	 * Stop the interface. ixgbe_setup_low_power_mode() calls
3704 	 * ixgbe_ifstop(), so it's not required to call ixgbe_ifstop()
3705 	 * directly.
3706 	 */
3707 	ixgbe_setup_low_power_mode(adapter);
3708 
3709 	callout_halt(&adapter->timer, NULL);
3710 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
3711 		callout_halt(&adapter->recovery_mode_timer, NULL);
3712 
3713 	workqueue_wait(adapter->admin_wq, &adapter->admin_wc);
3714 	atomic_store_relaxed(&adapter->admin_pending, 0);
3715 	workqueue_wait(adapter->timer_wq, &adapter->timer_wc);
3716 	atomic_store_relaxed(&adapter->timer_pending, 0);
3717 
3718 	pmf_device_deregister(dev);
3719 
3720 	ixgbe_free_deferred_handlers(adapter);
3721 
3722 	/* let hardware know driver is unloading */
3723 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
3724 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
3725 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
3726 
3727 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
3728 		netmap_detach(adapter->ifp);
3729 
3730 	ixgbe_free_pci_resources(adapter);
3731 #if 0	/* XXX the NetBSD port is probably missing something here */
3732 	bus_generic_detach(dev);
3733 #endif
3734 	if_detach(adapter->ifp);
3735 	ifmedia_fini(&adapter->media);
3736 	if_percpuq_destroy(adapter->ipq);
3737 
3738 	sysctl_teardown(&adapter->sysctllog);
3739 	evcnt_detach(&adapter->efbig_tx_dma_setup);
3740 	evcnt_detach(&adapter->mbuf_defrag_failed);
3741 	evcnt_detach(&adapter->efbig2_tx_dma_setup);
3742 	evcnt_detach(&adapter->einval_tx_dma_setup);
3743 	evcnt_detach(&adapter->other_tx_dma_setup);
3744 	evcnt_detach(&adapter->eagain_tx_dma_setup);
3745 	evcnt_detach(&adapter->enomem_tx_dma_setup);
3746 	evcnt_detach(&adapter->watchdog_events);
3747 	evcnt_detach(&adapter->tso_err);
3748 	evcnt_detach(&adapter->admin_irqev);
3749 	evcnt_detach(&adapter->link_workev);
3750 	evcnt_detach(&adapter->mod_workev);
3751 	evcnt_detach(&adapter->msf_workev);
3752 	evcnt_detach(&adapter->phy_workev);
3753 
3754 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
3755 		if (i < __arraycount(stats->mpc)) {
3756 			evcnt_detach(&stats->mpc[i]);
3757 			if (hw->mac.type == ixgbe_mac_82598EB)
3758 				evcnt_detach(&stats->rnbc[i]);
3759 		}
3760 		if (i < __arraycount(stats->pxontxc)) {
3761 			evcnt_detach(&stats->pxontxc[i]);
3762 			evcnt_detach(&stats->pxonrxc[i]);
3763 			evcnt_detach(&stats->pxofftxc[i]);
3764 			evcnt_detach(&stats->pxoffrxc[i]);
3765 			if (hw->mac.type >= ixgbe_mac_82599EB)
3766 				evcnt_detach(&stats->pxon2offc[i]);
3767 		}
3768 	}
3769 
3770 	txr = adapter->tx_rings;
3771 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
3772 		evcnt_detach(&adapter->queues[i].irqs);
3773 		evcnt_detach(&adapter->queues[i].handleq);
3774 		evcnt_detach(&adapter->queues[i].req);
3775 		evcnt_detach(&txr->no_desc_avail);
3776 		evcnt_detach(&txr->total_packets);
3777 		evcnt_detach(&txr->tso_tx);
3778 #ifndef IXGBE_LEGACY_TX
3779 		evcnt_detach(&txr->pcq_drops);
3780 #endif
3781 
3782 		if (i < __arraycount(stats->qprc)) {
3783 			evcnt_detach(&stats->qprc[i]);
3784 			evcnt_detach(&stats->qptc[i]);
3785 			evcnt_detach(&stats->qbrc[i]);
3786 			evcnt_detach(&stats->qbtc[i]);
3787 			if (hw->mac.type >= ixgbe_mac_82599EB)
3788 				evcnt_detach(&stats->qprdc[i]);
3789 		}
3790 
3791 		evcnt_detach(&rxr->rx_packets);
3792 		evcnt_detach(&rxr->rx_bytes);
3793 		evcnt_detach(&rxr->rx_copies);
3794 		evcnt_detach(&rxr->no_mbuf);
3795 		evcnt_detach(&rxr->rx_discarded);
3796 	}
3797 	evcnt_detach(&stats->ipcs);
3798 	evcnt_detach(&stats->l4cs);
3799 	evcnt_detach(&stats->ipcs_bad);
3800 	evcnt_detach(&stats->l4cs_bad);
3801 	evcnt_detach(&stats->intzero);
3802 	evcnt_detach(&stats->legint);
3803 	evcnt_detach(&stats->crcerrs);
3804 	evcnt_detach(&stats->illerrc);
3805 	evcnt_detach(&stats->errbc);
3806 	evcnt_detach(&stats->mspdc);
3807 	if (hw->mac.type >= ixgbe_mac_X550)
3808 		evcnt_detach(&stats->mbsdc);
3809 	evcnt_detach(&stats->mpctotal);
3810 	evcnt_detach(&stats->mlfc);
3811 	evcnt_detach(&stats->mrfc);
3812 	if (hw->mac.type == ixgbe_mac_X550EM_a)
3813 		evcnt_detach(&stats->link_dn_cnt);
3814 	evcnt_detach(&stats->rlec);
3815 	evcnt_detach(&stats->lxontxc);
3816 	evcnt_detach(&stats->lxonrxc);
3817 	evcnt_detach(&stats->lxofftxc);
3818 	evcnt_detach(&stats->lxoffrxc);
3819 
3820 	/* Packet Reception Stats */
3821 	evcnt_detach(&stats->tor);
3822 	evcnt_detach(&stats->gorc);
3823 	evcnt_detach(&stats->tpr);
3824 	evcnt_detach(&stats->gprc);
3825 	evcnt_detach(&stats->mprc);
3826 	evcnt_detach(&stats->bprc);
3827 	evcnt_detach(&stats->prc64);
3828 	evcnt_detach(&stats->prc127);
3829 	evcnt_detach(&stats->prc255);
3830 	evcnt_detach(&stats->prc511);
3831 	evcnt_detach(&stats->prc1023);
3832 	evcnt_detach(&stats->prc1522);
3833 	evcnt_detach(&stats->ruc);
3834 	evcnt_detach(&stats->rfc);
3835 	evcnt_detach(&stats->roc);
3836 	evcnt_detach(&stats->rjc);
3837 	evcnt_detach(&stats->mngprc);
3838 	evcnt_detach(&stats->mngpdc);
3839 	evcnt_detach(&stats->xec);
3840 
3841 	/* Packet Transmission Stats */
3842 	evcnt_detach(&stats->gotc);
3843 	evcnt_detach(&stats->tpt);
3844 	evcnt_detach(&stats->gptc);
3845 	evcnt_detach(&stats->bptc);
3846 	evcnt_detach(&stats->mptc);
3847 	evcnt_detach(&stats->mngptc);
3848 	evcnt_detach(&stats->ptc64);
3849 	evcnt_detach(&stats->ptc127);
3850 	evcnt_detach(&stats->ptc255);
3851 	evcnt_detach(&stats->ptc511);
3852 	evcnt_detach(&stats->ptc1023);
3853 	evcnt_detach(&stats->ptc1522);
3854 
3855 	ixgbe_free_queues(adapter);
3856 	free(adapter->mta, M_DEVBUF);
3857 
3858 	mutex_destroy(&adapter->admin_mtx); /* XXX appropriate order? */
3859 	IXGBE_CORE_LOCK_DESTROY(adapter);
3860 
3861 	return (0);
3862 } /* ixgbe_detach */
3863 
3864 /************************************************************************
3865  * ixgbe_setup_low_power_mode - LPLU/WoL preparation
3866  *
3867  *   Prepare the adapter/port for LPLU and/or WoL
3868  ************************************************************************/
3869 static int
3870 ixgbe_setup_low_power_mode(struct adapter *adapter)
3871 {
3872 	struct ixgbe_hw *hw = &adapter->hw;
3873 	device_t	dev = adapter->dev;
3874 	struct ifnet	*ifp = adapter->ifp;
3875 	s32		error = 0;
3876 
3877 	/* Limit power management flow to X550EM baseT */
3878 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
3879 	    hw->phy.ops.enter_lplu) {
3880 		/* X550EM baseT adapters need a special LPLU flow */
3881 		hw->phy.reset_disable = true;
3882 		ixgbe_ifstop(ifp, 1);
3883 		error = hw->phy.ops.enter_lplu(hw);
3884 		if (error)
3885 			device_printf(dev,
3886 			    "Error entering LPLU: %d\n", error);
3887 		hw->phy.reset_disable = false;
3888 	} else {
3889 		/* Just stop for other adapters */
3890 		ixgbe_ifstop(ifp, 1);
3891 	}
3892 
3893 	IXGBE_CORE_LOCK(adapter);
3894 
3895 	if (!hw->wol_enabled) {
3896 		ixgbe_set_phy_power(hw, FALSE);
3897 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3898 		IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
3899 	} else {
3900 		/* Turn off support for APM wakeup. (Using ACPI instead) */
3901 		IXGBE_WRITE_REG(hw, IXGBE_GRC_BY_MAC(hw),
3902 		    IXGBE_READ_REG(hw, IXGBE_GRC_BY_MAC(hw)) & ~(u32)2);
3903 
3904 		/*
3905 		 * Clear Wake Up Status register to prevent any previous wakeup
3906 		 * events from waking us up immediately after we suspend.
3907 		 */
3908 		IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3909 
3910 		/*
3911 		 * Program the Wakeup Filter Control register with user filter
3912 		 * settings
3913 		 */
3914 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
3915 
3916 		/* Enable wakeups and power management in Wakeup Control */
3917 		IXGBE_WRITE_REG(hw, IXGBE_WUC,
3918 		    IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
3919 	}
3920 
3921 	IXGBE_CORE_UNLOCK(adapter);
3922 
3923 	return error;
3924 } /* ixgbe_setup_low_power_mode */
3925 
3926 /************************************************************************
3927  * ixgbe_shutdown - Shutdown entry point
3928  ************************************************************************/
3929 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
3930 static int
3931 ixgbe_shutdown(device_t dev)
3932 {
3933 	struct adapter *adapter = device_private(dev);
3934 	int error = 0;
3935 
3936 	INIT_DEBUGOUT("ixgbe_shutdown: begin");
3937 
3938 	error = ixgbe_setup_low_power_mode(adapter);
3939 
3940 	return (error);
3941 } /* ixgbe_shutdown */
3942 #endif
3943 
3944 /************************************************************************
3945  * ixgbe_suspend
3946  *
3947  *   From D0 to D3
3948  ************************************************************************/
3949 static bool
3950 ixgbe_suspend(device_t dev, const pmf_qual_t *qual)
3951 {
3952 	struct adapter *adapter = device_private(dev);
3953 	int	       error = 0;
3954 
3955 	INIT_DEBUGOUT("ixgbe_suspend: begin");
3956 
3957 	error = ixgbe_setup_low_power_mode(adapter);
3958 
3959 	return (error);
3960 } /* ixgbe_suspend */
3961 
3962 /************************************************************************
3963  * ixgbe_resume
3964  *
3965  *   From D3 to D0
3966  ************************************************************************/
3967 static bool
3968 ixgbe_resume(device_t dev, const pmf_qual_t *qual)
3969 {
3970 	struct adapter	*adapter = device_private(dev);
3971 	struct ifnet	*ifp = adapter->ifp;
3972 	struct ixgbe_hw *hw = &adapter->hw;
3973 	u32		wus;
3974 
3975 	INIT_DEBUGOUT("ixgbe_resume: begin");
3976 
3977 	IXGBE_CORE_LOCK(adapter);
3978 
3979 	/* Read & clear WUS register */
3980 	wus = IXGBE_READ_REG(hw, IXGBE_WUS);
3981 	if (wus)
3982 		device_printf(dev, "Woken up by (WUS): %#010x\n",
3983 		    IXGBE_READ_REG(hw, IXGBE_WUS));
3984 	IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
3985 	/* And clear WUFC until next low-power transition */
3986 	IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
3987 
3988 	/*
3989 	 * Required after D3->D0 transition;
3990 	 * will re-advertise all previous advertised speeds
3991 	 */
3992 	if (ifp->if_flags & IFF_UP)
3993 		ixgbe_init_locked(adapter);
3994 
3995 	IXGBE_CORE_UNLOCK(adapter);
3996 
3997 	return true;
3998 } /* ixgbe_resume */
3999 
4000 /*
4001  * Set the various hardware offload abilities.
4002  *
4003  * This takes the ifnet's if_capenable flags (e.g. set by the user using
4004  * ifconfig) and indicates to the OS via the ifnet's if_hwassist field what
4005  * mbuf offload flags the driver will understand.
4006  */
4007 static void
4008 ixgbe_set_if_hwassist(struct adapter *adapter)
4009 {
4010 	/* XXX */
4011 }
4012 
4013 /************************************************************************
4014  * ixgbe_init_locked - Init entry point
4015  *
4016  *   Used in two ways: It is used by the stack as an init
4017  *   entry point in network interface structure. It is also
4018  *   used by the driver as a hw/sw initialization routine to
4019  *   get to a consistent state.
4020  *
4021  *   return 0 on success, positive on failure
4022  ************************************************************************/
4023 static void
4024 ixgbe_init_locked(struct adapter *adapter)
4025 {
4026 	struct ifnet   *ifp = adapter->ifp;
4027 	device_t	dev = adapter->dev;
4028 	struct ixgbe_hw *hw = &adapter->hw;
4029 	struct ix_queue *que;
4030 	struct tx_ring	*txr;
4031 	struct rx_ring	*rxr;
4032 	u32		txdctl, mhadd;
4033 	u32		rxdctl, rxctrl;
4034 	u32		ctrl_ext;
4035 	bool		unsupported_sfp = false;
4036 	int		i, j, error;
4037 
4038 	/* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
4039 
4040 	KASSERT(mutex_owned(&adapter->core_mtx));
4041 	INIT_DEBUGOUT("ixgbe_init_locked: begin");
4042 
4043 	hw->need_unsupported_sfp_recovery = false;
4044 	hw->adapter_stopped = FALSE;
4045 	ixgbe_stop_adapter(hw);
4046 	callout_stop(&adapter->timer);
4047 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
4048 		callout_stop(&adapter->recovery_mode_timer);
4049 	for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
4050 		que->disabled_count = 0;
4051 
4052 	/* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
4053 	adapter->max_frame_size =
4054 		ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
4055 
4056 	/* Queue indices may change with IOV mode */
4057 	ixgbe_align_all_queue_indices(adapter);
4058 
4059 	/* reprogram the RAR[0] in case user changed it. */
4060 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
4061 
4062 	/* Get the latest mac address, User can use a LAA */
4063 	memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
4064 	    IXGBE_ETH_LENGTH_OF_ADDRESS);
4065 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
4066 	hw->addr_ctrl.rar_used_count = 1;
4067 
4068 	/* Set hardware offload abilities from ifnet flags */
4069 	ixgbe_set_if_hwassist(adapter);
4070 
4071 	/* Prepare transmit descriptors and buffers */
4072 	if (ixgbe_setup_transmit_structures(adapter)) {
4073 		device_printf(dev, "Could not setup transmit structures\n");
4074 		ixgbe_stop_locked(adapter);
4075 		return;
4076 	}
4077 
4078 	ixgbe_init_hw(hw);
4079 
4080 	ixgbe_initialize_iov(adapter);
4081 
4082 	ixgbe_initialize_transmit_units(adapter);
4083 
4084 	/* Setup Multicast table */
4085 	ixgbe_set_rxfilter(adapter);
4086 
4087 	/* Use fixed buffer size, even for jumbo frames */
4088 	adapter->rx_mbuf_sz = MCLBYTES;
4089 
4090 	/* Prepare receive descriptors and buffers */
4091 	error = ixgbe_setup_receive_structures(adapter);
4092 	if (error) {
4093 		device_printf(dev,
4094 		    "Could not setup receive structures (err = %d)\n", error);
4095 		ixgbe_stop_locked(adapter);
4096 		return;
4097 	}
4098 
4099 	/* Configure RX settings */
4100 	ixgbe_initialize_receive_units(adapter);
4101 
4102 	/* Initialize variable holding task enqueue requests interrupts */
4103 	adapter->task_requests = 0;
4104 
4105 	/* Enable SDP & MSI-X interrupts based on adapter */
4106 	ixgbe_config_gpie(adapter);
4107 
4108 	/* Set MTU size */
4109 	if (ifp->if_mtu > ETHERMTU) {
4110 		/* aka IXGBE_MAXFRS on 82599 and newer */
4111 		mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
4112 		mhadd &= ~IXGBE_MHADD_MFS_MASK;
4113 		mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
4114 		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
4115 	}
4116 
4117 	/* Now enable all the queues */
4118 	for (i = 0; i < adapter->num_queues; i++) {
4119 		txr = &adapter->tx_rings[i];
4120 		txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
4121 		txdctl |= IXGBE_TXDCTL_ENABLE;
4122 		/* Set WTHRESH to 8, burst writeback */
4123 		txdctl |= IXGBE_TX_WTHRESH << IXGBE_TXDCTL_WTHRESH_SHIFT;
4124 		/*
4125 		 * When the internal queue falls below PTHRESH (32),
4126 		 * start prefetching as long as there are at least
4127 		 * HTHRESH (1) buffers ready. The values are taken
4128 		 * from the Intel linux driver 3.8.21.
4129 		 * Prefetching enables tx line rate even with 1 queue.
4130 		 */
4131 		txdctl |= (32 << 0) | (1 << 8);
4132 		IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
4133 	}
4134 
4135 	for (i = 0; i < adapter->num_queues; i++) {
4136 		rxr = &adapter->rx_rings[i];
4137 		rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
4138 		if (hw->mac.type == ixgbe_mac_82598EB) {
4139 			/*
4140 			 * PTHRESH = 21
4141 			 * HTHRESH = 4
4142 			 * WTHRESH = 8
4143 			 */
4144 			rxdctl &= ~0x3FFFFF;
4145 			rxdctl |= 0x080420;
4146 		}
4147 		rxdctl |= IXGBE_RXDCTL_ENABLE;
4148 		IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
4149 		for (j = 0; j < 10; j++) {
4150 			if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
4151 			    IXGBE_RXDCTL_ENABLE)
4152 				break;
4153 			else
4154 				msec_delay(1);
4155 		}
4156 		IXGBE_WRITE_BARRIER(hw);
4157 
4158 		/*
4159 		 * In netmap mode, we must preserve the buffers made
4160 		 * available to userspace before the if_init()
4161 		 * (this is true by default on the TX side, because
4162 		 * init makes all buffers available to userspace).
4163 		 *
4164 		 * netmap_reset() and the device specific routines
4165 		 * (e.g. ixgbe_setup_receive_rings()) map these
4166 		 * buffers at the end of the NIC ring, so here we
4167 		 * must set the RDT (tail) register to make sure
4168 		 * they are not overwritten.
4169 		 *
4170 		 * In this driver the NIC ring starts at RDH = 0,
4171 		 * RDT points to the last slot available for reception (?),
4172 		 * so RDT = num_rx_desc - 1 means the whole ring is available.
4173 		 */
4174 #ifdef DEV_NETMAP
4175 		if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
4176 		    (ifp->if_capenable & IFCAP_NETMAP)) {
4177 			struct netmap_adapter *na = NA(adapter->ifp);
4178 			struct netmap_kring *kring = na->rx_rings[i];
4179 			int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
4180 
4181 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
4182 		} else
4183 #endif /* DEV_NETMAP */
4184 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me),
4185 			    adapter->num_rx_desc - 1);
4186 	}
4187 
4188 	/* Enable Receive engine */
4189 	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
4190 	if (hw->mac.type == ixgbe_mac_82598EB)
4191 		rxctrl |= IXGBE_RXCTRL_DMBYPS;
4192 	rxctrl |= IXGBE_RXCTRL_RXEN;
4193 	ixgbe_enable_rx_dma(hw, rxctrl);
4194 
4195 	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4196 	atomic_store_relaxed(&adapter->timer_pending, 0);
4197 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
4198 		callout_reset(&adapter->recovery_mode_timer, hz,
4199 		    ixgbe_recovery_mode_timer, adapter);
4200 
4201 	/* Set up MSI/MSI-X routing */
4202 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4203 		ixgbe_configure_ivars(adapter);
4204 		/* Set up auto-mask */
4205 		if (hw->mac.type == ixgbe_mac_82598EB)
4206 			IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4207 		else {
4208 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
4209 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
4210 		}
4211 	} else {  /* Simple settings for Legacy/MSI */
4212 		ixgbe_set_ivar(adapter, 0, 0, 0);
4213 		ixgbe_set_ivar(adapter, 0, 0, 1);
4214 		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
4215 	}
4216 
4217 	ixgbe_init_fdir(adapter);
4218 
4219 	/*
4220 	 * Check on any SFP devices that
4221 	 * need to be kick-started
4222 	 */
4223 	if (hw->phy.type == ixgbe_phy_none) {
4224 		error = hw->phy.ops.identify(hw);
4225 		if (error == IXGBE_ERR_SFP_NOT_SUPPORTED)
4226 			unsupported_sfp = true;
4227 	} else if (hw->phy.type == ixgbe_phy_sfp_unsupported)
4228 		unsupported_sfp = true;
4229 
4230 	if (unsupported_sfp)
4231 		device_printf(dev,
4232 		    "Unsupported SFP+ module type was detected.\n");
4233 
4234 	/* Set moderation on the Link interrupt */
4235 	ixgbe_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
4236 
4237 	/* Enable EEE power saving */
4238 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
4239 		hw->mac.ops.setup_eee(hw,
4240 		    adapter->feat_en & IXGBE_FEATURE_EEE);
4241 
4242 	/* Enable power to the phy. */
4243 	if (!unsupported_sfp) {
4244 		ixgbe_set_phy_power(hw, TRUE);
4245 
4246 		/* Config/Enable Link */
4247 		ixgbe_config_link(adapter);
4248 	}
4249 
4250 	/* Hardware Packet Buffer & Flow Control setup */
4251 	ixgbe_config_delay_values(adapter);
4252 
4253 	/* Initialize the FC settings */
4254 	ixgbe_start_hw(hw);
4255 
4256 	/* Set up VLAN support and filter */
4257 	ixgbe_setup_vlan_hw_support(adapter);
4258 
4259 	/* Setup DMA Coalescing */
4260 	ixgbe_config_dmac(adapter);
4261 
4262 	/* OK to schedule workqueues. */
4263 	adapter->schedule_wqs_ok = true;
4264 
4265 	/* And now turn on interrupts */
4266 	ixgbe_enable_intr(adapter);
4267 
4268 	/* Enable the use of the MBX by the VF's */
4269 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
4270 		ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
4271 		ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
4272 		IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
4273 	}
4274 
4275 	/* Update saved flags. See ixgbe_ifflags_cb() */
4276 	adapter->if_flags = ifp->if_flags;
4277 	adapter->ec_capenable = adapter->osdep.ec.ec_capenable;
4278 
4279 	/* Now inform the stack we're ready */
4280 	ifp->if_flags |= IFF_RUNNING;
4281 
4282 	return;
4283 } /* ixgbe_init_locked */
4284 
4285 /************************************************************************
4286  * ixgbe_init
4287  ************************************************************************/
4288 static int
4289 ixgbe_init(struct ifnet *ifp)
4290 {
4291 	struct adapter *adapter = ifp->if_softc;
4292 
4293 	IXGBE_CORE_LOCK(adapter);
4294 	ixgbe_init_locked(adapter);
4295 	IXGBE_CORE_UNLOCK(adapter);
4296 
4297 	return 0;	/* XXX ixgbe_init_locked cannot fail?  really? */
4298 } /* ixgbe_init */
4299 
4300 /************************************************************************
4301  * ixgbe_set_ivar
4302  *
4303  *   Setup the correct IVAR register for a particular MSI-X interrupt
4304  *     (yes this is all very magic and confusing :)
4305  *    - entry is the register array entry
4306  *    - vector is the MSI-X vector for this queue
4307  *    - type is RX/TX/MISC
4308  ************************************************************************/
4309 static void
4310 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
4311 {
4312 	struct ixgbe_hw *hw = &adapter->hw;
4313 	u32 ivar, index;
4314 
4315 	vector |= IXGBE_IVAR_ALLOC_VAL;
4316 
4317 	switch (hw->mac.type) {
4318 	case ixgbe_mac_82598EB:
4319 		if (type == -1)
4320 			entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
4321 		else
4322 			entry += (type * 64);
4323 		index = (entry >> 2) & 0x1F;
4324 		ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4325 		ivar &= ~(0xffUL << (8 * (entry & 0x3)));
4326 		ivar |= ((u32)vector << (8 * (entry & 0x3)));
4327 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
4328 		break;
4329 	case ixgbe_mac_82599EB:
4330 	case ixgbe_mac_X540:
4331 	case ixgbe_mac_X550:
4332 	case ixgbe_mac_X550EM_x:
4333 	case ixgbe_mac_X550EM_a:
4334 		if (type == -1) { /* MISC IVAR */
4335 			index = (entry & 1) * 8;
4336 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4337 			ivar &= ~(0xffUL << index);
4338 			ivar |= ((u32)vector << index);
4339 			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4340 		} else {	/* RX/TX IVARS */
4341 			index = (16 * (entry & 1)) + (8 * type);
4342 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
4343 			ivar &= ~(0xffUL << index);
4344 			ivar |= ((u32)vector << index);
4345 			IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
4346 		}
4347 		break;
4348 	default:
4349 		break;
4350 	}
4351 } /* ixgbe_set_ivar */
4352 
4353 /************************************************************************
4354  * ixgbe_configure_ivars
4355  ************************************************************************/
4356 static void
4357 ixgbe_configure_ivars(struct adapter *adapter)
4358 {
4359 	struct ix_queue *que = adapter->queues;
4360 	u32		newitr;
4361 
4362 	if (ixgbe_max_interrupt_rate > 0)
4363 		newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
4364 	else {
4365 		/*
4366 		 * Disable DMA coalescing if interrupt moderation is
4367 		 * disabled.
4368 		 */
4369 		adapter->dmac = 0;
4370 		newitr = 0;
4371 	}
4372 
4373 	for (int i = 0; i < adapter->num_queues; i++, que++) {
4374 		struct rx_ring *rxr = &adapter->rx_rings[i];
4375 		struct tx_ring *txr = &adapter->tx_rings[i];
4376 		/* First the RX queue entry */
4377 		ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
4378 		/* ... and the TX */
4379 		ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
4380 		/* Set an Initial EITR value */
4381 		ixgbe_eitr_write(adapter, que->msix, newitr);
4382 		/*
4383 		 * To eliminate influence of the previous state.
4384 		 * At this point, Tx/Rx interrupt handler
4385 		 * (ixgbe_msix_que()) cannot be called, so  both
4386 		 * IXGBE_TX_LOCK and IXGBE_RX_LOCK are not required.
4387 		 */
4388 		que->eitr_setting = 0;
4389 	}
4390 
4391 	/* For the Link interrupt */
4392 	ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
4393 } /* ixgbe_configure_ivars */
4394 
4395 /************************************************************************
4396  * ixgbe_config_gpie
4397  ************************************************************************/
4398 static void
4399 ixgbe_config_gpie(struct adapter *adapter)
4400 {
4401 	struct ixgbe_hw *hw = &adapter->hw;
4402 	u32		gpie;
4403 
4404 	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
4405 
4406 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
4407 		/* Enable Enhanced MSI-X mode */
4408 		gpie |= IXGBE_GPIE_MSIX_MODE
4409 		     |	IXGBE_GPIE_EIAME
4410 		     |	IXGBE_GPIE_PBA_SUPPORT
4411 		     |	IXGBE_GPIE_OCD;
4412 	}
4413 
4414 	/* Fan Failure Interrupt */
4415 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
4416 		gpie |= IXGBE_SDP1_GPIEN;
4417 
4418 	/* Thermal Sensor Interrupt */
4419 	if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
4420 		gpie |= IXGBE_SDP0_GPIEN_X540;
4421 
4422 	/* Link detection */
4423 	switch (hw->mac.type) {
4424 	case ixgbe_mac_82599EB:
4425 		gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
4426 		break;
4427 	case ixgbe_mac_X550EM_x:
4428 	case ixgbe_mac_X550EM_a:
4429 		gpie |= IXGBE_SDP0_GPIEN_X540;
4430 		break;
4431 	default:
4432 		break;
4433 	}
4434 
4435 	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
4436 
4437 } /* ixgbe_config_gpie */
4438 
4439 /************************************************************************
4440  * ixgbe_config_delay_values
4441  *
4442  *   Requires adapter->max_frame_size to be set.
4443  ************************************************************************/
4444 static void
4445 ixgbe_config_delay_values(struct adapter *adapter)
4446 {
4447 	struct ixgbe_hw *hw = &adapter->hw;
4448 	u32		rxpb, frame, size, tmp;
4449 
4450 	frame = adapter->max_frame_size;
4451 
4452 	/* Calculate High Water */
4453 	switch (hw->mac.type) {
4454 	case ixgbe_mac_X540:
4455 	case ixgbe_mac_X550:
4456 	case ixgbe_mac_X550EM_x:
4457 	case ixgbe_mac_X550EM_a:
4458 		tmp = IXGBE_DV_X540(frame, frame);
4459 		break;
4460 	default:
4461 		tmp = IXGBE_DV(frame, frame);
4462 		break;
4463 	}
4464 	size = IXGBE_BT2KB(tmp);
4465 	rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
4466 	hw->fc.high_water[0] = rxpb - size;
4467 
4468 	/* Now calculate Low Water */
4469 	switch (hw->mac.type) {
4470 	case ixgbe_mac_X540:
4471 	case ixgbe_mac_X550:
4472 	case ixgbe_mac_X550EM_x:
4473 	case ixgbe_mac_X550EM_a:
4474 		tmp = IXGBE_LOW_DV_X540(frame);
4475 		break;
4476 	default:
4477 		tmp = IXGBE_LOW_DV(frame);
4478 		break;
4479 	}
4480 	hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
4481 
4482 	hw->fc.pause_time = IXGBE_FC_PAUSE;
4483 	hw->fc.send_xon = TRUE;
4484 } /* ixgbe_config_delay_values */
4485 
4486 /************************************************************************
4487  * ixgbe_set_rxfilter - Multicast Update
4488  *
4489  *   Called whenever multicast address list is updated.
4490  ************************************************************************/
4491 static void
4492 ixgbe_set_rxfilter(struct adapter *adapter)
4493 {
4494 	struct ixgbe_mc_addr	*mta;
4495 	struct ifnet		*ifp = adapter->ifp;
4496 	u8			*update_ptr;
4497 	int			mcnt = 0;
4498 	u32			fctrl;
4499 	struct ethercom		*ec = &adapter->osdep.ec;
4500 	struct ether_multi	*enm;
4501 	struct ether_multistep	step;
4502 
4503 	KASSERT(mutex_owned(&adapter->core_mtx));
4504 	IOCTL_DEBUGOUT("ixgbe_set_rxfilter: begin");
4505 
4506 	mta = adapter->mta;
4507 	bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
4508 
4509 	ETHER_LOCK(ec);
4510 	ec->ec_flags &= ~ETHER_F_ALLMULTI;
4511 	ETHER_FIRST_MULTI(step, ec, enm);
4512 	while (enm != NULL) {
4513 		if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
4514 		    (memcmp(enm->enm_addrlo, enm->enm_addrhi,
4515 			ETHER_ADDR_LEN) != 0)) {
4516 			ec->ec_flags |= ETHER_F_ALLMULTI;
4517 			break;
4518 		}
4519 		bcopy(enm->enm_addrlo,
4520 		    mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
4521 		mta[mcnt].vmdq = adapter->pool;
4522 		mcnt++;
4523 		ETHER_NEXT_MULTI(step, enm);
4524 	}
4525 
4526 	fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
4527 	if (ifp->if_flags & IFF_PROMISC)
4528 		fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4529 	else if (ec->ec_flags & ETHER_F_ALLMULTI) {
4530 		fctrl |= IXGBE_FCTRL_MPE;
4531 		fctrl &= ~IXGBE_FCTRL_UPE;
4532 	} else
4533 		fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
4534 
4535 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
4536 
4537 	/* Update multicast filter entries only when it's not ALLMULTI */
4538 	if ((ec->ec_flags & ETHER_F_ALLMULTI) == 0) {
4539 		ETHER_UNLOCK(ec);
4540 		update_ptr = (u8 *)mta;
4541 		ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
4542 		    ixgbe_mc_array_itr, TRUE);
4543 	} else
4544 		ETHER_UNLOCK(ec);
4545 } /* ixgbe_set_rxfilter */
4546 
4547 /************************************************************************
4548  * ixgbe_mc_array_itr
4549  *
4550  *   An iterator function needed by the multicast shared code.
4551  *   It feeds the shared code routine the addresses in the
4552  *   array of ixgbe_set_rxfilter() one by one.
4553  ************************************************************************/
4554 static u8 *
4555 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
4556 {
4557 	struct ixgbe_mc_addr *mta;
4558 
4559 	mta = (struct ixgbe_mc_addr *)*update_ptr;
4560 	*vmdq = mta->vmdq;
4561 
4562 	*update_ptr = (u8*)(mta + 1);
4563 
4564 	return (mta->addr);
4565 } /* ixgbe_mc_array_itr */
4566 
4567 /************************************************************************
4568  * ixgbe_local_timer - Timer routine
4569  *
4570  *   Checks for link status, updates statistics,
4571  *   and runs the watchdog check.
4572  ************************************************************************/
4573 static void
4574 ixgbe_local_timer(void *arg)
4575 {
4576 	struct adapter *adapter = arg;
4577 
4578 	if (adapter->schedule_wqs_ok) {
4579 		if (atomic_cas_uint(&adapter->timer_pending, 0, 1) == 0)
4580 			workqueue_enqueue(adapter->timer_wq,
4581 			    &adapter->timer_wc, NULL);
4582 	}
4583 }
4584 
4585 static void
4586 ixgbe_handle_timer(struct work *wk, void *context)
4587 {
4588 	struct adapter	*adapter = context;
4589 	struct ixgbe_hw *hw = &adapter->hw;
4590 	device_t	dev = adapter->dev;
4591 	struct ix_queue	*que = adapter->queues;
4592 	u64		queues = 0;
4593 	u64		v0, v1, v2, v3, v4, v5, v6, v7;
4594 	int		hung = 0;
4595 	int		i;
4596 
4597 	IXGBE_CORE_LOCK(adapter);
4598 
4599 	/* Check for pluggable optics */
4600 	if (ixgbe_is_sfp(hw)) {
4601 		bool sched_mod_task = false;
4602 
4603 		if (hw->mac.type == ixgbe_mac_82598EB) {
4604 			/*
4605 			 * On 82598EB, SFP+'s MOD_ABS pin is not connected to
4606 			 * any GPIO(SDP). So just schedule TASK_MOD.
4607 			 */
4608 			sched_mod_task = true;
4609 		} else {
4610 			bool was_full, is_full;
4611 
4612 			was_full =
4613 			    hw->phy.sfp_type != ixgbe_sfp_type_not_present;
4614 			is_full = ixgbe_sfp_cage_full(hw);
4615 
4616 			/* Do probe if cage state changed */
4617 			if (was_full ^ is_full)
4618 				sched_mod_task = true;
4619 		}
4620 		if (sched_mod_task) {
4621 			mutex_enter(&adapter->admin_mtx);
4622 			adapter->task_requests |= IXGBE_REQUEST_TASK_MOD_WOI;
4623 			ixgbe_schedule_admin_tasklet(adapter);
4624 			mutex_exit(&adapter->admin_mtx);
4625 		}
4626 	}
4627 
4628 	ixgbe_update_link_status(adapter);
4629 	ixgbe_update_stats_counters(adapter);
4630 
4631 	/* Update some event counters */
4632 	v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
4633 	que = adapter->queues;
4634 	for (i = 0; i < adapter->num_queues; i++, que++) {
4635 		struct tx_ring	*txr = que->txr;
4636 
4637 		v0 += txr->q_efbig_tx_dma_setup;
4638 		v1 += txr->q_mbuf_defrag_failed;
4639 		v2 += txr->q_efbig2_tx_dma_setup;
4640 		v3 += txr->q_einval_tx_dma_setup;
4641 		v4 += txr->q_other_tx_dma_setup;
4642 		v5 += txr->q_eagain_tx_dma_setup;
4643 		v6 += txr->q_enomem_tx_dma_setup;
4644 		v7 += txr->q_tso_err;
4645 	}
4646 	IXGBE_EVC_STORE(&adapter->efbig_tx_dma_setup, v0);
4647 	IXGBE_EVC_STORE(&adapter->mbuf_defrag_failed, v1);
4648 	IXGBE_EVC_STORE(&adapter->efbig2_tx_dma_setup, v2);
4649 	IXGBE_EVC_STORE(&adapter->einval_tx_dma_setup, v3);
4650 	IXGBE_EVC_STORE(&adapter->other_tx_dma_setup, v4);
4651 	IXGBE_EVC_STORE(&adapter->eagain_tx_dma_setup, v5);
4652 	IXGBE_EVC_STORE(&adapter->enomem_tx_dma_setup, v6);
4653 	IXGBE_EVC_STORE(&adapter->tso_err, v7);
4654 
4655 	/*
4656 	 * Check the TX queues status
4657 	 *	- mark hung queues so we don't schedule on them
4658 	 *	- watchdog only if all queues show hung
4659 	 */
4660 	que = adapter->queues;
4661 	for (i = 0; i < adapter->num_queues; i++, que++) {
4662 		/* Keep track of queues with work for soft irq */
4663 		if (que->txr->busy)
4664 			queues |= 1ULL << que->me;
4665 		/*
4666 		 * Each time txeof runs without cleaning, but there
4667 		 * are uncleaned descriptors it increments busy. If
4668 		 * we get to the MAX we declare it hung.
4669 		 */
4670 		if (que->busy == IXGBE_QUEUE_HUNG) {
4671 			++hung;
4672 			/* Mark the queue as inactive */
4673 			adapter->active_queues &= ~(1ULL << que->me);
4674 			continue;
4675 		} else {
4676 			/* Check if we've come back from hung */
4677 			if ((adapter->active_queues & (1ULL << que->me)) == 0)
4678 				adapter->active_queues |= 1ULL << que->me;
4679 		}
4680 		if (que->busy >= IXGBE_MAX_TX_BUSY) {
4681 			device_printf(dev,
4682 			    "Warning queue %d appears to be hung!\n", i);
4683 			que->txr->busy = IXGBE_QUEUE_HUNG;
4684 			++hung;
4685 		}
4686 	}
4687 
4688 	/* Only truly watchdog if all queues show hung */
4689 	if (hung == adapter->num_queues)
4690 		goto watchdog;
4691 #if 0 /* XXX Avoid unexpectedly disabling interrupt forever (PR#53294) */
4692 	else if (queues != 0) { /* Force an IRQ on queues with work */
4693 		que = adapter->queues;
4694 		for (i = 0; i < adapter->num_queues; i++, que++) {
4695 			mutex_enter(&que->dc_mtx);
4696 			if (que->disabled_count == 0)
4697 				ixgbe_rearm_queues(adapter,
4698 				    queues & ((u64)1 << i));
4699 			mutex_exit(&que->dc_mtx);
4700 		}
4701 	}
4702 #endif
4703 
4704 	atomic_store_relaxed(&adapter->timer_pending, 0);
4705 	IXGBE_CORE_UNLOCK(adapter);
4706 	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
4707 	return;
4708 
4709 watchdog:
4710 	device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
4711 	adapter->ifp->if_flags &= ~IFF_RUNNING;
4712 	IXGBE_EVC_ADD(&adapter->watchdog_events, 1);
4713 	ixgbe_init_locked(adapter);
4714 	IXGBE_CORE_UNLOCK(adapter);
4715 } /* ixgbe_handle_timer */
4716 
4717 /************************************************************************
4718  * ixgbe_recovery_mode_timer - Recovery mode timer routine
4719  ************************************************************************/
4720 static void
4721 ixgbe_recovery_mode_timer(void *arg)
4722 {
4723 	struct adapter *adapter = arg;
4724 
4725 	if (__predict_true(adapter->osdep.detaching == false)) {
4726 		if (atomic_cas_uint(&adapter->recovery_mode_timer_pending,
4727 			0, 1) == 0) {
4728 			workqueue_enqueue(adapter->recovery_mode_timer_wq,
4729 			    &adapter->recovery_mode_timer_wc, NULL);
4730 		}
4731 	}
4732 }
4733 
4734 static void
4735 ixgbe_handle_recovery_mode_timer(struct work *wk, void *context)
4736 {
4737 	struct adapter *adapter = context;
4738 	struct ixgbe_hw *hw = &adapter->hw;
4739 
4740 	IXGBE_CORE_LOCK(adapter);
4741 	if (ixgbe_fw_recovery_mode(hw)) {
4742 		if (atomic_cas_uint(&adapter->recovery_mode, 0, 1) == 0) {
4743 			/* Firmware error detected, entering recovery mode */
4744 			device_printf(adapter->dev,
4745 			    "Firmware recovery mode detected. Limiting "
4746 			    "functionality. Refer to the Intel(R) Ethernet "
4747 			    "Adapters and Devices User Guide for details on "
4748 			    "firmware recovery mode.\n");
4749 
4750 			if (hw->adapter_stopped == FALSE)
4751 				ixgbe_stop_locked(adapter);
4752 		}
4753 	} else
4754 		atomic_cas_uint(&adapter->recovery_mode, 1, 0);
4755 
4756 	atomic_store_relaxed(&adapter->recovery_mode_timer_pending, 0);
4757 	callout_reset(&adapter->recovery_mode_timer, hz,
4758 	    ixgbe_recovery_mode_timer, adapter);
4759 	IXGBE_CORE_UNLOCK(adapter);
4760 } /* ixgbe_handle_recovery_mode_timer */
4761 
4762 /************************************************************************
4763  * ixgbe_handle_mod - Tasklet for SFP module interrupts
4764  * bool int_en: true if it's called when the interrupt is enabled.
4765  ************************************************************************/
4766 static void
4767 ixgbe_handle_mod(void *context, bool int_en)
4768 {
4769 	struct adapter	*adapter = context;
4770 	struct ixgbe_hw *hw = &adapter->hw;
4771 	device_t	dev = adapter->dev;
4772 	enum ixgbe_sfp_type last_sfp_type;
4773 	u32		err;
4774 	bool		last_unsupported_sfp_recovery;
4775 
4776 	KASSERT(mutex_owned(&adapter->core_mtx));
4777 
4778 	last_sfp_type = hw->phy.sfp_type;
4779 	last_unsupported_sfp_recovery = hw->need_unsupported_sfp_recovery;
4780 	IXGBE_EVC_ADD(&adapter->mod_workev, 1);
4781 	if (adapter->hw.need_crosstalk_fix) {
4782 		if ((hw->mac.type != ixgbe_mac_82598EB) &&
4783 		    !ixgbe_sfp_cage_full(hw))
4784 			goto out;
4785 	}
4786 
4787 	err = hw->phy.ops.identify_sfp(hw);
4788 	if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4789 		if (last_unsupported_sfp_recovery == false)
4790 			device_printf(dev,
4791 			    "Unsupported SFP+ module type was detected.\n");
4792 		goto out;
4793 	}
4794 
4795 	if (hw->need_unsupported_sfp_recovery) {
4796 		device_printf(dev, "Recovering from unsupported SFP\n");
4797 		/*
4798 		 *  We could recover the status by calling setup_sfp(),
4799 		 * setup_link() and some others. It's complex and might not
4800 		 * work correctly on some unknown cases. To avoid such type of
4801 		 * problem, call ixgbe_init_locked(). It's simple and safe
4802 		 * approach.
4803 		 */
4804 		ixgbe_init_locked(adapter);
4805 	} else if ((hw->phy.sfp_type != ixgbe_sfp_type_not_present) &&
4806 	    (hw->phy.sfp_type != last_sfp_type)) {
4807 		/* A module is inserted and changed. */
4808 
4809 		if (hw->mac.type == ixgbe_mac_82598EB)
4810 			err = hw->phy.ops.reset(hw);
4811 		else {
4812 			err = hw->mac.ops.setup_sfp(hw);
4813 			hw->phy.sfp_setup_needed = FALSE;
4814 		}
4815 		if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
4816 			device_printf(dev,
4817 			    "Setup failure - unsupported SFP+ module type.\n");
4818 			goto out;
4819 		}
4820 	}
4821 
4822 out:
4823 	/* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
4824 	adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
4825 
4826 	/* Adjust media types shown in ifconfig */
4827 	IXGBE_CORE_UNLOCK(adapter);
4828 	ifmedia_removeall(&adapter->media);
4829 	ixgbe_add_media_types(adapter);
4830 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
4831 	IXGBE_CORE_LOCK(adapter);
4832 
4833 	/*
4834 	 * Don't schedule MSF event if the chip is 82598. 82598 doesn't support
4835 	 * MSF. At least, calling ixgbe_handle_msf on 82598 DA makes the link
4836 	 * flap because the function calls setup_link().
4837 	 */
4838 	if (hw->mac.type != ixgbe_mac_82598EB) {
4839 		mutex_enter(&adapter->admin_mtx);
4840 		if (int_en)
4841 			adapter->task_requests |= IXGBE_REQUEST_TASK_MSF;
4842 		else
4843 			adapter->task_requests |= IXGBE_REQUEST_TASK_MSF_WOI;
4844 		mutex_exit(&adapter->admin_mtx);
4845 	}
4846 
4847 	/*
4848 	 * Don't call ixgbe_schedule_admin_tasklet() because we are on
4849 	 * the workqueue now.
4850 	 */
4851 } /* ixgbe_handle_mod */
4852 
4853 
4854 /************************************************************************
4855  * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
4856  ************************************************************************/
4857 static void
4858 ixgbe_handle_msf(void *context)
4859 {
4860 	struct adapter	*adapter = context;
4861 	struct ixgbe_hw *hw = &adapter->hw;
4862 	u32		autoneg;
4863 	bool		negotiate;
4864 
4865 	KASSERT(mutex_owned(&adapter->core_mtx));
4866 
4867 	IXGBE_EVC_ADD(&adapter->msf_workev, 1);
4868 
4869 	autoneg = hw->phy.autoneg_advertised;
4870 	if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
4871 		hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
4872 	if (hw->mac.ops.setup_link)
4873 		hw->mac.ops.setup_link(hw, autoneg, TRUE);
4874 } /* ixgbe_handle_msf */
4875 
4876 /************************************************************************
4877  * ixgbe_handle_phy - Tasklet for external PHY interrupts
4878  ************************************************************************/
4879 static void
4880 ixgbe_handle_phy(void *context)
4881 {
4882 	struct adapter	*adapter = context;
4883 	struct ixgbe_hw *hw = &adapter->hw;
4884 	int error;
4885 
4886 	KASSERT(mutex_owned(&adapter->core_mtx));
4887 
4888 	IXGBE_EVC_ADD(&adapter->phy_workev, 1);
4889 	error = hw->phy.ops.handle_lasi(hw);
4890 	if (error == IXGBE_ERR_OVERTEMP)
4891 		device_printf(adapter->dev,
4892 		    "CRITICAL: EXTERNAL PHY OVER TEMP!! "
4893 		    " PHY will downshift to lower power state!\n");
4894 	else if (error)
4895 		device_printf(adapter->dev,
4896 		    "Error handling LASI interrupt: %d\n", error);
4897 } /* ixgbe_handle_phy */
4898 
4899 static void
4900 ixgbe_handle_admin(struct work *wk, void *context)
4901 {
4902 	struct adapter	*adapter = context;
4903 	struct ifnet	*ifp = adapter->ifp;
4904 	struct ixgbe_hw *hw = &adapter->hw;
4905 	u32		task_requests;
4906 	u32		eims_enable = 0;
4907 
4908 	mutex_enter(&adapter->admin_mtx);
4909 	adapter->admin_pending = 0;
4910 	task_requests = adapter->task_requests;
4911 	adapter->task_requests = 0;
4912 	mutex_exit(&adapter->admin_mtx);
4913 
4914 	/*
4915 	 * Hold the IFNET_LOCK across this entire call.  This will
4916 	 * prevent additional changes to adapter->phy_layer
4917 	 * and serialize calls to this tasklet.  We cannot hold the
4918 	 * CORE_LOCK while calling into the ifmedia functions as
4919 	 * they call ifmedia_lock() and the lock is CORE_LOCK.
4920 	 */
4921 	IFNET_LOCK(ifp);
4922 	IXGBE_CORE_LOCK(adapter);
4923 	if ((task_requests & IXGBE_REQUEST_TASK_LSC) != 0) {
4924 		ixgbe_handle_link(adapter);
4925 		eims_enable |= IXGBE_EIMS_LSC;
4926 	}
4927 	if ((task_requests & IXGBE_REQUEST_TASK_MOD_WOI) != 0)
4928 		ixgbe_handle_mod(adapter, false);
4929 	if ((task_requests & IXGBE_REQUEST_TASK_MOD) != 0) {
4930 		ixgbe_handle_mod(adapter, true);
4931 		if (hw->mac.type >= ixgbe_mac_X540)
4932 			eims_enable |= IXGBE_EICR_GPI_SDP0_X540;
4933 		else
4934 			eims_enable |= IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
4935 	}
4936 	if ((task_requests
4937 	    & (IXGBE_REQUEST_TASK_MSF_WOI | IXGBE_REQUEST_TASK_MSF)) != 0) {
4938 		ixgbe_handle_msf(adapter);
4939 		if (((task_requests & IXGBE_REQUEST_TASK_MSF) != 0) &&
4940 		    (hw->mac.type == ixgbe_mac_82599EB))
4941 		    eims_enable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
4942 	}
4943 	if ((task_requests & IXGBE_REQUEST_TASK_PHY) != 0) {
4944 		ixgbe_handle_phy(adapter);
4945 		eims_enable |= IXGBE_EICR_GPI_SDP0_X540;
4946 	}
4947 	if ((task_requests & IXGBE_REQUEST_TASK_FDIR) != 0) {
4948 		ixgbe_reinit_fdir(adapter);
4949 		eims_enable |= IXGBE_EIMS_FLOW_DIR;
4950 	}
4951 #if 0 /* notyet */
4952 	if ((task_requests & IXGBE_REQUEST_TASK_MBX) != 0) {
4953 		ixgbe_handle_mbx(adapter);
4954 		eims_enable |= IXGBE_EIMS_MAILBOX;
4955 	}
4956 #endif
4957 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_enable);
4958 
4959 	IXGBE_CORE_UNLOCK(adapter);
4960 	IFNET_UNLOCK(ifp);
4961 } /* ixgbe_handle_admin */
4962 
4963 static void
4964 ixgbe_ifstop(struct ifnet *ifp, int disable)
4965 {
4966 	struct adapter *adapter = ifp->if_softc;
4967 
4968 	IXGBE_CORE_LOCK(adapter);
4969 	ixgbe_stop_locked(adapter);
4970 	IXGBE_CORE_UNLOCK(adapter);
4971 
4972 	workqueue_wait(adapter->timer_wq, &adapter->timer_wc);
4973 	atomic_store_relaxed(&adapter->timer_pending, 0);
4974 }
4975 
4976 /************************************************************************
4977  * ixgbe_stop_locked - Stop the hardware
4978  *
4979  *   Disables all traffic on the adapter by issuing a
4980  *   global reset on the MAC and deallocates TX/RX buffers.
4981  ************************************************************************/
4982 static void
4983 ixgbe_stop_locked(void *arg)
4984 {
4985 	struct ifnet	*ifp;
4986 	struct adapter	*adapter = arg;
4987 	struct ixgbe_hw *hw = &adapter->hw;
4988 
4989 	ifp = adapter->ifp;
4990 
4991 	KASSERT(mutex_owned(&adapter->core_mtx));
4992 
4993 	INIT_DEBUGOUT("ixgbe_stop_locked: begin\n");
4994 	ixgbe_disable_intr(adapter);
4995 	callout_stop(&adapter->timer);
4996 
4997 	/* Don't schedule workqueues. */
4998 	adapter->schedule_wqs_ok = false;
4999 
5000 	/* Let the stack know...*/
5001 	ifp->if_flags &= ~IFF_RUNNING;
5002 
5003 	ixgbe_reset_hw(hw);
5004 	hw->adapter_stopped = FALSE;
5005 	ixgbe_stop_adapter(hw);
5006 	if (hw->mac.type == ixgbe_mac_82599EB)
5007 		ixgbe_stop_mac_link_on_d3_82599(hw);
5008 	/* Turn off the laser - noop with no optics */
5009 	ixgbe_disable_tx_laser(hw);
5010 
5011 	/* Update the stack */
5012 	adapter->link_up = FALSE;
5013 	ixgbe_update_link_status(adapter);
5014 
5015 	/* reprogram the RAR[0] in case user changed it. */
5016 	ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
5017 
5018 	return;
5019 } /* ixgbe_stop_locked */
5020 
5021 /************************************************************************
5022  * ixgbe_update_link_status - Update OS on link state
5023  *
5024  * Note: Only updates the OS on the cached link state.
5025  *	 The real check of the hardware only happens with
5026  *	 a link interrupt.
5027  ************************************************************************/
5028 static void
5029 ixgbe_update_link_status(struct adapter *adapter)
5030 {
5031 	struct ifnet	*ifp = adapter->ifp;
5032 	device_t	dev = adapter->dev;
5033 	struct ixgbe_hw *hw = &adapter->hw;
5034 
5035 	KASSERT(mutex_owned(&adapter->core_mtx));
5036 
5037 	if (adapter->link_up) {
5038 		if (adapter->link_active != LINK_STATE_UP) {
5039 			/*
5040 			 * To eliminate influence of the previous state
5041 			 * in the same way as ixgbe_init_locked().
5042 			 */
5043 			struct ix_queue	*que = adapter->queues;
5044 			for (int i = 0; i < adapter->num_queues; i++, que++)
5045 				que->eitr_setting = 0;
5046 
5047 			if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL){
5048 				/*
5049 				 *  Discard count for both MAC Local Fault and
5050 				 * Remote Fault because those registers are
5051 				 * valid only when the link speed is up and
5052 				 * 10Gbps.
5053 				 */
5054 				IXGBE_READ_REG(hw, IXGBE_MLFC);
5055 				IXGBE_READ_REG(hw, IXGBE_MRFC);
5056 			}
5057 
5058 			if (bootverbose) {
5059 				const char *bpsmsg;
5060 
5061 				switch (adapter->link_speed) {
5062 				case IXGBE_LINK_SPEED_10GB_FULL:
5063 					bpsmsg = "10 Gbps";
5064 					break;
5065 				case IXGBE_LINK_SPEED_5GB_FULL:
5066 					bpsmsg = "5 Gbps";
5067 					break;
5068 				case IXGBE_LINK_SPEED_2_5GB_FULL:
5069 					bpsmsg = "2.5 Gbps";
5070 					break;
5071 				case IXGBE_LINK_SPEED_1GB_FULL:
5072 					bpsmsg = "1 Gbps";
5073 					break;
5074 				case IXGBE_LINK_SPEED_100_FULL:
5075 					bpsmsg = "100 Mbps";
5076 					break;
5077 				case IXGBE_LINK_SPEED_10_FULL:
5078 					bpsmsg = "10 Mbps";
5079 					break;
5080 				default:
5081 					bpsmsg = "unknown speed";
5082 					break;
5083 				}
5084 				device_printf(dev, "Link is up %s %s \n",
5085 				    bpsmsg, "Full Duplex");
5086 			}
5087 			adapter->link_active = LINK_STATE_UP;
5088 			/* Update any Flow Control changes */
5089 			ixgbe_fc_enable(&adapter->hw);
5090 			/* Update DMA coalescing config */
5091 			ixgbe_config_dmac(adapter);
5092 			if_link_state_change(ifp, LINK_STATE_UP);
5093 
5094 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5095 				ixgbe_ping_all_vfs(adapter);
5096 		}
5097 	} else {
5098 		/*
5099 		 * Do it when link active changes to DOWN. i.e.
5100 		 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
5101 		 * b) LINK_STATE_UP	 -> LINK_STATE_DOWN
5102 		 */
5103 		if (adapter->link_active != LINK_STATE_DOWN) {
5104 			if (bootverbose)
5105 				device_printf(dev, "Link is Down\n");
5106 			if_link_state_change(ifp, LINK_STATE_DOWN);
5107 			adapter->link_active = LINK_STATE_DOWN;
5108 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5109 				ixgbe_ping_all_vfs(adapter);
5110 			ixgbe_drain_all(adapter);
5111 		}
5112 	}
5113 } /* ixgbe_update_link_status */
5114 
5115 /************************************************************************
5116  * ixgbe_config_dmac - Configure DMA Coalescing
5117  ************************************************************************/
5118 static void
5119 ixgbe_config_dmac(struct adapter *adapter)
5120 {
5121 	struct ixgbe_hw *hw = &adapter->hw;
5122 	struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
5123 
5124 	if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
5125 		return;
5126 
5127 	if (dcfg->watchdog_timer ^ adapter->dmac ||
5128 	    dcfg->link_speed ^ adapter->link_speed) {
5129 		dcfg->watchdog_timer = adapter->dmac;
5130 		dcfg->fcoe_en = false;
5131 		dcfg->link_speed = adapter->link_speed;
5132 		dcfg->num_tcs = 1;
5133 
5134 		INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
5135 		    dcfg->watchdog_timer, dcfg->link_speed);
5136 
5137 		hw->mac.ops.dmac_config(hw);
5138 	}
5139 } /* ixgbe_config_dmac */
5140 
5141 /************************************************************************
5142  * ixgbe_enable_intr
5143  ************************************************************************/
5144 static void
5145 ixgbe_enable_intr(struct adapter *adapter)
5146 {
5147 	struct ixgbe_hw	*hw = &adapter->hw;
5148 	struct ix_queue	*que = adapter->queues;
5149 	u32		mask, fwsm;
5150 
5151 	mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
5152 
5153 	switch (adapter->hw.mac.type) {
5154 	case ixgbe_mac_82599EB:
5155 		mask |= IXGBE_EIMS_ECC;
5156 		/* Temperature sensor on some adapters */
5157 		mask |= IXGBE_EIMS_GPI_SDP0;
5158 		/* SFP+ (RX_LOS_N & MOD_ABS_N) */
5159 		mask |= IXGBE_EIMS_GPI_SDP1;
5160 		mask |= IXGBE_EIMS_GPI_SDP2;
5161 		break;
5162 	case ixgbe_mac_X540:
5163 		/* Detect if Thermal Sensor is enabled */
5164 		fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
5165 		if (fwsm & IXGBE_FWSM_TS_ENABLED)
5166 			mask |= IXGBE_EIMS_TS;
5167 		mask |= IXGBE_EIMS_ECC;
5168 		break;
5169 	case ixgbe_mac_X550:
5170 		/* MAC thermal sensor is automatically enabled */
5171 		mask |= IXGBE_EIMS_TS;
5172 		mask |= IXGBE_EIMS_ECC;
5173 		break;
5174 	case ixgbe_mac_X550EM_x:
5175 	case ixgbe_mac_X550EM_a:
5176 		/* Some devices use SDP0 for important information */
5177 		if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
5178 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
5179 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
5180 		    hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
5181 			mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
5182 		if (hw->phy.type == ixgbe_phy_x550em_ext_t)
5183 			mask |= IXGBE_EICR_GPI_SDP0_X540;
5184 		mask |= IXGBE_EIMS_ECC;
5185 		break;
5186 	default:
5187 		break;
5188 	}
5189 
5190 	/* Enable Fan Failure detection */
5191 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
5192 		mask |= IXGBE_EIMS_GPI_SDP1;
5193 	/* Enable SR-IOV */
5194 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
5195 		mask |= IXGBE_EIMS_MAILBOX;
5196 	/* Enable Flow Director */
5197 	if (adapter->feat_en & IXGBE_FEATURE_FDIR)
5198 		mask |= IXGBE_EIMS_FLOW_DIR;
5199 
5200 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
5201 
5202 	/* With MSI-X we use auto clear */
5203 	if ((adapter->feat_en & IXGBE_FEATURE_MSIX) != 0) {
5204 		/*
5205 		 * We use auto clear for RTX_QUEUE only. Don't use other
5206 		 * interrupts (e.g. link interrupt). BTW, we don't use
5207 		 *  TCP_TIMER interrupt itself.
5208 		 */
5209 		IXGBE_WRITE_REG(hw, IXGBE_EIAC, IXGBE_EIMS_RTX_QUEUE);
5210 	}
5211 
5212 	/*
5213 	 * Now enable all queues, this is done separately to
5214 	 * allow for handling the extended (beyond 32) MSI-X
5215 	 * vectors that can be used by 82599
5216 	 */
5217 	for (int i = 0; i < adapter->num_queues; i++, que++)
5218 		ixgbe_enable_queue(adapter, que->msix);
5219 
5220 	IXGBE_WRITE_FLUSH(hw);
5221 
5222 } /* ixgbe_enable_intr */
5223 
5224 /************************************************************************
5225  * ixgbe_disable_intr_internal
5226  ************************************************************************/
5227 static void
5228 ixgbe_disable_intr_internal(struct adapter *adapter, bool nestok)
5229 {
5230 	struct ix_queue	*que = adapter->queues;
5231 
5232 	/* disable interrupts other than queues */
5233 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~IXGBE_EIMC_RTX_QUEUE);
5234 
5235 	if ((adapter->feat_en & IXGBE_FEATURE_MSIX) != 0)
5236 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
5237 
5238 	for (int i = 0; i < adapter->num_queues; i++, que++)
5239 		ixgbe_disable_queue_internal(adapter, que->msix, nestok);
5240 
5241 	IXGBE_WRITE_FLUSH(&adapter->hw);
5242 
5243 } /* ixgbe_do_disable_intr_internal */
5244 
5245 /************************************************************************
5246  * ixgbe_disable_intr
5247  ************************************************************************/
5248 static void
5249 ixgbe_disable_intr(struct adapter *adapter)
5250 {
5251 
5252 	ixgbe_disable_intr_internal(adapter, true);
5253 } /* ixgbe_disable_intr */
5254 
5255 /************************************************************************
5256  * ixgbe_ensure_disabled_intr
5257  ************************************************************************/
5258 void
5259 ixgbe_ensure_disabled_intr(struct adapter *adapter)
5260 {
5261 
5262 	ixgbe_disable_intr_internal(adapter, false);
5263 } /* ixgbe_ensure_disabled_intr */
5264 
5265 /************************************************************************
5266  * ixgbe_legacy_irq - Legacy Interrupt Service routine
5267  ************************************************************************/
5268 static int
5269 ixgbe_legacy_irq(void *arg)
5270 {
5271 	struct ix_queue *que = arg;
5272 	struct adapter	*adapter = que->adapter;
5273 	struct ixgbe_hw	*hw = &adapter->hw;
5274 	struct ifnet	*ifp = adapter->ifp;
5275 	struct		tx_ring *txr = adapter->tx_rings;
5276 	u32		eicr;
5277 	u32		eims_orig;
5278 	u32		eims_enable = 0;
5279 	u32		eims_disable = 0;
5280 
5281 	eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
5282 	/*
5283 	 * Silicon errata #26 on 82598. Disable all interrupts before reading
5284 	 * EICR.
5285 	 */
5286 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
5287 
5288 	/* Read and clear EICR */
5289 	eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
5290 
5291 	if (eicr == 0) {
5292 		IXGBE_EVC_ADD(&adapter->stats.pf.intzero, 1);
5293 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig);
5294 		return 0;
5295 	}
5296 	IXGBE_EVC_ADD(&adapter->stats.pf.legint, 1);
5297 
5298 	/* Queue (0) intr */
5299 	if (((ifp->if_flags & IFF_RUNNING) != 0) &&
5300 	    (eicr & IXGBE_EIMC_RTX_QUEUE) != 0) {
5301 		IXGBE_EVC_ADD(&que->irqs, 1);
5302 
5303 		/*
5304 		 * The same as ixgbe_msix_que() about
5305 		 * "que->txrx_use_workqueue".
5306 		 */
5307 		que->txrx_use_workqueue = adapter->txrx_use_workqueue;
5308 
5309 		IXGBE_TX_LOCK(txr);
5310 		ixgbe_txeof(txr);
5311 #ifdef notyet
5312 		if (!ixgbe_ring_empty(ifp, txr->br))
5313 			ixgbe_start_locked(ifp, txr);
5314 #endif
5315 		IXGBE_TX_UNLOCK(txr);
5316 
5317 		IXGBE_EVC_ADD(&que->req, 1);
5318 		ixgbe_sched_handle_que(adapter, que);
5319 		/* Disable queue 0 interrupt */
5320 		eims_disable |= 1UL << 0;
5321 	} else
5322 		eims_enable |= eims_orig & IXGBE_EIMC_RTX_QUEUE;
5323 
5324 	ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
5325 
5326 	/* Re-enable some interrupts */
5327 	IXGBE_WRITE_REG(hw, IXGBE_EIMS,
5328 	    (eims_orig & ~eims_disable) | eims_enable);
5329 
5330 	return 1;
5331 } /* ixgbe_legacy_irq */
5332 
5333 /************************************************************************
5334  * ixgbe_free_pciintr_resources
5335  ************************************************************************/
5336 static void
5337 ixgbe_free_pciintr_resources(struct adapter *adapter)
5338 {
5339 	struct ix_queue *que = adapter->queues;
5340 	int		rid;
5341 
5342 	/*
5343 	 * Release all msix queue resources:
5344 	 */
5345 	for (int i = 0; i < adapter->num_queues; i++, que++) {
5346 		if (que->res != NULL) {
5347 			pci_intr_disestablish(adapter->osdep.pc,
5348 			    adapter->osdep.ihs[i]);
5349 			adapter->osdep.ihs[i] = NULL;
5350 		}
5351 	}
5352 
5353 	/* Clean the Legacy or Link interrupt last */
5354 	if (adapter->vector) /* we are doing MSIX */
5355 		rid = adapter->vector;
5356 	else
5357 		rid = 0;
5358 
5359 	if (adapter->osdep.ihs[rid] != NULL) {
5360 		pci_intr_disestablish(adapter->osdep.pc,
5361 		    adapter->osdep.ihs[rid]);
5362 		adapter->osdep.ihs[rid] = NULL;
5363 	}
5364 
5365 	if (adapter->osdep.intrs != NULL) {
5366 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
5367 		    adapter->osdep.nintrs);
5368 		adapter->osdep.intrs = NULL;
5369 	}
5370 } /* ixgbe_free_pciintr_resources */
5371 
5372 /************************************************************************
5373  * ixgbe_free_pci_resources
5374  ************************************************************************/
5375 static void
5376 ixgbe_free_pci_resources(struct adapter *adapter)
5377 {
5378 
5379 	ixgbe_free_pciintr_resources(adapter);
5380 
5381 	if (adapter->osdep.mem_size != 0) {
5382 		bus_space_unmap(adapter->osdep.mem_bus_space_tag,
5383 		    adapter->osdep.mem_bus_space_handle,
5384 		    adapter->osdep.mem_size);
5385 	}
5386 } /* ixgbe_free_pci_resources */
5387 
5388 /************************************************************************
5389  * ixgbe_sysctl_flowcntl
5390  *
5391  *   SYSCTL wrapper around setting Flow Control
5392  ************************************************************************/
5393 static int
5394 ixgbe_sysctl_flowcntl(SYSCTLFN_ARGS)
5395 {
5396 	struct sysctlnode node = *rnode;
5397 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
5398 	int error, fc;
5399 
5400 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5401 		return (EPERM);
5402 
5403 	fc = adapter->hw.fc.current_mode;
5404 	node.sysctl_data = &fc;
5405 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5406 	if (error != 0 || newp == NULL)
5407 		return error;
5408 
5409 	/* Don't bother if it's not changed */
5410 	if (fc == adapter->hw.fc.current_mode)
5411 		return (0);
5412 
5413 	return ixgbe_set_flowcntl(adapter, fc);
5414 } /* ixgbe_sysctl_flowcntl */
5415 
5416 /************************************************************************
5417  * ixgbe_set_flowcntl - Set flow control
5418  *
5419  *   Flow control values:
5420  *     0 - off
5421  *     1 - rx pause
5422  *     2 - tx pause
5423  *     3 - full
5424  ************************************************************************/
5425 static int
5426 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
5427 {
5428 	switch (fc) {
5429 		case ixgbe_fc_rx_pause:
5430 		case ixgbe_fc_tx_pause:
5431 		case ixgbe_fc_full:
5432 			adapter->hw.fc.requested_mode = fc;
5433 			if (adapter->num_queues > 1)
5434 				ixgbe_disable_rx_drop(adapter);
5435 			break;
5436 		case ixgbe_fc_none:
5437 			adapter->hw.fc.requested_mode = ixgbe_fc_none;
5438 			if (adapter->num_queues > 1)
5439 				ixgbe_enable_rx_drop(adapter);
5440 			break;
5441 		default:
5442 			return (EINVAL);
5443 	}
5444 
5445 #if 0 /* XXX NetBSD */
5446 	/* Don't autoneg if forcing a value */
5447 	adapter->hw.fc.disable_fc_autoneg = TRUE;
5448 #endif
5449 	ixgbe_fc_enable(&adapter->hw);
5450 
5451 	return (0);
5452 } /* ixgbe_set_flowcntl */
5453 
5454 /************************************************************************
5455  * ixgbe_enable_rx_drop
5456  *
5457  *   Enable the hardware to drop packets when the buffer is
5458  *   full. This is useful with multiqueue, so that no single
5459  *   queue being full stalls the entire RX engine. We only
5460  *   enable this when Multiqueue is enabled AND Flow Control
5461  *   is disabled.
5462  ************************************************************************/
5463 static void
5464 ixgbe_enable_rx_drop(struct adapter *adapter)
5465 {
5466 	struct ixgbe_hw *hw = &adapter->hw;
5467 	struct rx_ring	*rxr;
5468 	u32		srrctl;
5469 
5470 	for (int i = 0; i < adapter->num_queues; i++) {
5471 		rxr = &adapter->rx_rings[i];
5472 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5473 		srrctl |= IXGBE_SRRCTL_DROP_EN;
5474 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5475 	}
5476 
5477 	/* enable drop for each vf */
5478 	for (int i = 0; i < adapter->num_vfs; i++) {
5479 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
5480 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
5481 		    IXGBE_QDE_ENABLE));
5482 	}
5483 } /* ixgbe_enable_rx_drop */
5484 
5485 /************************************************************************
5486  * ixgbe_disable_rx_drop
5487  ************************************************************************/
5488 static void
5489 ixgbe_disable_rx_drop(struct adapter *adapter)
5490 {
5491 	struct ixgbe_hw *hw = &adapter->hw;
5492 	struct rx_ring	*rxr;
5493 	u32		srrctl;
5494 
5495 	for (int i = 0; i < adapter->num_queues; i++) {
5496 		rxr = &adapter->rx_rings[i];
5497 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
5498 		srrctl &= ~IXGBE_SRRCTL_DROP_EN;
5499 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
5500 	}
5501 
5502 	/* disable drop for each vf */
5503 	for (int i = 0; i < adapter->num_vfs; i++) {
5504 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
5505 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
5506 	}
5507 } /* ixgbe_disable_rx_drop */
5508 
5509 /************************************************************************
5510  * ixgbe_sysctl_advertise
5511  *
5512  *   SYSCTL wrapper around setting advertised speed
5513  ************************************************************************/
5514 static int
5515 ixgbe_sysctl_advertise(SYSCTLFN_ARGS)
5516 {
5517 	struct sysctlnode node = *rnode;
5518 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
5519 	int	       error = 0, advertise;
5520 
5521 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5522 		return (EPERM);
5523 
5524 	advertise = adapter->advertise;
5525 	node.sysctl_data = &advertise;
5526 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5527 	if (error != 0 || newp == NULL)
5528 		return error;
5529 
5530 	return ixgbe_set_advertise(adapter, advertise);
5531 } /* ixgbe_sysctl_advertise */
5532 
5533 /************************************************************************
5534  * ixgbe_set_advertise - Control advertised link speed
5535  *
5536  *   Flags:
5537  *     0x00 - Default (all capable link speed)
5538  *     0x1  - advertise 100 Mb
5539  *     0x2  - advertise 1G
5540  *     0x4  - advertise 10G
5541  *     0x8  - advertise 10 Mb (yes, Mb)
5542  *     0x10 - advertise 2.5G
5543  *     0x20 - advertise 5G
5544  ************************************************************************/
5545 static int
5546 ixgbe_set_advertise(struct adapter *adapter, int advertise)
5547 {
5548 	device_t	 dev;
5549 	struct ixgbe_hw	 *hw;
5550 	ixgbe_link_speed speed = 0;
5551 	ixgbe_link_speed link_caps = 0;
5552 	s32		 err = IXGBE_NOT_IMPLEMENTED;
5553 	bool		 negotiate = FALSE;
5554 
5555 	/* Checks to validate new value */
5556 	if (adapter->advertise == advertise) /* no change */
5557 		return (0);
5558 
5559 	dev = adapter->dev;
5560 	hw = &adapter->hw;
5561 
5562 	/* No speed changes for backplane media */
5563 	if (hw->phy.media_type == ixgbe_media_type_backplane)
5564 		return (ENODEV);
5565 
5566 	if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
5567 	    (hw->phy.multispeed_fiber))) {
5568 		device_printf(dev,
5569 		    "Advertised speed can only be set on copper or "
5570 		    "multispeed fiber media types.\n");
5571 		return (EINVAL);
5572 	}
5573 
5574 	if (advertise < 0x0 || advertise > 0x3f) {
5575 		device_printf(dev, "Invalid advertised speed; "
5576 		    "valid modes are 0x0 through 0x3f\n");
5577 		return (EINVAL);
5578 	}
5579 
5580 	if (hw->mac.ops.get_link_capabilities) {
5581 		err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
5582 		    &negotiate);
5583 		if (err != IXGBE_SUCCESS) {
5584 			device_printf(dev, "Unable to determine supported "
5585 			    "advertise speeds\n");
5586 			return (ENODEV);
5587 		}
5588 	}
5589 
5590 	/* Set new value and report new advertised mode */
5591 	if (advertise & 0x1) {
5592 		if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
5593 			device_printf(dev, "Interface does not support 100Mb "
5594 			    "advertised speed\n");
5595 			return (EINVAL);
5596 		}
5597 		speed |= IXGBE_LINK_SPEED_100_FULL;
5598 	}
5599 	if (advertise & 0x2) {
5600 		if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
5601 			device_printf(dev, "Interface does not support 1Gb "
5602 			    "advertised speed\n");
5603 			return (EINVAL);
5604 		}
5605 		speed |= IXGBE_LINK_SPEED_1GB_FULL;
5606 	}
5607 	if (advertise & 0x4) {
5608 		if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
5609 			device_printf(dev, "Interface does not support 10Gb "
5610 			    "advertised speed\n");
5611 			return (EINVAL);
5612 		}
5613 		speed |= IXGBE_LINK_SPEED_10GB_FULL;
5614 	}
5615 	if (advertise & 0x8) {
5616 		if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
5617 			device_printf(dev, "Interface does not support 10Mb "
5618 			    "advertised speed\n");
5619 			return (EINVAL);
5620 		}
5621 		speed |= IXGBE_LINK_SPEED_10_FULL;
5622 	}
5623 	if (advertise & 0x10) {
5624 		if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
5625 			device_printf(dev, "Interface does not support 2.5Gb "
5626 			    "advertised speed\n");
5627 			return (EINVAL);
5628 		}
5629 		speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
5630 	}
5631 	if (advertise & 0x20) {
5632 		if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
5633 			device_printf(dev, "Interface does not support 5Gb "
5634 			    "advertised speed\n");
5635 			return (EINVAL);
5636 		}
5637 		speed |= IXGBE_LINK_SPEED_5GB_FULL;
5638 	}
5639 	if (advertise == 0)
5640 		speed = link_caps; /* All capable link speed */
5641 
5642 	hw->mac.autotry_restart = TRUE;
5643 	hw->mac.ops.setup_link(hw, speed, TRUE);
5644 	adapter->advertise = advertise;
5645 
5646 	return (0);
5647 } /* ixgbe_set_advertise */
5648 
5649 /************************************************************************
5650  * ixgbe_get_default_advertise - Get default advertised speed settings
5651  *
5652  *   Formatted for sysctl usage.
5653  *   Flags:
5654  *     0x1  - advertise 100 Mb
5655  *     0x2  - advertise 1G
5656  *     0x4  - advertise 10G
5657  *     0x8  - advertise 10 Mb (yes, Mb)
5658  *     0x10 - advertise 2.5G
5659  *     0x20 - advertise 5G
5660  ************************************************************************/
5661 static int
5662 ixgbe_get_default_advertise(struct adapter *adapter)
5663 {
5664 	struct ixgbe_hw	 *hw = &adapter->hw;
5665 	int		 speed;
5666 	ixgbe_link_speed link_caps = 0;
5667 	s32		 err;
5668 	bool		 negotiate = FALSE;
5669 
5670 	/*
5671 	 * Advertised speed means nothing unless it's copper or
5672 	 * multi-speed fiber
5673 	 */
5674 	if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
5675 	    !(hw->phy.multispeed_fiber))
5676 		return (0);
5677 
5678 	err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
5679 	if (err != IXGBE_SUCCESS)
5680 		return (0);
5681 
5682 	speed =
5683 	    ((link_caps & IXGBE_LINK_SPEED_10GB_FULL)  ? 0x4  : 0) |
5684 	    ((link_caps & IXGBE_LINK_SPEED_5GB_FULL)   ? 0x20 : 0) |
5685 	    ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
5686 	    ((link_caps & IXGBE_LINK_SPEED_1GB_FULL)   ? 0x2  : 0) |
5687 	    ((link_caps & IXGBE_LINK_SPEED_100_FULL)   ? 0x1  : 0) |
5688 	    ((link_caps & IXGBE_LINK_SPEED_10_FULL)    ? 0x8  : 0);
5689 
5690 	return speed;
5691 } /* ixgbe_get_default_advertise */
5692 
5693 /************************************************************************
5694  * ixgbe_sysctl_dmac - Manage DMA Coalescing
5695  *
5696  *   Control values:
5697  *     0/1 - off / on (use default value of 1000)
5698  *
5699  *     Legal timer values are:
5700  *     50,100,250,500,1000,2000,5000,10000
5701  *
5702  *     Turning off interrupt moderation will also turn this off.
5703  ************************************************************************/
5704 static int
5705 ixgbe_sysctl_dmac(SYSCTLFN_ARGS)
5706 {
5707 	struct sysctlnode node = *rnode;
5708 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
5709 	struct ifnet   *ifp = adapter->ifp;
5710 	int	       error;
5711 	int	       newval;
5712 
5713 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5714 		return (EPERM);
5715 
5716 	newval = adapter->dmac;
5717 	node.sysctl_data = &newval;
5718 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5719 	if ((error) || (newp == NULL))
5720 		return (error);
5721 
5722 	switch (newval) {
5723 	case 0:
5724 		/* Disabled */
5725 		adapter->dmac = 0;
5726 		break;
5727 	case 1:
5728 		/* Enable and use default */
5729 		adapter->dmac = 1000;
5730 		break;
5731 	case 50:
5732 	case 100:
5733 	case 250:
5734 	case 500:
5735 	case 1000:
5736 	case 2000:
5737 	case 5000:
5738 	case 10000:
5739 		/* Legal values - allow */
5740 		adapter->dmac = newval;
5741 		break;
5742 	default:
5743 		/* Do nothing, illegal value */
5744 		return (EINVAL);
5745 	}
5746 
5747 	/* Re-initialize hardware if it's already running */
5748 	if (ifp->if_flags & IFF_RUNNING)
5749 		if_init(ifp);
5750 
5751 	return (0);
5752 }
5753 
5754 #ifdef IXGBE_DEBUG
5755 /************************************************************************
5756  * ixgbe_sysctl_power_state
5757  *
5758  *   Sysctl to test power states
5759  *   Values:
5760  *     0      - set device to D0
5761  *     3      - set device to D3
5762  *     (none) - get current device power state
5763  ************************************************************************/
5764 static int
5765 ixgbe_sysctl_power_state(SYSCTLFN_ARGS)
5766 {
5767 #ifdef notyet
5768 	struct sysctlnode node = *rnode;
5769 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
5770 	device_t       dev =  adapter->dev;
5771 	int	       curr_ps, new_ps, error = 0;
5772 
5773 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5774 		return (EPERM);
5775 
5776 	curr_ps = new_ps = pci_get_powerstate(dev);
5777 
5778 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5779 	if ((error) || (req->newp == NULL))
5780 		return (error);
5781 
5782 	if (new_ps == curr_ps)
5783 		return (0);
5784 
5785 	if (new_ps == 3 && curr_ps == 0)
5786 		error = DEVICE_SUSPEND(dev);
5787 	else if (new_ps == 0 && curr_ps == 3)
5788 		error = DEVICE_RESUME(dev);
5789 	else
5790 		return (EINVAL);
5791 
5792 	device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
5793 
5794 	return (error);
5795 #else
5796 	return 0;
5797 #endif
5798 } /* ixgbe_sysctl_power_state */
5799 #endif
5800 
5801 /************************************************************************
5802  * ixgbe_sysctl_wol_enable
5803  *
5804  *   Sysctl to enable/disable the WoL capability,
5805  *   if supported by the adapter.
5806  *
5807  *   Values:
5808  *     0 - disabled
5809  *     1 - enabled
5810  ************************************************************************/
5811 static int
5812 ixgbe_sysctl_wol_enable(SYSCTLFN_ARGS)
5813 {
5814 	struct sysctlnode node = *rnode;
5815 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
5816 	struct ixgbe_hw *hw = &adapter->hw;
5817 	bool		new_wol_enabled;
5818 	int		error = 0;
5819 
5820 	/*
5821 	 * It's not required to check recovery mode because this function never
5822 	 * touches hardware.
5823 	 */
5824 	new_wol_enabled = hw->wol_enabled;
5825 	node.sysctl_data = &new_wol_enabled;
5826 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5827 	if ((error) || (newp == NULL))
5828 		return (error);
5829 	if (new_wol_enabled == hw->wol_enabled)
5830 		return (0);
5831 
5832 	if (new_wol_enabled && !adapter->wol_support)
5833 		return (ENODEV);
5834 	else
5835 		hw->wol_enabled = new_wol_enabled;
5836 
5837 	return (0);
5838 } /* ixgbe_sysctl_wol_enable */
5839 
5840 /************************************************************************
5841  * ixgbe_sysctl_wufc - Wake Up Filter Control
5842  *
5843  *   Sysctl to enable/disable the types of packets that the
5844  *   adapter will wake up on upon receipt.
5845  *   Flags:
5846  *     0x1  - Link Status Change
5847  *     0x2  - Magic Packet
5848  *     0x4  - Direct Exact
5849  *     0x8  - Directed Multicast
5850  *     0x10 - Broadcast
5851  *     0x20 - ARP/IPv4 Request Packet
5852  *     0x40 - Direct IPv4 Packet
5853  *     0x80 - Direct IPv6 Packet
5854  *
5855  *   Settings not listed above will cause the sysctl to return an error.
5856  ************************************************************************/
5857 static int
5858 ixgbe_sysctl_wufc(SYSCTLFN_ARGS)
5859 {
5860 	struct sysctlnode node = *rnode;
5861 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
5862 	int error = 0;
5863 	u32 new_wufc;
5864 
5865 	/*
5866 	 * It's not required to check recovery mode because this function never
5867 	 * touches hardware.
5868 	 */
5869 	new_wufc = adapter->wufc;
5870 	node.sysctl_data = &new_wufc;
5871 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5872 	if ((error) || (newp == NULL))
5873 		return (error);
5874 	if (new_wufc == adapter->wufc)
5875 		return (0);
5876 
5877 	if (new_wufc & 0xffffff00)
5878 		return (EINVAL);
5879 
5880 	new_wufc &= 0xff;
5881 	new_wufc |= (0xffffff & adapter->wufc);
5882 	adapter->wufc = new_wufc;
5883 
5884 	return (0);
5885 } /* ixgbe_sysctl_wufc */
5886 
5887 #ifdef IXGBE_DEBUG
5888 /************************************************************************
5889  * ixgbe_sysctl_print_rss_config
5890  ************************************************************************/
5891 static int
5892 ixgbe_sysctl_print_rss_config(SYSCTLFN_ARGS)
5893 {
5894 #ifdef notyet
5895 	struct sysctlnode node = *rnode;
5896 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
5897 	struct ixgbe_hw *hw = &adapter->hw;
5898 	device_t	dev = adapter->dev;
5899 	struct sbuf	*buf;
5900 	int		error = 0, reta_size;
5901 	u32		reg;
5902 
5903 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5904 		return (EPERM);
5905 
5906 	buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5907 	if (!buf) {
5908 		device_printf(dev, "Could not allocate sbuf for output.\n");
5909 		return (ENOMEM);
5910 	}
5911 
5912 	// TODO: use sbufs to make a string to print out
5913 	/* Set multiplier for RETA setup and table size based on MAC */
5914 	switch (adapter->hw.mac.type) {
5915 	case ixgbe_mac_X550:
5916 	case ixgbe_mac_X550EM_x:
5917 	case ixgbe_mac_X550EM_a:
5918 		reta_size = 128;
5919 		break;
5920 	default:
5921 		reta_size = 32;
5922 		break;
5923 	}
5924 
5925 	/* Print out the redirection table */
5926 	sbuf_cat(buf, "\n");
5927 	for (int i = 0; i < reta_size; i++) {
5928 		if (i < 32) {
5929 			reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
5930 			sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
5931 		} else {
5932 			reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
5933 			sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
5934 		}
5935 	}
5936 
5937 	// TODO: print more config
5938 
5939 	error = sbuf_finish(buf);
5940 	if (error)
5941 		device_printf(dev, "Error finishing sbuf: %d\n", error);
5942 
5943 	sbuf_delete(buf);
5944 #endif
5945 	return (0);
5946 } /* ixgbe_sysctl_print_rss_config */
5947 #endif /* IXGBE_DEBUG */
5948 
5949 /************************************************************************
5950  * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
5951  *
5952  *   For X552/X557-AT devices using an external PHY
5953  ************************************************************************/
5954 static int
5955 ixgbe_sysctl_phy_temp(SYSCTLFN_ARGS)
5956 {
5957 	struct sysctlnode node = *rnode;
5958 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
5959 	struct ixgbe_hw *hw = &adapter->hw;
5960 	int val;
5961 	u16 reg;
5962 	int		error;
5963 
5964 	if (ixgbe_fw_recovery_mode_swflag(adapter))
5965 		return (EPERM);
5966 
5967 	if ((hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) &&
5968 	    (hw->device_id != IXGBE_DEV_ID_X550EM_A_10G_T)) {
5969 		device_printf(adapter->dev,
5970 		    "Device has no supported external thermal sensor.\n");
5971 		return (ENODEV);
5972 	}
5973 
5974 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
5975 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
5976 		device_printf(adapter->dev,
5977 		    "Error reading from PHY's current temperature register\n");
5978 		return (EAGAIN);
5979 	}
5980 
5981 	node.sysctl_data = &val;
5982 
5983 	/* Shift temp for output */
5984 	val = reg >> 8;
5985 
5986 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5987 	if ((error) || (newp == NULL))
5988 		return (error);
5989 
5990 	return (0);
5991 } /* ixgbe_sysctl_phy_temp */
5992 
5993 /************************************************************************
5994  * ixgbe_sysctl_phy_overtemp_occurred
5995  *
5996  *   Reports (directly from the PHY) whether the current PHY
5997  *   temperature is over the overtemp threshold.
5998  ************************************************************************/
5999 static int
6000 ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_ARGS)
6001 {
6002 	struct sysctlnode node = *rnode;
6003 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
6004 	struct ixgbe_hw *hw = &adapter->hw;
6005 	int val, error;
6006 	u16 reg;
6007 
6008 	if (ixgbe_fw_recovery_mode_swflag(adapter))
6009 		return (EPERM);
6010 
6011 	if ((hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) &&
6012 	    (hw->device_id != IXGBE_DEV_ID_X550EM_A_10G_T)){
6013 		device_printf(adapter->dev,
6014 		    "Device has no supported external thermal sensor.\n");
6015 		return (ENODEV);
6016 	}
6017 
6018 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
6019 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
6020 		device_printf(adapter->dev,
6021 		    "Error reading from PHY's temperature status register\n");
6022 		return (EAGAIN);
6023 	}
6024 
6025 	node.sysctl_data = &val;
6026 
6027 	/* Get occurrence bit */
6028 	val = !!(reg & 0x4000);
6029 
6030 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6031 	if ((error) || (newp == NULL))
6032 		return (error);
6033 
6034 	return (0);
6035 } /* ixgbe_sysctl_phy_overtemp_occurred */
6036 
6037 /************************************************************************
6038  * ixgbe_sysctl_eee_state
6039  *
6040  *   Sysctl to set EEE power saving feature
6041  *   Values:
6042  *     0      - disable EEE
6043  *     1      - enable EEE
6044  *     (none) - get current device EEE state
6045  ************************************************************************/
6046 static int
6047 ixgbe_sysctl_eee_state(SYSCTLFN_ARGS)
6048 {
6049 	struct sysctlnode node = *rnode;
6050 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
6051 	struct ifnet   *ifp = adapter->ifp;
6052 	device_t       dev = adapter->dev;
6053 	int	       curr_eee, new_eee, error = 0;
6054 	s32	       retval;
6055 
6056 	if (ixgbe_fw_recovery_mode_swflag(adapter))
6057 		return (EPERM);
6058 
6059 	curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
6060 	node.sysctl_data = &new_eee;
6061 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6062 	if ((error) || (newp == NULL))
6063 		return (error);
6064 
6065 	/* Nothing to do */
6066 	if (new_eee == curr_eee)
6067 		return (0);
6068 
6069 	/* Not supported */
6070 	if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
6071 		return (EINVAL);
6072 
6073 	/* Bounds checking */
6074 	if ((new_eee < 0) || (new_eee > 1))
6075 		return (EINVAL);
6076 
6077 	retval = ixgbe_setup_eee(&adapter->hw, new_eee);
6078 	if (retval) {
6079 		device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
6080 		return (EINVAL);
6081 	}
6082 
6083 	/* Restart auto-neg */
6084 	if_init(ifp);
6085 
6086 	device_printf(dev, "New EEE state: %d\n", new_eee);
6087 
6088 	/* Cache new value */
6089 	if (new_eee)
6090 		adapter->feat_en |= IXGBE_FEATURE_EEE;
6091 	else
6092 		adapter->feat_en &= ~IXGBE_FEATURE_EEE;
6093 
6094 	return (error);
6095 } /* ixgbe_sysctl_eee_state */
6096 
6097 #define PRINTQS(adapter, regname)					\
6098 	do {								\
6099 		struct ixgbe_hw	*_hw = &(adapter)->hw;			\
6100 		int _i;							\
6101 									\
6102 		printf("%s: %s", device_xname((adapter)->dev), #regname); \
6103 		for (_i = 0; _i < (adapter)->num_queues; _i++) {	\
6104 			printf((_i == 0) ? "\t" : " ");			\
6105 			printf("%08x", IXGBE_READ_REG(_hw,		\
6106 				IXGBE_##regname(_i)));			\
6107 		}							\
6108 		printf("\n");						\
6109 	} while (0)
6110 
6111 /************************************************************************
6112  * ixgbe_print_debug_info
6113  *
6114  *   Called only when em_display_debug_stats is enabled.
6115  *   Provides a way to take a look at important statistics
6116  *   maintained by the driver and hardware.
6117  ************************************************************************/
6118 static void
6119 ixgbe_print_debug_info(struct adapter *adapter)
6120 {
6121 	device_t	dev = adapter->dev;
6122 	struct ixgbe_hw *hw = &adapter->hw;
6123 	int table_size;
6124 	int i;
6125 
6126 	switch (adapter->hw.mac.type) {
6127 	case ixgbe_mac_X550:
6128 	case ixgbe_mac_X550EM_x:
6129 	case ixgbe_mac_X550EM_a:
6130 		table_size = 128;
6131 		break;
6132 	default:
6133 		table_size = 32;
6134 		break;
6135 	}
6136 
6137 	device_printf(dev, "[E]RETA:\n");
6138 	for (i = 0; i < table_size; i++) {
6139 		if (i < 32)
6140 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
6141 				IXGBE_RETA(i)));
6142 		else
6143 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
6144 				IXGBE_ERETA(i - 32)));
6145 	}
6146 
6147 	device_printf(dev, "queue:");
6148 	for (i = 0; i < adapter->num_queues; i++) {
6149 		printf((i == 0) ? "\t" : " ");
6150 		printf("%8d", i);
6151 	}
6152 	printf("\n");
6153 	PRINTQS(adapter, RDBAL);
6154 	PRINTQS(adapter, RDBAH);
6155 	PRINTQS(adapter, RDLEN);
6156 	PRINTQS(adapter, SRRCTL);
6157 	PRINTQS(adapter, RDH);
6158 	PRINTQS(adapter, RDT);
6159 	PRINTQS(adapter, RXDCTL);
6160 
6161 	device_printf(dev, "RQSMR:");
6162 	for (i = 0; i < adapter->num_queues / 4; i++) {
6163 		printf((i == 0) ? "\t" : " ");
6164 		printf("%08x", IXGBE_READ_REG(hw, IXGBE_RQSMR(i)));
6165 	}
6166 	printf("\n");
6167 
6168 	device_printf(dev, "disabled_count:");
6169 	for (i = 0; i < adapter->num_queues; i++) {
6170 		printf((i == 0) ? "\t" : " ");
6171 		printf("%8d", adapter->queues[i].disabled_count);
6172 	}
6173 	printf("\n");
6174 
6175 	device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
6176 	if (hw->mac.type != ixgbe_mac_82598EB) {
6177 		device_printf(dev, "EIMS_EX(0):\t%08x\n",
6178 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0)));
6179 		device_printf(dev, "EIMS_EX(1):\t%08x\n",
6180 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1)));
6181 	}
6182 	device_printf(dev, "EIAM:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIAM));
6183 	device_printf(dev, "EIAC:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIAC));
6184 } /* ixgbe_print_debug_info */
6185 
6186 /************************************************************************
6187  * ixgbe_sysctl_debug
6188  ************************************************************************/
6189 static int
6190 ixgbe_sysctl_debug(SYSCTLFN_ARGS)
6191 {
6192 	struct sysctlnode node = *rnode;
6193 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
6194 	int	       error, result = 0;
6195 
6196 	if (ixgbe_fw_recovery_mode_swflag(adapter))
6197 		return (EPERM);
6198 
6199 	node.sysctl_data = &result;
6200 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6201 
6202 	if (error || newp == NULL)
6203 		return error;
6204 
6205 	if (result == 1)
6206 		ixgbe_print_debug_info(adapter);
6207 
6208 	return 0;
6209 } /* ixgbe_sysctl_debug */
6210 
6211 /************************************************************************
6212  * ixgbe_sysctl_rx_copy_len
6213  ************************************************************************/
6214 static int
6215 ixgbe_sysctl_rx_copy_len(SYSCTLFN_ARGS)
6216 {
6217 	struct sysctlnode node = *rnode;
6218 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
6219 	int error;
6220 	int result = adapter->rx_copy_len;
6221 
6222 	node.sysctl_data = &result;
6223 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6224 
6225 	if (error || newp == NULL)
6226 		return error;
6227 
6228 	if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
6229 		return EINVAL;
6230 
6231 	adapter->rx_copy_len = result;
6232 
6233 	return 0;
6234 } /* ixgbe_sysctl_rx_copy_len */
6235 
6236 /************************************************************************
6237  * ixgbe_sysctl_tx_process_limit
6238  ************************************************************************/
6239 static int
6240 ixgbe_sysctl_tx_process_limit(SYSCTLFN_ARGS)
6241 {
6242 	struct sysctlnode node = *rnode;
6243 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
6244 	int error;
6245 	int result = adapter->tx_process_limit;
6246 
6247 	node.sysctl_data = &result;
6248 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6249 
6250 	if (error || newp == NULL)
6251 		return error;
6252 
6253 	if ((result <= 0) || (result > adapter->num_tx_desc))
6254 		return EINVAL;
6255 
6256 	adapter->tx_process_limit = result;
6257 
6258 	return 0;
6259 } /* ixgbe_sysctl_tx_process_limit */
6260 
6261 /************************************************************************
6262  * ixgbe_sysctl_rx_process_limit
6263  ************************************************************************/
6264 static int
6265 ixgbe_sysctl_rx_process_limit(SYSCTLFN_ARGS)
6266 {
6267 	struct sysctlnode node = *rnode;
6268 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
6269 	int error;
6270 	int result = adapter->rx_process_limit;
6271 
6272 	node.sysctl_data = &result;
6273 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
6274 
6275 	if (error || newp == NULL)
6276 		return error;
6277 
6278 	if ((result <= 0) || (result > adapter->num_rx_desc))
6279 		return EINVAL;
6280 
6281 	adapter->rx_process_limit = result;
6282 
6283 	return 0;
6284 } /* ixgbe_sysctl_rx_process_limit */
6285 
6286 /************************************************************************
6287  * ixgbe_init_device_features
6288  ************************************************************************/
6289 static void
6290 ixgbe_init_device_features(struct adapter *adapter)
6291 {
6292 	adapter->feat_cap = IXGBE_FEATURE_NETMAP
6293 			  | IXGBE_FEATURE_RSS
6294 			  | IXGBE_FEATURE_MSI
6295 			  | IXGBE_FEATURE_MSIX
6296 			  | IXGBE_FEATURE_LEGACY_IRQ
6297 			  | IXGBE_FEATURE_LEGACY_TX;
6298 
6299 	/* Set capabilities first... */
6300 	switch (adapter->hw.mac.type) {
6301 	case ixgbe_mac_82598EB:
6302 		if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
6303 			adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
6304 		break;
6305 	case ixgbe_mac_X540:
6306 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6307 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6308 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
6309 		    (adapter->hw.bus.func == 0))
6310 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6311 		break;
6312 	case ixgbe_mac_X550:
6313 		/*
6314 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6315 		 * NVM Image version.
6316 		 */
6317 		adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6318 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6319 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6320 		break;
6321 	case ixgbe_mac_X550EM_x:
6322 		/*
6323 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6324 		 * NVM Image version.
6325 		 */
6326 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6327 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6328 		break;
6329 	case ixgbe_mac_X550EM_a:
6330 		/*
6331 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
6332 		 * NVM Image version.
6333 		 */
6334 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6335 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6336 		adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6337 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
6338 		    (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
6339 			adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
6340 			adapter->feat_cap |= IXGBE_FEATURE_EEE;
6341 		}
6342 		break;
6343 	case ixgbe_mac_82599EB:
6344 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
6345 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
6346 		if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
6347 		    (adapter->hw.bus.func == 0))
6348 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
6349 		if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
6350 			adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
6351 		break;
6352 	default:
6353 		break;
6354 	}
6355 
6356 	/* Enabled by default... */
6357 	/* Fan failure detection */
6358 	if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
6359 		adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
6360 	/* Netmap */
6361 	if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
6362 		adapter->feat_en |= IXGBE_FEATURE_NETMAP;
6363 	/* EEE */
6364 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
6365 		adapter->feat_en |= IXGBE_FEATURE_EEE;
6366 	/* Thermal Sensor */
6367 	if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
6368 		adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
6369 	/*
6370 	 * Recovery mode:
6371 	 * NetBSD: IXGBE_FEATURE_RECOVERY_MODE will be controlled after reading
6372 	 * NVM Image version.
6373 	 */
6374 
6375 	/* Enabled via global sysctl... */
6376 	/* Flow Director */
6377 	if (ixgbe_enable_fdir) {
6378 		if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
6379 			adapter->feat_en |= IXGBE_FEATURE_FDIR;
6380 		else
6381 			device_printf(adapter->dev, "Device does not support "
6382 			    "Flow Director. Leaving disabled.");
6383 	}
6384 	/* Legacy (single queue) transmit */
6385 	if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
6386 	    ixgbe_enable_legacy_tx)
6387 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
6388 	/*
6389 	 * Message Signal Interrupts - Extended (MSI-X)
6390 	 * Normal MSI is only enabled if MSI-X calls fail.
6391 	 */
6392 	if (!ixgbe_enable_msix)
6393 		adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
6394 	/* Receive-Side Scaling (RSS) */
6395 	if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
6396 		adapter->feat_en |= IXGBE_FEATURE_RSS;
6397 
6398 	/* Disable features with unmet dependencies... */
6399 	/* No MSI-X */
6400 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
6401 		adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
6402 		adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
6403 		adapter->feat_en &= ~IXGBE_FEATURE_RSS;
6404 		adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
6405 	}
6406 } /* ixgbe_init_device_features */
6407 
6408 /************************************************************************
6409  * ixgbe_probe - Device identification routine
6410  *
6411  *   Determines if the driver should be loaded on
6412  *   adapter based on its PCI vendor/device ID.
6413  *
6414  *   return BUS_PROBE_DEFAULT on success, positive on failure
6415  ************************************************************************/
6416 static int
6417 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
6418 {
6419 	const struct pci_attach_args *pa = aux;
6420 
6421 	return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
6422 }
6423 
6424 static const ixgbe_vendor_info_t *
6425 ixgbe_lookup(const struct pci_attach_args *pa)
6426 {
6427 	const ixgbe_vendor_info_t *ent;
6428 	pcireg_t subid;
6429 
6430 	INIT_DEBUGOUT("ixgbe_lookup: begin");
6431 
6432 	if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
6433 		return NULL;
6434 
6435 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
6436 
6437 	for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
6438 		if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
6439 		    (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
6440 		    ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
6441 			(ent->subvendor_id == 0)) &&
6442 		    ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
6443 			(ent->subdevice_id == 0))) {
6444 			return ent;
6445 		}
6446 	}
6447 	return NULL;
6448 }
6449 
6450 static int
6451 ixgbe_ifflags_cb(struct ethercom *ec)
6452 {
6453 	struct ifnet *ifp = &ec->ec_if;
6454 	struct adapter *adapter = ifp->if_softc;
6455 	u_short change;
6456 	int rv = 0;
6457 
6458 	IXGBE_CORE_LOCK(adapter);
6459 
6460 	change = ifp->if_flags ^ adapter->if_flags;
6461 	if (change != 0)
6462 		adapter->if_flags = ifp->if_flags;
6463 
6464 	if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
6465 		rv = ENETRESET;
6466 		goto out;
6467 	} else if ((change & IFF_PROMISC) != 0)
6468 		ixgbe_set_rxfilter(adapter);
6469 
6470 	/* Check for ec_capenable. */
6471 	change = ec->ec_capenable ^ adapter->ec_capenable;
6472 	adapter->ec_capenable = ec->ec_capenable;
6473 	if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
6474 	    | ETHERCAP_VLAN_HWFILTER)) != 0) {
6475 		rv = ENETRESET;
6476 		goto out;
6477 	}
6478 
6479 	/*
6480 	 * Special handling is not required for ETHERCAP_VLAN_MTU.
6481 	 * MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
6482 	 */
6483 
6484 	/* Set up VLAN support and filter */
6485 	if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
6486 		ixgbe_setup_vlan_hw_support(adapter);
6487 
6488 out:
6489 	IXGBE_CORE_UNLOCK(adapter);
6490 
6491 	return rv;
6492 }
6493 
6494 /************************************************************************
6495  * ixgbe_ioctl - Ioctl entry point
6496  *
6497  *   Called when the user wants to configure the interface.
6498  *
6499  *   return 0 on success, positive on failure
6500  ************************************************************************/
6501 static int
6502 ixgbe_ioctl(struct ifnet *ifp, u_long command, void *data)
6503 {
6504 	struct adapter	*adapter = ifp->if_softc;
6505 	struct ixgbe_hw *hw = &adapter->hw;
6506 	struct ifcapreq *ifcr = data;
6507 	struct ifreq	*ifr = data;
6508 	int		error = 0;
6509 	int l4csum_en;
6510 	const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
6511 	     IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
6512 
6513 	if (ixgbe_fw_recovery_mode_swflag(adapter))
6514 		return (EPERM);
6515 
6516 	switch (command) {
6517 	case SIOCSIFFLAGS:
6518 		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
6519 		break;
6520 	case SIOCADDMULTI:
6521 	case SIOCDELMULTI:
6522 		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
6523 		break;
6524 	case SIOCSIFMEDIA:
6525 	case SIOCGIFMEDIA:
6526 		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
6527 		break;
6528 	case SIOCSIFCAP:
6529 		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
6530 		break;
6531 	case SIOCSIFMTU:
6532 		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
6533 		break;
6534 #ifdef __NetBSD__
6535 	case SIOCINITIFADDR:
6536 		IOCTL_DEBUGOUT("ioctl: SIOCINITIFADDR");
6537 		break;
6538 	case SIOCGIFFLAGS:
6539 		IOCTL_DEBUGOUT("ioctl: SIOCGIFFLAGS");
6540 		break;
6541 	case SIOCGIFAFLAG_IN:
6542 		IOCTL_DEBUGOUT("ioctl: SIOCGIFAFLAG_IN");
6543 		break;
6544 	case SIOCGIFADDR:
6545 		IOCTL_DEBUGOUT("ioctl: SIOCGIFADDR");
6546 		break;
6547 	case SIOCGIFMTU:
6548 		IOCTL_DEBUGOUT("ioctl: SIOCGIFMTU (Get Interface MTU)");
6549 		break;
6550 	case SIOCGIFCAP:
6551 		IOCTL_DEBUGOUT("ioctl: SIOCGIFCAP (Get IF cap)");
6552 		break;
6553 	case SIOCGETHERCAP:
6554 		IOCTL_DEBUGOUT("ioctl: SIOCGETHERCAP (Get ethercap)");
6555 		break;
6556 	case SIOCGLIFADDR:
6557 		IOCTL_DEBUGOUT("ioctl: SIOCGLIFADDR (Get Interface addr)");
6558 		break;
6559 	case SIOCZIFDATA:
6560 		IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
6561 		hw->mac.ops.clear_hw_cntrs(hw);
6562 		ixgbe_clear_evcnt(adapter);
6563 		break;
6564 	case SIOCAIFADDR:
6565 		IOCTL_DEBUGOUT("ioctl: SIOCAIFADDR (add/chg IF alias)");
6566 		break;
6567 #endif
6568 	default:
6569 		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
6570 		break;
6571 	}
6572 
6573 	switch (command) {
6574 	case SIOCGI2C:
6575 	{
6576 		struct ixgbe_i2c_req	i2c;
6577 
6578 		IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
6579 		error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
6580 		if (error != 0)
6581 			break;
6582 		if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
6583 			error = EINVAL;
6584 			break;
6585 		}
6586 		if (i2c.len > sizeof(i2c.data)) {
6587 			error = EINVAL;
6588 			break;
6589 		}
6590 
6591 		hw->phy.ops.read_i2c_byte(hw, i2c.offset,
6592 		    i2c.dev_addr, i2c.data);
6593 		error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
6594 		break;
6595 	}
6596 	case SIOCSIFCAP:
6597 		/* Layer-4 Rx checksum offload has to be turned on and
6598 		 * off as a unit.
6599 		 */
6600 		l4csum_en = ifcr->ifcr_capenable & l4csum;
6601 		if (l4csum_en != l4csum && l4csum_en != 0)
6602 			return EINVAL;
6603 		/*FALLTHROUGH*/
6604 	case SIOCADDMULTI:
6605 	case SIOCDELMULTI:
6606 	case SIOCSIFFLAGS:
6607 	case SIOCSIFMTU:
6608 	default:
6609 		if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
6610 			return error;
6611 		if ((ifp->if_flags & IFF_RUNNING) == 0)
6612 			;
6613 		else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
6614 			IXGBE_CORE_LOCK(adapter);
6615 			if ((ifp->if_flags & IFF_RUNNING) != 0)
6616 				ixgbe_init_locked(adapter);
6617 			ixgbe_recalculate_max_frame(adapter);
6618 			IXGBE_CORE_UNLOCK(adapter);
6619 		} else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
6620 			/*
6621 			 * Multicast list has changed; set the hardware filter
6622 			 * accordingly.
6623 			 */
6624 			IXGBE_CORE_LOCK(adapter);
6625 			ixgbe_disable_intr(adapter);
6626 			ixgbe_set_rxfilter(adapter);
6627 			ixgbe_enable_intr(adapter);
6628 			IXGBE_CORE_UNLOCK(adapter);
6629 		}
6630 		return 0;
6631 	}
6632 
6633 	return error;
6634 } /* ixgbe_ioctl */
6635 
6636 /************************************************************************
6637  * ixgbe_check_fan_failure
6638  ************************************************************************/
6639 static int
6640 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
6641 {
6642 	u32 mask;
6643 
6644 	mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
6645 	    IXGBE_ESDP_SDP1;
6646 
6647 	if ((reg & mask) == 0)
6648 		return IXGBE_SUCCESS;
6649 
6650 	/*
6651 	 * Use ratecheck() just in case interrupt occur frequently.
6652 	 * When EXPX9501AT's fan stopped, interrupt occurred only once,
6653 	 * an red LED on the board turned on and link never up until
6654 	 * power off.
6655 	 */
6656 	if (ratecheck(&adapter->lasterr_time, &ixgbe_errlog_intrvl))
6657 		device_printf(adapter->dev,
6658 		    "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
6659 
6660 	return IXGBE_ERR_FAN_FAILURE;
6661 } /* ixgbe_check_fan_failure */
6662 
6663 /************************************************************************
6664  * ixgbe_handle_que
6665  ************************************************************************/
6666 static void
6667 ixgbe_handle_que(void *context)
6668 {
6669 	struct ix_queue *que = context;
6670 	struct adapter	*adapter = que->adapter;
6671 	struct tx_ring	*txr = que->txr;
6672 	struct ifnet	*ifp = adapter->ifp;
6673 	bool		more = false;
6674 
6675 	IXGBE_EVC_ADD(&que->handleq, 1);
6676 
6677 	if (ifp->if_flags & IFF_RUNNING) {
6678 		IXGBE_TX_LOCK(txr);
6679 		more = ixgbe_txeof(txr);
6680 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
6681 			if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
6682 				ixgbe_mq_start_locked(ifp, txr);
6683 		/* Only for queue 0 */
6684 		/* NetBSD still needs this for CBQ */
6685 		if ((&adapter->queues[0] == que)
6686 		    && (!ixgbe_legacy_ring_empty(ifp, NULL)))
6687 			ixgbe_legacy_start_locked(ifp, txr);
6688 		IXGBE_TX_UNLOCK(txr);
6689 		more |= ixgbe_rxeof(que);
6690 	}
6691 
6692 	if (more) {
6693 		IXGBE_EVC_ADD(&que->req, 1);
6694 		ixgbe_sched_handle_que(adapter, que);
6695 	} else if (que->res != NULL) {
6696 		/* MSIX: Re-enable this interrupt */
6697 		ixgbe_enable_queue(adapter, que->msix);
6698 	} else {
6699 		/* INTx or MSI */
6700 		ixgbe_enable_queue(adapter, 0);
6701 	}
6702 
6703 	return;
6704 } /* ixgbe_handle_que */
6705 
6706 /************************************************************************
6707  * ixgbe_handle_que_work
6708  ************************************************************************/
6709 static void
6710 ixgbe_handle_que_work(struct work *wk, void *context)
6711 {
6712 	struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
6713 
6714 	/*
6715 	 * "enqueued flag" is not required here.
6716 	 * See ixgbe_msix_que().
6717 	 */
6718 	ixgbe_handle_que(que);
6719 }
6720 
6721 /************************************************************************
6722  * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
6723  ************************************************************************/
6724 static int
6725 ixgbe_allocate_legacy(struct adapter *adapter,
6726     const struct pci_attach_args *pa)
6727 {
6728 	device_t	dev = adapter->dev;
6729 	struct ix_queue *que = adapter->queues;
6730 	struct tx_ring	*txr = adapter->tx_rings;
6731 	int		counts[PCI_INTR_TYPE_SIZE];
6732 	pci_intr_type_t intr_type, max_type;
6733 	char		intrbuf[PCI_INTRSTR_LEN];
6734 	char		wqname[MAXCOMLEN];
6735 	const char	*intrstr = NULL;
6736 	int defertx_error = 0, error;
6737 
6738 	/* We allocate a single interrupt resource */
6739 	max_type = PCI_INTR_TYPE_MSI;
6740 	counts[PCI_INTR_TYPE_MSIX] = 0;
6741 	counts[PCI_INTR_TYPE_MSI] =
6742 	    (adapter->feat_en & IXGBE_FEATURE_MSI) ? 1 : 0;
6743 	/* Check not feat_en but feat_cap to fallback to INTx */
6744 	counts[PCI_INTR_TYPE_INTX] =
6745 	    (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) ? 1 : 0;
6746 
6747 alloc_retry:
6748 	if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
6749 		aprint_error_dev(dev, "couldn't alloc interrupt\n");
6750 		return ENXIO;
6751 	}
6752 	adapter->osdep.nintrs = 1;
6753 	intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
6754 	    intrbuf, sizeof(intrbuf));
6755 	adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
6756 	    adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
6757 	    device_xname(dev));
6758 	intr_type = pci_intr_type(adapter->osdep.pc, adapter->osdep.intrs[0]);
6759 	if (adapter->osdep.ihs[0] == NULL) {
6760 		aprint_error_dev(dev,"unable to establish %s\n",
6761 		    (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
6762 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6763 		adapter->osdep.intrs = NULL;
6764 		switch (intr_type) {
6765 		case PCI_INTR_TYPE_MSI:
6766 			/* The next try is for INTx: Disable MSI */
6767 			max_type = PCI_INTR_TYPE_INTX;
6768 			counts[PCI_INTR_TYPE_INTX] = 1;
6769 			adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6770 			if (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) {
6771 				adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6772 				goto alloc_retry;
6773 			} else
6774 				break;
6775 		case PCI_INTR_TYPE_INTX:
6776 		default:
6777 			/* See below */
6778 			break;
6779 		}
6780 	}
6781 	if (intr_type == PCI_INTR_TYPE_INTX) {
6782 		adapter->feat_en &= ~IXGBE_FEATURE_MSI;
6783 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
6784 	}
6785 	if (adapter->osdep.ihs[0] == NULL) {
6786 		aprint_error_dev(dev,
6787 		    "couldn't establish interrupt%s%s\n",
6788 		    intrstr ? " at " : "", intrstr ? intrstr : "");
6789 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
6790 		adapter->osdep.intrs = NULL;
6791 		return ENXIO;
6792 	}
6793 	aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
6794 	/*
6795 	 * Try allocating a fast interrupt and the associated deferred
6796 	 * processing contexts.
6797 	 */
6798 	if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
6799 		txr->txr_si =
6800 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6801 			ixgbe_deferred_mq_start, txr);
6802 
6803 		snprintf(wqname, sizeof(wqname), "%sdeferTx",
6804 		    device_xname(dev));
6805 		defertx_error = workqueue_create(&adapter->txr_wq, wqname,
6806 		    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI,
6807 		    IPL_NET, IXGBE_WORKQUEUE_FLAGS);
6808 		adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
6809 	}
6810 	que->que_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6811 	    ixgbe_handle_que, que);
6812 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
6813 	error = workqueue_create(&adapter->que_wq, wqname,
6814 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6815 	    IXGBE_WORKQUEUE_FLAGS);
6816 
6817 	if ((!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)
6818 		&& ((txr->txr_si == NULL) || defertx_error != 0))
6819 	    || (que->que_si == NULL) || error != 0) {
6820 		aprint_error_dev(dev,
6821 		    "could not establish software interrupts\n");
6822 
6823 		return ENXIO;
6824 	}
6825 	/* For simplicity in the handlers */
6826 	adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
6827 
6828 	return (0);
6829 } /* ixgbe_allocate_legacy */
6830 
6831 /************************************************************************
6832  * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
6833  ************************************************************************/
6834 static int
6835 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
6836 {
6837 	device_t	dev = adapter->dev;
6838 	struct		ix_queue *que = adapter->queues;
6839 	struct		tx_ring *txr = adapter->tx_rings;
6840 	pci_chipset_tag_t pc;
6841 	char		intrbuf[PCI_INTRSTR_LEN];
6842 	char		intr_xname[32];
6843 	char		wqname[MAXCOMLEN];
6844 	const char	*intrstr = NULL;
6845 	int		error, vector = 0;
6846 	int		cpu_id = 0;
6847 	kcpuset_t	*affinity;
6848 #ifdef RSS
6849 	unsigned int	rss_buckets = 0;
6850 	kcpuset_t	cpu_mask;
6851 #endif
6852 
6853 	pc = adapter->osdep.pc;
6854 #ifdef	RSS
6855 	/*
6856 	 * If we're doing RSS, the number of queues needs to
6857 	 * match the number of RSS buckets that are configured.
6858 	 *
6859 	 * + If there's more queues than RSS buckets, we'll end
6860 	 *   up with queues that get no traffic.
6861 	 *
6862 	 * + If there's more RSS buckets than queues, we'll end
6863 	 *   up having multiple RSS buckets map to the same queue,
6864 	 *   so there'll be some contention.
6865 	 */
6866 	rss_buckets = rss_getnumbuckets();
6867 	if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
6868 	    (adapter->num_queues != rss_buckets)) {
6869 		device_printf(dev,
6870 		    "%s: number of queues (%d) != number of RSS buckets (%d)"
6871 		    "; performance will be impacted.\n",
6872 		    __func__, adapter->num_queues, rss_buckets);
6873 	}
6874 #endif
6875 
6876 	adapter->osdep.nintrs = adapter->num_queues + 1;
6877 	if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
6878 	    adapter->osdep.nintrs) != 0) {
6879 		aprint_error_dev(dev,
6880 		    "failed to allocate MSI-X interrupt\n");
6881 		adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
6882 		return (ENXIO);
6883 	}
6884 
6885 	kcpuset_create(&affinity, false);
6886 	for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
6887 		snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
6888 		    device_xname(dev), i);
6889 		intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
6890 		    sizeof(intrbuf));
6891 #ifdef IXGBE_MPSAFE
6892 		pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
6893 		    true);
6894 #endif
6895 		/* Set the handler function */
6896 		que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
6897 		    adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
6898 		    intr_xname);
6899 		if (que->res == NULL) {
6900 			aprint_error_dev(dev,
6901 			    "Failed to register QUE handler\n");
6902 			error = ENXIO;
6903 			goto err_out;
6904 		}
6905 		que->msix = vector;
6906 		adapter->active_queues |= 1ULL << que->msix;
6907 
6908 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
6909 #ifdef	RSS
6910 			/*
6911 			 * The queue ID is used as the RSS layer bucket ID.
6912 			 * We look up the queue ID -> RSS CPU ID and select
6913 			 * that.
6914 			 */
6915 			cpu_id = rss_getcpu(i % rss_getnumbuckets());
6916 			CPU_SETOF(cpu_id, &cpu_mask);
6917 #endif
6918 		} else {
6919 			/*
6920 			 * Bind the MSI-X vector, and thus the
6921 			 * rings to the corresponding CPU.
6922 			 *
6923 			 * This just happens to match the default RSS
6924 			 * round-robin bucket -> queue -> CPU allocation.
6925 			 */
6926 			if (adapter->num_queues > 1)
6927 				cpu_id = i;
6928 		}
6929 		/* Round-robin affinity */
6930 		kcpuset_zero(affinity);
6931 		kcpuset_set(affinity, cpu_id % ncpu);
6932 		error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
6933 		    NULL);
6934 		aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
6935 		    intrstr);
6936 		if (error == 0) {
6937 #if 1 /* def IXGBE_DEBUG */
6938 #ifdef	RSS
6939 			aprint_normal(", bound RSS bucket %d to CPU %d", i,
6940 			    cpu_id % ncpu);
6941 #else
6942 			aprint_normal(", bound queue %d to cpu %d", i,
6943 			    cpu_id % ncpu);
6944 #endif
6945 #endif /* IXGBE_DEBUG */
6946 		}
6947 		aprint_normal("\n");
6948 
6949 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
6950 			txr->txr_si = softint_establish(
6951 				SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6952 				ixgbe_deferred_mq_start, txr);
6953 			if (txr->txr_si == NULL) {
6954 				aprint_error_dev(dev,
6955 				    "couldn't establish software interrupt\n");
6956 				error = ENXIO;
6957 				goto err_out;
6958 			}
6959 		}
6960 		que->que_si
6961 		    = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
6962 			ixgbe_handle_que, que);
6963 		if (que->que_si == NULL) {
6964 			aprint_error_dev(dev,
6965 			    "couldn't establish software interrupt\n");
6966 			error = ENXIO;
6967 			goto err_out;
6968 		}
6969 	}
6970 	snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
6971 	error = workqueue_create(&adapter->txr_wq, wqname,
6972 	    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6973 	    IXGBE_WORKQUEUE_FLAGS);
6974 	if (error) {
6975 		aprint_error_dev(dev,
6976 		    "couldn't create workqueue for deferred Tx\n");
6977 		goto err_out;
6978 	}
6979 	adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
6980 
6981 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
6982 	error = workqueue_create(&adapter->que_wq, wqname,
6983 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
6984 	    IXGBE_WORKQUEUE_FLAGS);
6985 	if (error) {
6986 		aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
6987 		goto err_out;
6988 	}
6989 
6990 	/* and Link */
6991 	cpu_id++;
6992 	snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
6993 	adapter->vector = vector;
6994 	intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
6995 	    sizeof(intrbuf));
6996 #ifdef IXGBE_MPSAFE
6997 	pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
6998 	    true);
6999 #endif
7000 	/* Set the link handler function */
7001 	adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
7002 	    adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_admin, adapter,
7003 	    intr_xname);
7004 	if (adapter->osdep.ihs[vector] == NULL) {
7005 		aprint_error_dev(dev, "Failed to register LINK handler\n");
7006 		error = ENXIO;
7007 		goto err_out;
7008 	}
7009 	/* Round-robin affinity */
7010 	kcpuset_zero(affinity);
7011 	kcpuset_set(affinity, cpu_id % ncpu);
7012 	error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
7013 	    NULL);
7014 
7015 	aprint_normal_dev(dev,
7016 	    "for link, interrupting at %s", intrstr);
7017 	if (error == 0)
7018 		aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
7019 	else
7020 		aprint_normal("\n");
7021 
7022 	kcpuset_destroy(affinity);
7023 	aprint_normal_dev(dev,
7024 	    "Using MSI-X interrupts with %d vectors\n", vector + 1);
7025 
7026 	return (0);
7027 
7028 err_out:
7029 	kcpuset_destroy(affinity);
7030 	ixgbe_free_deferred_handlers(adapter);
7031 	ixgbe_free_pciintr_resources(adapter);
7032 	return (error);
7033 } /* ixgbe_allocate_msix */
7034 
7035 /************************************************************************
7036  * ixgbe_configure_interrupts
7037  *
7038  *   Setup MSI-X, MSI, or legacy interrupts (in that order).
7039  *   This will also depend on user settings.
7040  ************************************************************************/
7041 static int
7042 ixgbe_configure_interrupts(struct adapter *adapter)
7043 {
7044 	device_t dev = adapter->dev;
7045 	struct ixgbe_mac_info *mac = &adapter->hw.mac;
7046 	int want, queues, msgs;
7047 
7048 	/* Default to 1 queue if MSI-X setup fails */
7049 	adapter->num_queues = 1;
7050 
7051 	/* Override by tuneable */
7052 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX))
7053 		goto msi;
7054 
7055 	/*
7056 	 *  NetBSD only: Use single vector MSI when number of CPU is 1 to save
7057 	 * interrupt slot.
7058 	 */
7059 	if (ncpu == 1)
7060 		goto msi;
7061 
7062 	/* First try MSI-X */
7063 	msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
7064 	msgs = MIN(msgs, IXG_MAX_NINTR);
7065 	if (msgs < 2)
7066 		goto msi;
7067 
7068 	adapter->feat_en |= IXGBE_FEATURE_MSIX;
7069 
7070 	/* Figure out a reasonable auto config value */
7071 	queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
7072 
7073 #ifdef	RSS
7074 	/* If we're doing RSS, clamp at the number of RSS buckets */
7075 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
7076 		queues = uimin(queues, rss_getnumbuckets());
7077 #endif
7078 	if (ixgbe_num_queues > queues) {
7079 		aprint_error_dev(adapter->dev,
7080 		    "ixgbe_num_queues (%d) is too large, "
7081 		    "using reduced amount (%d).\n", ixgbe_num_queues, queues);
7082 		ixgbe_num_queues = queues;
7083 	}
7084 
7085 	if (ixgbe_num_queues != 0)
7086 		queues = ixgbe_num_queues;
7087 	else
7088 		queues = uimin(queues,
7089 		    uimin(mac->max_tx_queues, mac->max_rx_queues));
7090 
7091 	/* reflect correct sysctl value */
7092 	ixgbe_num_queues = queues;
7093 
7094 	/*
7095 	 * Want one vector (RX/TX pair) per queue
7096 	 * plus an additional for Link.
7097 	 */
7098 	want = queues + 1;
7099 	if (msgs >= want)
7100 		msgs = want;
7101 	else {
7102 		aprint_error_dev(dev, "MSI-X Configuration Problem, "
7103 		    "%d vectors but %d queues wanted!\n", msgs, want);
7104 		goto msi;
7105 	}
7106 	adapter->num_queues = queues;
7107 	adapter->feat_en |= IXGBE_FEATURE_MSIX;
7108 	return (0);
7109 
7110 	/*
7111 	 * MSI-X allocation failed or provided us with
7112 	 * less vectors than needed. Free MSI-X resources
7113 	 * and we'll try enabling MSI.
7114 	 */
7115 msi:
7116 	/* Without MSI-X, some features are no longer supported */
7117 	adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
7118 	adapter->feat_en  &= ~IXGBE_FEATURE_RSS;
7119 	adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
7120 	adapter->feat_en  &= ~IXGBE_FEATURE_SRIOV;
7121 
7122 	msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
7123 	adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
7124 	if (msgs > 1)
7125 		msgs = 1;
7126 	if (msgs != 0) {
7127 		msgs = 1;
7128 		adapter->feat_en |= IXGBE_FEATURE_MSI;
7129 		return (0);
7130 	}
7131 
7132 	if (!(adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ)) {
7133 		aprint_error_dev(dev,
7134 		    "Device does not support legacy interrupts.\n");
7135 		return 1;
7136 	}
7137 
7138 	adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
7139 
7140 	return (0);
7141 } /* ixgbe_configure_interrupts */
7142 
7143 
7144 /************************************************************************
7145  * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
7146  *
7147  *   Done outside of interrupt context since the driver might sleep
7148  ************************************************************************/
7149 static void
7150 ixgbe_handle_link(void *context)
7151 {
7152 	struct adapter	*adapter = context;
7153 	struct ixgbe_hw *hw = &adapter->hw;
7154 
7155 	KASSERT(mutex_owned(&adapter->core_mtx));
7156 
7157 	IXGBE_EVC_ADD(&adapter->link_workev, 1);
7158 	ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
7159 	ixgbe_update_link_status(adapter);
7160 
7161 	/* Re-enable link interrupts */
7162 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
7163 } /* ixgbe_handle_link */
7164 
7165 #if 0
7166 /************************************************************************
7167  * ixgbe_rearm_queues
7168  ************************************************************************/
7169 static __inline void
7170 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
7171 {
7172 	u32 mask;
7173 
7174 	switch (adapter->hw.mac.type) {
7175 	case ixgbe_mac_82598EB:
7176 		mask = (IXGBE_EIMS_RTX_QUEUE & queues);
7177 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
7178 		break;
7179 	case ixgbe_mac_82599EB:
7180 	case ixgbe_mac_X540:
7181 	case ixgbe_mac_X550:
7182 	case ixgbe_mac_X550EM_x:
7183 	case ixgbe_mac_X550EM_a:
7184 		mask = (queues & 0xFFFFFFFF);
7185 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
7186 		mask = (queues >> 32);
7187 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
7188 		break;
7189 	default:
7190 		break;
7191 	}
7192 } /* ixgbe_rearm_queues */
7193 #endif
7194