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