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