]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixgbe/if_ix.c
ixgbe: fix software vlan handling
[FreeBSD/FreeBSD.git] / sys / dev / ixgbe / if_ix.c
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 || (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) {
1929                 /* Clear the vlan hw flag */
1930                 for (i = 0; i < sc->num_rx_queues; i++) {
1931                         rxr = &sc->rx_queues[i].rxr;
1932                         /* On 82599 the VLAN enable is per/queue in RXDCTL */
1933                         if (hw->mac.type != ixgbe_mac_82598EB) {
1934                                 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
1935                                 ctrl &= ~IXGBE_RXDCTL_VME;
1936                                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
1937                         }
1938                         rxr->vtag_strip = false;
1939                 }
1940                 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
1941                 /* Enable the Filter Table if enabled */
1942                 ctrl |= IXGBE_VLNCTRL_CFIEN;
1943                 ctrl &= ~IXGBE_VLNCTRL_VFE;
1944                 if (hw->mac.type == ixgbe_mac_82598EB)
1945                         ctrl &= ~IXGBE_VLNCTRL_VME;
1946                 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
1947                 return;
1948         }
1949
1950         /* Setup the queues for vlans */
1951         if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) {
1952                 for (i = 0; i < sc->num_rx_queues; i++) {
1953                         rxr = &sc->rx_queues[i].rxr;
1954                         /* On 82599 the VLAN enable is per/queue in RXDCTL */
1955                         if (hw->mac.type != ixgbe_mac_82598EB) {
1956                                 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
1957                                 ctrl |= IXGBE_RXDCTL_VME;
1958                                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
1959                         }
1960                         rxr->vtag_strip = true;
1961                 }
1962         }
1963
1964         if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
1965                 return;
1966         /*
1967          * A soft reset zero's out the VFTA, so
1968          * we need to repopulate it now.
1969          */
1970         for (i = 0; i < IXGBE_VFTA_SIZE; i++)
1971                 if (sc->shadow_vfta[i] != 0)
1972                         IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
1973                             sc->shadow_vfta[i]);
1974
1975         ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
1976         /* Enable the Filter Table if enabled */
1977         if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) {
1978                 ctrl &= ~IXGBE_VLNCTRL_CFIEN;
1979                 ctrl |= IXGBE_VLNCTRL_VFE;
1980         }
1981         if (hw->mac.type == ixgbe_mac_82598EB)
1982                 ctrl |= IXGBE_VLNCTRL_VME;
1983         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
1984 } /* ixgbe_setup_vlan_hw_support */
1985
1986 /************************************************************************
1987  * ixgbe_get_slot_info
1988  *
1989  *   Get the width and transaction speed of
1990  *   the slot this adapter is plugged into.
1991  ************************************************************************/
1992 static void
1993 ixgbe_get_slot_info(struct ixgbe_softc *sc)
1994 {
1995         device_t        dev = iflib_get_dev(sc->ctx);
1996         struct ixgbe_hw *hw = &sc->hw;
1997         int             bus_info_valid = true;
1998         u32             offset;
1999         u16             link;
2000
2001         /* Some devices are behind an internal bridge */
2002         switch (hw->device_id) {
2003         case IXGBE_DEV_ID_82599_SFP_SF_QP:
2004         case IXGBE_DEV_ID_82599_QSFP_SF_QP:
2005                 goto get_parent_info;
2006         default:
2007                 break;
2008         }
2009
2010         ixgbe_get_bus_info(hw);
2011
2012         /*
2013          * Some devices don't use PCI-E, but there is no need
2014          * to display "Unknown" for bus speed and width.
2015          */
2016         switch (hw->mac.type) {
2017         case ixgbe_mac_X550EM_x:
2018         case ixgbe_mac_X550EM_a:
2019                 return;
2020         default:
2021                 goto display;
2022         }
2023
2024 get_parent_info:
2025         /*
2026          * For the Quad port adapter we need to parse back
2027          * up the PCI tree to find the speed of the expansion
2028          * slot into which this adapter is plugged. A bit more work.
2029          */
2030         dev = device_get_parent(device_get_parent(dev));
2031 #ifdef IXGBE_DEBUG
2032         device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
2033             pci_get_slot(dev), pci_get_function(dev));
2034 #endif
2035         dev = device_get_parent(device_get_parent(dev));
2036 #ifdef IXGBE_DEBUG
2037         device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
2038             pci_get_slot(dev), pci_get_function(dev));
2039 #endif
2040         /* Now get the PCI Express Capabilities offset */
2041         if (pci_find_cap(dev, PCIY_EXPRESS, &offset)) {
2042                 /*
2043                  * Hmm...can't get PCI-Express capabilities.
2044                  * Falling back to default method.
2045                  */
2046                 bus_info_valid = false;
2047                 ixgbe_get_bus_info(hw);
2048                 goto display;
2049         }
2050         /* ...and read the Link Status Register */
2051         link = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
2052         ixgbe_set_pci_config_data_generic(hw, link);
2053
2054 display:
2055         device_printf(dev, "PCI Express Bus: Speed %s %s\n",
2056             ((hw->bus.speed == ixgbe_bus_speed_8000)    ? "8.0GT/s"  :
2057              (hw->bus.speed == ixgbe_bus_speed_5000)    ? "5.0GT/s"  :
2058              (hw->bus.speed == ixgbe_bus_speed_2500)    ? "2.5GT/s"  :
2059              "Unknown"),
2060             ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
2061              (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
2062              (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
2063              "Unknown"));
2064
2065         if (bus_info_valid) {
2066                 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2067                     ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
2068                     (hw->bus.speed == ixgbe_bus_speed_2500))) {
2069                         device_printf(dev, "PCI-Express bandwidth available for this card\n     is not sufficient for optimal performance.\n");
2070                         device_printf(dev, "For optimal performance a x8 PCIE, or x4 PCIE Gen2 slot is required.\n");
2071                 }
2072                 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
2073                     ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
2074                     (hw->bus.speed < ixgbe_bus_speed_8000))) {
2075                         device_printf(dev, "PCI-Express bandwidth available for this card\n     is not sufficient for optimal performance.\n");
2076                         device_printf(dev, "For optimal performance a x8 PCIE Gen3 slot is required.\n");
2077                 }
2078         } else
2079                 device_printf(dev, "Unable to determine slot speed/width. The speed/width reported are that of the internal switch.\n");
2080
2081         return;
2082 } /* ixgbe_get_slot_info */
2083
2084 /************************************************************************
2085  * ixgbe_if_msix_intr_assign
2086  *
2087  *   Setup MSI-X Interrupt resources and handlers
2088  ************************************************************************/
2089 static int
2090 ixgbe_if_msix_intr_assign(if_ctx_t ctx, int msix)
2091 {
2092         struct ixgbe_softc     *sc = iflib_get_softc(ctx);
2093         struct ix_rx_queue *rx_que = sc->rx_queues;
2094         struct ix_tx_queue *tx_que;
2095         int                error, rid, vector = 0;
2096         char               buf[16];
2097
2098         /* Admin Que is vector 0*/
2099         rid = vector + 1;
2100         for (int i = 0; i < sc->num_rx_queues; i++, vector++, rx_que++) {
2101                 rid = vector + 1;
2102
2103                 snprintf(buf, sizeof(buf), "rxq%d", i);
2104                 error = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
2105                     IFLIB_INTR_RXTX, ixgbe_msix_que, rx_que, rx_que->rxr.me, buf);
2106
2107                 if (error) {
2108                         device_printf(iflib_get_dev(ctx),
2109                             "Failed to allocate que int %d err: %d", i, error);
2110                         sc->num_rx_queues = i + 1;
2111                         goto fail;
2112                 }
2113
2114                 rx_que->msix = vector;
2115         }
2116         for (int i = 0; i < sc->num_tx_queues; i++) {
2117                 snprintf(buf, sizeof(buf), "txq%d", i);
2118                 tx_que = &sc->tx_queues[i];
2119                 tx_que->msix = i % sc->num_rx_queues;
2120                 iflib_softirq_alloc_generic(ctx,
2121                     &sc->rx_queues[tx_que->msix].que_irq,
2122                     IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
2123         }
2124         rid = vector + 1;
2125         error = iflib_irq_alloc_generic(ctx, &sc->irq, rid,
2126             IFLIB_INTR_ADMIN, ixgbe_msix_link, sc, 0, "aq");
2127         if (error) {
2128                 device_printf(iflib_get_dev(ctx),
2129                     "Failed to register admin handler");
2130                 return (error);
2131         }
2132
2133         sc->vector = vector;
2134
2135         return (0);
2136 fail:
2137         iflib_irq_free(ctx, &sc->irq);
2138         rx_que = sc->rx_queues;
2139         for (int i = 0; i < sc->num_rx_queues; i++, rx_que++)
2140                 iflib_irq_free(ctx, &rx_que->que_irq);
2141
2142         return (error);
2143 } /* ixgbe_if_msix_intr_assign */
2144
2145 static inline void
2146 ixgbe_perform_aim(struct ixgbe_softc *sc, struct ix_rx_queue *que)
2147 {
2148         uint32_t newitr = 0;
2149         struct rx_ring *rxr = &que->rxr;
2150
2151         /*
2152          * Do Adaptive Interrupt Moderation:
2153          *  - Write out last calculated setting
2154          *  - Calculate based on average size over
2155          *    the last interval.
2156          */
2157         if (que->eitr_setting) {
2158                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EITR(que->msix),
2159                     que->eitr_setting);
2160         }
2161
2162         que->eitr_setting = 0;
2163         /* Idle, do nothing */
2164         if (rxr->bytes == 0) {
2165                 return;
2166         }
2167
2168         if ((rxr->bytes) && (rxr->packets)) {
2169                 newitr = (rxr->bytes / rxr->packets);
2170         }
2171
2172         newitr += 24; /* account for hardware frame, crc */
2173         /* set an upper boundary */
2174         newitr = min(newitr, 3000);
2175
2176         /* Be nice to the mid range */
2177         if ((newitr > 300) && (newitr < 1200)) {
2178                 newitr = (newitr / 3);
2179         } else {
2180                 newitr = (newitr / 2);
2181         }
2182
2183         if (sc->hw.mac.type == ixgbe_mac_82598EB) {
2184                 newitr |= newitr << 16;
2185         } else {
2186                 newitr |= IXGBE_EITR_CNT_WDIS;
2187         }
2188
2189         /* save for next interrupt */
2190         que->eitr_setting = newitr;
2191
2192         /* Reset state */
2193         rxr->bytes = 0;
2194         rxr->packets = 0;
2195
2196         return;
2197 }
2198
2199 /*********************************************************************
2200  * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2201  **********************************************************************/
2202 static int
2203 ixgbe_msix_que(void *arg)
2204 {
2205         struct ix_rx_queue *que = arg;
2206         struct ixgbe_softc     *sc = que->sc;
2207         struct ifnet       *ifp = iflib_get_ifp(que->sc->ctx);
2208
2209         /* Protect against spurious interrupts */
2210         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2211                 return (FILTER_HANDLED);
2212
2213         ixgbe_disable_queue(sc, que->msix);
2214         ++que->irqs;
2215
2216         /* Check for AIM */
2217         if (sc->enable_aim) {
2218                 ixgbe_perform_aim(sc, que);
2219         }
2220
2221         return (FILTER_SCHEDULE_THREAD);
2222 } /* ixgbe_msix_que */
2223
2224 /************************************************************************
2225  * ixgbe_media_status - Media Ioctl callback
2226  *
2227  *   Called whenever the user queries the status of
2228  *   the interface using ifconfig.
2229  ************************************************************************/
2230 static void
2231 ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr)
2232 {
2233         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
2234         struct ixgbe_hw *hw = &sc->hw;
2235         int             layer;
2236
2237         INIT_DEBUGOUT("ixgbe_if_media_status: begin");
2238
2239         ifmr->ifm_status = IFM_AVALID;
2240         ifmr->ifm_active = IFM_ETHER;
2241
2242         if (!sc->link_active)
2243                 return;
2244
2245         ifmr->ifm_status |= IFM_ACTIVE;
2246         layer = sc->phy_layer;
2247
2248         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2249             layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2250             layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2251             layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2252                 switch (sc->link_speed) {
2253                 case IXGBE_LINK_SPEED_10GB_FULL:
2254                         ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2255                         break;
2256                 case IXGBE_LINK_SPEED_1GB_FULL:
2257                         ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2258                         break;
2259                 case IXGBE_LINK_SPEED_100_FULL:
2260                         ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2261                         break;
2262                 case IXGBE_LINK_SPEED_10_FULL:
2263                         ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2264                         break;
2265                 }
2266         if (hw->mac.type == ixgbe_mac_X550)
2267                 switch (sc->link_speed) {
2268                 case IXGBE_LINK_SPEED_5GB_FULL:
2269                         ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
2270                         break;
2271                 case IXGBE_LINK_SPEED_2_5GB_FULL:
2272                         ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
2273                         break;
2274                 }
2275         if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2276             layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2277                 switch (sc->link_speed) {
2278                 case IXGBE_LINK_SPEED_10GB_FULL:
2279                         ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2280                         break;
2281                 }
2282         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2283                 switch (sc->link_speed) {
2284                 case IXGBE_LINK_SPEED_10GB_FULL:
2285                         ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2286                         break;
2287                 case IXGBE_LINK_SPEED_1GB_FULL:
2288                         ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2289                         break;
2290                 }
2291         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2292                 switch (sc->link_speed) {
2293                 case IXGBE_LINK_SPEED_10GB_FULL:
2294                         ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2295                         break;
2296                 case IXGBE_LINK_SPEED_1GB_FULL:
2297                         ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2298                         break;
2299                 }
2300         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2301             layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2302                 switch (sc->link_speed) {
2303                 case IXGBE_LINK_SPEED_10GB_FULL:
2304                         ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2305                         break;
2306                 case IXGBE_LINK_SPEED_1GB_FULL:
2307                         ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2308                         break;
2309                 }
2310         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2311                 switch (sc->link_speed) {
2312                 case IXGBE_LINK_SPEED_10GB_FULL:
2313                         ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2314                         break;
2315                 }
2316         /*
2317          * XXX: These need to use the proper media types once
2318          * they're added.
2319          */
2320 #ifndef IFM_ETH_XTYPE
2321         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2322                 switch (sc->link_speed) {
2323                 case IXGBE_LINK_SPEED_10GB_FULL:
2324                         ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2325                         break;
2326                 case IXGBE_LINK_SPEED_2_5GB_FULL:
2327                         ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2328                         break;
2329                 case IXGBE_LINK_SPEED_1GB_FULL:
2330                         ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2331                         break;
2332                 }
2333         else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2334             layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2335             layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2336                 switch (sc->link_speed) {
2337                 case IXGBE_LINK_SPEED_10GB_FULL:
2338                         ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2339                         break;
2340                 case IXGBE_LINK_SPEED_2_5GB_FULL:
2341                         ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2342                         break;
2343                 case IXGBE_LINK_SPEED_1GB_FULL:
2344                         ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2345                         break;
2346                 }
2347 #else
2348         if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2349                 switch (sc->link_speed) {
2350                 case IXGBE_LINK_SPEED_10GB_FULL:
2351                         ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2352                         break;
2353                 case IXGBE_LINK_SPEED_2_5GB_FULL:
2354                         ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2355                         break;
2356                 case IXGBE_LINK_SPEED_1GB_FULL:
2357                         ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2358                         break;
2359                 }
2360         else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2361             layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2362             layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2363                 switch (sc->link_speed) {
2364                 case IXGBE_LINK_SPEED_10GB_FULL:
2365                         ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
2366                         break;
2367                 case IXGBE_LINK_SPEED_2_5GB_FULL:
2368                         ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2369                         break;
2370                 case IXGBE_LINK_SPEED_1GB_FULL:
2371                         ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2372                         break;
2373                 }
2374 #endif
2375
2376         /* If nothing is recognized... */
2377         if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
2378                 ifmr->ifm_active |= IFM_UNKNOWN;
2379
2380         /* Display current flow control setting used on link */
2381         if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
2382             hw->fc.current_mode == ixgbe_fc_full)
2383                 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
2384         if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
2385             hw->fc.current_mode == ixgbe_fc_full)
2386                 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
2387 } /* ixgbe_media_status */
2388
2389 /************************************************************************
2390  * ixgbe_media_change - Media Ioctl callback
2391  *
2392  *   Called when the user changes speed/duplex using
2393  *   media/mediopt option with ifconfig.
2394  ************************************************************************/
2395 static int
2396 ixgbe_if_media_change(if_ctx_t ctx)
2397 {
2398         struct ixgbe_softc   *sc = iflib_get_softc(ctx);
2399         struct ifmedia   *ifm = iflib_get_media(ctx);
2400         struct ixgbe_hw  *hw = &sc->hw;
2401         ixgbe_link_speed speed = 0;
2402
2403         INIT_DEBUGOUT("ixgbe_if_media_change: begin");
2404
2405         if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
2406                 return (EINVAL);
2407
2408         if (hw->phy.media_type == ixgbe_media_type_backplane)
2409                 return (EPERM);
2410
2411         /*
2412          * We don't actually need to check against the supported
2413          * media types of the adapter; ifmedia will take care of
2414          * that for us.
2415          */
2416         switch (IFM_SUBTYPE(ifm->ifm_media)) {
2417         case IFM_AUTO:
2418         case IFM_10G_T:
2419                 speed |= IXGBE_LINK_SPEED_100_FULL;
2420                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2421                 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2422                 break;
2423         case IFM_10G_LRM:
2424         case IFM_10G_LR:
2425 #ifndef IFM_ETH_XTYPE
2426         case IFM_10G_SR: /* KR, too */
2427         case IFM_10G_CX4: /* KX4 */
2428 #else
2429         case IFM_10G_KR:
2430         case IFM_10G_KX4:
2431 #endif
2432                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2433                 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2434                 break;
2435 #ifndef IFM_ETH_XTYPE
2436         case IFM_1000_CX: /* KX */
2437 #else
2438         case IFM_1000_KX:
2439 #endif
2440         case IFM_1000_LX:
2441         case IFM_1000_SX:
2442                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2443                 break;
2444         case IFM_1000_T:
2445                 speed |= IXGBE_LINK_SPEED_100_FULL;
2446                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2447                 break;
2448         case IFM_10G_TWINAX:
2449                 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2450                 break;
2451         case IFM_5000_T:
2452                 speed |= IXGBE_LINK_SPEED_5GB_FULL;
2453                 break;
2454         case IFM_2500_T:
2455                 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
2456                 break;
2457         case IFM_100_TX:
2458                 speed |= IXGBE_LINK_SPEED_100_FULL;
2459                 break;
2460         case IFM_10_T:
2461                 speed |= IXGBE_LINK_SPEED_10_FULL;
2462                 break;
2463         default:
2464                 goto invalid;
2465         }
2466
2467         hw->mac.autotry_restart = true;
2468         hw->mac.ops.setup_link(hw, speed, true);
2469         sc->advertise =
2470             ((speed & IXGBE_LINK_SPEED_10GB_FULL)  ? 0x4  : 0) |
2471             ((speed & IXGBE_LINK_SPEED_5GB_FULL)   ? 0x20 : 0) |
2472             ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
2473             ((speed & IXGBE_LINK_SPEED_1GB_FULL)   ? 0x2  : 0) |
2474             ((speed & IXGBE_LINK_SPEED_100_FULL)   ? 0x1  : 0) |
2475             ((speed & IXGBE_LINK_SPEED_10_FULL)    ? 0x8  : 0);
2476
2477         return (0);
2478
2479 invalid:
2480         device_printf(iflib_get_dev(ctx), "Invalid media type!\n");
2481
2482         return (EINVAL);
2483 } /* ixgbe_if_media_change */
2484
2485 /************************************************************************
2486  * ixgbe_set_promisc
2487  ************************************************************************/
2488 static int
2489 ixgbe_if_promisc_set(if_ctx_t ctx, int flags)
2490 {
2491         struct ixgbe_softc *sc = iflib_get_softc(ctx);
2492         struct ifnet   *ifp = iflib_get_ifp(ctx);
2493         u32            rctl;
2494         int            mcnt = 0;
2495
2496         rctl = IXGBE_READ_REG(&sc->hw, IXGBE_FCTRL);
2497         rctl &= (~IXGBE_FCTRL_UPE);
2498         if (ifp->if_flags & IFF_ALLMULTI)
2499                 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
2500         else {
2501                 mcnt = min(if_llmaddr_count(ifp), MAX_NUM_MULTICAST_ADDRESSES);
2502         }
2503         if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
2504                 rctl &= (~IXGBE_FCTRL_MPE);
2505         IXGBE_WRITE_REG(&sc->hw, IXGBE_FCTRL, rctl);
2506
2507         if (ifp->if_flags & IFF_PROMISC) {
2508                 rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
2509                 IXGBE_WRITE_REG(&sc->hw, IXGBE_FCTRL, rctl);
2510         } else if (ifp->if_flags & IFF_ALLMULTI) {
2511                 rctl |= IXGBE_FCTRL_MPE;
2512                 rctl &= ~IXGBE_FCTRL_UPE;
2513                 IXGBE_WRITE_REG(&sc->hw, IXGBE_FCTRL, rctl);
2514         }
2515         return (0);
2516 } /* ixgbe_if_promisc_set */
2517
2518 /************************************************************************
2519  * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
2520  ************************************************************************/
2521 static int
2522 ixgbe_msix_link(void *arg)
2523 {
2524         struct ixgbe_softc  *sc = arg;
2525         struct ixgbe_hw *hw = &sc->hw;
2526         u32             eicr, eicr_mask;
2527         s32             retval;
2528
2529         ++sc->link_irq;
2530
2531         /* Pause other interrupts */
2532         IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
2533
2534         /* First get the cause */
2535         eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
2536         /* Be sure the queue bits are not cleared */
2537         eicr &= ~IXGBE_EICR_RTX_QUEUE;
2538         /* Clear interrupt with write */
2539         IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
2540
2541         /* Link status change */
2542         if (eicr & IXGBE_EICR_LSC) {
2543                 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
2544                 sc->task_requests |= IXGBE_REQUEST_TASK_LSC;
2545         }
2546
2547         if (sc->hw.mac.type != ixgbe_mac_82598EB) {
2548                 if ((sc->feat_en & IXGBE_FEATURE_FDIR) &&
2549                     (eicr & IXGBE_EICR_FLOW_DIR)) {
2550                         /* This is probably overkill :) */
2551                         if (!atomic_cmpset_int(&sc->fdir_reinit, 0, 1))
2552                                 return (FILTER_HANDLED);
2553                         /* Disable the interrupt */
2554                         IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
2555                         sc->task_requests |= IXGBE_REQUEST_TASK_FDIR;
2556                 } else
2557                         if (eicr & IXGBE_EICR_ECC) {
2558                                 device_printf(iflib_get_dev(sc->ctx),
2559                                    "Received ECC Err, initiating reset\n");
2560                                 hw->mac.flags |= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
2561                                 ixgbe_reset_hw(hw);
2562                                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
2563                         }
2564
2565                 /* Check for over temp condition */
2566                 if (sc->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
2567                         switch (sc->hw.mac.type) {
2568                         case ixgbe_mac_X550EM_a:
2569                                 if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
2570                                         break;
2571                                 IXGBE_WRITE_REG(hw, IXGBE_EIMC,
2572                                     IXGBE_EICR_GPI_SDP0_X550EM_a);
2573                                 IXGBE_WRITE_REG(hw, IXGBE_EICR,
2574                                     IXGBE_EICR_GPI_SDP0_X550EM_a);
2575                                 retval = hw->phy.ops.check_overtemp(hw);
2576                                 if (retval != IXGBE_ERR_OVERTEMP)
2577                                         break;
2578                                 device_printf(iflib_get_dev(sc->ctx),
2579                                     "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2580                                 device_printf(iflib_get_dev(sc->ctx),
2581                                     "System shutdown required!\n");
2582                                 break;
2583                         default:
2584                                 if (!(eicr & IXGBE_EICR_TS))
2585                                         break;
2586                                 retval = hw->phy.ops.check_overtemp(hw);
2587                                 if (retval != IXGBE_ERR_OVERTEMP)
2588                                         break;
2589                                 device_printf(iflib_get_dev(sc->ctx),
2590                                     "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2591                                 device_printf(iflib_get_dev(sc->ctx),
2592                                     "System shutdown required!\n");
2593                                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
2594                                 break;
2595                         }
2596                 }
2597
2598                 /* Check for VF message */
2599                 if ((sc->feat_en & IXGBE_FEATURE_SRIOV) &&
2600                     (eicr & IXGBE_EICR_MAILBOX))
2601                         sc->task_requests |= IXGBE_REQUEST_TASK_MBX;
2602         }
2603
2604         if (ixgbe_is_sfp(hw)) {
2605                 /* Pluggable optics-related interrupt */
2606                 if (hw->mac.type >= ixgbe_mac_X540)
2607                         eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
2608                 else
2609                         eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
2610
2611                 if (eicr & eicr_mask) {
2612                         IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
2613                         sc->task_requests |= IXGBE_REQUEST_TASK_MOD;
2614                 }
2615
2616                 if ((hw->mac.type == ixgbe_mac_82599EB) &&
2617                     (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
2618                         IXGBE_WRITE_REG(hw, IXGBE_EICR,
2619                             IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2620                         sc->task_requests |= IXGBE_REQUEST_TASK_MSF;
2621                 }
2622         }
2623
2624         /* Check for fan failure */
2625         if (sc->feat_en & IXGBE_FEATURE_FAN_FAIL) {
2626                 ixgbe_check_fan_failure(sc, eicr, true);
2627                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2628         }
2629
2630         /* External PHY interrupt */
2631         if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
2632             (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
2633                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
2634                 sc->task_requests |= IXGBE_REQUEST_TASK_PHY;
2635         }
2636
2637         return (sc->task_requests != 0) ? FILTER_SCHEDULE_THREAD : FILTER_HANDLED;
2638 } /* ixgbe_msix_link */
2639
2640 /************************************************************************
2641  * ixgbe_sysctl_interrupt_rate_handler
2642  ************************************************************************/
2643 static int
2644 ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
2645 {
2646         struct ix_rx_queue *que = ((struct ix_rx_queue *)oidp->oid_arg1);
2647         int                error;
2648         unsigned int       reg, usec, rate;
2649
2650         reg = IXGBE_READ_REG(&que->sc->hw, IXGBE_EITR(que->msix));
2651         usec = ((reg & 0x0FF8) >> 3);
2652         if (usec > 0)
2653                 rate = 500000 / usec;
2654         else
2655                 rate = 0;
2656         error = sysctl_handle_int(oidp, &rate, 0, req);
2657         if (error || !req->newptr)
2658                 return error;
2659         reg &= ~0xfff; /* default, no limitation */
2660         ixgbe_max_interrupt_rate = 0;
2661         if (rate > 0 && rate < 500000) {
2662                 if (rate < 1000)
2663                         rate = 1000;
2664                 ixgbe_max_interrupt_rate = rate;
2665                 reg |= ((4000000/rate) & 0xff8);
2666         }
2667         IXGBE_WRITE_REG(&que->sc->hw, IXGBE_EITR(que->msix), reg);
2668
2669         return (0);
2670 } /* ixgbe_sysctl_interrupt_rate_handler */
2671
2672 /************************************************************************
2673  * ixgbe_add_device_sysctls
2674  ************************************************************************/
2675 static void
2676 ixgbe_add_device_sysctls(if_ctx_t ctx)
2677 {
2678         struct ixgbe_softc         *sc = iflib_get_softc(ctx);
2679         device_t               dev = iflib_get_dev(ctx);
2680         struct ixgbe_hw        *hw = &sc->hw;
2681         struct sysctl_oid_list *child;
2682         struct sysctl_ctx_list *ctx_list;
2683
2684         ctx_list = device_get_sysctl_ctx(dev);
2685         child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
2686
2687         /* Sysctls for all devices */
2688         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "fc",
2689             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2690             sc, 0, ixgbe_sysctl_flowcntl, "I",
2691             IXGBE_SYSCTL_DESC_SET_FC);
2692
2693         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "advertise_speed",
2694             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2695             sc, 0, ixgbe_sysctl_advertise, "I",
2696             IXGBE_SYSCTL_DESC_ADV_SPEED);
2697
2698         sc->enable_aim = ixgbe_enable_aim;
2699         SYSCTL_ADD_INT(ctx_list, child, OID_AUTO, "enable_aim", CTLFLAG_RW,
2700             &sc->enable_aim, 0, "Interrupt Moderation");
2701
2702         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "fw_version",
2703             CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0,
2704             ixgbe_sysctl_print_fw_version, "A", "Prints FW/NVM Versions");
2705
2706 #ifdef IXGBE_DEBUG
2707         /* testing sysctls (for all devices) */
2708         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "power_state",
2709             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2710             sc, 0, ixgbe_sysctl_power_state,
2711             "I", "PCI Power State");
2712
2713         SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "print_rss_config",
2714             CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0,
2715             ixgbe_sysctl_print_rss_config, "A", "Prints RSS Configuration");
2716 #endif
2717         /* for X550 series devices */
2718         if (hw->mac.type >= ixgbe_mac_X550)
2719                 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "dmac",
2720                     CTLTYPE_U16 | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2721                     sc, 0, ixgbe_sysctl_dmac,
2722                     "I", "DMA Coalesce");
2723
2724         /* for WoL-capable devices */
2725         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2726                 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wol_enable",
2727                     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0,
2728                     ixgbe_sysctl_wol_enable, "I", "Enable/Disable Wake on LAN");
2729
2730                 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wufc",
2731                     CTLTYPE_U32 | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2732                     sc, 0, ixgbe_sysctl_wufc,
2733                     "I", "Enable/Disable Wake Up Filters");
2734         }
2735
2736         /* for X552/X557-AT devices */
2737         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2738                 struct sysctl_oid *phy_node;
2739                 struct sysctl_oid_list *phy_list;
2740
2741                 phy_node = SYSCTL_ADD_NODE(ctx_list, child, OID_AUTO, "phy",
2742                     CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "External PHY sysctls");
2743                 phy_list = SYSCTL_CHILDREN(phy_node);
2744
2745                 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO, "temp",
2746                     CTLTYPE_U16 | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
2747                     sc, 0, ixgbe_sysctl_phy_temp,
2748                     "I", "Current External PHY Temperature (Celsius)");
2749
2750                 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO,
2751                     "overtemp_occurred",
2752                     CTLTYPE_U16 | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0,
2753                     ixgbe_sysctl_phy_overtemp_occurred, "I",
2754                     "External PHY High Temperature Event Occurred");
2755         }
2756
2757         if (sc->feat_cap & IXGBE_FEATURE_EEE) {
2758                 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "eee_state",
2759                     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0,
2760                     ixgbe_sysctl_eee_state, "I", "EEE Power Save State");
2761         }
2762 } /* ixgbe_add_device_sysctls */
2763
2764 /************************************************************************
2765  * ixgbe_allocate_pci_resources
2766  ************************************************************************/
2767 static int
2768 ixgbe_allocate_pci_resources(if_ctx_t ctx)
2769 {
2770         struct ixgbe_softc *sc = iflib_get_softc(ctx);
2771         device_t        dev = iflib_get_dev(ctx);
2772         int             rid;
2773
2774         rid = PCIR_BAR(0);
2775         sc->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
2776             RF_ACTIVE);
2777
2778         if (!(sc->pci_mem)) {
2779                 device_printf(dev, "Unable to allocate bus resource: memory\n");
2780                 return (ENXIO);
2781         }
2782
2783         /* Save bus_space values for READ/WRITE_REG macros */
2784         sc->osdep.mem_bus_space_tag = rman_get_bustag(sc->pci_mem);
2785         sc->osdep.mem_bus_space_handle =
2786             rman_get_bushandle(sc->pci_mem);
2787         /* Set hw values for shared code */
2788         sc->hw.hw_addr = (u8 *)&sc->osdep.mem_bus_space_handle;
2789
2790         return (0);
2791 } /* ixgbe_allocate_pci_resources */
2792
2793 /************************************************************************
2794  * ixgbe_detach - Device removal routine
2795  *
2796  *   Called when the driver is being removed.
2797  *   Stops the adapter and deallocates all the resources
2798  *   that were allocated for driver operation.
2799  *
2800  *   return 0 on success, positive on failure
2801  ************************************************************************/
2802 static int
2803 ixgbe_if_detach(if_ctx_t ctx)
2804 {
2805         struct ixgbe_softc *sc = iflib_get_softc(ctx);
2806         device_t       dev = iflib_get_dev(ctx);
2807         u32            ctrl_ext;
2808
2809         INIT_DEBUGOUT("ixgbe_detach: begin");
2810
2811         if (ixgbe_pci_iov_detach(dev) != 0) {
2812                 device_printf(dev, "SR-IOV in use; detach first.\n");
2813                 return (EBUSY);
2814         }
2815
2816         ixgbe_setup_low_power_mode(ctx);
2817
2818         /* let hardware know driver is unloading */
2819         ctrl_ext = IXGBE_READ_REG(&sc->hw, IXGBE_CTRL_EXT);
2820         ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
2821         IXGBE_WRITE_REG(&sc->hw, IXGBE_CTRL_EXT, ctrl_ext);
2822
2823         ixgbe_free_pci_resources(ctx);
2824         free(sc->mta, M_IXGBE);
2825
2826         return (0);
2827 } /* ixgbe_if_detach */
2828
2829 /************************************************************************
2830  * ixgbe_setup_low_power_mode - LPLU/WoL preparation
2831  *
2832  *   Prepare the adapter/port for LPLU and/or WoL
2833  ************************************************************************/
2834 static int
2835 ixgbe_setup_low_power_mode(if_ctx_t ctx)
2836 {
2837         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
2838         struct ixgbe_hw *hw = &sc->hw;
2839         device_t        dev = iflib_get_dev(ctx);
2840         s32             error = 0;
2841
2842         if (!hw->wol_enabled)
2843                 ixgbe_set_phy_power(hw, false);
2844
2845         /* Limit power management flow to X550EM baseT */
2846         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
2847             hw->phy.ops.enter_lplu) {
2848                 /* Turn off support for APM wakeup. (Using ACPI instead) */
2849                 IXGBE_WRITE_REG(hw, IXGBE_GRC,
2850                     IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
2851
2852                 /*
2853                  * Clear Wake Up Status register to prevent any previous wakeup
2854                  * events from waking us up immediately after we suspend.
2855                  */
2856                 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2857
2858                 /*
2859                  * Program the Wakeup Filter Control register with user filter
2860                  * settings
2861                  */
2862                 IXGBE_WRITE_REG(hw, IXGBE_WUFC, sc->wufc);
2863
2864                 /* Enable wakeups and power management in Wakeup Control */
2865                 IXGBE_WRITE_REG(hw, IXGBE_WUC,
2866                     IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
2867
2868                 /* X550EM baseT adapters need a special LPLU flow */
2869                 hw->phy.reset_disable = true;
2870                 ixgbe_if_stop(ctx);
2871                 error = hw->phy.ops.enter_lplu(hw);
2872                 if (error)
2873                         device_printf(dev, "Error entering LPLU: %d\n", error);
2874                 hw->phy.reset_disable = false;
2875         } else {
2876                 /* Just stop for other adapters */
2877                 ixgbe_if_stop(ctx);
2878         }
2879
2880         return error;
2881 } /* ixgbe_setup_low_power_mode */
2882
2883 /************************************************************************
2884  * ixgbe_shutdown - Shutdown entry point
2885  ************************************************************************/
2886 static int
2887 ixgbe_if_shutdown(if_ctx_t ctx)
2888 {
2889         int error = 0;
2890
2891         INIT_DEBUGOUT("ixgbe_shutdown: begin");
2892
2893         error = ixgbe_setup_low_power_mode(ctx);
2894
2895         return (error);
2896 } /* ixgbe_if_shutdown */
2897
2898 /************************************************************************
2899  * ixgbe_suspend
2900  *
2901  *   From D0 to D3
2902  ************************************************************************/
2903 static int
2904 ixgbe_if_suspend(if_ctx_t ctx)
2905 {
2906         int error = 0;
2907
2908         INIT_DEBUGOUT("ixgbe_suspend: begin");
2909
2910         error = ixgbe_setup_low_power_mode(ctx);
2911
2912         return (error);
2913 } /* ixgbe_if_suspend */
2914
2915 /************************************************************************
2916  * ixgbe_resume
2917  *
2918  *   From D3 to D0
2919  ************************************************************************/
2920 static int
2921 ixgbe_if_resume(if_ctx_t ctx)
2922 {
2923         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
2924         device_t        dev = iflib_get_dev(ctx);
2925         struct ifnet    *ifp = iflib_get_ifp(ctx);
2926         struct ixgbe_hw *hw = &sc->hw;
2927         u32             wus;
2928
2929         INIT_DEBUGOUT("ixgbe_resume: begin");
2930
2931         /* Read & clear WUS register */
2932         wus = IXGBE_READ_REG(hw, IXGBE_WUS);
2933         if (wus)
2934                 device_printf(dev, "Woken up by (WUS): %#010x\n",
2935                     IXGBE_READ_REG(hw, IXGBE_WUS));
2936         IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2937         /* And clear WUFC until next low-power transition */
2938         IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
2939
2940         /*
2941          * Required after D3->D0 transition;
2942          * will re-advertise all previous advertised speeds
2943          */
2944         if (ifp->if_flags & IFF_UP)
2945                 ixgbe_if_init(ctx);
2946
2947         return (0);
2948 } /* ixgbe_if_resume */
2949
2950 /************************************************************************
2951  * ixgbe_if_mtu_set - Ioctl mtu entry point
2952  *
2953  *   Return 0 on success, EINVAL on failure
2954  ************************************************************************/
2955 static int
2956 ixgbe_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
2957 {
2958         struct ixgbe_softc *sc = iflib_get_softc(ctx);
2959         int error = 0;
2960
2961         IOCTL_DEBUGOUT("ioctl: SIOCIFMTU (Set Interface MTU)");
2962
2963         if (mtu > IXGBE_MAX_MTU) {
2964                 error = EINVAL;
2965         } else {
2966                 sc->max_frame_size = mtu + IXGBE_MTU_HDR;
2967         }
2968
2969         return error;
2970 } /* ixgbe_if_mtu_set */
2971
2972 /************************************************************************
2973  * ixgbe_if_crcstrip_set
2974  ************************************************************************/
2975 static void
2976 ixgbe_if_crcstrip_set(if_ctx_t ctx, int onoff, int crcstrip)
2977 {
2978         struct ixgbe_softc *sc = iflib_get_softc(ctx);
2979         struct ixgbe_hw *hw = &sc->hw;
2980         /* crc stripping is set in two places:
2981          * IXGBE_HLREG0 (modified on init_locked and hw reset)
2982          * IXGBE_RDRXCTL (set by the original driver in
2983          *      ixgbe_setup_hw_rsc() called in init_locked.
2984          *      We disable the setting when netmap is compiled in).
2985          * We update the values here, but also in ixgbe.c because
2986          * init_locked sometimes is called outside our control.
2987          */
2988         uint32_t hl, rxc;
2989
2990         hl = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2991         rxc = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2992 #ifdef NETMAP
2993         if (netmap_verbose)
2994                 D("%s read  HLREG 0x%x rxc 0x%x",
2995                         onoff ? "enter" : "exit", hl, rxc);
2996 #endif
2997         /* hw requirements ... */
2998         rxc &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
2999         rxc |= IXGBE_RDRXCTL_RSCACKC;
3000         if (onoff && !crcstrip) {
3001                 /* keep the crc. Fast rx */
3002                 hl &= ~IXGBE_HLREG0_RXCRCSTRP;
3003                 rxc &= ~IXGBE_RDRXCTL_CRCSTRIP;
3004         } else {
3005                 /* reset default mode */
3006                 hl |= IXGBE_HLREG0_RXCRCSTRP;
3007                 rxc |= IXGBE_RDRXCTL_CRCSTRIP;
3008         }
3009 #ifdef NETMAP
3010         if (netmap_verbose)
3011                 D("%s write HLREG 0x%x rxc 0x%x",
3012                         onoff ? "enter" : "exit", hl, rxc);
3013 #endif
3014         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hl);
3015         IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rxc);
3016 } /* ixgbe_if_crcstrip_set */
3017
3018 /*********************************************************************
3019  * ixgbe_if_init - Init entry point
3020  *
3021  *   Used in two ways: It is used by the stack as an init
3022  *   entry point in network interface structure. It is also
3023  *   used by the driver as a hw/sw initialization routine to
3024  *   get to a consistent state.
3025  *
3026  *   Return 0 on success, positive on failure
3027  **********************************************************************/
3028 void
3029 ixgbe_if_init(if_ctx_t ctx)
3030 {
3031         struct ixgbe_softc     *sc = iflib_get_softc(ctx);
3032         struct ifnet       *ifp = iflib_get_ifp(ctx);
3033         device_t           dev = iflib_get_dev(ctx);
3034         struct ixgbe_hw *hw = &sc->hw;
3035         struct ix_rx_queue *rx_que;
3036         struct ix_tx_queue *tx_que;
3037         u32             txdctl, mhadd;
3038         u32             rxdctl, rxctrl;
3039         u32             ctrl_ext;
3040
3041         int             i, j, err;
3042
3043         INIT_DEBUGOUT("ixgbe_if_init: begin");
3044
3045         /* Queue indices may change with IOV mode */
3046         ixgbe_align_all_queue_indices(sc);
3047
3048         /* reprogram the RAR[0] in case user changed it. */
3049         ixgbe_set_rar(hw, 0, hw->mac.addr, sc->pool, IXGBE_RAH_AV);
3050
3051         /* Get the latest mac address, User can use a LAA */
3052         bcopy(IF_LLADDR(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
3053         ixgbe_set_rar(hw, 0, hw->mac.addr, sc->pool, 1);
3054         hw->addr_ctrl.rar_used_count = 1;
3055
3056         ixgbe_init_hw(hw);
3057
3058         ixgbe_initialize_iov(sc);
3059
3060         ixgbe_initialize_transmit_units(ctx);
3061
3062         /* Setup Multicast table */
3063         ixgbe_if_multi_set(ctx);
3064
3065         /* Determine the correct mbuf pool, based on frame size */
3066         sc->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx);
3067
3068         /* Configure RX settings */
3069         ixgbe_initialize_receive_units(ctx);
3070
3071         /*
3072          * Initialize variable holding task enqueue requests
3073          * from MSI-X interrupts
3074          */
3075         sc->task_requests = 0;
3076
3077         /* Enable SDP & MSI-X interrupts based on adapter */
3078         ixgbe_config_gpie(sc);
3079
3080         /* Set MTU size */
3081         if (ifp->if_mtu > ETHERMTU) {
3082                 /* aka IXGBE_MAXFRS on 82599 and newer */
3083                 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
3084                 mhadd &= ~IXGBE_MHADD_MFS_MASK;
3085                 mhadd |= sc->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
3086                 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
3087         }
3088
3089         /* Now enable all the queues */
3090         for (i = 0, tx_que = sc->tx_queues; i < sc->num_tx_queues; i++, tx_que++) {
3091                 struct tx_ring *txr = &tx_que->txr;
3092
3093                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
3094                 txdctl |= IXGBE_TXDCTL_ENABLE;
3095                 /* Set WTHRESH to 8, burst writeback */
3096                 txdctl |= (8 << 16);
3097                 /*
3098                  * When the internal queue falls below PTHRESH (32),
3099                  * start prefetching as long as there are at least
3100                  * HTHRESH (1) buffers ready. The values are taken
3101                  * from the Intel linux driver 3.8.21.
3102                  * Prefetching enables tx line rate even with 1 queue.
3103                  */
3104                 txdctl |= (32 << 0) | (1 << 8);
3105                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
3106         }
3107
3108         for (i = 0, rx_que = sc->rx_queues; i < sc->num_rx_queues; i++, rx_que++) {
3109                 struct rx_ring *rxr = &rx_que->rxr;
3110
3111                 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
3112                 if (hw->mac.type == ixgbe_mac_82598EB) {
3113                         /*
3114                          * PTHRESH = 21
3115                          * HTHRESH = 4
3116                          * WTHRESH = 8
3117                          */
3118                         rxdctl &= ~0x3FFFFF;
3119                         rxdctl |= 0x080420;
3120                 }
3121                 rxdctl |= IXGBE_RXDCTL_ENABLE;
3122                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
3123                 for (j = 0; j < 10; j++) {
3124                         if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
3125                             IXGBE_RXDCTL_ENABLE)
3126                                 break;
3127                         else
3128                                 msec_delay(1);
3129                 }
3130                 wmb();
3131         }
3132
3133         /* Enable Receive engine */
3134         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3135         if (hw->mac.type == ixgbe_mac_82598EB)
3136                 rxctrl |= IXGBE_RXCTRL_DMBYPS;
3137         rxctrl |= IXGBE_RXCTRL_RXEN;
3138         ixgbe_enable_rx_dma(hw, rxctrl);
3139
3140         /* Set up MSI/MSI-X routing */
3141         if (ixgbe_enable_msix)  {
3142                 ixgbe_configure_ivars(sc);
3143                 /* Set up auto-mask */
3144                 if (hw->mac.type == ixgbe_mac_82598EB)
3145                         IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
3146                 else {
3147                         IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
3148                         IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
3149                 }
3150         } else {  /* Simple settings for Legacy/MSI */
3151                 ixgbe_set_ivar(sc, 0, 0, 0);
3152                 ixgbe_set_ivar(sc, 0, 0, 1);
3153                 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
3154         }
3155
3156         ixgbe_init_fdir(sc);
3157
3158         /*
3159          * Check on any SFP devices that
3160          * need to be kick-started
3161          */
3162         if (hw->phy.type == ixgbe_phy_none) {
3163                 err = hw->phy.ops.identify(hw);
3164                 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3165                         device_printf(dev,
3166                             "Unsupported SFP+ module type was detected.\n");
3167                         return;
3168                 }
3169         }
3170
3171         /* Set moderation on the Link interrupt */
3172         IXGBE_WRITE_REG(hw, IXGBE_EITR(sc->vector), IXGBE_LINK_ITR);
3173
3174         /* Enable power to the phy. */
3175         ixgbe_set_phy_power(hw, true);
3176
3177         /* Config/Enable Link */
3178         ixgbe_config_link(ctx);
3179
3180         /* Hardware Packet Buffer & Flow Control setup */
3181         ixgbe_config_delay_values(sc);
3182
3183         /* Initialize the FC settings */
3184         ixgbe_start_hw(hw);
3185
3186         /* Set up VLAN support and filter */
3187         ixgbe_setup_vlan_hw_support(ctx);
3188
3189         /* Setup DMA Coalescing */
3190         ixgbe_config_dmac(sc);
3191
3192         /* And now turn on interrupts */
3193         ixgbe_if_enable_intr(ctx);
3194
3195         /* Enable the use of the MBX by the VF's */
3196         if (sc->feat_en & IXGBE_FEATURE_SRIOV) {
3197                 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
3198                 ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
3199                 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
3200         }
3201
3202 } /* ixgbe_init_locked */
3203
3204 /************************************************************************
3205  * ixgbe_set_ivar
3206  *
3207  *   Setup the correct IVAR register for a particular MSI-X interrupt
3208  *     (yes this is all very magic and confusing :)
3209  *    - entry is the register array entry
3210  *    - vector is the MSI-X vector for this queue
3211  *    - type is RX/TX/MISC
3212  ************************************************************************/
3213 static void
3214 ixgbe_set_ivar(struct ixgbe_softc *sc, u8 entry, u8 vector, s8 type)
3215 {
3216         struct ixgbe_hw *hw = &sc->hw;
3217         u32 ivar, index;
3218
3219         vector |= IXGBE_IVAR_ALLOC_VAL;
3220
3221         switch (hw->mac.type) {
3222         case ixgbe_mac_82598EB:
3223                 if (type == -1)
3224                         entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
3225                 else
3226                         entry += (type * 64);
3227                 index = (entry >> 2) & 0x1F;
3228                 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
3229                 ivar &= ~(0xFF << (8 * (entry & 0x3)));
3230                 ivar |= (vector << (8 * (entry & 0x3)));
3231                 IXGBE_WRITE_REG(&sc->hw, IXGBE_IVAR(index), ivar);
3232                 break;
3233         case ixgbe_mac_82599EB:
3234         case ixgbe_mac_X540:
3235         case ixgbe_mac_X550:
3236         case ixgbe_mac_X550EM_x:
3237         case ixgbe_mac_X550EM_a:
3238                 if (type == -1) { /* MISC IVAR */
3239                         index = (entry & 1) * 8;
3240                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
3241                         ivar &= ~(0xFF << index);
3242                         ivar |= (vector << index);
3243                         IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
3244                 } else {          /* RX/TX IVARS */
3245                         index = (16 * (entry & 1)) + (8 * type);
3246                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
3247                         ivar &= ~(0xFF << index);
3248                         ivar |= (vector << index);
3249                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
3250                 }
3251         default:
3252                 break;
3253         }
3254 } /* ixgbe_set_ivar */
3255
3256 /************************************************************************
3257  * ixgbe_configure_ivars
3258  ************************************************************************/
3259 static void
3260 ixgbe_configure_ivars(struct ixgbe_softc *sc)
3261 {
3262         struct ix_rx_queue *rx_que = sc->rx_queues;
3263         struct ix_tx_queue *tx_que = sc->tx_queues;
3264         u32                newitr;
3265
3266         if (ixgbe_max_interrupt_rate > 0)
3267                 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
3268         else {
3269                 /*
3270                  * Disable DMA coalescing if interrupt moderation is
3271                  * disabled.
3272                  */
3273                 sc->dmac = 0;
3274                 newitr = 0;
3275         }
3276
3277         for (int i = 0; i < sc->num_rx_queues; i++, rx_que++) {
3278                 struct rx_ring *rxr = &rx_que->rxr;
3279
3280                 /* First the RX queue entry */
3281                 ixgbe_set_ivar(sc, rxr->me, rx_que->msix, 0);
3282
3283                 /* Set an Initial EITR value */
3284                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EITR(rx_que->msix), newitr);
3285         }
3286         for (int i = 0; i < sc->num_tx_queues; i++, tx_que++) {
3287                 struct tx_ring *txr = &tx_que->txr;
3288
3289                 /* ... and the TX */
3290                 ixgbe_set_ivar(sc, txr->me, tx_que->msix, 1);
3291         }
3292         /* For the Link interrupt */
3293         ixgbe_set_ivar(sc, 1, sc->vector, -1);
3294 } /* ixgbe_configure_ivars */
3295
3296 /************************************************************************
3297  * ixgbe_config_gpie
3298  ************************************************************************/
3299 static void
3300 ixgbe_config_gpie(struct ixgbe_softc *sc)
3301 {
3302         struct ixgbe_hw *hw = &sc->hw;
3303         u32             gpie;
3304
3305         gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
3306
3307         if (sc->intr_type == IFLIB_INTR_MSIX) {
3308                 /* Enable Enhanced MSI-X mode */
3309                 gpie |= IXGBE_GPIE_MSIX_MODE
3310                      |  IXGBE_GPIE_EIAME
3311                      |  IXGBE_GPIE_PBA_SUPPORT
3312                      |  IXGBE_GPIE_OCD;
3313         }
3314
3315         /* Fan Failure Interrupt */
3316         if (sc->feat_en & IXGBE_FEATURE_FAN_FAIL)
3317                 gpie |= IXGBE_SDP1_GPIEN;
3318
3319         /* Thermal Sensor Interrupt */
3320         if (sc->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
3321                 gpie |= IXGBE_SDP0_GPIEN_X540;
3322
3323         /* Link detection */
3324         switch (hw->mac.type) {
3325         case ixgbe_mac_82599EB:
3326                 gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
3327                 break;
3328         case ixgbe_mac_X550EM_x:
3329         case ixgbe_mac_X550EM_a:
3330                 gpie |= IXGBE_SDP0_GPIEN_X540;
3331                 break;
3332         default:
3333                 break;
3334         }
3335
3336         IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
3337
3338 } /* ixgbe_config_gpie */
3339
3340 /************************************************************************
3341  * ixgbe_config_delay_values
3342  *
3343  *   Requires sc->max_frame_size to be set.
3344  ************************************************************************/
3345 static void
3346 ixgbe_config_delay_values(struct ixgbe_softc *sc)
3347 {
3348         struct ixgbe_hw *hw = &sc->hw;
3349         u32             rxpb, frame, size, tmp;
3350
3351         frame = sc->max_frame_size;
3352
3353         /* Calculate High Water */
3354         switch (hw->mac.type) {
3355         case ixgbe_mac_X540:
3356         case ixgbe_mac_X550:
3357         case ixgbe_mac_X550EM_x:
3358         case ixgbe_mac_X550EM_a:
3359                 tmp = IXGBE_DV_X540(frame, frame);
3360                 break;
3361         default:
3362                 tmp = IXGBE_DV(frame, frame);
3363                 break;
3364         }
3365         size = IXGBE_BT2KB(tmp);
3366         rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
3367         hw->fc.high_water[0] = rxpb - size;
3368
3369         /* Now calculate Low Water */
3370         switch (hw->mac.type) {
3371         case ixgbe_mac_X540:
3372         case ixgbe_mac_X550:
3373         case ixgbe_mac_X550EM_x:
3374         case ixgbe_mac_X550EM_a:
3375                 tmp = IXGBE_LOW_DV_X540(frame);
3376                 break;
3377         default:
3378                 tmp = IXGBE_LOW_DV(frame);
3379                 break;
3380         }
3381         hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
3382
3383         hw->fc.pause_time = IXGBE_FC_PAUSE;
3384         hw->fc.send_xon = true;
3385 } /* ixgbe_config_delay_values */
3386
3387 /************************************************************************
3388  * ixgbe_set_multi - Multicast Update
3389  *
3390  *   Called whenever multicast address list is updated.
3391  ************************************************************************/
3392 static u_int
3393 ixgbe_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int idx)
3394 {
3395         struct ixgbe_softc *sc = arg;
3396         struct ixgbe_mc_addr *mta = sc->mta;
3397
3398         if (idx == MAX_NUM_MULTICAST_ADDRESSES)
3399                 return (0);
3400         bcopy(LLADDR(sdl), mta[idx].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
3401         mta[idx].vmdq = sc->pool;
3402
3403         return (1);
3404 } /* ixgbe_mc_filter_apply */
3405
3406 static void
3407 ixgbe_if_multi_set(if_ctx_t ctx)
3408 {
3409         struct ixgbe_softc       *sc = iflib_get_softc(ctx);
3410         struct ixgbe_mc_addr *mta;
3411         struct ifnet         *ifp = iflib_get_ifp(ctx);
3412         u8                   *update_ptr;
3413         u32                  fctrl;
3414         u_int                mcnt;
3415
3416         IOCTL_DEBUGOUT("ixgbe_if_multi_set: begin");
3417
3418         mta = sc->mta;
3419         bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
3420
3421         mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixgbe_mc_filter_apply, sc);
3422
3423         if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
3424                 update_ptr = (u8 *)mta;
3425                 ixgbe_update_mc_addr_list(&sc->hw, update_ptr, mcnt,
3426                     ixgbe_mc_array_itr, true);
3427         }
3428
3429         fctrl = IXGBE_READ_REG(&sc->hw, IXGBE_FCTRL);
3430
3431         if (ifp->if_flags & IFF_PROMISC)
3432                 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3433         else if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES ||
3434             ifp->if_flags & IFF_ALLMULTI) {
3435                 fctrl |= IXGBE_FCTRL_MPE;
3436                 fctrl &= ~IXGBE_FCTRL_UPE;
3437         } else
3438                 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3439
3440         IXGBE_WRITE_REG(&sc->hw, IXGBE_FCTRL, fctrl);
3441 } /* ixgbe_if_multi_set */
3442
3443 /************************************************************************
3444  * ixgbe_mc_array_itr
3445  *
3446  *   An iterator function needed by the multicast shared code.
3447  *   It feeds the shared code routine the addresses in the
3448  *   array of ixgbe_set_multi() one by one.
3449  ************************************************************************/
3450 static u8 *
3451 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
3452 {
3453         struct ixgbe_mc_addr *mta;
3454
3455         mta = (struct ixgbe_mc_addr *)*update_ptr;
3456         *vmdq = mta->vmdq;
3457
3458         *update_ptr = (u8*)(mta + 1);
3459
3460         return (mta->addr);
3461 } /* ixgbe_mc_array_itr */
3462
3463 /************************************************************************
3464  * ixgbe_local_timer - Timer routine
3465  *
3466  *   Checks for link status, updates statistics,
3467  *   and runs the watchdog check.
3468  ************************************************************************/
3469 static void
3470 ixgbe_if_timer(if_ctx_t ctx, uint16_t qid)
3471 {
3472         struct ixgbe_softc *sc = iflib_get_softc(ctx);
3473
3474         if (qid != 0)
3475                 return;
3476
3477         /* Check for pluggable optics */
3478         if (sc->sfp_probe)
3479                 if (!ixgbe_sfp_probe(ctx))
3480                         return; /* Nothing to do */
3481
3482         ixgbe_check_link(&sc->hw, &sc->link_speed, &sc->link_up, 0);
3483
3484         /* Fire off the adminq task */
3485         iflib_admin_intr_deferred(ctx);
3486
3487 } /* ixgbe_if_timer */
3488
3489 /************************************************************************
3490  * ixgbe_sfp_probe
3491  *
3492  *   Determine if a port had optics inserted.
3493  ************************************************************************/
3494 static bool
3495 ixgbe_sfp_probe(if_ctx_t ctx)
3496 {
3497         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
3498         struct ixgbe_hw *hw = &sc->hw;
3499         device_t        dev = iflib_get_dev(ctx);
3500         bool            result = false;
3501
3502         if ((hw->phy.type == ixgbe_phy_nl) &&
3503             (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
3504                 s32 ret = hw->phy.ops.identify_sfp(hw);
3505                 if (ret)
3506                         goto out;
3507                 ret = hw->phy.ops.reset(hw);
3508                 sc->sfp_probe = false;
3509                 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3510                         device_printf(dev, "Unsupported SFP+ module detected!");
3511                         device_printf(dev,
3512                             "Reload driver with supported module.\n");
3513                         goto out;
3514                 } else
3515                         device_printf(dev, "SFP+ module detected!\n");
3516                 /* We now have supported optics */
3517                 result = true;
3518         }
3519 out:
3520
3521         return (result);
3522 } /* ixgbe_sfp_probe */
3523
3524 /************************************************************************
3525  * ixgbe_handle_mod - Tasklet for SFP module interrupts
3526  ************************************************************************/
3527 static void
3528 ixgbe_handle_mod(void *context)
3529 {
3530         if_ctx_t        ctx = context;
3531         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
3532         struct ixgbe_hw *hw = &sc->hw;
3533         device_t        dev = iflib_get_dev(ctx);
3534         u32             err, cage_full = 0;
3535
3536         if (sc->hw.need_crosstalk_fix) {
3537                 switch (hw->mac.type) {
3538                 case ixgbe_mac_82599EB:
3539                         cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3540                             IXGBE_ESDP_SDP2;
3541                         break;
3542                 case ixgbe_mac_X550EM_x:
3543                 case ixgbe_mac_X550EM_a:
3544                         cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3545                             IXGBE_ESDP_SDP0;
3546                         break;
3547                 default:
3548                         break;
3549                 }
3550
3551                 if (!cage_full)
3552                         goto handle_mod_out;
3553         }
3554
3555         err = hw->phy.ops.identify_sfp(hw);
3556         if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3557                 device_printf(dev,
3558                     "Unsupported SFP+ module type was detected.\n");
3559                 goto handle_mod_out;
3560         }
3561
3562         if (hw->mac.type == ixgbe_mac_82598EB)
3563                 err = hw->phy.ops.reset(hw);
3564         else
3565                 err = hw->mac.ops.setup_sfp(hw);
3566
3567         if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3568                 device_printf(dev,
3569                     "Setup failure - unsupported SFP+ module type.\n");
3570                 goto handle_mod_out;
3571         }
3572         sc->task_requests |= IXGBE_REQUEST_TASK_MSF;
3573         return;
3574
3575 handle_mod_out:
3576         sc->task_requests &= ~(IXGBE_REQUEST_TASK_MSF);
3577 } /* ixgbe_handle_mod */
3578
3579
3580 /************************************************************************
3581  * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
3582  ************************************************************************/
3583 static void
3584 ixgbe_handle_msf(void *context)
3585 {
3586         if_ctx_t        ctx = context;
3587         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
3588         struct ixgbe_hw *hw = &sc->hw;
3589         u32             autoneg;
3590         bool            negotiate;
3591
3592         /* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
3593         sc->phy_layer = ixgbe_get_supported_physical_layer(hw);
3594
3595         autoneg = hw->phy.autoneg_advertised;
3596         if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
3597                 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
3598         if (hw->mac.ops.setup_link)
3599                 hw->mac.ops.setup_link(hw, autoneg, true);
3600
3601         /* Adjust media types shown in ifconfig */
3602         ifmedia_removeall(sc->media);
3603         ixgbe_add_media_types(sc->ctx);
3604         ifmedia_set(sc->media, IFM_ETHER | IFM_AUTO);
3605 } /* ixgbe_handle_msf */
3606
3607 /************************************************************************
3608  * ixgbe_handle_phy - Tasklet for external PHY interrupts
3609  ************************************************************************/
3610 static void
3611 ixgbe_handle_phy(void *context)
3612 {
3613         if_ctx_t        ctx = context;
3614         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
3615         struct ixgbe_hw *hw = &sc->hw;
3616         int             error;
3617
3618         error = hw->phy.ops.handle_lasi(hw);
3619         if (error == IXGBE_ERR_OVERTEMP)
3620                 device_printf(sc->dev, "CRITICAL: EXTERNAL PHY OVER TEMP!!  PHY will downshift to lower power state!\n");
3621         else if (error)
3622                 device_printf(sc->dev,
3623                     "Error handling LASI interrupt: %d\n", error);
3624 } /* ixgbe_handle_phy */
3625
3626 /************************************************************************
3627  * ixgbe_if_stop - Stop the hardware
3628  *
3629  *   Disables all traffic on the adapter by issuing a
3630  *   global reset on the MAC and deallocates TX/RX buffers.
3631  ************************************************************************/
3632 static void
3633 ixgbe_if_stop(if_ctx_t ctx)
3634 {
3635         struct ixgbe_softc  *sc = iflib_get_softc(ctx);
3636         struct ixgbe_hw *hw = &sc->hw;
3637
3638         INIT_DEBUGOUT("ixgbe_if_stop: begin\n");
3639
3640         ixgbe_reset_hw(hw);
3641         hw->adapter_stopped = false;
3642         ixgbe_stop_adapter(hw);
3643         if (hw->mac.type == ixgbe_mac_82599EB)
3644                 ixgbe_stop_mac_link_on_d3_82599(hw);
3645         /* Turn off the laser - noop with no optics */
3646         ixgbe_disable_tx_laser(hw);
3647
3648         /* Update the stack */
3649         sc->link_up = false;
3650         ixgbe_if_update_admin_status(ctx);
3651
3652         /* reprogram the RAR[0] in case user changed it. */
3653         ixgbe_set_rar(&sc->hw, 0, sc->hw.mac.addr, 0, IXGBE_RAH_AV);
3654
3655         return;
3656 } /* ixgbe_if_stop */
3657
3658 /************************************************************************
3659  * ixgbe_update_link_status - Update OS on link state
3660  *
3661  * Note: Only updates the OS on the cached link state.
3662  *       The real check of the hardware only happens with
3663  *       a link interrupt.
3664  ************************************************************************/
3665 static void
3666 ixgbe_if_update_admin_status(if_ctx_t ctx)
3667 {
3668         struct ixgbe_softc *sc = iflib_get_softc(ctx);
3669         device_t       dev = iflib_get_dev(ctx);
3670
3671         if (sc->link_up) {
3672                 if (sc->link_active == false) {
3673                         if (bootverbose)
3674                                 device_printf(dev, "Link is up %d Gbps %s \n",
3675                                     ((sc->link_speed == 128) ? 10 : 1),
3676                                     "Full Duplex");
3677                         sc->link_active = true;
3678                         /* Update any Flow Control changes */
3679                         ixgbe_fc_enable(&sc->hw);
3680                         /* Update DMA coalescing config */
3681                         ixgbe_config_dmac(sc);
3682                         /* should actually be negotiated value */
3683                         iflib_link_state_change(ctx, LINK_STATE_UP, IF_Gbps(10));
3684
3685                         if (sc->feat_en & IXGBE_FEATURE_SRIOV)
3686                                 ixgbe_ping_all_vfs(sc);
3687                 }
3688         } else { /* Link down */
3689                 if (sc->link_active == true) {
3690                         if (bootverbose)
3691                                 device_printf(dev, "Link is Down\n");
3692                         iflib_link_state_change(ctx, LINK_STATE_DOWN, 0);
3693                         sc->link_active = false;
3694                         if (sc->feat_en & IXGBE_FEATURE_SRIOV)
3695                                 ixgbe_ping_all_vfs(sc);
3696                 }
3697         }
3698
3699         /* Handle task requests from msix_link() */
3700         if (sc->task_requests & IXGBE_REQUEST_TASK_MOD)
3701                 ixgbe_handle_mod(ctx);
3702         if (sc->task_requests & IXGBE_REQUEST_TASK_MSF)
3703                 ixgbe_handle_msf(ctx);
3704         if (sc->task_requests & IXGBE_REQUEST_TASK_MBX)
3705                 ixgbe_handle_mbx(ctx);
3706         if (sc->task_requests & IXGBE_REQUEST_TASK_FDIR)
3707                 ixgbe_reinit_fdir(ctx);
3708         if (sc->task_requests & IXGBE_REQUEST_TASK_PHY)
3709                 ixgbe_handle_phy(ctx);
3710         sc->task_requests = 0;
3711
3712         ixgbe_update_stats_counters(sc);
3713 } /* ixgbe_if_update_admin_status */
3714
3715 /************************************************************************
3716  * ixgbe_config_dmac - Configure DMA Coalescing
3717  ************************************************************************/
3718 static void
3719 ixgbe_config_dmac(struct ixgbe_softc *sc)
3720 {
3721         struct ixgbe_hw          *hw = &sc->hw;
3722         struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
3723
3724         if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
3725                 return;
3726
3727         if (dcfg->watchdog_timer ^ sc->dmac ||
3728             dcfg->link_speed ^ sc->link_speed) {
3729                 dcfg->watchdog_timer = sc->dmac;
3730                 dcfg->fcoe_en = false;
3731                 dcfg->link_speed = sc->link_speed;
3732                 dcfg->num_tcs = 1;
3733
3734                 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
3735                     dcfg->watchdog_timer, dcfg->link_speed);
3736
3737                 hw->mac.ops.dmac_config(hw);
3738         }
3739 } /* ixgbe_config_dmac */
3740
3741 /************************************************************************
3742  * ixgbe_if_enable_intr
3743  ************************************************************************/
3744 void
3745 ixgbe_if_enable_intr(if_ctx_t ctx)
3746 {
3747         struct ixgbe_softc     *sc = iflib_get_softc(ctx);
3748         struct ixgbe_hw    *hw = &sc->hw;
3749         struct ix_rx_queue *que = sc->rx_queues;
3750         u32                mask, fwsm;
3751
3752         mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3753
3754         switch (sc->hw.mac.type) {
3755         case ixgbe_mac_82599EB:
3756                 mask |= IXGBE_EIMS_ECC;
3757                 /* Temperature sensor on some scs */
3758                 mask |= IXGBE_EIMS_GPI_SDP0;
3759                 /* SFP+ (RX_LOS_N & MOD_ABS_N) */
3760                 mask |= IXGBE_EIMS_GPI_SDP1;
3761                 mask |= IXGBE_EIMS_GPI_SDP2;
3762                 break;
3763         case ixgbe_mac_X540:
3764                 /* Detect if Thermal Sensor is enabled */
3765                 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
3766                 if (fwsm & IXGBE_FWSM_TS_ENABLED)
3767                         mask |= IXGBE_EIMS_TS;
3768                 mask |= IXGBE_EIMS_ECC;
3769                 break;
3770         case ixgbe_mac_X550:
3771                 /* MAC thermal sensor is automatically enabled */
3772                 mask |= IXGBE_EIMS_TS;
3773                 mask |= IXGBE_EIMS_ECC;
3774                 break;
3775         case ixgbe_mac_X550EM_x:
3776         case ixgbe_mac_X550EM_a:
3777                 /* Some devices use SDP0 for important information */
3778                 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
3779                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
3780                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
3781                     hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
3782                         mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
3783                 if (hw->phy.type == ixgbe_phy_x550em_ext_t)
3784                         mask |= IXGBE_EICR_GPI_SDP0_X540;
3785                 mask |= IXGBE_EIMS_ECC;
3786                 break;
3787         default:
3788                 break;
3789         }
3790
3791         /* Enable Fan Failure detection */
3792         if (sc->feat_en & IXGBE_FEATURE_FAN_FAIL)
3793                 mask |= IXGBE_EIMS_GPI_SDP1;
3794         /* Enable SR-IOV */
3795         if (sc->feat_en & IXGBE_FEATURE_SRIOV)
3796                 mask |= IXGBE_EIMS_MAILBOX;
3797         /* Enable Flow Director */
3798         if (sc->feat_en & IXGBE_FEATURE_FDIR)
3799                 mask |= IXGBE_EIMS_FLOW_DIR;
3800
3801         IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3802
3803         /* With MSI-X we use auto clear */
3804         if (sc->intr_type == IFLIB_INTR_MSIX) {
3805                 mask = IXGBE_EIMS_ENABLE_MASK;
3806                 /* Don't autoclear Link */
3807                 mask &= ~IXGBE_EIMS_OTHER;
3808                 mask &= ~IXGBE_EIMS_LSC;
3809                 if (sc->feat_cap & IXGBE_FEATURE_SRIOV)
3810                         mask &= ~IXGBE_EIMS_MAILBOX;
3811                 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
3812         }
3813
3814         /*
3815          * Now enable all queues, this is done separately to
3816          * allow for handling the extended (beyond 32) MSI-X
3817          * vectors that can be used by 82599
3818          */
3819         for (int i = 0; i < sc->num_rx_queues; i++, que++)
3820                 ixgbe_enable_queue(sc, que->msix);
3821
3822         IXGBE_WRITE_FLUSH(hw);
3823
3824 } /* ixgbe_if_enable_intr */
3825
3826 /************************************************************************
3827  * ixgbe_disable_intr
3828  ************************************************************************/
3829 static void
3830 ixgbe_if_disable_intr(if_ctx_t ctx)
3831 {
3832         struct ixgbe_softc *sc = iflib_get_softc(ctx);
3833
3834         if (sc->intr_type == IFLIB_INTR_MSIX)
3835                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EIAC, 0);
3836         if (sc->hw.mac.type == ixgbe_mac_82598EB) {
3837                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EIMC, ~0);
3838         } else {
3839                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EIMC, 0xFFFF0000);
3840                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EIMC_EX(0), ~0);
3841                 IXGBE_WRITE_REG(&sc->hw, IXGBE_EIMC_EX(1), ~0);
3842         }
3843         IXGBE_WRITE_FLUSH(&sc->hw);
3844
3845 } /* ixgbe_if_disable_intr */
3846
3847 /************************************************************************
3848  * ixgbe_link_intr_enable
3849  ************************************************************************/
3850 static void
3851 ixgbe_link_intr_enable(if_ctx_t ctx)
3852 {
3853         struct ixgbe_hw *hw = &((struct ixgbe_softc *)iflib_get_softc(ctx))->hw;
3854
3855         /* Re-enable other interrupts */
3856         IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
3857 } /* ixgbe_link_intr_enable */
3858
3859 /************************************************************************
3860  * ixgbe_if_rx_queue_intr_enable
3861  ************************************************************************/
3862 static int
3863 ixgbe_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
3864 {
3865         struct ixgbe_softc     *sc = iflib_get_softc(ctx);
3866         struct ix_rx_queue *que = &sc->rx_queues[rxqid];
3867
3868         ixgbe_enable_queue(sc, que->msix);
3869
3870         return (0);
3871 } /* ixgbe_if_rx_queue_intr_enable */
3872
3873 /************************************************************************
3874  * ixgbe_enable_queue
3875  ************************************************************************/
3876 static void
3877 ixgbe_enable_queue(struct ixgbe_softc *sc, u32 vector)
3878 {
3879         struct ixgbe_hw *hw = &sc->hw;
3880         u64             queue = 1ULL << vector;
3881         u32             mask;
3882
3883         if (hw->mac.type == ixgbe_mac_82598EB) {
3884                 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3885                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3886         } else {
3887                 mask = (queue & 0xFFFFFFFF);
3888                 if (mask)
3889                         IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
3890                 mask = (queue >> 32);
3891                 if (mask)
3892                         IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
3893         }
3894 } /* ixgbe_enable_queue */
3895
3896 /************************************************************************
3897  * ixgbe_disable_queue
3898  ************************************************************************/
3899 static void
3900 ixgbe_disable_queue(struct ixgbe_softc *sc, u32 vector)
3901 {
3902         struct ixgbe_hw *hw = &sc->hw;
3903         u64             queue = 1ULL << vector;
3904         u32             mask;
3905
3906         if (hw->mac.type == ixgbe_mac_82598EB) {
3907                 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3908                 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
3909         } else {
3910                 mask = (queue & 0xFFFFFFFF);
3911                 if (mask)
3912                         IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
3913                 mask = (queue >> 32);
3914                 if (mask)
3915                         IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
3916         }
3917 } /* ixgbe_disable_queue */
3918
3919 /************************************************************************
3920  * ixgbe_intr - Legacy Interrupt Service Routine
3921  ************************************************************************/
3922 int
3923 ixgbe_intr(void *arg)
3924 {
3925         struct ixgbe_softc     *sc = arg;
3926         struct ix_rx_queue *que = sc->rx_queues;
3927         struct ixgbe_hw    *hw = &sc->hw;
3928         if_ctx_t           ctx = sc->ctx;
3929         u32                eicr, eicr_mask;
3930
3931         eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
3932
3933         ++que->irqs;
3934         if (eicr == 0) {
3935                 ixgbe_if_enable_intr(ctx);
3936                 return (FILTER_HANDLED);
3937         }
3938
3939         /* Check for fan failure */
3940         if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
3941             (eicr & IXGBE_EICR_GPI_SDP1)) {
3942                 device_printf(sc->dev,
3943                     "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
3944                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3945         }
3946
3947         /* Link status change */
3948         if (eicr & IXGBE_EICR_LSC) {
3949                 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
3950                 iflib_admin_intr_deferred(ctx);
3951         }
3952
3953         if (ixgbe_is_sfp(hw)) {
3954                 /* Pluggable optics-related interrupt */
3955                 if (hw->mac.type >= ixgbe_mac_X540)
3956                         eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3957                 else
3958                         eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3959
3960                 if (eicr & eicr_mask) {
3961                         IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
3962                         sc->task_requests |= IXGBE_REQUEST_TASK_MOD;
3963                 }
3964
3965                 if ((hw->mac.type == ixgbe_mac_82599EB) &&
3966                     (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3967                         IXGBE_WRITE_REG(hw, IXGBE_EICR,
3968                             IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3969                         sc->task_requests |= IXGBE_REQUEST_TASK_MSF;
3970                 }
3971         }
3972
3973         /* External PHY interrupt */
3974         if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3975             (eicr & IXGBE_EICR_GPI_SDP0_X540))
3976                 sc->task_requests |= IXGBE_REQUEST_TASK_PHY;
3977
3978         return (FILTER_SCHEDULE_THREAD);
3979 } /* ixgbe_intr */
3980
3981 /************************************************************************
3982  * ixgbe_free_pci_resources
3983  ************************************************************************/
3984 static void
3985 ixgbe_free_pci_resources(if_ctx_t ctx)
3986 {
3987         struct ixgbe_softc *sc = iflib_get_softc(ctx);
3988         struct         ix_rx_queue *que = sc->rx_queues;
3989         device_t       dev = iflib_get_dev(ctx);
3990
3991         /* Release all MSI-X queue resources */
3992         if (sc->intr_type == IFLIB_INTR_MSIX)
3993                 iflib_irq_free(ctx, &sc->irq);
3994
3995         if (que != NULL) {
3996                 for (int i = 0; i < sc->num_rx_queues; i++, que++) {
3997                         iflib_irq_free(ctx, &que->que_irq);
3998                 }
3999         }
4000
4001         if (sc->pci_mem != NULL)
4002                 bus_release_resource(dev, SYS_RES_MEMORY,
4003                     rman_get_rid(sc->pci_mem), sc->pci_mem);
4004 } /* ixgbe_free_pci_resources */
4005
4006 /************************************************************************
4007  * ixgbe_sysctl_flowcntl
4008  *
4009  *   SYSCTL wrapper around setting Flow Control
4010  ************************************************************************/
4011 static int
4012 ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS)
4013 {
4014         struct ixgbe_softc *sc;
4015         int            error, fc;
4016
4017         sc = (struct ixgbe_softc *)arg1;
4018         fc = sc->hw.fc.current_mode;
4019
4020         error = sysctl_handle_int(oidp, &fc, 0, req);
4021         if ((error) || (req->newptr == NULL))
4022                 return (error);
4023
4024         /* Don't bother if it's not changed */
4025         if (fc == sc->hw.fc.current_mode)
4026                 return (0);
4027
4028         return ixgbe_set_flowcntl(sc, fc);
4029 } /* ixgbe_sysctl_flowcntl */
4030
4031 /************************************************************************
4032  * ixgbe_set_flowcntl - Set flow control
4033  *
4034  *   Flow control values:
4035  *     0 - off
4036  *     1 - rx pause
4037  *     2 - tx pause
4038  *     3 - full
4039  ************************************************************************/
4040 static int
4041 ixgbe_set_flowcntl(struct ixgbe_softc *sc, int fc)
4042 {
4043         switch (fc) {
4044         case ixgbe_fc_rx_pause:
4045         case ixgbe_fc_tx_pause:
4046         case ixgbe_fc_full:
4047                 sc->hw.fc.requested_mode = fc;
4048                 if (sc->num_rx_queues > 1)
4049                         ixgbe_disable_rx_drop(sc);
4050                 break;
4051         case ixgbe_fc_none:
4052                 sc->hw.fc.requested_mode = ixgbe_fc_none;
4053                 if (sc->num_rx_queues > 1)
4054                         ixgbe_enable_rx_drop(sc);
4055                 break;
4056         default:
4057                 return (EINVAL);
4058         }
4059
4060         /* Don't autoneg if forcing a value */
4061         sc->hw.fc.disable_fc_autoneg = true;
4062         ixgbe_fc_enable(&sc->hw);
4063
4064         return (0);
4065 } /* ixgbe_set_flowcntl */
4066
4067 /************************************************************************
4068  * ixgbe_enable_rx_drop
4069  *
4070  *   Enable the hardware to drop packets when the buffer is
4071  *   full. This is useful with multiqueue, so that no single
4072  *   queue being full stalls the entire RX engine. We only
4073  *   enable this when Multiqueue is enabled AND Flow Control
4074  *   is disabled.
4075  ************************************************************************/
4076 static void
4077 ixgbe_enable_rx_drop(struct ixgbe_softc *sc)
4078 {
4079         struct ixgbe_hw *hw = &sc->hw;
4080         struct rx_ring  *rxr;
4081         u32             srrctl;
4082
4083         for (int i = 0; i < sc->num_rx_queues; i++) {
4084                 rxr = &sc->rx_queues[i].rxr;
4085                 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
4086                 srrctl |= IXGBE_SRRCTL_DROP_EN;
4087                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
4088         }
4089
4090         /* enable drop for each vf */
4091         for (int i = 0; i < sc->num_vfs; i++) {
4092                 IXGBE_WRITE_REG(hw, IXGBE_QDE,
4093                                 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
4094                                 IXGBE_QDE_ENABLE));
4095         }
4096 } /* ixgbe_enable_rx_drop */
4097
4098 /************************************************************************
4099  * ixgbe_disable_rx_drop
4100  ************************************************************************/
4101 static void
4102 ixgbe_disable_rx_drop(struct ixgbe_softc *sc)
4103 {
4104         struct ixgbe_hw *hw = &sc->hw;
4105         struct rx_ring  *rxr;
4106         u32             srrctl;
4107
4108         for (int i = 0; i < sc->num_rx_queues; i++) {
4109                 rxr = &sc->rx_queues[i].rxr;
4110                 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
4111                 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
4112                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
4113         }
4114
4115         /* disable drop for each vf */
4116         for (int i = 0; i < sc->num_vfs; i++) {
4117                 IXGBE_WRITE_REG(hw, IXGBE_QDE,
4118                     (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
4119         }
4120 } /* ixgbe_disable_rx_drop */
4121
4122 /************************************************************************
4123  * ixgbe_sysctl_advertise
4124  *
4125  *   SYSCTL wrapper around setting advertised speed
4126  ************************************************************************/
4127 static int
4128 ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS)
4129 {
4130         struct ixgbe_softc *sc;
4131         int            error, advertise;
4132
4133         sc = (struct ixgbe_softc *)arg1;
4134         advertise = sc->advertise;
4135
4136         error = sysctl_handle_int(oidp, &advertise, 0, req);
4137         if ((error) || (req->newptr == NULL))
4138                 return (error);
4139
4140         return ixgbe_set_advertise(sc, advertise);
4141 } /* ixgbe_sysctl_advertise */
4142
4143 /************************************************************************
4144  * ixgbe_set_advertise - Control advertised link speed
4145  *
4146  *   Flags:
4147  *     0x1  - advertise 100 Mb
4148  *     0x2  - advertise 1G
4149  *     0x4  - advertise 10G
4150  *     0x8  - advertise 10 Mb (yes, Mb)
4151  *     0x10 - advertise 2.5G (disabled by default)
4152  *     0x20 - advertise 5G (disabled by default)
4153  *
4154  ************************************************************************/
4155 static int
4156 ixgbe_set_advertise(struct ixgbe_softc *sc, int advertise)
4157 {
4158         device_t         dev = iflib_get_dev(sc->ctx);
4159         struct ixgbe_hw  *hw;
4160         ixgbe_link_speed speed = 0;
4161         ixgbe_link_speed link_caps = 0;
4162         s32              err = IXGBE_NOT_IMPLEMENTED;
4163         bool             negotiate = false;
4164
4165         /* Checks to validate new value */
4166         if (sc->advertise == advertise) /* no change */
4167                 return (0);
4168
4169         hw = &sc->hw;
4170
4171         /* No speed changes for backplane media */
4172         if (hw->phy.media_type == ixgbe_media_type_backplane)
4173                 return (ENODEV);
4174
4175         if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
4176               (hw->phy.multispeed_fiber))) {
4177                 device_printf(dev, "Advertised speed can only be set on copper or multispeed fiber media types.\n");
4178                 return (EINVAL);
4179         }
4180
4181         if (advertise < 0x1 || advertise > 0x3F) {
4182                 device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0x3F\n");
4183                 return (EINVAL);
4184         }
4185
4186         if (hw->mac.ops.get_link_capabilities) {
4187                 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
4188                     &negotiate);
4189                 if (err != IXGBE_SUCCESS) {
4190                         device_printf(dev, "Unable to determine supported advertise speeds\n");
4191                         return (ENODEV);
4192                 }
4193         }
4194
4195         /* Set new value and report new advertised mode */
4196         if (advertise & 0x1) {
4197                 if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
4198                         device_printf(dev, "Interface does not support 100Mb advertised speed\n");
4199                         return (EINVAL);
4200                 }
4201                 speed |= IXGBE_LINK_SPEED_100_FULL;
4202         }
4203         if (advertise & 0x2) {
4204                 if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
4205                         device_printf(dev, "Interface does not support 1Gb advertised speed\n");
4206                         return (EINVAL);
4207                 }
4208                 speed |= IXGBE_LINK_SPEED_1GB_FULL;
4209         }
4210         if (advertise & 0x4) {
4211                 if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
4212                         device_printf(dev, "Interface does not support 10Gb advertised speed\n");
4213                         return (EINVAL);
4214                 }
4215                 speed |= IXGBE_LINK_SPEED_10GB_FULL;
4216         }
4217         if (advertise & 0x8) {
4218                 if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
4219                         device_printf(dev, "Interface does not support 10Mb advertised speed\n");
4220                         return (EINVAL);
4221                 }
4222                 speed |= IXGBE_LINK_SPEED_10_FULL;
4223         }
4224         if (advertise & 0x10) {
4225                 if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
4226                         device_printf(dev, "Interface does not support 2.5G advertised speed\n");
4227                         return (EINVAL);
4228                 }
4229                 speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
4230         }
4231         if (advertise & 0x20) {
4232                 if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
4233                         device_printf(dev, "Interface does not support 5G advertised speed\n");
4234                         return (EINVAL);
4235                 }
4236                 speed |= IXGBE_LINK_SPEED_5GB_FULL;
4237         }
4238
4239         hw->mac.autotry_restart = true;
4240         hw->mac.ops.setup_link(hw, speed, true);
4241         sc->advertise = advertise;
4242
4243         return (0);
4244 } /* ixgbe_set_advertise */
4245
4246 /************************************************************************
4247  * ixgbe_get_default_advertise - Get default advertised speed settings
4248  *
4249  *   Formatted for sysctl usage.
4250  *   Flags:
4251  *     0x1 - advertise 100 Mb
4252  *     0x2 - advertise 1G
4253  *     0x4 - advertise 10G
4254  *     0x8 - advertise 10 Mb (yes, Mb)
4255  *     0x10 - advertise 2.5G (disabled by default)
4256  *     0x20 - advertise 5G (disabled by default)
4257  ************************************************************************/
4258 static int
4259 ixgbe_get_default_advertise(struct ixgbe_softc *sc)
4260 {
4261         struct ixgbe_hw  *hw = &sc->hw;
4262         int              speed;
4263         ixgbe_link_speed link_caps = 0;
4264         s32              err;
4265         bool             negotiate = false;
4266
4267         /*
4268          * Advertised speed means nothing unless it's copper or
4269          * multi-speed fiber
4270          */
4271         if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
4272             !(hw->phy.multispeed_fiber))
4273                 return (0);
4274
4275         err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
4276         if (err != IXGBE_SUCCESS)
4277                 return (0);
4278
4279         if (hw->mac.type == ixgbe_mac_X550) {
4280                 /*
4281                  * 2.5G and 5G autonegotiation speeds on X550
4282                  * are disabled by default due to reported
4283                  * interoperability issues with some switches.
4284                  */
4285                 link_caps &= ~(IXGBE_LINK_SPEED_2_5GB_FULL |
4286                     IXGBE_LINK_SPEED_5GB_FULL);
4287         }
4288
4289         speed =
4290             ((link_caps & IXGBE_LINK_SPEED_10GB_FULL)  ? 0x4  : 0) |
4291             ((link_caps & IXGBE_LINK_SPEED_5GB_FULL)   ? 0x20 : 0) |
4292             ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
4293             ((link_caps & IXGBE_LINK_SPEED_1GB_FULL)   ? 0x2  : 0) |
4294             ((link_caps & IXGBE_LINK_SPEED_100_FULL)   ? 0x1  : 0) |
4295             ((link_caps & IXGBE_LINK_SPEED_10_FULL)    ? 0x8  : 0);
4296
4297         return speed;
4298 } /* ixgbe_get_default_advertise */
4299
4300 /************************************************************************
4301  * ixgbe_sysctl_dmac - Manage DMA Coalescing
4302  *
4303  *   Control values:
4304  *     0/1 - off / on (use default value of 1000)
4305  *
4306  *     Legal timer values are:
4307  *     50,100,250,500,1000,2000,5000,10000
4308  *
4309  *     Turning off interrupt moderation will also turn this off.
4310  ************************************************************************/
4311 static int
4312 ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
4313 {
4314         struct ixgbe_softc *sc = (struct ixgbe_softc *)arg1;
4315         struct ifnet   *ifp = iflib_get_ifp(sc->ctx);
4316         int            error;
4317         u16            newval;
4318
4319         newval = sc->dmac;
4320         error = sysctl_handle_16(oidp, &newval, 0, req);
4321         if ((error) || (req->newptr == NULL))
4322                 return (error);
4323
4324         switch (newval) {
4325         case 0:
4326                 /* Disabled */
4327                 sc->dmac = 0;
4328                 break;
4329         case 1:
4330                 /* Enable and use default */
4331                 sc->dmac = 1000;
4332                 break;
4333         case 50:
4334         case 100:
4335         case 250:
4336         case 500:
4337         case 1000:
4338         case 2000:
4339         case 5000:
4340         case 10000:
4341                 /* Legal values - allow */
4342                 sc->dmac = newval;
4343                 break;
4344         default:
4345                 /* Do nothing, illegal value */
4346                 return (EINVAL);
4347         }
4348
4349         /* Re-initialize hardware if it's already running */
4350         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4351                 ifp->if_init(ifp);
4352
4353         return (0);
4354 } /* ixgbe_sysctl_dmac */
4355
4356 #ifdef IXGBE_DEBUG
4357 /************************************************************************
4358  * ixgbe_sysctl_power_state
4359  *
4360  *   Sysctl to test power states
4361  *   Values:
4362  *     0      - set device to D0
4363  *     3      - set device to D3
4364  *     (none) - get current device power state
4365  ************************************************************************/
4366 static int
4367 ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS)
4368 {
4369         struct ixgbe_softc *sc = (struct ixgbe_softc *)arg1;
4370         device_t       dev = sc->dev;
4371         int            curr_ps, new_ps, error = 0;
4372
4373         curr_ps = new_ps = pci_get_powerstate(dev);
4374
4375         error = sysctl_handle_int(oidp, &new_ps, 0, req);
4376         if ((error) || (req->newptr == NULL))
4377                 return (error);
4378
4379         if (new_ps == curr_ps)
4380                 return (0);
4381
4382         if (new_ps == 3 && curr_ps == 0)
4383                 error = DEVICE_SUSPEND(dev);
4384         else if (new_ps == 0 && curr_ps == 3)
4385                 error = DEVICE_RESUME(dev);
4386         else
4387                 return (EINVAL);
4388
4389         device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
4390
4391         return (error);
4392 } /* ixgbe_sysctl_power_state */
4393 #endif
4394
4395 /************************************************************************
4396  * ixgbe_sysctl_wol_enable
4397  *
4398  *   Sysctl to enable/disable the WoL capability,
4399  *   if supported by the adapter.
4400  *
4401  *   Values:
4402  *     0 - disabled
4403  *     1 - enabled
4404  ************************************************************************/
4405 static int
4406 ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
4407 {
4408         struct ixgbe_softc  *sc = (struct ixgbe_softc *)arg1;
4409         struct ixgbe_hw *hw = &sc->hw;
4410         int             new_wol_enabled;
4411         int             error = 0;
4412
4413         new_wol_enabled = hw->wol_enabled;
4414         error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
4415         if ((error) || (req->newptr == NULL))
4416                 return (error);
4417         new_wol_enabled = !!(new_wol_enabled);
4418         if (new_wol_enabled == hw->wol_enabled)
4419                 return (0);
4420
4421         if (new_wol_enabled > 0 && !sc->wol_support)
4422                 return (ENODEV);
4423         else
4424                 hw->wol_enabled = new_wol_enabled;
4425
4426         return (0);
4427 } /* ixgbe_sysctl_wol_enable */
4428
4429 /************************************************************************
4430  * ixgbe_sysctl_wufc - Wake Up Filter Control
4431  *
4432  *   Sysctl to enable/disable the types of packets that the
4433  *   adapter will wake up on upon receipt.
4434  *   Flags:
4435  *     0x1  - Link Status Change
4436  *     0x2  - Magic Packet
4437  *     0x4  - Direct Exact
4438  *     0x8  - Directed Multicast
4439  *     0x10 - Broadcast
4440  *     0x20 - ARP/IPv4 Request Packet
4441  *     0x40 - Direct IPv4 Packet
4442  *     0x80 - Direct IPv6 Packet
4443  *
4444  *   Settings not listed above will cause the sysctl to return an error.
4445  ************************************************************************/
4446 static int
4447 ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
4448 {
4449         struct ixgbe_softc *sc = (struct ixgbe_softc *)arg1;
4450         int            error = 0;
4451         u32            new_wufc;
4452
4453         new_wufc = sc->wufc;
4454
4455         error = sysctl_handle_32(oidp, &new_wufc, 0, req);
4456         if ((error) || (req->newptr == NULL))
4457                 return (error);
4458         if (new_wufc == sc->wufc)
4459                 return (0);
4460
4461         if (new_wufc & 0xffffff00)
4462                 return (EINVAL);
4463
4464         new_wufc &= 0xff;
4465         new_wufc |= (0xffffff & sc->wufc);
4466         sc->wufc = new_wufc;
4467
4468         return (0);
4469 } /* ixgbe_sysctl_wufc */
4470
4471 #ifdef IXGBE_DEBUG
4472 /************************************************************************
4473  * ixgbe_sysctl_print_rss_config
4474  ************************************************************************/
4475 static int
4476 ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS)
4477 {
4478         struct ixgbe_softc  *sc = (struct ixgbe_softc *)arg1;
4479         struct ixgbe_hw *hw = &sc->hw;
4480         device_t        dev = sc->dev;
4481         struct sbuf     *buf;
4482         int             error = 0, reta_size;
4483         u32             reg;
4484
4485         buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4486         if (!buf) {
4487                 device_printf(dev, "Could not allocate sbuf for output.\n");
4488                 return (ENOMEM);
4489         }
4490
4491         // TODO: use sbufs to make a string to print out
4492         /* Set multiplier for RETA setup and table size based on MAC */
4493         switch (sc->hw.mac.type) {
4494         case ixgbe_mac_X550:
4495         case ixgbe_mac_X550EM_x:
4496         case ixgbe_mac_X550EM_a:
4497                 reta_size = 128;
4498                 break;
4499         default:
4500                 reta_size = 32;
4501                 break;
4502         }
4503
4504         /* Print out the redirection table */
4505         sbuf_cat(buf, "\n");
4506         for (int i = 0; i < reta_size; i++) {
4507                 if (i < 32) {
4508                         reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
4509                         sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
4510                 } else {
4511                         reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
4512                         sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
4513                 }
4514         }
4515
4516         // TODO: print more config
4517
4518         error = sbuf_finish(buf);
4519         if (error)
4520                 device_printf(dev, "Error finishing sbuf: %d\n", error);
4521
4522         sbuf_delete(buf);
4523
4524         return (0);
4525 } /* ixgbe_sysctl_print_rss_config */
4526 #endif /* IXGBE_DEBUG */
4527
4528 /************************************************************************
4529  * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
4530  *
4531  *   For X552/X557-AT devices using an external PHY
4532  ************************************************************************/
4533 static int
4534 ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
4535 {
4536         struct ixgbe_softc  *sc = (struct ixgbe_softc *)arg1;
4537         struct ixgbe_hw *hw = &sc->hw;
4538         u16             reg;
4539
4540         if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4541                 device_printf(iflib_get_dev(sc->ctx),
4542                     "Device has no supported external thermal sensor.\n");
4543                 return (ENODEV);
4544         }
4545
4546         if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
4547             IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
4548                 device_printf(iflib_get_dev(sc->ctx),
4549                     "Error reading from PHY's current temperature register\n");
4550                 return (EAGAIN);
4551         }
4552
4553         /* Shift temp for output */
4554         reg = reg >> 8;
4555
4556         return (sysctl_handle_16(oidp, NULL, reg, req));
4557 } /* ixgbe_sysctl_phy_temp */
4558
4559 /************************************************************************
4560  * ixgbe_sysctl_phy_overtemp_occurred
4561  *
4562  *   Reports (directly from the PHY) whether the current PHY
4563  *   temperature is over the overtemp threshold.
4564  ************************************************************************/
4565 static int
4566 ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
4567 {
4568         struct ixgbe_softc  *sc = (struct ixgbe_softc *)arg1;
4569         struct ixgbe_hw *hw = &sc->hw;
4570         u16             reg;
4571
4572         if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4573                 device_printf(iflib_get_dev(sc->ctx),
4574                     "Device has no supported external thermal sensor.\n");
4575                 return (ENODEV);
4576         }
4577
4578         if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
4579             IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
4580                 device_printf(iflib_get_dev(sc->ctx),
4581                     "Error reading from PHY's temperature status register\n");
4582                 return (EAGAIN);
4583         }
4584
4585         /* Get occurrence bit */
4586         reg = !!(reg & 0x4000);
4587
4588         return (sysctl_handle_16(oidp, 0, reg, req));
4589 } /* ixgbe_sysctl_phy_overtemp_occurred */
4590
4591 /************************************************************************
4592  * ixgbe_sysctl_eee_state
4593  *
4594  *   Sysctl to set EEE power saving feature
4595  *   Values:
4596  *     0      - disable EEE
4597  *     1      - enable EEE
4598  *     (none) - get current device EEE state
4599  ************************************************************************/
4600 static int
4601 ixgbe_sysctl_eee_state(SYSCTL_HANDLER_ARGS)
4602 {
4603         struct ixgbe_softc *sc = (struct ixgbe_softc *)arg1;
4604         device_t       dev = sc->dev;
4605         struct ifnet   *ifp = iflib_get_ifp(sc->ctx);
4606         int            curr_eee, new_eee, error = 0;
4607         s32            retval;
4608
4609         curr_eee = new_eee = !!(sc->feat_en & IXGBE_FEATURE_EEE);
4610
4611         error = sysctl_handle_int(oidp, &new_eee, 0, req);
4612         if ((error) || (req->newptr == NULL))
4613                 return (error);
4614
4615         /* Nothing to do */
4616         if (new_eee == curr_eee)
4617                 return (0);
4618
4619         /* Not supported */
4620         if (!(sc->feat_cap & IXGBE_FEATURE_EEE))
4621                 return (EINVAL);
4622
4623         /* Bounds checking */
4624         if ((new_eee < 0) || (new_eee > 1))
4625                 return (EINVAL);
4626
4627         retval = ixgbe_setup_eee(&sc->hw, new_eee);
4628         if (retval) {
4629                 device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
4630                 return (EINVAL);
4631         }
4632
4633         /* Restart auto-neg */
4634         ifp->if_init(ifp);
4635
4636         device_printf(dev, "New EEE state: %d\n", new_eee);
4637
4638         /* Cache new value */
4639         if (new_eee)
4640                 sc->feat_en |= IXGBE_FEATURE_EEE;
4641         else
4642                 sc->feat_en &= ~IXGBE_FEATURE_EEE;
4643
4644         return (error);
4645 } /* ixgbe_sysctl_eee_state */
4646
4647 /************************************************************************
4648  * ixgbe_init_device_features
4649  ************************************************************************/
4650 static void
4651 ixgbe_init_device_features(struct ixgbe_softc *sc)
4652 {
4653         sc->feat_cap = IXGBE_FEATURE_NETMAP
4654                           | IXGBE_FEATURE_RSS
4655                           | IXGBE_FEATURE_MSI
4656                           | IXGBE_FEATURE_MSIX
4657                           | IXGBE_FEATURE_LEGACY_IRQ;
4658
4659         /* Set capabilities first... */
4660         switch (sc->hw.mac.type) {
4661         case ixgbe_mac_82598EB:
4662                 if (sc->hw.device_id == IXGBE_DEV_ID_82598AT)
4663                         sc->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
4664                 break;
4665         case ixgbe_mac_X540:
4666                 sc->feat_cap |= IXGBE_FEATURE_SRIOV;
4667                 sc->feat_cap |= IXGBE_FEATURE_FDIR;
4668                 if ((sc->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
4669                     (sc->hw.bus.func == 0))
4670                         sc->feat_cap |= IXGBE_FEATURE_BYPASS;
4671                 break;
4672         case ixgbe_mac_X550:
4673                 sc->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4674                 sc->feat_cap |= IXGBE_FEATURE_SRIOV;
4675                 sc->feat_cap |= IXGBE_FEATURE_FDIR;
4676                 break;
4677         case ixgbe_mac_X550EM_x:
4678                 sc->feat_cap |= IXGBE_FEATURE_SRIOV;
4679                 sc->feat_cap |= IXGBE_FEATURE_FDIR;
4680                 break;
4681         case ixgbe_mac_X550EM_a:
4682                 sc->feat_cap |= IXGBE_FEATURE_SRIOV;
4683                 sc->feat_cap |= IXGBE_FEATURE_FDIR;
4684                 sc->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4685                 if ((sc->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
4686                     (sc->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
4687                         sc->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4688                         sc->feat_cap |= IXGBE_FEATURE_EEE;
4689                 }
4690                 break;
4691         case ixgbe_mac_82599EB:
4692                 sc->feat_cap |= IXGBE_FEATURE_SRIOV;
4693                 sc->feat_cap |= IXGBE_FEATURE_FDIR;
4694                 if ((sc->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
4695                     (sc->hw.bus.func == 0))
4696                         sc->feat_cap |= IXGBE_FEATURE_BYPASS;
4697                 if (sc->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
4698                         sc->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4699                 break;
4700         default:
4701                 break;
4702         }
4703
4704         /* Enabled by default... */
4705         /* Fan failure detection */
4706         if (sc->feat_cap & IXGBE_FEATURE_FAN_FAIL)
4707                 sc->feat_en |= IXGBE_FEATURE_FAN_FAIL;
4708         /* Netmap */
4709         if (sc->feat_cap & IXGBE_FEATURE_NETMAP)
4710                 sc->feat_en |= IXGBE_FEATURE_NETMAP;
4711         /* EEE */
4712         if (sc->feat_cap & IXGBE_FEATURE_EEE)
4713                 sc->feat_en |= IXGBE_FEATURE_EEE;
4714         /* Thermal Sensor */
4715         if (sc->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
4716                 sc->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
4717
4718         /* Enabled via global sysctl... */
4719         /* Flow Director */
4720         if (ixgbe_enable_fdir) {
4721                 if (sc->feat_cap & IXGBE_FEATURE_FDIR)
4722                         sc->feat_en |= IXGBE_FEATURE_FDIR;
4723                 else
4724                         device_printf(sc->dev, "Device does not support Flow Director. Leaving disabled.");
4725         }
4726         /*
4727          * Message Signal Interrupts - Extended (MSI-X)
4728          * Normal MSI is only enabled if MSI-X calls fail.
4729          */
4730         if (!ixgbe_enable_msix)
4731                 sc->feat_cap &= ~IXGBE_FEATURE_MSIX;
4732         /* Receive-Side Scaling (RSS) */
4733         if ((sc->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
4734                 sc->feat_en |= IXGBE_FEATURE_RSS;
4735
4736         /* Disable features with unmet dependencies... */
4737         /* No MSI-X */
4738         if (!(sc->feat_cap & IXGBE_FEATURE_MSIX)) {
4739                 sc->feat_cap &= ~IXGBE_FEATURE_RSS;
4740                 sc->feat_cap &= ~IXGBE_FEATURE_SRIOV;
4741                 sc->feat_en &= ~IXGBE_FEATURE_RSS;
4742                 sc->feat_en &= ~IXGBE_FEATURE_SRIOV;
4743         }
4744 } /* ixgbe_init_device_features */
4745
4746 /************************************************************************
4747  * ixgbe_check_fan_failure
4748  ************************************************************************/
4749 static void
4750 ixgbe_check_fan_failure(struct ixgbe_softc *sc, u32 reg, bool in_interrupt)
4751 {
4752         u32 mask;
4753
4754         mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&sc->hw) :
4755             IXGBE_ESDP_SDP1;
4756
4757         if (reg & mask)
4758                 device_printf(sc->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
4759 } /* ixgbe_check_fan_failure */
4760
4761 /************************************************************************
4762  * ixgbe_sbuf_fw_version
4763  ************************************************************************/
4764 static void
4765 ixgbe_sbuf_fw_version(struct ixgbe_hw *hw, struct sbuf *buf)
4766 {
4767         struct ixgbe_nvm_version nvm_ver = {0};
4768         uint16_t phyfw = 0;
4769         int status;
4770         const char *space = "";
4771
4772         ixgbe_get_oem_prod_version(hw, &nvm_ver); /* OEM's NVM version */
4773         ixgbe_get_orom_version(hw, &nvm_ver); /* Option ROM */
4774         ixgbe_get_etk_id(hw, &nvm_ver); /* eTrack identifies a build in Intel's SCM */
4775         status = ixgbe_get_phy_firmware_version(hw, &phyfw);
4776
4777         if (nvm_ver.oem_valid) {
4778                 sbuf_printf(buf, "NVM OEM V%d.%d R%d", nvm_ver.oem_major,
4779                     nvm_ver.oem_minor, nvm_ver.oem_release);
4780                 space = " ";
4781         }
4782
4783         if (nvm_ver.or_valid) {
4784                 sbuf_printf(buf, "%sOption ROM V%d-b%d-p%d",
4785                     space, nvm_ver.or_major, nvm_ver.or_build, nvm_ver.or_patch);
4786                 space = " ";
4787         }
4788
4789         if (nvm_ver.etk_id != ((NVM_VER_INVALID << NVM_ETK_SHIFT) |
4790             NVM_VER_INVALID)) {
4791                 sbuf_printf(buf, "%seTrack 0x%08x", space, nvm_ver.etk_id);
4792                 space = " ";
4793         }
4794
4795         if (phyfw != 0 && status == IXGBE_SUCCESS)
4796                 sbuf_printf(buf, "%sPHY FW V%d", space, phyfw);
4797 } /* ixgbe_sbuf_fw_version */
4798
4799 /************************************************************************
4800  * ixgbe_print_fw_version
4801  ************************************************************************/
4802 static void
4803 ixgbe_print_fw_version(if_ctx_t ctx)
4804 {
4805         struct ixgbe_softc *sc = iflib_get_softc(ctx);
4806         struct ixgbe_hw *hw = &sc->hw;
4807         device_t dev = sc->dev;
4808         struct sbuf *buf;
4809         int error = 0;
4810
4811         buf = sbuf_new_auto();
4812         if (!buf) {
4813                 device_printf(dev, "Could not allocate sbuf for output.\n");
4814                 return;
4815         }
4816
4817         ixgbe_sbuf_fw_version(hw, buf);
4818
4819         error = sbuf_finish(buf);
4820         if (error)
4821                 device_printf(dev, "Error finishing sbuf: %d\n", error);
4822         else if (sbuf_len(buf))
4823                 device_printf(dev, "%s\n", sbuf_data(buf));
4824
4825         sbuf_delete(buf);
4826 } /* ixgbe_print_fw_version */
4827
4828 /************************************************************************
4829  * ixgbe_sysctl_print_fw_version
4830  ************************************************************************/
4831 static int
4832 ixgbe_sysctl_print_fw_version(SYSCTL_HANDLER_ARGS)
4833 {
4834         struct ixgbe_softc  *sc = (struct ixgbe_softc *)arg1;
4835         struct ixgbe_hw *hw = &sc->hw;
4836         device_t dev = sc->dev;
4837         struct sbuf *buf;
4838         int error = 0;
4839
4840         buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4841         if (!buf) {
4842                 device_printf(dev, "Could not allocate sbuf for output.\n");
4843                 return (ENOMEM);
4844         }
4845
4846         ixgbe_sbuf_fw_version(hw, buf);
4847
4848         error = sbuf_finish(buf);
4849         if (error)
4850                 device_printf(dev, "Error finishing sbuf: %d\n", error);
4851
4852         sbuf_delete(buf);
4853
4854         return (0);
4855 } /* ixgbe_sysctl_print_fw_version */