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