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