1 /******************************************************************************
3 Copyright (c) 2001-2017, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
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.
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.
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.
32 ******************************************************************************/
37 #include "opt_inet6.h"
41 #include "ixgbe_sriov.h"
44 #include <net/netmap.h>
45 #include <dev/netmap/netmap_kern.h>
47 /************************************************************************
49 ************************************************************************/
50 char ixgbe_driver_version[] = "4.0.0-k";
53 /************************************************************************
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
60 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
61 ************************************************************************/
62 static pci_vendor_info_t ixgbe_vendor_info_array[] =
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_SFP, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
96 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
97 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
98 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
99 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP_N, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
100 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
101 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
102 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_10G_T, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
103 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
104 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
105 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_BYPASS, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
106 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
107 /* required last entry */
111 static void *ixgbe_register(device_t dev);
112 static int ixgbe_if_attach_pre(if_ctx_t ctx);
113 static int ixgbe_if_attach_post(if_ctx_t ctx);
114 static int ixgbe_if_detach(if_ctx_t ctx);
115 static int ixgbe_if_shutdown(if_ctx_t ctx);
116 static int ixgbe_if_suspend(if_ctx_t ctx);
117 static int ixgbe_if_resume(if_ctx_t ctx);
119 static void ixgbe_if_stop(if_ctx_t ctx);
120 void ixgbe_if_enable_intr(if_ctx_t ctx);
121 static void ixgbe_if_disable_intr(if_ctx_t ctx);
122 static int ixgbe_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t qid);
123 static void ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr);
124 static int ixgbe_if_media_change(if_ctx_t ctx);
125 static int ixgbe_if_msix_intr_assign(if_ctx_t, int);
126 static int ixgbe_if_mtu_set(if_ctx_t ctx, uint32_t mtu);
127 static void ixgbe_if_crcstrip_set(if_ctx_t ctx, int onoff, int strip);
128 static void ixgbe_if_multi_set(if_ctx_t ctx);
129 static int ixgbe_if_promisc_set(if_ctx_t ctx, int flags);
130 static int ixgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs,
131 uint64_t *paddrs, int nrxqs, int nrxqsets);
132 static int ixgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs,
133 uint64_t *paddrs, int nrxqs, int nrxqsets);
134 static void ixgbe_if_queues_free(if_ctx_t ctx);
135 static void ixgbe_if_timer(if_ctx_t ctx, uint16_t);
136 static void ixgbe_if_update_admin_status(if_ctx_t ctx);
137 static void ixgbe_if_vlan_register(if_ctx_t ctx, u16 vtag);
138 static void ixgbe_if_vlan_unregister(if_ctx_t ctx, u16 vtag);
140 int ixgbe_intr(void *arg);
142 /************************************************************************
143 * Function prototypes
144 ************************************************************************/
145 #if __FreeBSD_version >= 1100036
146 static uint64_t ixgbe_if_get_counter(if_ctx_t, ift_counter);
149 static void ixgbe_enable_queue(struct adapter *adapter, u32 vector);
150 static void ixgbe_disable_queue(struct adapter *adapter, u32 vector);
151 static void ixgbe_add_device_sysctls(if_ctx_t ctx);
152 static int ixgbe_allocate_pci_resources(if_ctx_t ctx);
153 static int ixgbe_setup_low_power_mode(if_ctx_t ctx);
155 static void ixgbe_config_dmac(struct adapter *adapter);
156 static void ixgbe_configure_ivars(struct adapter *adapter);
157 static void ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector,
159 static u8 *ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
160 static bool ixgbe_sfp_probe(if_ctx_t ctx);
162 static void ixgbe_free_pci_resources(if_ctx_t ctx);
164 static int ixgbe_msix_link(void *arg);
165 static int ixgbe_msix_que(void *arg);
166 static void ixgbe_initialize_rss_mapping(struct adapter *adapter);
167 static void ixgbe_initialize_receive_units(if_ctx_t ctx);
168 static void ixgbe_initialize_transmit_units(if_ctx_t ctx);
170 static int ixgbe_setup_interface(if_ctx_t ctx);
171 static void ixgbe_init_device_features(struct adapter *adapter);
172 static void ixgbe_check_fan_failure(struct adapter *, u32, bool);
173 static void ixgbe_add_media_types(if_ctx_t ctx);
174 static void ixgbe_update_stats_counters(struct adapter *adapter);
175 static void ixgbe_config_link(struct adapter *adapter);
176 static void ixgbe_get_slot_info(struct adapter *);
177 static void ixgbe_check_wol_support(struct adapter *adapter);
178 static void ixgbe_enable_rx_drop(struct adapter *);
179 static void ixgbe_disable_rx_drop(struct adapter *);
181 static void ixgbe_add_hw_stats(struct adapter *adapter);
182 static int ixgbe_set_flowcntl(struct adapter *, int);
183 static int ixgbe_set_advertise(struct adapter *, int);
184 static int ixgbe_get_advertise(struct adapter *);
185 static void ixgbe_setup_vlan_hw_support(if_ctx_t ctx);
186 static void ixgbe_config_gpie(struct adapter *adapter);
187 static void ixgbe_config_delay_values(struct adapter *adapter);
189 /* Sysctl handlers */
190 static int ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS);
191 static int ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS);
192 static int ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS);
193 static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
194 static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
195 static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
197 static int ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS);
198 static int ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS);
200 static int ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS);
201 static int ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS);
202 static int ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS);
203 static int ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS);
204 static int ixgbe_sysctl_eee_state(SYSCTL_HANDLER_ARGS);
205 static int ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
206 static int ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
208 /* Deferred interrupt tasklets */
209 static void ixgbe_handle_msf(void *);
210 static void ixgbe_handle_mod(void *);
211 static void ixgbe_handle_phy(void *);
213 /************************************************************************
214 * FreeBSD Device Interface Entry Points
215 ************************************************************************/
216 static device_method_t ix_methods[] = {
217 /* Device interface */
218 DEVMETHOD(device_register, ixgbe_register),
219 DEVMETHOD(device_probe, iflib_device_probe),
220 DEVMETHOD(device_attach, iflib_device_attach),
221 DEVMETHOD(device_detach, iflib_device_detach),
222 DEVMETHOD(device_shutdown, iflib_device_shutdown),
223 DEVMETHOD(device_suspend, iflib_device_suspend),
224 DEVMETHOD(device_resume, iflib_device_resume),
226 DEVMETHOD(pci_iov_init, iflib_device_iov_init),
227 DEVMETHOD(pci_iov_uninit, iflib_device_iov_uninit),
228 DEVMETHOD(pci_iov_add_vf, iflib_device_iov_add_vf),
233 static driver_t ix_driver = {
234 "ix", ix_methods, sizeof(struct adapter),
237 devclass_t ix_devclass;
238 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
240 MODULE_DEPEND(ix, pci, 1, 1, 1);
241 MODULE_DEPEND(ix, ether, 1, 1, 1);
242 MODULE_DEPEND(ix, iflib, 1, 1, 1);
244 static device_method_t ixgbe_if_methods[] = {
245 DEVMETHOD(ifdi_attach_pre, ixgbe_if_attach_pre),
246 DEVMETHOD(ifdi_attach_post, ixgbe_if_attach_post),
247 DEVMETHOD(ifdi_detach, ixgbe_if_detach),
248 DEVMETHOD(ifdi_shutdown, ixgbe_if_shutdown),
249 DEVMETHOD(ifdi_suspend, ixgbe_if_suspend),
250 DEVMETHOD(ifdi_resume, ixgbe_if_resume),
251 DEVMETHOD(ifdi_init, ixgbe_if_init),
252 DEVMETHOD(ifdi_stop, ixgbe_if_stop),
253 DEVMETHOD(ifdi_msix_intr_assign, ixgbe_if_msix_intr_assign),
254 DEVMETHOD(ifdi_intr_enable, ixgbe_if_enable_intr),
255 DEVMETHOD(ifdi_intr_disable, ixgbe_if_disable_intr),
256 DEVMETHOD(ifdi_tx_queue_intr_enable, ixgbe_if_rx_queue_intr_enable),
257 DEVMETHOD(ifdi_rx_queue_intr_enable, ixgbe_if_rx_queue_intr_enable),
258 DEVMETHOD(ifdi_tx_queues_alloc, ixgbe_if_tx_queues_alloc),
259 DEVMETHOD(ifdi_rx_queues_alloc, ixgbe_if_rx_queues_alloc),
260 DEVMETHOD(ifdi_queues_free, ixgbe_if_queues_free),
261 DEVMETHOD(ifdi_update_admin_status, ixgbe_if_update_admin_status),
262 DEVMETHOD(ifdi_multi_set, ixgbe_if_multi_set),
263 DEVMETHOD(ifdi_mtu_set, ixgbe_if_mtu_set),
264 DEVMETHOD(ifdi_crcstrip_set, ixgbe_if_crcstrip_set),
265 DEVMETHOD(ifdi_media_status, ixgbe_if_media_status),
266 DEVMETHOD(ifdi_media_change, ixgbe_if_media_change),
267 DEVMETHOD(ifdi_promisc_set, ixgbe_if_promisc_set),
268 DEVMETHOD(ifdi_timer, ixgbe_if_timer),
269 DEVMETHOD(ifdi_vlan_register, ixgbe_if_vlan_register),
270 DEVMETHOD(ifdi_vlan_unregister, ixgbe_if_vlan_unregister),
271 DEVMETHOD(ifdi_get_counter, ixgbe_if_get_counter),
273 DEVMETHOD(ifdi_iov_init, ixgbe_if_iov_init),
274 DEVMETHOD(ifdi_iov_uninit, ixgbe_if_iov_uninit),
275 DEVMETHOD(ifdi_iov_vf_add, ixgbe_if_iov_vf_add),
281 * TUNEABLE PARAMETERS:
284 static SYSCTL_NODE(_hw, OID_AUTO, ix, CTLFLAG_RD, 0, "IXGBE driver parameters");
285 static driver_t ixgbe_if_driver = {
286 "ixgbe_if", ixgbe_if_methods, sizeof(struct adapter)
289 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
290 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
291 &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
293 /* Flow control setting, default to full */
294 static int ixgbe_flow_control = ixgbe_fc_full;
295 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
296 &ixgbe_flow_control, 0, "Default flow control used for all adapters");
298 /* Advertise Speed, default to 0 (auto) */
299 static int ixgbe_advertise_speed = 0;
300 SYSCTL_INT(_hw_ix, OID_AUTO, advertise_speed, CTLFLAG_RDTUN,
301 &ixgbe_advertise_speed, 0, "Default advertised speed for all adapters");
304 * Smart speed setting, default to on
305 * this only works as a compile option
306 * right now as its during attach, set
307 * this to 'ixgbe_smart_speed_off' to
310 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
313 * MSI-X should be the default for best performance,
314 * but this allows it to be forced off for testing.
316 static int ixgbe_enable_msix = 1;
317 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
318 "Enable MSI-X interrupts");
321 * Defining this on will allow the use
322 * of unsupported SFP+ modules, note that
323 * doing so you are on your own :)
325 static int allow_unsupported_sfp = FALSE;
326 SYSCTL_INT(_hw_ix, OID_AUTO, unsupported_sfp, CTLFLAG_RDTUN,
327 &allow_unsupported_sfp, 0,
328 "Allow unsupported SFP modules...use at your own risk");
331 * Not sure if Flow Director is fully baked,
332 * so we'll default to turning it off.
334 static int ixgbe_enable_fdir = 0;
335 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
336 "Enable Flow Director");
338 /* Receive-Side Scaling */
339 static int ixgbe_enable_rss = 1;
340 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
341 "Enable Receive-Side Scaling (RSS)");
344 /* Keep running tab on them for sanity check */
345 static int ixgbe_total_ports;
348 MALLOC_DEFINE(M_IXGBE, "ix", "ix driver allocations");
351 * For Flow Director: this is the number of TX packets we sample
352 * for the filter pool, this means every 20th packet will be probed.
354 * This feature can be disabled by setting this to 0.
356 static int atr_sample_rate = 20;
358 extern struct if_txrx ixgbe_txrx;
360 static struct if_shared_ctx ixgbe_sctx_init = {
361 .isc_magic = IFLIB_MAGIC,
362 .isc_q_align = PAGE_SIZE,/* max(DBA_ALIGN, PAGE_SIZE) */
363 .isc_tx_maxsize = IXGBE_TSO_SIZE,
365 .isc_tx_maxsegsize = PAGE_SIZE,
367 .isc_rx_maxsize = PAGE_SIZE*4,
368 .isc_rx_nsegments = 1,
369 .isc_rx_maxsegsize = PAGE_SIZE*4,
374 .isc_admin_intrcnt = 1,
375 .isc_vendor_info = ixgbe_vendor_info_array,
376 .isc_driver_version = ixgbe_driver_version,
377 .isc_driver = &ixgbe_if_driver,
379 .isc_nrxd_min = {MIN_RXD},
380 .isc_ntxd_min = {MIN_TXD},
381 .isc_nrxd_max = {MAX_RXD},
382 .isc_ntxd_max = {MAX_TXD},
383 .isc_nrxd_default = {DEFAULT_RXD},
384 .isc_ntxd_default = {DEFAULT_TXD},
387 if_shared_ctx_t ixgbe_sctx = &ixgbe_sctx_init;
389 /************************************************************************
390 * ixgbe_if_tx_queues_alloc
391 ************************************************************************/
393 ixgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
394 int ntxqs, int ntxqsets)
396 struct adapter *adapter = iflib_get_softc(ctx);
397 if_softc_ctx_t scctx = adapter->shared;
398 struct ix_tx_queue *que;
401 MPASS(adapter->num_tx_queues > 0);
402 MPASS(adapter->num_tx_queues == ntxqsets);
405 /* Allocate queue structure memory */
407 (struct ix_tx_queue *)malloc(sizeof(struct ix_tx_queue) * ntxqsets,
408 M_IXGBE, M_NOWAIT | M_ZERO);
409 if (!adapter->tx_queues) {
410 device_printf(iflib_get_dev(ctx),
411 "Unable to allocate TX ring memory\n");
415 for (i = 0, que = adapter->tx_queues; i < ntxqsets; i++, que++) {
416 struct tx_ring *txr = &que->txr;
418 /* In case SR-IOV is enabled, align the index properly */
419 txr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
422 txr->adapter = que->adapter = adapter;
423 adapter->active_queues |= (u64)1 << txr->me;
425 /* Allocate report status array */
426 txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_IXGBE, M_NOWAIT | M_ZERO);
427 if (txr->tx_rsq == NULL) {
431 for (j = 0; j < scctx->isc_ntxd[0]; j++)
432 txr->tx_rsq[j] = QIDX_INVALID;
433 /* get the virtual and physical address of the hardware queues */
434 txr->tail = IXGBE_TDT(txr->me);
435 txr->tx_base = (union ixgbe_adv_tx_desc *)vaddrs[i];
436 txr->tx_paddr = paddrs[i];
439 txr->total_packets = 0;
441 /* Set the rate at which we sample packets */
442 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
443 txr->atr_sample = atr_sample_rate;
447 iflib_config_gtask_init(ctx, &adapter->mod_task, ixgbe_handle_mod,
449 iflib_config_gtask_init(ctx, &adapter->msf_task, ixgbe_handle_msf,
451 iflib_config_gtask_init(ctx, &adapter->phy_task, ixgbe_handle_phy,
453 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
454 iflib_config_gtask_init(ctx, &adapter->mbx_task,
455 ixgbe_handle_mbx, "mbx_task");
456 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
457 iflib_config_gtask_init(ctx, &adapter->fdir_task,
458 ixgbe_reinit_fdir, "fdir_task");
460 device_printf(iflib_get_dev(ctx), "allocated for %d queues\n",
461 adapter->num_tx_queues);
466 ixgbe_if_queues_free(ctx);
469 } /* ixgbe_if_tx_queues_alloc */
471 /************************************************************************
472 * ixgbe_if_rx_queues_alloc
473 ************************************************************************/
475 ixgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
476 int nrxqs, int nrxqsets)
478 struct adapter *adapter = iflib_get_softc(ctx);
479 struct ix_rx_queue *que;
482 MPASS(adapter->num_rx_queues > 0);
483 MPASS(adapter->num_rx_queues == nrxqsets);
486 /* Allocate queue structure memory */
488 (struct ix_rx_queue *)malloc(sizeof(struct ix_rx_queue)*nrxqsets,
489 M_IXGBE, M_NOWAIT | M_ZERO);
490 if (!adapter->rx_queues) {
491 device_printf(iflib_get_dev(ctx),
492 "Unable to allocate TX ring memory\n");
496 for (i = 0, que = adapter->rx_queues; i < nrxqsets; i++, que++) {
497 struct rx_ring *rxr = &que->rxr;
499 /* In case SR-IOV is enabled, align the index properly */
500 rxr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
503 rxr->adapter = que->adapter = adapter;
505 /* get the virtual and physical address of the hw queues */
506 rxr->tail = IXGBE_RDT(rxr->me);
507 rxr->rx_base = (union ixgbe_adv_rx_desc *)vaddrs[i];
508 rxr->rx_paddr = paddrs[i];
513 device_printf(iflib_get_dev(ctx), "allocated for %d rx queues\n",
514 adapter->num_rx_queues);
517 } /* ixgbe_if_rx_queues_alloc */
519 /************************************************************************
520 * ixgbe_if_queues_free
521 ************************************************************************/
523 ixgbe_if_queues_free(if_ctx_t ctx)
525 struct adapter *adapter = iflib_get_softc(ctx);
526 struct ix_tx_queue *tx_que = adapter->tx_queues;
527 struct ix_rx_queue *rx_que = adapter->rx_queues;
530 if (tx_que != NULL) {
531 for (i = 0; i < adapter->num_tx_queues; i++, tx_que++) {
532 struct tx_ring *txr = &tx_que->txr;
533 if (txr->tx_rsq == NULL)
536 free(txr->tx_rsq, M_IXGBE);
540 free(adapter->tx_queues, M_IXGBE);
541 adapter->tx_queues = NULL;
543 if (rx_que != NULL) {
544 free(adapter->rx_queues, M_IXGBE);
545 adapter->rx_queues = NULL;
547 } /* ixgbe_if_queues_free */
549 /************************************************************************
550 * ixgbe_initialize_rss_mapping
551 ************************************************************************/
553 ixgbe_initialize_rss_mapping(struct adapter *adapter)
555 struct ixgbe_hw *hw = &adapter->hw;
556 u32 reta = 0, mrqc, rss_key[10];
557 int queue_id, table_size, index_mult;
561 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
562 /* Fetch the configured RSS key */
563 rss_getkey((uint8_t *)&rss_key);
565 /* set up random bits */
566 arc4rand(&rss_key, sizeof(rss_key), 0);
569 /* Set multiplier for RETA setup and table size based on MAC */
572 switch (adapter->hw.mac.type) {
573 case ixgbe_mac_82598EB:
577 case ixgbe_mac_X550EM_x:
578 case ixgbe_mac_X550EM_a:
585 /* Set up the redirection table */
586 for (i = 0, j = 0; i < table_size; i++, j++) {
587 if (j == adapter->num_rx_queues)
590 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
592 * Fetch the RSS bucket id for the given indirection
593 * entry. Cap it at the number of configured buckets
594 * (which is num_rx_queues.)
596 queue_id = rss_get_indirection_to_bucket(i);
597 queue_id = queue_id % adapter->num_rx_queues;
599 queue_id = (j * index_mult);
602 * The low 8 bits are for hash value (n+0);
603 * The next 8 bits are for hash value (n+1), etc.
606 reta = reta | (((uint32_t)queue_id) << 24);
609 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
611 IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
617 /* Now fill our hash function seeds */
618 for (i = 0; i < 10; i++)
619 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
621 /* Perform hash on these packet types */
622 if (adapter->feat_en & IXGBE_FEATURE_RSS)
623 rss_hash_config = rss_gethashconfig();
626 * Disable UDP - IP fragments aren't currently being handled
627 * and so we end up with a mix of 2-tuple and 4-tuple
630 rss_hash_config = RSS_HASHTYPE_RSS_IPV4
631 | RSS_HASHTYPE_RSS_TCP_IPV4
632 | RSS_HASHTYPE_RSS_IPV6
633 | RSS_HASHTYPE_RSS_TCP_IPV6
634 | RSS_HASHTYPE_RSS_IPV6_EX
635 | RSS_HASHTYPE_RSS_TCP_IPV6_EX;
638 mrqc = IXGBE_MRQC_RSSEN;
639 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
640 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
641 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
642 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
643 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
644 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
645 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
646 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
647 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
648 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
649 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
650 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
651 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
652 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
653 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
654 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
655 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
656 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
657 mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
658 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
659 } /* ixgbe_initialize_rss_mapping */
661 /************************************************************************
662 * ixgbe_initialize_receive_units - Setup receive registers and features.
663 ************************************************************************/
664 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
667 ixgbe_initialize_receive_units(if_ctx_t ctx)
669 struct adapter *adapter = iflib_get_softc(ctx);
670 if_softc_ctx_t scctx = adapter->shared;
671 struct ixgbe_hw *hw = &adapter->hw;
672 struct ifnet *ifp = iflib_get_ifp(ctx);
673 struct ix_rx_queue *que;
675 u32 bufsz, fctrl, srrctl, rxcsum;
679 * Make sure receives are disabled while
680 * setting up the descriptor ring
682 ixgbe_disable_rx(hw);
684 /* Enable broadcasts */
685 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
686 fctrl |= IXGBE_FCTRL_BAM;
687 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
688 fctrl |= IXGBE_FCTRL_DPF;
689 fctrl |= IXGBE_FCTRL_PMCF;
691 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
693 /* Set for Jumbo Frames? */
694 hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
695 if (ifp->if_mtu > ETHERMTU)
696 hlreg |= IXGBE_HLREG0_JUMBOEN;
698 hlreg &= ~IXGBE_HLREG0_JUMBOEN;
699 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
701 bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
702 IXGBE_SRRCTL_BSIZEPKT_SHIFT;
704 /* Setup the Base and Length of the Rx Descriptor Ring */
705 for (i = 0, que = adapter->rx_queues; i < adapter->num_rx_queues; i++, que++) {
706 struct rx_ring *rxr = &que->rxr;
707 u64 rdba = rxr->rx_paddr;
711 /* Setup the Base and Length of the Rx Descriptor Ring */
712 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
713 (rdba & 0x00000000ffffffffULL));
714 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
715 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
716 scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc));
718 /* Set up the SRRCTL register */
719 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
720 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
721 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
723 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
726 * Set DROP_EN iff we have no flow control and >1 queue.
727 * Note that srrctl was cleared shortly before during reset,
728 * so we do not need to clear the bit, but do it just in case
729 * this code is moved elsewhere.
731 if (adapter->num_rx_queues > 1 &&
732 adapter->hw.fc.requested_mode == ixgbe_fc_none) {
733 srrctl |= IXGBE_SRRCTL_DROP_EN;
735 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
738 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
740 /* Setup the HW Rx Head and Tail Descriptor Pointers */
741 IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
742 IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
744 /* Set the driver rx tail address */
745 rxr->tail = IXGBE_RDT(rxr->me);
748 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
749 u32 psrtype = IXGBE_PSRTYPE_TCPHDR
750 | IXGBE_PSRTYPE_UDPHDR
751 | IXGBE_PSRTYPE_IPV4HDR
752 | IXGBE_PSRTYPE_IPV6HDR;
753 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
756 rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
758 ixgbe_initialize_rss_mapping(adapter);
760 if (adapter->num_rx_queues > 1) {
761 /* RSS and RX IPP Checksum are mutually exclusive */
762 rxcsum |= IXGBE_RXCSUM_PCSD;
765 if (ifp->if_capenable & IFCAP_RXCSUM)
766 rxcsum |= IXGBE_RXCSUM_PCSD;
768 /* This is useful for calculating UDP/IP fragment checksums */
769 if (!(rxcsum & IXGBE_RXCSUM_PCSD))
770 rxcsum |= IXGBE_RXCSUM_IPPCSE;
772 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
774 } /* ixgbe_initialize_receive_units */
776 /************************************************************************
777 * ixgbe_initialize_transmit_units - Enable transmit units.
778 ************************************************************************/
780 ixgbe_initialize_transmit_units(if_ctx_t ctx)
782 struct adapter *adapter = iflib_get_softc(ctx);
783 struct ixgbe_hw *hw = &adapter->hw;
784 if_softc_ctx_t scctx = adapter->shared;
785 struct ix_tx_queue *que;
788 /* Setup the Base and Length of the Tx Descriptor Ring */
789 for (i = 0, que = adapter->tx_queues; i < adapter->num_tx_queues;
791 struct tx_ring *txr = &que->txr;
792 u64 tdba = txr->tx_paddr;
796 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
797 (tdba & 0x00000000ffffffffULL));
798 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
799 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
800 scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc));
802 /* Setup the HW Tx Head and Tail descriptor pointers */
803 IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
804 IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
806 /* Cache the tail address */
807 txr->tx_rs_cidx = txr->tx_rs_pidx = txr->tx_cidx_processed = 0;
808 for (int k = 0; k < scctx->isc_ntxd[0]; k++)
809 txr->tx_rsq[k] = QIDX_INVALID;
811 /* Disable Head Writeback */
813 * Note: for X550 series devices, these registers are actually
814 * prefixed with TPH_ isntead of DCA_, but the addresses and
815 * fields remain the same.
817 switch (hw->mac.type) {
818 case ixgbe_mac_82598EB:
819 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
822 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
825 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
826 switch (hw->mac.type) {
827 case ixgbe_mac_82598EB:
828 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
831 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
837 if (hw->mac.type != ixgbe_mac_82598EB) {
838 u32 dmatxctl, rttdcs;
840 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
841 dmatxctl |= IXGBE_DMATXCTL_TE;
842 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
843 /* Disable arbiter to set MTQC */
844 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
845 rttdcs |= IXGBE_RTTDCS_ARBDIS;
846 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
847 IXGBE_WRITE_REG(hw, IXGBE_MTQC,
848 ixgbe_get_mtqc(adapter->iov_mode));
849 rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
850 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
853 } /* ixgbe_initialize_transmit_units */
855 /************************************************************************
857 ************************************************************************/
859 ixgbe_register(device_t dev)
862 } /* ixgbe_register */
864 /************************************************************************
865 * ixgbe_if_attach_pre - Device initialization routine, part 1
867 * Called when the driver is being loaded.
868 * Identifies the type of hardware, initializes the hardware,
869 * and initializes iflib structures.
871 * return 0 on success, positive on failure
872 ************************************************************************/
874 ixgbe_if_attach_pre(if_ctx_t ctx)
876 struct adapter *adapter;
878 if_softc_ctx_t scctx;
883 INIT_DEBUGOUT("ixgbe_attach: begin");
885 /* Allocate, clear, and link in our adapter structure */
886 dev = iflib_get_dev(ctx);
887 adapter = iflib_get_softc(ctx);
888 adapter->hw.back = adapter;
891 scctx = adapter->shared = iflib_get_softc_ctx(ctx);
892 adapter->media = iflib_get_media(ctx);
895 /* Determine hardware revision */
896 hw->vendor_id = pci_get_vendor(dev);
897 hw->device_id = pci_get_device(dev);
898 hw->revision_id = pci_get_revid(dev);
899 hw->subsystem_vendor_id = pci_get_subvendor(dev);
900 hw->subsystem_device_id = pci_get_subdevice(dev);
902 /* Do base PCI setup - map BAR0 */
903 if (ixgbe_allocate_pci_resources(ctx)) {
904 device_printf(dev, "Allocation of PCI resources failed\n");
908 /* let hardware know driver is loaded */
909 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
910 ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
911 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
914 * Initialize the shared code
916 if (ixgbe_init_shared_code(hw) != 0) {
917 device_printf(dev, "Unable to initialize the shared code\n");
922 if (hw->mbx.ops.init_params)
923 hw->mbx.ops.init_params(hw);
925 hw->allow_unsupported_sfp = allow_unsupported_sfp;
927 if (hw->mac.type != ixgbe_mac_82598EB)
928 hw->phy.smart_speed = ixgbe_smart_speed;
930 ixgbe_init_device_features(adapter);
932 /* Enable WoL (if supported) */
933 ixgbe_check_wol_support(adapter);
935 /* Verify adapter fan is still functional (if applicable) */
936 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
937 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
938 ixgbe_check_fan_failure(adapter, esdp, FALSE);
941 /* Ensure SW/FW semaphore is free */
942 ixgbe_init_swfw_semaphore(hw);
944 /* Set an initial default flow control value */
945 hw->fc.requested_mode = ixgbe_flow_control;
947 hw->phy.reset_if_overtemp = TRUE;
948 error = ixgbe_reset_hw(hw);
949 hw->phy.reset_if_overtemp = FALSE;
950 if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
952 * No optics in this port, set up
953 * so the timer routine will probe
954 * for later insertion.
956 adapter->sfp_probe = TRUE;
958 } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
959 device_printf(dev, "Unsupported SFP+ module detected!\n");
963 device_printf(dev, "Hardware initialization failed\n");
968 /* Make sure we have a good EEPROM before we read from it */
969 if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
970 device_printf(dev, "The EEPROM Checksum Is Not Valid\n");
975 error = ixgbe_start_hw(hw);
977 case IXGBE_ERR_EEPROM_VERSION:
978 device_printf(dev, "This device is a pre-production adapter/LOM. Please be aware there may be issues associated with your hardware.\nIf you are experiencing problems please contact your Intel or hardware representative who provided you with this hardware.\n");
980 case IXGBE_ERR_SFP_NOT_SUPPORTED:
981 device_printf(dev, "Unsupported SFP+ Module\n");
984 case IXGBE_ERR_SFP_NOT_PRESENT:
985 device_printf(dev, "No SFP+ Module found\n");
991 /* Most of the iflib initialization... */
993 iflib_set_mac(ctx, hw->mac.addr);
994 switch (adapter->hw.mac.type) {
996 case ixgbe_mac_X550EM_x:
997 case ixgbe_mac_X550EM_a:
998 scctx->isc_rss_table_size = 512;
999 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 64;
1002 scctx->isc_rss_table_size = 128;
1003 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 16;
1006 /* Allow legacy interrupts */
1007 ixgbe_txrx.ift_legacy_intr = ixgbe_intr;
1009 scctx->isc_txqsizes[0] =
1010 roundup2(scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc) +
1011 sizeof(u32), DBA_ALIGN),
1012 scctx->isc_rxqsizes[0] =
1013 roundup2(scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc),
1017 scctx->isc_tx_csum_flags = CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_TSO |
1018 CSUM_IP6_TCP | CSUM_IP6_UDP | CSUM_IP6_TSO;
1019 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
1020 scctx->isc_tx_nsegments = IXGBE_82598_SCATTER;
1021 scctx->isc_msix_bar = PCIR_BAR(MSIX_82598_BAR);
1023 scctx->isc_tx_csum_flags |= CSUM_SCTP |CSUM_IP6_SCTP;
1024 scctx->isc_tx_nsegments = IXGBE_82599_SCATTER;
1025 scctx->isc_msix_bar = PCIR_BAR(MSIX_82599_BAR);
1027 scctx->isc_tx_tso_segments_max = scctx->isc_tx_nsegments;
1028 scctx->isc_tx_tso_size_max = IXGBE_TSO_SIZE;
1029 scctx->isc_tx_tso_segsize_max = PAGE_SIZE;
1031 scctx->isc_txrx = &ixgbe_txrx;
1033 scctx->isc_capenable = IXGBE_CAPS;
1038 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
1039 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
1040 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
1041 ixgbe_free_pci_resources(ctx);
1044 } /* ixgbe_if_attach_pre */
1046 /*********************************************************************
1047 * ixgbe_if_attach_post - Device initialization routine, part 2
1049 * Called during driver load, but after interrupts and
1050 * resources have been allocated and configured.
1051 * Sets up some data structures not relevant to iflib.
1053 * return 0 on success, positive on failure
1054 *********************************************************************/
1056 ixgbe_if_attach_post(if_ctx_t ctx)
1059 struct adapter *adapter;
1060 struct ixgbe_hw *hw;
1063 dev = iflib_get_dev(ctx);
1064 adapter = iflib_get_softc(ctx);
1068 if (adapter->intr_type == IFLIB_INTR_LEGACY &&
1069 (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) == 0) {
1070 device_printf(dev, "Device does not support legacy interrupts");
1075 /* Allocate multicast array memory. */
1076 adapter->mta = malloc(sizeof(*adapter->mta) *
1077 MAX_NUM_MULTICAST_ADDRESSES, M_IXGBE, M_NOWAIT);
1078 if (adapter->mta == NULL) {
1079 device_printf(dev, "Can not allocate multicast setup array\n");
1084 /* hw.ix defaults init */
1085 ixgbe_set_advertise(adapter, ixgbe_advertise_speed);
1087 /* Enable the optics for 82599 SFP+ fiber */
1088 ixgbe_enable_tx_laser(hw);
1090 /* Enable power to the phy. */
1091 ixgbe_set_phy_power(hw, TRUE);
1093 ixgbe_initialize_iov(adapter);
1095 error = ixgbe_setup_interface(ctx);
1097 device_printf(dev, "Interface setup failed: %d\n", error);
1101 ixgbe_if_update_admin_status(ctx);
1103 /* Initialize statistics */
1104 ixgbe_update_stats_counters(adapter);
1105 ixgbe_add_hw_stats(adapter);
1107 /* Check PCIE slot type/speed/width */
1108 ixgbe_get_slot_info(adapter);
1111 * Do time init and sysctl init here, but
1112 * only on the first port of a bypass adapter.
1114 ixgbe_bypass_init(adapter);
1116 /* Set an initial dmac value */
1118 /* Set initial advertised speeds (if applicable) */
1119 adapter->advertise = ixgbe_get_advertise(adapter);
1121 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
1122 ixgbe_define_iov_schemas(dev, &error);
1125 ixgbe_add_device_sysctls(ctx);
1130 } /* ixgbe_if_attach_post */
1132 /************************************************************************
1133 * ixgbe_check_wol_support
1135 * Checks whether the adapter's ports are capable of
1136 * Wake On LAN by reading the adapter's NVM.
1138 * Sets each port's hw->wol_enabled value depending
1139 * on the value read here.
1140 ************************************************************************/
1142 ixgbe_check_wol_support(struct adapter *adapter)
1144 struct ixgbe_hw *hw = &adapter->hw;
1147 /* Find out WoL support for port */
1148 adapter->wol_support = hw->wol_enabled = 0;
1149 ixgbe_get_device_caps(hw, &dev_caps);
1150 if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
1151 ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
1153 adapter->wol_support = hw->wol_enabled = 1;
1155 /* Save initial wake up filter configuration */
1156 adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
1159 } /* ixgbe_check_wol_support */
1161 /************************************************************************
1162 * ixgbe_setup_interface
1164 * Setup networking device structure and register an interface.
1165 ************************************************************************/
1167 ixgbe_setup_interface(if_ctx_t ctx)
1169 struct ifnet *ifp = iflib_get_ifp(ctx);
1170 struct adapter *adapter = iflib_get_softc(ctx);
1172 INIT_DEBUGOUT("ixgbe_setup_interface: begin");
1174 if_setifheaderlen(ifp, sizeof(struct ether_vlan_header));
1175 if_setbaudrate(ifp, IF_Gbps(10));
1177 adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1180 * Don't turn this on by default, if vlans are
1181 * created on another pseudo device (eg. lagg)
1182 * then vlan events are not passed thru, breaking
1183 * operation, but with HW FILTER off it works. If
1184 * using vlans directly on the ixgbe driver you can
1185 * enable this and get full hardware tag filtering.
1187 if_setcapenablebit(ifp, 0, IFCAP_VLAN_HWFILTER);
1188 adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
1190 ixgbe_add_media_types(ctx);
1192 /* Autoselect media by default */
1193 ifmedia_set(adapter->media, IFM_ETHER | IFM_AUTO);
1196 } /* ixgbe_setup_interface */
1198 /************************************************************************
1199 * ixgbe_if_get_counter
1200 ************************************************************************/
1202 ixgbe_if_get_counter(if_ctx_t ctx, ift_counter cnt)
1204 struct adapter *adapter = iflib_get_softc(ctx);
1205 if_t ifp = iflib_get_ifp(ctx);
1208 case IFCOUNTER_IPACKETS:
1209 return (adapter->ipackets);
1210 case IFCOUNTER_OPACKETS:
1211 return (adapter->opackets);
1212 case IFCOUNTER_IBYTES:
1213 return (adapter->ibytes);
1214 case IFCOUNTER_OBYTES:
1215 return (adapter->obytes);
1216 case IFCOUNTER_IMCASTS:
1217 return (adapter->imcasts);
1218 case IFCOUNTER_OMCASTS:
1219 return (adapter->omcasts);
1220 case IFCOUNTER_COLLISIONS:
1222 case IFCOUNTER_IQDROPS:
1223 return (adapter->iqdrops);
1224 case IFCOUNTER_OQDROPS:
1226 case IFCOUNTER_IERRORS:
1227 return (adapter->ierrors);
1229 return (if_get_counter_default(ifp, cnt));
1231 } /* ixgbe_if_get_counter */
1233 /************************************************************************
1234 * ixgbe_add_media_types
1235 ************************************************************************/
1237 ixgbe_add_media_types(if_ctx_t ctx)
1239 struct adapter *adapter = iflib_get_softc(ctx);
1240 struct ixgbe_hw *hw = &adapter->hw;
1241 device_t dev = iflib_get_dev(ctx);
1244 layer = adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
1246 /* Media types with matching FreeBSD media defines */
1247 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
1248 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_T, 0, NULL);
1249 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
1250 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1251 if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
1252 ifmedia_add(adapter->media, IFM_ETHER | IFM_100_TX, 0, NULL);
1253 if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
1254 ifmedia_add(adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
1256 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
1257 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
1258 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0,
1261 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
1262 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
1263 if (hw->phy.multispeed_fiber)
1264 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_LX, 0,
1267 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
1268 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
1269 if (hw->phy.multispeed_fiber)
1270 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_SX, 0,
1272 } else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
1273 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
1274 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
1275 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
1277 #ifdef IFM_ETH_XTYPE
1278 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
1279 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_KR, 0, NULL);
1280 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4)
1281 ifmedia_add( adapter->media, IFM_ETHER | IFM_10G_KX4, 0, NULL);
1282 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
1283 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_KX, 0, NULL);
1284 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX)
1285 ifmedia_add(adapter->media, IFM_ETHER | IFM_2500_KX, 0, NULL);
1287 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
1288 device_printf(dev, "Media supported: 10GbaseKR\n");
1289 device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
1290 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
1292 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
1293 device_printf(dev, "Media supported: 10GbaseKX4\n");
1294 device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
1295 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
1297 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
1298 device_printf(dev, "Media supported: 1000baseKX\n");
1299 device_printf(dev, "1000baseKX mapped to 1000baseCX\n");
1300 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
1302 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX) {
1303 device_printf(dev, "Media supported: 2500baseKX\n");
1304 device_printf(dev, "2500baseKX mapped to 2500baseSX\n");
1305 ifmedia_add(adapter->media, IFM_ETHER | IFM_2500_SX, 0, NULL);
1308 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
1309 device_printf(dev, "Media supported: 1000baseBX\n");
1311 if (hw->device_id == IXGBE_DEV_ID_82598AT) {
1312 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1314 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1317 ifmedia_add(adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1318 } /* ixgbe_add_media_types */
1320 /************************************************************************
1322 ************************************************************************/
1324 ixgbe_is_sfp(struct ixgbe_hw *hw)
1326 switch (hw->mac.type) {
1327 case ixgbe_mac_82598EB:
1328 if (hw->phy.type == ixgbe_phy_nl)
1331 case ixgbe_mac_82599EB:
1332 switch (hw->mac.ops.get_media_type(hw)) {
1333 case ixgbe_media_type_fiber:
1334 case ixgbe_media_type_fiber_qsfp:
1339 case ixgbe_mac_X550EM_x:
1340 case ixgbe_mac_X550EM_a:
1341 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
1347 } /* ixgbe_is_sfp */
1349 /************************************************************************
1351 ************************************************************************/
1353 ixgbe_config_link(struct adapter *adapter)
1355 struct ixgbe_hw *hw = &adapter->hw;
1356 u32 autoneg, err = 0;
1357 bool sfp, negotiate;
1359 sfp = ixgbe_is_sfp(hw);
1362 GROUPTASK_ENQUEUE(&adapter->mod_task);
1364 if (hw->mac.ops.check_link)
1365 err = ixgbe_check_link(hw, &adapter->link_speed,
1366 &adapter->link_up, FALSE);
1369 autoneg = hw->phy.autoneg_advertised;
1370 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
1371 err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
1375 if (hw->mac.ops.setup_link)
1376 err = hw->mac.ops.setup_link(hw, autoneg,
1380 } /* ixgbe_config_link */
1382 /************************************************************************
1383 * ixgbe_update_stats_counters - Update board statistics counters.
1384 ************************************************************************/
1386 ixgbe_update_stats_counters(struct adapter *adapter)
1388 struct ixgbe_hw *hw = &adapter->hw;
1389 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1390 u32 missed_rx = 0, bprc, lxon, lxoff, total;
1391 u64 total_missed_rx = 0;
1393 stats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
1394 stats->illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
1395 stats->errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC);
1396 stats->mspdc += IXGBE_READ_REG(hw, IXGBE_MSPDC);
1397 stats->mpc[0] += IXGBE_READ_REG(hw, IXGBE_MPC(0));
1399 for (int i = 0; i < 16; i++) {
1400 stats->qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
1401 stats->qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
1402 stats->qprdc[i] += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
1404 stats->mlfc += IXGBE_READ_REG(hw, IXGBE_MLFC);
1405 stats->mrfc += IXGBE_READ_REG(hw, IXGBE_MRFC);
1406 stats->rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
1408 /* Hardware workaround, gprc counts missed packets */
1409 stats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
1410 stats->gprc -= missed_rx;
1412 if (hw->mac.type != ixgbe_mac_82598EB) {
1413 stats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL) +
1414 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
1415 stats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
1416 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32);
1417 stats->tor += IXGBE_READ_REG(hw, IXGBE_TORL) +
1418 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
1419 stats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
1420 stats->lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
1422 stats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
1423 stats->lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
1424 /* 82598 only has a counter in the high register */
1425 stats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
1426 stats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
1427 stats->tor += IXGBE_READ_REG(hw, IXGBE_TORH);
1431 * Workaround: mprc hardware is incorrectly counting
1432 * broadcasts, so for now we subtract those.
1434 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
1435 stats->bprc += bprc;
1436 stats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC);
1437 if (hw->mac.type == ixgbe_mac_82598EB)
1438 stats->mprc -= bprc;
1440 stats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64);
1441 stats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127);
1442 stats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255);
1443 stats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511);
1444 stats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023);
1445 stats->prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
1447 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
1448 stats->lxontxc += lxon;
1449 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
1450 stats->lxofftxc += lxoff;
1451 total = lxon + lxoff;
1453 stats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC);
1454 stats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
1455 stats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64);
1456 stats->gptc -= total;
1457 stats->mptc -= total;
1458 stats->ptc64 -= total;
1459 stats->gotc -= total * ETHER_MIN_LEN;
1461 stats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
1462 stats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
1463 stats->roc += IXGBE_READ_REG(hw, IXGBE_ROC);
1464 stats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC);
1465 stats->mngprc += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
1466 stats->mngpdc += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
1467 stats->mngptc += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
1468 stats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR);
1469 stats->tpt += IXGBE_READ_REG(hw, IXGBE_TPT);
1470 stats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127);
1471 stats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255);
1472 stats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511);
1473 stats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023);
1474 stats->ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522);
1475 stats->bptc += IXGBE_READ_REG(hw, IXGBE_BPTC);
1476 stats->xec += IXGBE_READ_REG(hw, IXGBE_XEC);
1477 stats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC);
1478 stats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST);
1479 /* Only read FCOE on 82599 */
1480 if (hw->mac.type != ixgbe_mac_82598EB) {
1481 stats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
1482 stats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
1483 stats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
1484 stats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
1485 stats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
1488 /* Fill out the OS statistics structure */
1489 IXGBE_SET_IPACKETS(adapter, stats->gprc);
1490 IXGBE_SET_OPACKETS(adapter, stats->gptc);
1491 IXGBE_SET_IBYTES(adapter, stats->gorc);
1492 IXGBE_SET_OBYTES(adapter, stats->gotc);
1493 IXGBE_SET_IMCASTS(adapter, stats->mprc);
1494 IXGBE_SET_OMCASTS(adapter, stats->mptc);
1495 IXGBE_SET_COLLISIONS(adapter, 0);
1496 IXGBE_SET_IQDROPS(adapter, total_missed_rx);
1497 IXGBE_SET_IERRORS(adapter, stats->crcerrs + stats->rlec);
1498 } /* ixgbe_update_stats_counters */
1500 /************************************************************************
1501 * ixgbe_add_hw_stats
1503 * Add sysctl variables, one per statistic, to the system.
1504 ************************************************************************/
1506 ixgbe_add_hw_stats(struct adapter *adapter)
1508 device_t dev = iflib_get_dev(adapter->ctx);
1509 struct ix_rx_queue *rx_que;
1510 struct ix_tx_queue *tx_que;
1511 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
1512 struct sysctl_oid *tree = device_get_sysctl_tree(dev);
1513 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
1514 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1515 struct sysctl_oid *stat_node, *queue_node;
1516 struct sysctl_oid_list *stat_list, *queue_list;
1519 #define QUEUE_NAME_LEN 32
1520 char namebuf[QUEUE_NAME_LEN];
1522 /* Driver Statistics */
1523 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
1524 CTLFLAG_RD, &adapter->dropped_pkts, "Driver dropped packets");
1525 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
1526 CTLFLAG_RD, &adapter->watchdog_events, "Watchdog timeouts");
1527 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
1528 CTLFLAG_RD, &adapter->link_irq, "Link MSI-X IRQ Handled");
1530 for (i = 0, tx_que = adapter->tx_queues; i < adapter->num_tx_queues; i++, tx_que++) {
1531 struct tx_ring *txr = &tx_que->txr;
1532 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1533 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1534 CTLFLAG_RD, NULL, "Queue Name");
1535 queue_list = SYSCTL_CHILDREN(queue_node);
1537 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head",
1538 CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
1539 ixgbe_sysctl_tdh_handler, "IU", "Transmit Descriptor Head");
1540 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail",
1541 CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
1542 ixgbe_sysctl_tdt_handler, "IU", "Transmit Descriptor Tail");
1543 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso_tx",
1544 CTLFLAG_RD, &txr->tso_tx, "TSO");
1545 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
1546 CTLFLAG_RD, &txr->total_packets,
1547 "Queue Packets Transmitted");
1550 for (i = 0, rx_que = adapter->rx_queues; i < adapter->num_rx_queues; i++, rx_que++) {
1551 struct rx_ring *rxr = &rx_que->rxr;
1552 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1553 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1554 CTLFLAG_RD, NULL, "Queue Name");
1555 queue_list = SYSCTL_CHILDREN(queue_node);
1557 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "interrupt_rate",
1558 CTLTYPE_UINT | CTLFLAG_RW, &adapter->rx_queues[i],
1559 sizeof(&adapter->rx_queues[i]),
1560 ixgbe_sysctl_interrupt_rate_handler, "IU",
1562 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
1563 CTLFLAG_RD, &(adapter->rx_queues[i].irqs),
1564 "irqs on this queue");
1565 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head",
1566 CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
1567 ixgbe_sysctl_rdh_handler, "IU", "Receive Descriptor Head");
1568 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail",
1569 CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
1570 ixgbe_sysctl_rdt_handler, "IU", "Receive Descriptor Tail");
1571 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
1572 CTLFLAG_RD, &rxr->rx_packets, "Queue Packets Received");
1573 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
1574 CTLFLAG_RD, &rxr->rx_bytes, "Queue Bytes Received");
1575 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_copies",
1576 CTLFLAG_RD, &rxr->rx_copies, "Copied RX Frames");
1577 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_discarded",
1578 CTLFLAG_RD, &rxr->rx_discarded, "Discarded RX packets");
1581 /* MAC stats get their own sub node */
1583 stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats",
1584 CTLFLAG_RD, NULL, "MAC Statistics");
1585 stat_list = SYSCTL_CHILDREN(stat_node);
1587 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "crc_errs",
1588 CTLFLAG_RD, &stats->crcerrs, "CRC Errors");
1589 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "ill_errs",
1590 CTLFLAG_RD, &stats->illerrc, "Illegal Byte Errors");
1591 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "byte_errs",
1592 CTLFLAG_RD, &stats->errbc, "Byte Errors");
1593 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "short_discards",
1594 CTLFLAG_RD, &stats->mspdc, "MAC Short Packets Discarded");
1595 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "local_faults",
1596 CTLFLAG_RD, &stats->mlfc, "MAC Local Faults");
1597 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "remote_faults",
1598 CTLFLAG_RD, &stats->mrfc, "MAC Remote Faults");
1599 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rec_len_errs",
1600 CTLFLAG_RD, &stats->rlec, "Receive Length Errors");
1601 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_missed_packets",
1602 CTLFLAG_RD, &stats->mpc[0], "RX Missed Packet Count");
1604 /* Flow Control stats */
1605 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_txd",
1606 CTLFLAG_RD, &stats->lxontxc, "Link XON Transmitted");
1607 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_recvd",
1608 CTLFLAG_RD, &stats->lxonrxc, "Link XON Received");
1609 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_txd",
1610 CTLFLAG_RD, &stats->lxofftxc, "Link XOFF Transmitted");
1611 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_recvd",
1612 CTLFLAG_RD, &stats->lxoffrxc, "Link XOFF Received");
1614 /* Packet Reception Stats */
1615 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_octets_rcvd",
1616 CTLFLAG_RD, &stats->tor, "Total Octets Received");
1617 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_rcvd",
1618 CTLFLAG_RD, &stats->gorc, "Good Octets Received");
1619 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_rcvd",
1620 CTLFLAG_RD, &stats->tpr, "Total Packets Received");
1621 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_rcvd",
1622 CTLFLAG_RD, &stats->gprc, "Good Packets Received");
1623 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_rcvd",
1624 CTLFLAG_RD, &stats->mprc, "Multicast Packets Received");
1625 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_rcvd",
1626 CTLFLAG_RD, &stats->bprc, "Broadcast Packets Received");
1627 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_64",
1628 CTLFLAG_RD, &stats->prc64, "64 byte frames received ");
1629 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_65_127",
1630 CTLFLAG_RD, &stats->prc127, "65-127 byte frames received");
1631 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_128_255",
1632 CTLFLAG_RD, &stats->prc255, "128-255 byte frames received");
1633 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_256_511",
1634 CTLFLAG_RD, &stats->prc511, "256-511 byte frames received");
1635 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_512_1023",
1636 CTLFLAG_RD, &stats->prc1023, "512-1023 byte frames received");
1637 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
1638 CTLFLAG_RD, &stats->prc1522, "1023-1522 byte frames received");
1639 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_undersized",
1640 CTLFLAG_RD, &stats->ruc, "Receive Undersized");
1641 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_fragmented",
1642 CTLFLAG_RD, &stats->rfc, "Fragmented Packets Received ");
1643 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_oversized",
1644 CTLFLAG_RD, &stats->roc, "Oversized Packets Received");
1645 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabberd",
1646 CTLFLAG_RD, &stats->rjc, "Received Jabber");
1647 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_rcvd",
1648 CTLFLAG_RD, &stats->mngprc, "Management Packets Received");
1649 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_drpd",
1650 CTLFLAG_RD, &stats->mngptc, "Management Packets Dropped");
1651 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "checksum_errs",
1652 CTLFLAG_RD, &stats->xec, "Checksum Errors");
1654 /* Packet Transmission Stats */
1655 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
1656 CTLFLAG_RD, &stats->gotc, "Good Octets Transmitted");
1657 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
1658 CTLFLAG_RD, &stats->tpt, "Total Packets Transmitted");
1659 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
1660 CTLFLAG_RD, &stats->gptc, "Good Packets Transmitted");
1661 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_txd",
1662 CTLFLAG_RD, &stats->bptc, "Broadcast Packets Transmitted");
1663 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_txd",
1664 CTLFLAG_RD, &stats->mptc, "Multicast Packets Transmitted");
1665 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_txd",
1666 CTLFLAG_RD, &stats->mngptc, "Management Packets Transmitted");
1667 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_64",
1668 CTLFLAG_RD, &stats->ptc64, "64 byte frames transmitted ");
1669 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_65_127",
1670 CTLFLAG_RD, &stats->ptc127, "65-127 byte frames transmitted");
1671 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_128_255",
1672 CTLFLAG_RD, &stats->ptc255, "128-255 byte frames transmitted");
1673 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_256_511",
1674 CTLFLAG_RD, &stats->ptc511, "256-511 byte frames transmitted");
1675 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_512_1023",
1676 CTLFLAG_RD, &stats->ptc1023, "512-1023 byte frames transmitted");
1677 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_1024_1522",
1678 CTLFLAG_RD, &stats->ptc1522, "1024-1522 byte frames transmitted");
1679 } /* ixgbe_add_hw_stats */
1681 /************************************************************************
1682 * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
1684 * Retrieves the TDH value from the hardware
1685 ************************************************************************/
1687 ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS)
1689 struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
1696 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
1697 error = sysctl_handle_int(oidp, &val, 0, req);
1698 if (error || !req->newptr)
1702 } /* ixgbe_sysctl_tdh_handler */
1704 /************************************************************************
1705 * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
1707 * Retrieves the TDT value from the hardware
1708 ************************************************************************/
1710 ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS)
1712 struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
1719 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
1720 error = sysctl_handle_int(oidp, &val, 0, req);
1721 if (error || !req->newptr)
1725 } /* ixgbe_sysctl_tdt_handler */
1727 /************************************************************************
1728 * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
1730 * Retrieves the RDH value from the hardware
1731 ************************************************************************/
1733 ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS)
1735 struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
1742 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
1743 error = sysctl_handle_int(oidp, &val, 0, req);
1744 if (error || !req->newptr)
1748 } /* ixgbe_sysctl_rdh_handler */
1750 /************************************************************************
1751 * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
1753 * Retrieves the RDT value from the hardware
1754 ************************************************************************/
1756 ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS)
1758 struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
1765 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
1766 error = sysctl_handle_int(oidp, &val, 0, req);
1767 if (error || !req->newptr)
1771 } /* ixgbe_sysctl_rdt_handler */
1773 /************************************************************************
1774 * ixgbe_if_vlan_register
1776 * Run via vlan config EVENT, it enables us to use the
1777 * HW Filter table since we can get the vlan id. This
1778 * just creates the entry in the soft version of the
1779 * VFTA, init will repopulate the real table.
1780 ************************************************************************/
1782 ixgbe_if_vlan_register(if_ctx_t ctx, u16 vtag)
1784 struct adapter *adapter = iflib_get_softc(ctx);
1787 index = (vtag >> 5) & 0x7F;
1789 adapter->shadow_vfta[index] |= (1 << bit);
1790 ++adapter->num_vlans;
1791 ixgbe_setup_vlan_hw_support(ctx);
1792 } /* ixgbe_if_vlan_register */
1794 /************************************************************************
1795 * ixgbe_if_vlan_unregister
1797 * Run via vlan unconfig EVENT, remove our entry in the soft vfta.
1798 ************************************************************************/
1800 ixgbe_if_vlan_unregister(if_ctx_t ctx, u16 vtag)
1802 struct adapter *adapter = iflib_get_softc(ctx);
1805 index = (vtag >> 5) & 0x7F;
1807 adapter->shadow_vfta[index] &= ~(1 << bit);
1808 --adapter->num_vlans;
1809 /* Re-init to load the changes */
1810 ixgbe_setup_vlan_hw_support(ctx);
1811 } /* ixgbe_if_vlan_unregister */
1813 /************************************************************************
1814 * ixgbe_setup_vlan_hw_support
1815 ************************************************************************/
1817 ixgbe_setup_vlan_hw_support(if_ctx_t ctx)
1819 struct ifnet *ifp = iflib_get_ifp(ctx);
1820 struct adapter *adapter = iflib_get_softc(ctx);
1821 struct ixgbe_hw *hw = &adapter->hw;
1822 struct rx_ring *rxr;
1828 * We get here thru init_locked, meaning
1829 * a soft reset, this has already cleared
1830 * the VFTA and other state, so if there
1831 * have been no vlan's registered do nothing.
1833 if (adapter->num_vlans == 0)
1836 /* Setup the queues for vlans */
1837 if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) {
1838 for (i = 0; i < adapter->num_rx_queues; i++) {
1839 rxr = &adapter->rx_queues[i].rxr;
1840 /* On 82599 the VLAN enable is per/queue in RXDCTL */
1841 if (hw->mac.type != ixgbe_mac_82598EB) {
1842 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
1843 ctrl |= IXGBE_RXDCTL_VME;
1844 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
1846 rxr->vtag_strip = TRUE;
1850 if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
1853 * A soft reset zero's out the VFTA, so
1854 * we need to repopulate it now.
1856 for (i = 0; i < IXGBE_VFTA_SIZE; i++)
1857 if (adapter->shadow_vfta[i] != 0)
1858 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
1859 adapter->shadow_vfta[i]);
1861 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
1862 /* Enable the Filter Table if enabled */
1863 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) {
1864 ctrl &= ~IXGBE_VLNCTRL_CFIEN;
1865 ctrl |= IXGBE_VLNCTRL_VFE;
1867 if (hw->mac.type == ixgbe_mac_82598EB)
1868 ctrl |= IXGBE_VLNCTRL_VME;
1869 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
1870 } /* ixgbe_setup_vlan_hw_support */
1872 /************************************************************************
1873 * ixgbe_get_slot_info
1875 * Get the width and transaction speed of
1876 * the slot this adapter is plugged into.
1877 ************************************************************************/
1879 ixgbe_get_slot_info(struct adapter *adapter)
1881 device_t dev = iflib_get_dev(adapter->ctx);
1882 struct ixgbe_hw *hw = &adapter->hw;
1883 int bus_info_valid = TRUE;
1887 /* Some devices are behind an internal bridge */
1888 switch (hw->device_id) {
1889 case IXGBE_DEV_ID_82599_SFP_SF_QP:
1890 case IXGBE_DEV_ID_82599_QSFP_SF_QP:
1891 goto get_parent_info;
1896 ixgbe_get_bus_info(hw);
1899 * Some devices don't use PCI-E, but there is no need
1900 * to display "Unknown" for bus speed and width.
1902 switch (hw->mac.type) {
1903 case ixgbe_mac_X550EM_x:
1904 case ixgbe_mac_X550EM_a:
1912 * For the Quad port adapter we need to parse back
1913 * up the PCI tree to find the speed of the expansion
1914 * slot into which this adapter is plugged. A bit more work.
1916 dev = device_get_parent(device_get_parent(dev));
1918 device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
1919 pci_get_slot(dev), pci_get_function(dev));
1921 dev = device_get_parent(device_get_parent(dev));
1923 device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
1924 pci_get_slot(dev), pci_get_function(dev));
1926 /* Now get the PCI Express Capabilities offset */
1927 if (pci_find_cap(dev, PCIY_EXPRESS, &offset)) {
1929 * Hmm...can't get PCI-Express capabilities.
1930 * Falling back to default method.
1932 bus_info_valid = FALSE;
1933 ixgbe_get_bus_info(hw);
1936 /* ...and read the Link Status Register */
1937 link = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
1938 ixgbe_set_pci_config_data_generic(hw, link);
1941 device_printf(dev, "PCI Express Bus: Speed %s %s\n",
1942 ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s" :
1943 (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s" :
1944 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s" :
1946 ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
1947 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
1948 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
1951 if (bus_info_valid) {
1952 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
1953 ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
1954 (hw->bus.speed == ixgbe_bus_speed_2500))) {
1955 device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
1956 device_printf(dev, "For optimal performance a x8 PCIE, or x4 PCIE Gen2 slot is required.\n");
1958 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
1959 ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
1960 (hw->bus.speed < ixgbe_bus_speed_8000))) {
1961 device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
1962 device_printf(dev, "For optimal performance a x8 PCIE Gen3 slot is required.\n");
1965 device_printf(dev, "Unable to determine slot speed/width. The speed/width reported are that of the internal switch.\n");
1968 } /* ixgbe_get_slot_info */
1970 /************************************************************************
1971 * ixgbe_if_msix_intr_assign
1973 * Setup MSI-X Interrupt resources and handlers
1974 ************************************************************************/
1976 ixgbe_if_msix_intr_assign(if_ctx_t ctx, int msix)
1978 struct adapter *adapter = iflib_get_softc(ctx);
1979 struct ix_rx_queue *rx_que = adapter->rx_queues;
1980 struct ix_tx_queue *tx_que;
1981 int error, rid, vector = 0;
1985 /* Admin Que is vector 0*/
1987 for (int i = 0; i < adapter->num_rx_queues; i++, vector++, rx_que++) {
1990 snprintf(buf, sizeof(buf), "rxq%d", i);
1991 error = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
1992 IFLIB_INTR_RX, ixgbe_msix_que, rx_que, rx_que->rxr.me, buf);
1995 device_printf(iflib_get_dev(ctx),
1996 "Failed to allocate que int %d err: %d", i, error);
1997 adapter->num_rx_queues = i + 1;
2001 rx_que->msix = vector;
2002 adapter->active_queues |= (u64)(1 << rx_que->msix);
2003 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
2005 * The queue ID is used as the RSS layer bucket ID.
2006 * We look up the queue ID -> RSS CPU ID and select
2009 cpu_id = rss_getcpu(i % rss_getnumbuckets());
2012 * Bind the msix vector, and thus the
2013 * rings to the corresponding cpu.
2015 * This just happens to match the default RSS
2016 * round-robin bucket -> queue -> CPU allocation.
2018 if (adapter->num_rx_queues > 1)
2023 for (int i = 0; i < adapter->num_tx_queues; i++) {
2024 snprintf(buf, sizeof(buf), "txq%d", i);
2025 tx_que = &adapter->tx_queues[i];
2026 tx_que->msix = i % adapter->num_rx_queues;
2027 iflib_softirq_alloc_generic(ctx,
2028 &adapter->rx_queues[tx_que->msix].que_irq,
2029 IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
2032 error = iflib_irq_alloc_generic(ctx, &adapter->irq, rid,
2033 IFLIB_INTR_ADMIN, ixgbe_msix_link, adapter, 0, "aq");
2035 device_printf(iflib_get_dev(ctx),
2036 "Failed to register admin handler");
2040 adapter->vector = vector;
2044 iflib_irq_free(ctx, &adapter->irq);
2045 rx_que = adapter->rx_queues;
2046 for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++)
2047 iflib_irq_free(ctx, &rx_que->que_irq);
2050 } /* ixgbe_if_msix_intr_assign */
2052 /*********************************************************************
2053 * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2054 **********************************************************************/
2056 ixgbe_msix_que(void *arg)
2058 struct ix_rx_queue *que = arg;
2059 struct adapter *adapter = que->adapter;
2060 struct ifnet *ifp = iflib_get_ifp(que->adapter->ctx);
2062 /* Protect against spurious interrupts */
2063 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2066 ixgbe_disable_queue(adapter, que->msix);
2069 return (FILTER_SCHEDULE_THREAD);
2070 } /* ixgbe_msix_que */
2072 /************************************************************************
2073 * ixgbe_media_status - Media Ioctl callback
2075 * Called whenever the user queries the status of
2076 * the interface using ifconfig.
2077 ************************************************************************/
2079 ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr)
2081 struct adapter *adapter = iflib_get_softc(ctx);
2082 struct ixgbe_hw *hw = &adapter->hw;
2085 INIT_DEBUGOUT("ixgbe_if_media_status: begin");
2087 iflib_admin_intr_deferred(ctx);
2089 ifmr->ifm_status = IFM_AVALID;
2090 ifmr->ifm_active = IFM_ETHER;
2092 if (!adapter->link_active)
2095 ifmr->ifm_status |= IFM_ACTIVE;
2096 layer = adapter->phy_layer;
2098 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2099 layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2100 layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2101 layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2102 switch (adapter->link_speed) {
2103 case IXGBE_LINK_SPEED_10GB_FULL:
2104 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2106 case IXGBE_LINK_SPEED_1GB_FULL:
2107 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2109 case IXGBE_LINK_SPEED_100_FULL:
2110 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2112 case IXGBE_LINK_SPEED_10_FULL:
2113 ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2116 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2117 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2118 switch (adapter->link_speed) {
2119 case IXGBE_LINK_SPEED_10GB_FULL:
2120 ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2123 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2124 switch (adapter->link_speed) {
2125 case IXGBE_LINK_SPEED_10GB_FULL:
2126 ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2128 case IXGBE_LINK_SPEED_1GB_FULL:
2129 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2132 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2133 switch (adapter->link_speed) {
2134 case IXGBE_LINK_SPEED_10GB_FULL:
2135 ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2137 case IXGBE_LINK_SPEED_1GB_FULL:
2138 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2141 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2142 layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2143 switch (adapter->link_speed) {
2144 case IXGBE_LINK_SPEED_10GB_FULL:
2145 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2147 case IXGBE_LINK_SPEED_1GB_FULL:
2148 ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2151 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2152 switch (adapter->link_speed) {
2153 case IXGBE_LINK_SPEED_10GB_FULL:
2154 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2158 * XXX: These need to use the proper media types once
2161 #ifndef IFM_ETH_XTYPE
2162 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2163 switch (adapter->link_speed) {
2164 case IXGBE_LINK_SPEED_10GB_FULL:
2165 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2167 case IXGBE_LINK_SPEED_2_5GB_FULL:
2168 ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2170 case IXGBE_LINK_SPEED_1GB_FULL:
2171 ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2174 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2175 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2176 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2177 switch (adapter->link_speed) {
2178 case IXGBE_LINK_SPEED_10GB_FULL:
2179 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2181 case IXGBE_LINK_SPEED_2_5GB_FULL:
2182 ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2184 case IXGBE_LINK_SPEED_1GB_FULL:
2185 ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2189 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2190 switch (adapter->link_speed) {
2191 case IXGBE_LINK_SPEED_10GB_FULL:
2192 ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2194 case IXGBE_LINK_SPEED_2_5GB_FULL:
2195 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2197 case IXGBE_LINK_SPEED_1GB_FULL:
2198 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2201 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2202 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2203 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2204 switch (adapter->link_speed) {
2205 case IXGBE_LINK_SPEED_10GB_FULL:
2206 ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
2208 case IXGBE_LINK_SPEED_2_5GB_FULL:
2209 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2211 case IXGBE_LINK_SPEED_1GB_FULL:
2212 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2217 /* If nothing is recognized... */
2218 if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
2219 ifmr->ifm_active |= IFM_UNKNOWN;
2221 /* Display current flow control setting used on link */
2222 if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
2223 hw->fc.current_mode == ixgbe_fc_full)
2224 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
2225 if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
2226 hw->fc.current_mode == ixgbe_fc_full)
2227 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
2228 } /* ixgbe_media_status */
2230 /************************************************************************
2231 * ixgbe_media_change - Media Ioctl callback
2233 * Called when the user changes speed/duplex using
2234 * media/mediopt option with ifconfig.
2235 ************************************************************************/
2237 ixgbe_if_media_change(if_ctx_t ctx)
2239 struct adapter *adapter = iflib_get_softc(ctx);
2240 struct ifmedia *ifm = iflib_get_media(ctx);
2241 struct ixgbe_hw *hw = &adapter->hw;
2242 ixgbe_link_speed speed = 0;
2244 INIT_DEBUGOUT("ixgbe_if_media_change: begin");
2246 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
2249 if (hw->phy.media_type == ixgbe_media_type_backplane)
2253 * We don't actually need to check against the supported
2254 * media types of the adapter; ifmedia will take care of
2257 switch (IFM_SUBTYPE(ifm->ifm_media)) {
2260 speed |= IXGBE_LINK_SPEED_100_FULL;
2261 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2262 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2266 #ifndef IFM_ETH_XTYPE
2267 case IFM_10G_SR: /* KR, too */
2268 case IFM_10G_CX4: /* KX4 */
2273 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2274 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2276 #ifndef IFM_ETH_XTYPE
2277 case IFM_1000_CX: /* KX */
2283 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2286 speed |= IXGBE_LINK_SPEED_100_FULL;
2287 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2289 case IFM_10G_TWINAX:
2290 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2293 speed |= IXGBE_LINK_SPEED_100_FULL;
2296 speed |= IXGBE_LINK_SPEED_10_FULL;
2302 hw->mac.autotry_restart = TRUE;
2303 hw->mac.ops.setup_link(hw, speed, TRUE);
2304 adapter->advertise =
2305 ((speed & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) |
2306 ((speed & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) |
2307 ((speed & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) |
2308 ((speed & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0);
2313 device_printf(iflib_get_dev(ctx), "Invalid media type!\n");
2316 } /* ixgbe_if_media_change */
2318 /************************************************************************
2320 ************************************************************************/
2322 ixgbe_if_promisc_set(if_ctx_t ctx, int flags)
2324 struct adapter *adapter = iflib_get_softc(ctx);
2325 struct ifnet *ifp = iflib_get_ifp(ctx);
2329 rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
2330 rctl &= (~IXGBE_FCTRL_UPE);
2331 if (ifp->if_flags & IFF_ALLMULTI)
2332 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
2334 mcnt = if_multiaddr_count(ifp, MAX_NUM_MULTICAST_ADDRESSES);
2336 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
2337 rctl &= (~IXGBE_FCTRL_MPE);
2338 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2340 if (ifp->if_flags & IFF_PROMISC) {
2341 rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
2342 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2343 } else if (ifp->if_flags & IFF_ALLMULTI) {
2344 rctl |= IXGBE_FCTRL_MPE;
2345 rctl &= ~IXGBE_FCTRL_UPE;
2346 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2349 } /* ixgbe_if_promisc_set */
2351 /************************************************************************
2352 * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
2353 ************************************************************************/
2355 ixgbe_msix_link(void *arg)
2357 struct adapter *adapter = arg;
2358 struct ixgbe_hw *hw = &adapter->hw;
2359 u32 eicr, eicr_mask;
2362 ++adapter->link_irq;
2364 /* Pause other interrupts */
2365 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
2367 /* First get the cause */
2368 eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
2369 /* Be sure the queue bits are not cleared */
2370 eicr &= ~IXGBE_EICR_RTX_QUEUE;
2371 /* Clear interrupt with write */
2372 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
2374 /* Link status change */
2375 if (eicr & IXGBE_EICR_LSC) {
2376 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
2377 iflib_admin_intr_deferred(adapter->ctx);
2380 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
2381 if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
2382 (eicr & IXGBE_EICR_FLOW_DIR)) {
2383 /* This is probably overkill :) */
2384 if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
2385 return (FILTER_HANDLED);
2386 /* Disable the interrupt */
2387 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
2388 GROUPTASK_ENQUEUE(&adapter->fdir_task);
2390 if (eicr & IXGBE_EICR_ECC) {
2391 device_printf(iflib_get_dev(adapter->ctx),
2392 "\nCRITICAL: ECC ERROR!! Please Reboot!!\n");
2393 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
2396 /* Check for over temp condition */
2397 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
2398 switch (adapter->hw.mac.type) {
2399 case ixgbe_mac_X550EM_a:
2400 if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
2402 IXGBE_WRITE_REG(hw, IXGBE_EIMC,
2403 IXGBE_EICR_GPI_SDP0_X550EM_a);
2404 IXGBE_WRITE_REG(hw, IXGBE_EICR,
2405 IXGBE_EICR_GPI_SDP0_X550EM_a);
2406 retval = hw->phy.ops.check_overtemp(hw);
2407 if (retval != IXGBE_ERR_OVERTEMP)
2409 device_printf(iflib_get_dev(adapter->ctx),
2410 "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2411 device_printf(iflib_get_dev(adapter->ctx),
2412 "System shutdown required!\n");
2415 if (!(eicr & IXGBE_EICR_TS))
2417 retval = hw->phy.ops.check_overtemp(hw);
2418 if (retval != IXGBE_ERR_OVERTEMP)
2420 device_printf(iflib_get_dev(adapter->ctx),
2421 "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2422 device_printf(iflib_get_dev(adapter->ctx),
2423 "System shutdown required!\n");
2424 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
2429 /* Check for VF message */
2430 if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
2431 (eicr & IXGBE_EICR_MAILBOX))
2432 GROUPTASK_ENQUEUE(&adapter->mbx_task);
2435 if (ixgbe_is_sfp(hw)) {
2436 /* Pluggable optics-related interrupt */
2437 if (hw->mac.type >= ixgbe_mac_X540)
2438 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
2440 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
2442 if (eicr & eicr_mask) {
2443 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
2444 if (atomic_cmpset_acq_int(&adapter->sfp_reinit, 0, 1))
2445 GROUPTASK_ENQUEUE(&adapter->mod_task);
2448 if ((hw->mac.type == ixgbe_mac_82599EB) &&
2449 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
2450 IXGBE_WRITE_REG(hw, IXGBE_EICR,
2451 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2452 if (atomic_cmpset_acq_int(&adapter->sfp_reinit, 0, 1))
2453 GROUPTASK_ENQUEUE(&adapter->msf_task);
2457 /* Check for fan failure */
2458 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
2459 ixgbe_check_fan_failure(adapter, eicr, TRUE);
2460 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2463 /* External PHY interrupt */
2464 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
2465 (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
2466 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
2467 GROUPTASK_ENQUEUE(&adapter->phy_task);
2470 /* Re-enable other interrupts */
2471 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
2473 return (FILTER_HANDLED);
2474 } /* ixgbe_msix_link */
2476 /************************************************************************
2477 * ixgbe_sysctl_interrupt_rate_handler
2478 ************************************************************************/
2480 ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
2482 struct ix_rx_queue *que = ((struct ix_rx_queue *)oidp->oid_arg1);
2484 unsigned int reg, usec, rate;
2486 reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
2487 usec = ((reg & 0x0FF8) >> 3);
2489 rate = 500000 / usec;
2492 error = sysctl_handle_int(oidp, &rate, 0, req);
2493 if (error || !req->newptr)
2495 reg &= ~0xfff; /* default, no limitation */
2496 ixgbe_max_interrupt_rate = 0;
2497 if (rate > 0 && rate < 500000) {
2500 ixgbe_max_interrupt_rate = rate;
2501 reg |= ((4000000/rate) & 0xff8);
2503 IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
2506 } /* ixgbe_sysctl_interrupt_rate_handler */
2508 /************************************************************************
2509 * ixgbe_add_device_sysctls
2510 ************************************************************************/
2512 ixgbe_add_device_sysctls(if_ctx_t ctx)
2514 struct adapter *adapter = iflib_get_softc(ctx);
2515 device_t dev = iflib_get_dev(ctx);
2516 struct ixgbe_hw *hw = &adapter->hw;
2517 struct sysctl_oid_list *child;
2518 struct sysctl_ctx_list *ctx_list;
2520 ctx_list = device_get_sysctl_ctx(dev);
2521 child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
2523 /* Sysctls for all devices */
2524 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "fc",
2525 CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_flowcntl, "I",
2526 IXGBE_SYSCTL_DESC_SET_FC);
2528 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "advertise_speed",
2529 CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_advertise, "I",
2530 IXGBE_SYSCTL_DESC_ADV_SPEED);
2533 /* testing sysctls (for all devices) */
2534 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "power_state",
2535 CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_power_state,
2536 "I", "PCI Power State");
2538 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "print_rss_config",
2539 CTLTYPE_STRING | CTLFLAG_RD, adapter, 0,
2540 ixgbe_sysctl_print_rss_config, "A", "Prints RSS Configuration");
2542 /* for X550 series devices */
2543 if (hw->mac.type >= ixgbe_mac_X550)
2544 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "dmac",
2545 CTLTYPE_U16 | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_dmac,
2546 "I", "DMA Coalesce");
2548 /* for WoL-capable devices */
2549 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2550 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wol_enable",
2551 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
2552 ixgbe_sysctl_wol_enable, "I", "Enable/Disable Wake on LAN");
2554 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wufc",
2555 CTLTYPE_U32 | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_wufc,
2556 "I", "Enable/Disable Wake Up Filters");
2559 /* for X552/X557-AT devices */
2560 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2561 struct sysctl_oid *phy_node;
2562 struct sysctl_oid_list *phy_list;
2564 phy_node = SYSCTL_ADD_NODE(ctx_list, child, OID_AUTO, "phy",
2565 CTLFLAG_RD, NULL, "External PHY sysctls");
2566 phy_list = SYSCTL_CHILDREN(phy_node);
2568 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO, "temp",
2569 CTLTYPE_U16 | CTLFLAG_RD, adapter, 0, ixgbe_sysctl_phy_temp,
2570 "I", "Current External PHY Temperature (Celsius)");
2572 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO,
2573 "overtemp_occurred", CTLTYPE_U16 | CTLFLAG_RD, adapter, 0,
2574 ixgbe_sysctl_phy_overtemp_occurred, "I",
2575 "External PHY High Temperature Event Occurred");
2578 if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
2579 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "eee_state",
2580 CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
2581 ixgbe_sysctl_eee_state, "I", "EEE Power Save State");
2583 } /* ixgbe_add_device_sysctls */
2585 /************************************************************************
2586 * ixgbe_allocate_pci_resources
2587 ************************************************************************/
2589 ixgbe_allocate_pci_resources(if_ctx_t ctx)
2591 struct adapter *adapter = iflib_get_softc(ctx);
2592 device_t dev = iflib_get_dev(ctx);
2596 adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
2599 if (!(adapter->pci_mem)) {
2600 device_printf(dev, "Unable to allocate bus resource: memory\n");
2604 /* Save bus_space values for READ/WRITE_REG macros */
2605 adapter->osdep.mem_bus_space_tag = rman_get_bustag(adapter->pci_mem);
2606 adapter->osdep.mem_bus_space_handle =
2607 rman_get_bushandle(adapter->pci_mem);
2608 /* Set hw values for shared code */
2609 adapter->hw.hw_addr = (u8 *)&adapter->osdep.mem_bus_space_handle;
2612 } /* ixgbe_allocate_pci_resources */
2614 /************************************************************************
2615 * ixgbe_detach - Device removal routine
2617 * Called when the driver is being removed.
2618 * Stops the adapter and deallocates all the resources
2619 * that were allocated for driver operation.
2621 * return 0 on success, positive on failure
2622 ************************************************************************/
2624 ixgbe_if_detach(if_ctx_t ctx)
2626 struct adapter *adapter = iflib_get_softc(ctx);
2627 device_t dev = iflib_get_dev(ctx);
2630 INIT_DEBUGOUT("ixgbe_detach: begin");
2632 if (ixgbe_pci_iov_detach(dev) != 0) {
2633 device_printf(dev, "SR-IOV in use; detach first.\n");
2637 iflib_config_gtask_deinit(&adapter->mod_task);
2638 iflib_config_gtask_deinit(&adapter->msf_task);
2639 iflib_config_gtask_deinit(&adapter->phy_task);
2640 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
2641 iflib_config_gtask_deinit(&adapter->mbx_task);
2643 ixgbe_setup_low_power_mode(ctx);
2645 /* let hardware know driver is unloading */
2646 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
2647 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
2648 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
2650 ixgbe_free_pci_resources(ctx);
2651 free(adapter->mta, M_IXGBE);
2654 } /* ixgbe_if_detach */
2656 /************************************************************************
2657 * ixgbe_setup_low_power_mode - LPLU/WoL preparation
2659 * Prepare the adapter/port for LPLU and/or WoL
2660 ************************************************************************/
2662 ixgbe_setup_low_power_mode(if_ctx_t ctx)
2664 struct adapter *adapter = iflib_get_softc(ctx);
2665 struct ixgbe_hw *hw = &adapter->hw;
2666 device_t dev = iflib_get_dev(ctx);
2669 if (!hw->wol_enabled)
2670 ixgbe_set_phy_power(hw, FALSE);
2672 /* Limit power management flow to X550EM baseT */
2673 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
2674 hw->phy.ops.enter_lplu) {
2675 /* Turn off support for APM wakeup. (Using ACPI instead) */
2676 IXGBE_WRITE_REG(hw, IXGBE_GRC,
2677 IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
2680 * Clear Wake Up Status register to prevent any previous wakeup
2681 * events from waking us up immediately after we suspend.
2683 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2686 * Program the Wakeup Filter Control register with user filter
2689 IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
2691 /* Enable wakeups and power management in Wakeup Control */
2692 IXGBE_WRITE_REG(hw, IXGBE_WUC,
2693 IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
2695 /* X550EM baseT adapters need a special LPLU flow */
2696 hw->phy.reset_disable = TRUE;
2698 error = hw->phy.ops.enter_lplu(hw);
2700 device_printf(dev, "Error entering LPLU: %d\n", error);
2701 hw->phy.reset_disable = FALSE;
2703 /* Just stop for other adapters */
2708 } /* ixgbe_setup_low_power_mode */
2710 /************************************************************************
2711 * ixgbe_shutdown - Shutdown entry point
2712 ************************************************************************/
2714 ixgbe_if_shutdown(if_ctx_t ctx)
2718 INIT_DEBUGOUT("ixgbe_shutdown: begin");
2720 error = ixgbe_setup_low_power_mode(ctx);
2723 } /* ixgbe_if_shutdown */
2725 /************************************************************************
2729 ************************************************************************/
2731 ixgbe_if_suspend(if_ctx_t ctx)
2735 INIT_DEBUGOUT("ixgbe_suspend: begin");
2737 error = ixgbe_setup_low_power_mode(ctx);
2740 } /* ixgbe_if_suspend */
2742 /************************************************************************
2746 ************************************************************************/
2748 ixgbe_if_resume(if_ctx_t ctx)
2750 struct adapter *adapter = iflib_get_softc(ctx);
2751 device_t dev = iflib_get_dev(ctx);
2752 struct ifnet *ifp = iflib_get_ifp(ctx);
2753 struct ixgbe_hw *hw = &adapter->hw;
2756 INIT_DEBUGOUT("ixgbe_resume: begin");
2758 /* Read & clear WUS register */
2759 wus = IXGBE_READ_REG(hw, IXGBE_WUS);
2761 device_printf(dev, "Woken up by (WUS): %#010x\n",
2762 IXGBE_READ_REG(hw, IXGBE_WUS));
2763 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2764 /* And clear WUFC until next low-power transition */
2765 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
2768 * Required after D3->D0 transition;
2769 * will re-advertise all previous advertised speeds
2771 if (ifp->if_flags & IFF_UP)
2775 } /* ixgbe_if_resume */
2777 /************************************************************************
2778 * ixgbe_if_mtu_set - Ioctl mtu entry point
2780 * Return 0 on success, EINVAL on failure
2781 ************************************************************************/
2783 ixgbe_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
2785 struct adapter *adapter = iflib_get_softc(ctx);
2788 IOCTL_DEBUGOUT("ioctl: SIOCIFMTU (Set Interface MTU)");
2790 if (mtu > IXGBE_MAX_MTU) {
2793 adapter->max_frame_size = mtu + IXGBE_MTU_HDR;
2797 } /* ixgbe_if_mtu_set */
2799 /************************************************************************
2800 * ixgbe_if_crcstrip_set
2801 ************************************************************************/
2803 ixgbe_if_crcstrip_set(if_ctx_t ctx, int onoff, int crcstrip)
2805 struct adapter *sc = iflib_get_softc(ctx);
2806 struct ixgbe_hw *hw = &sc->hw;
2807 /* crc stripping is set in two places:
2808 * IXGBE_HLREG0 (modified on init_locked and hw reset)
2809 * IXGBE_RDRXCTL (set by the original driver in
2810 * ixgbe_setup_hw_rsc() called in init_locked.
2811 * We disable the setting when netmap is compiled in).
2812 * We update the values here, but also in ixgbe.c because
2813 * init_locked sometimes is called outside our control.
2817 hl = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2818 rxc = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2821 D("%s read HLREG 0x%x rxc 0x%x",
2822 onoff ? "enter" : "exit", hl, rxc);
2824 /* hw requirements ... */
2825 rxc &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
2826 rxc |= IXGBE_RDRXCTL_RSCACKC;
2827 if (onoff && !crcstrip) {
2828 /* keep the crc. Fast rx */
2829 hl &= ~IXGBE_HLREG0_RXCRCSTRP;
2830 rxc &= ~IXGBE_RDRXCTL_CRCSTRIP;
2832 /* reset default mode */
2833 hl |= IXGBE_HLREG0_RXCRCSTRP;
2834 rxc |= IXGBE_RDRXCTL_CRCSTRIP;
2838 D("%s write HLREG 0x%x rxc 0x%x",
2839 onoff ? "enter" : "exit", hl, rxc);
2841 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hl);
2842 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rxc);
2843 } /* ixgbe_if_crcstrip_set */
2845 /*********************************************************************
2846 * ixgbe_if_init - Init entry point
2848 * Used in two ways: It is used by the stack as an init
2849 * entry point in network interface structure. It is also
2850 * used by the driver as a hw/sw initialization routine to
2851 * get to a consistent state.
2853 * Return 0 on success, positive on failure
2854 **********************************************************************/
2856 ixgbe_if_init(if_ctx_t ctx)
2858 struct adapter *adapter = iflib_get_softc(ctx);
2859 struct ifnet *ifp = iflib_get_ifp(ctx);
2860 device_t dev = iflib_get_dev(ctx);
2861 struct ixgbe_hw *hw = &adapter->hw;
2862 struct ix_rx_queue *rx_que;
2863 struct ix_tx_queue *tx_que;
2870 INIT_DEBUGOUT("ixgbe_if_init: begin");
2872 /* Queue indices may change with IOV mode */
2873 ixgbe_align_all_queue_indices(adapter);
2875 /* reprogram the RAR[0] in case user changed it. */
2876 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
2878 /* Get the latest mac address, User can use a LAA */
2879 bcopy(IF_LLADDR(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
2880 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
2881 hw->addr_ctrl.rar_used_count = 1;
2885 ixgbe_initialize_iov(adapter);
2887 ixgbe_initialize_transmit_units(ctx);
2889 /* Setup Multicast table */
2890 ixgbe_if_multi_set(ctx);
2892 /* Determine the correct mbuf pool, based on frame size */
2893 if (adapter->max_frame_size <= MCLBYTES)
2894 adapter->rx_mbuf_sz = MCLBYTES;
2896 adapter->rx_mbuf_sz = MJUMPAGESIZE;
2898 /* Configure RX settings */
2899 ixgbe_initialize_receive_units(ctx);
2901 /* Enable SDP & MSI-X interrupts based on adapter */
2902 ixgbe_config_gpie(adapter);
2905 if (ifp->if_mtu > ETHERMTU) {
2906 /* aka IXGBE_MAXFRS on 82599 and newer */
2907 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
2908 mhadd &= ~IXGBE_MHADD_MFS_MASK;
2909 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
2910 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
2913 /* Now enable all the queues */
2914 for (i = 0, tx_que = adapter->tx_queues; i < adapter->num_tx_queues; i++, tx_que++) {
2915 struct tx_ring *txr = &tx_que->txr;
2917 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
2918 txdctl |= IXGBE_TXDCTL_ENABLE;
2919 /* Set WTHRESH to 8, burst writeback */
2920 txdctl |= (8 << 16);
2922 * When the internal queue falls below PTHRESH (32),
2923 * start prefetching as long as there are at least
2924 * HTHRESH (1) buffers ready. The values are taken
2925 * from the Intel linux driver 3.8.21.
2926 * Prefetching enables tx line rate even with 1 queue.
2928 txdctl |= (32 << 0) | (1 << 8);
2929 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
2932 for (i = 0, rx_que = adapter->rx_queues; i < adapter->num_rx_queues; i++, rx_que++) {
2933 struct rx_ring *rxr = &rx_que->rxr;
2935 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
2936 if (hw->mac.type == ixgbe_mac_82598EB) {
2942 rxdctl &= ~0x3FFFFF;
2945 rxdctl |= IXGBE_RXDCTL_ENABLE;
2946 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
2947 for (j = 0; j < 10; j++) {
2948 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
2949 IXGBE_RXDCTL_ENABLE)
2957 /* Enable Receive engine */
2958 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
2959 if (hw->mac.type == ixgbe_mac_82598EB)
2960 rxctrl |= IXGBE_RXCTRL_DMBYPS;
2961 rxctrl |= IXGBE_RXCTRL_RXEN;
2962 ixgbe_enable_rx_dma(hw, rxctrl);
2964 /* Set up MSI/MSI-X routing */
2965 if (ixgbe_enable_msix) {
2966 ixgbe_configure_ivars(adapter);
2967 /* Set up auto-mask */
2968 if (hw->mac.type == ixgbe_mac_82598EB)
2969 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
2971 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
2972 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
2974 } else { /* Simple settings for Legacy/MSI */
2975 ixgbe_set_ivar(adapter, 0, 0, 0);
2976 ixgbe_set_ivar(adapter, 0, 0, 1);
2977 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
2980 ixgbe_init_fdir(adapter);
2983 * Check on any SFP devices that
2984 * need to be kick-started
2986 if (hw->phy.type == ixgbe_phy_none) {
2987 err = hw->phy.ops.identify(hw);
2988 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
2990 "Unsupported SFP+ module type was detected.\n");
2995 /* Set moderation on the Link interrupt */
2996 IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->vector), IXGBE_LINK_ITR);
2998 /* Enable power to the phy. */
2999 ixgbe_set_phy_power(hw, TRUE);
3001 /* Config/Enable Link */
3002 ixgbe_config_link(adapter);
3004 /* Hardware Packet Buffer & Flow Control setup */
3005 ixgbe_config_delay_values(adapter);
3007 /* Initialize the FC settings */
3010 /* Set up VLAN support and filter */
3011 ixgbe_setup_vlan_hw_support(ctx);
3013 /* Setup DMA Coalescing */
3014 ixgbe_config_dmac(adapter);
3016 /* And now turn on interrupts */
3017 ixgbe_if_enable_intr(ctx);
3019 /* Enable the use of the MBX by the VF's */
3020 if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
3021 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
3022 ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
3023 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
3026 } /* ixgbe_init_locked */
3028 /************************************************************************
3031 * Setup the correct IVAR register for a particular MSI-X interrupt
3032 * (yes this is all very magic and confusing :)
3033 * - entry is the register array entry
3034 * - vector is the MSI-X vector for this queue
3035 * - type is RX/TX/MISC
3036 ************************************************************************/
3038 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
3040 struct ixgbe_hw *hw = &adapter->hw;
3043 vector |= IXGBE_IVAR_ALLOC_VAL;
3045 switch (hw->mac.type) {
3046 case ixgbe_mac_82598EB:
3048 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
3050 entry += (type * 64);
3051 index = (entry >> 2) & 0x1F;
3052 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
3053 ivar &= ~(0xFF << (8 * (entry & 0x3)));
3054 ivar |= (vector << (8 * (entry & 0x3)));
3055 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
3057 case ixgbe_mac_82599EB:
3058 case ixgbe_mac_X540:
3059 case ixgbe_mac_X550:
3060 case ixgbe_mac_X550EM_x:
3061 case ixgbe_mac_X550EM_a:
3062 if (type == -1) { /* MISC IVAR */
3063 index = (entry & 1) * 8;
3064 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
3065 ivar &= ~(0xFF << index);
3066 ivar |= (vector << index);
3067 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
3068 } else { /* RX/TX IVARS */
3069 index = (16 * (entry & 1)) + (8 * type);
3070 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
3071 ivar &= ~(0xFF << index);
3072 ivar |= (vector << index);
3073 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
3078 } /* ixgbe_set_ivar */
3080 /************************************************************************
3081 * ixgbe_configure_ivars
3082 ************************************************************************/
3084 ixgbe_configure_ivars(struct adapter *adapter)
3086 struct ix_rx_queue *rx_que = adapter->rx_queues;
3087 struct ix_tx_queue *tx_que = adapter->tx_queues;
3090 if (ixgbe_max_interrupt_rate > 0)
3091 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
3094 * Disable DMA coalescing if interrupt moderation is
3101 for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++) {
3102 struct rx_ring *rxr = &rx_que->rxr;
3104 /* First the RX queue entry */
3105 ixgbe_set_ivar(adapter, rxr->me, rx_que->msix, 0);
3107 /* Set an Initial EITR value */
3108 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(rx_que->msix), newitr);
3110 for (int i = 0; i < adapter->num_tx_queues; i++, tx_que++) {
3111 struct tx_ring *txr = &tx_que->txr;
3113 /* ... and the TX */
3114 ixgbe_set_ivar(adapter, txr->me, tx_que->msix, 1);
3116 /* For the Link interrupt */
3117 ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
3118 } /* ixgbe_configure_ivars */
3120 /************************************************************************
3122 ************************************************************************/
3124 ixgbe_config_gpie(struct adapter *adapter)
3126 struct ixgbe_hw *hw = &adapter->hw;
3129 gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
3131 if (adapter->intr_type == IFLIB_INTR_MSIX) {
3132 /* Enable Enhanced MSI-X mode */
3133 gpie |= IXGBE_GPIE_MSIX_MODE
3135 | IXGBE_GPIE_PBA_SUPPORT
3139 /* Fan Failure Interrupt */
3140 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3141 gpie |= IXGBE_SDP1_GPIEN;
3143 /* Thermal Sensor Interrupt */
3144 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
3145 gpie |= IXGBE_SDP0_GPIEN_X540;
3147 /* Link detection */
3148 switch (hw->mac.type) {
3149 case ixgbe_mac_82599EB:
3150 gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
3152 case ixgbe_mac_X550EM_x:
3153 case ixgbe_mac_X550EM_a:
3154 gpie |= IXGBE_SDP0_GPIEN_X540;
3160 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
3162 } /* ixgbe_config_gpie */
3164 /************************************************************************
3165 * ixgbe_config_delay_values
3167 * Requires adapter->max_frame_size to be set.
3168 ************************************************************************/
3170 ixgbe_config_delay_values(struct adapter *adapter)
3172 struct ixgbe_hw *hw = &adapter->hw;
3173 u32 rxpb, frame, size, tmp;
3175 frame = adapter->max_frame_size;
3177 /* Calculate High Water */
3178 switch (hw->mac.type) {
3179 case ixgbe_mac_X540:
3180 case ixgbe_mac_X550:
3181 case ixgbe_mac_X550EM_x:
3182 case ixgbe_mac_X550EM_a:
3183 tmp = IXGBE_DV_X540(frame, frame);
3186 tmp = IXGBE_DV(frame, frame);
3189 size = IXGBE_BT2KB(tmp);
3190 rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
3191 hw->fc.high_water[0] = rxpb - size;
3193 /* Now calculate Low Water */
3194 switch (hw->mac.type) {
3195 case ixgbe_mac_X540:
3196 case ixgbe_mac_X550:
3197 case ixgbe_mac_X550EM_x:
3198 case ixgbe_mac_X550EM_a:
3199 tmp = IXGBE_LOW_DV_X540(frame);
3202 tmp = IXGBE_LOW_DV(frame);
3205 hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
3207 hw->fc.pause_time = IXGBE_FC_PAUSE;
3208 hw->fc.send_xon = TRUE;
3209 } /* ixgbe_config_delay_values */
3211 /************************************************************************
3212 * ixgbe_set_multi - Multicast Update
3214 * Called whenever multicast address list is updated.
3215 ************************************************************************/
3217 ixgbe_mc_filter_apply(void *arg, struct ifmultiaddr *ifma, int count)
3219 struct adapter *adapter = arg;
3220 struct ixgbe_mc_addr *mta = adapter->mta;
3222 if (ifma->ifma_addr->sa_family != AF_LINK)
3224 if (count == MAX_NUM_MULTICAST_ADDRESSES)
3226 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
3227 mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
3228 mta[count].vmdq = adapter->pool;
3231 } /* ixgbe_mc_filter_apply */
3234 ixgbe_if_multi_set(if_ctx_t ctx)
3236 struct adapter *adapter = iflib_get_softc(ctx);
3237 struct ixgbe_mc_addr *mta;
3238 struct ifnet *ifp = iflib_get_ifp(ctx);
3243 IOCTL_DEBUGOUT("ixgbe_if_multi_set: begin");
3246 bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
3248 mcnt = if_multi_apply(iflib_get_ifp(ctx), ixgbe_mc_filter_apply, adapter);
3250 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
3251 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3252 if (ifp->if_flags & IFF_PROMISC)
3253 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3254 else if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES ||
3255 ifp->if_flags & IFF_ALLMULTI) {
3256 fctrl |= IXGBE_FCTRL_MPE;
3257 fctrl &= ~IXGBE_FCTRL_UPE;
3259 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3261 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
3263 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
3264 update_ptr = (u8 *)mta;
3265 ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
3266 ixgbe_mc_array_itr, TRUE);
3269 } /* ixgbe_if_multi_set */
3271 /************************************************************************
3272 * ixgbe_mc_array_itr
3274 * An iterator function needed by the multicast shared code.
3275 * It feeds the shared code routine the addresses in the
3276 * array of ixgbe_set_multi() one by one.
3277 ************************************************************************/
3279 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
3281 struct ixgbe_mc_addr *mta;
3283 mta = (struct ixgbe_mc_addr *)*update_ptr;
3286 *update_ptr = (u8*)(mta + 1);
3289 } /* ixgbe_mc_array_itr */
3291 /************************************************************************
3292 * ixgbe_local_timer - Timer routine
3294 * Checks for link status, updates statistics,
3295 * and runs the watchdog check.
3296 ************************************************************************/
3298 ixgbe_if_timer(if_ctx_t ctx, uint16_t qid)
3300 struct adapter *adapter = iflib_get_softc(ctx);
3305 /* Check for pluggable optics */
3306 if (adapter->sfp_probe)
3307 if (!ixgbe_sfp_probe(ctx))
3308 return; /* Nothing to do */
3310 ixgbe_check_link(&adapter->hw, &adapter->link_speed,
3311 &adapter->link_up, 0);
3313 /* Fire off the adminq task */
3314 iflib_admin_intr_deferred(ctx);
3316 } /* ixgbe_if_timer */
3318 /************************************************************************
3321 * Determine if a port had optics inserted.
3322 ************************************************************************/
3324 ixgbe_sfp_probe(if_ctx_t ctx)
3326 struct adapter *adapter = iflib_get_softc(ctx);
3327 struct ixgbe_hw *hw = &adapter->hw;
3328 device_t dev = iflib_get_dev(ctx);
3329 bool result = FALSE;
3331 if ((hw->phy.type == ixgbe_phy_nl) &&
3332 (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
3333 s32 ret = hw->phy.ops.identify_sfp(hw);
3336 ret = hw->phy.ops.reset(hw);
3337 adapter->sfp_probe = FALSE;
3338 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3339 device_printf(dev, "Unsupported SFP+ module detected!");
3341 "Reload driver with supported module.\n");
3344 device_printf(dev, "SFP+ module detected!\n");
3345 /* We now have supported optics */
3351 } /* ixgbe_sfp_probe */
3353 /************************************************************************
3354 * ixgbe_handle_mod - Tasklet for SFP module interrupts
3355 ************************************************************************/
3357 ixgbe_handle_mod(void *context)
3359 if_ctx_t ctx = context;
3360 struct adapter *adapter = iflib_get_softc(ctx);
3361 struct ixgbe_hw *hw = &adapter->hw;
3362 device_t dev = iflib_get_dev(ctx);
3363 u32 err, cage_full = 0;
3365 adapter->sfp_reinit = 1;
3366 if (adapter->hw.need_crosstalk_fix) {
3367 switch (hw->mac.type) {
3368 case ixgbe_mac_82599EB:
3369 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3372 case ixgbe_mac_X550EM_x:
3373 case ixgbe_mac_X550EM_a:
3374 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3382 goto handle_mod_out;
3385 err = hw->phy.ops.identify_sfp(hw);
3386 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3388 "Unsupported SFP+ module type was detected.\n");
3389 goto handle_mod_out;
3392 if (hw->mac.type == ixgbe_mac_82598EB)
3393 err = hw->phy.ops.reset(hw);
3395 err = hw->mac.ops.setup_sfp(hw);
3397 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3399 "Setup failure - unsupported SFP+ module type.\n");
3400 goto handle_mod_out;
3402 GROUPTASK_ENQUEUE(&adapter->msf_task);
3406 adapter->sfp_reinit = 0;
3407 } /* ixgbe_handle_mod */
3410 /************************************************************************
3411 * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
3412 ************************************************************************/
3414 ixgbe_handle_msf(void *context)
3416 if_ctx_t ctx = context;
3417 struct adapter *adapter = iflib_get_softc(ctx);
3418 struct ixgbe_hw *hw = &adapter->hw;
3422 if (adapter->sfp_reinit != 1)
3425 /* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
3426 adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
3428 autoneg = hw->phy.autoneg_advertised;
3429 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
3430 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
3431 if (hw->mac.ops.setup_link)
3432 hw->mac.ops.setup_link(hw, autoneg, TRUE);
3434 /* Adjust media types shown in ifconfig */
3435 ifmedia_removeall(adapter->media);
3436 ixgbe_add_media_types(adapter->ctx);
3437 ifmedia_set(adapter->media, IFM_ETHER | IFM_AUTO);
3439 adapter->sfp_reinit = 0;
3440 } /* ixgbe_handle_msf */
3442 /************************************************************************
3443 * ixgbe_handle_phy - Tasklet for external PHY interrupts
3444 ************************************************************************/
3446 ixgbe_handle_phy(void *context)
3448 if_ctx_t ctx = context;
3449 struct adapter *adapter = iflib_get_softc(ctx);
3450 struct ixgbe_hw *hw = &adapter->hw;
3453 error = hw->phy.ops.handle_lasi(hw);
3454 if (error == IXGBE_ERR_OVERTEMP)
3455 device_printf(adapter->dev, "CRITICAL: EXTERNAL PHY OVER TEMP!! PHY will downshift to lower power state!\n");
3457 device_printf(adapter->dev,
3458 "Error handling LASI interrupt: %d\n", error);
3459 } /* ixgbe_handle_phy */
3461 /************************************************************************
3462 * ixgbe_if_stop - Stop the hardware
3464 * Disables all traffic on the adapter by issuing a
3465 * global reset on the MAC and deallocates TX/RX buffers.
3466 ************************************************************************/
3468 ixgbe_if_stop(if_ctx_t ctx)
3470 struct adapter *adapter = iflib_get_softc(ctx);
3471 struct ixgbe_hw *hw = &adapter->hw;
3473 INIT_DEBUGOUT("ixgbe_if_stop: begin\n");
3476 hw->adapter_stopped = FALSE;
3477 ixgbe_stop_adapter(hw);
3478 if (hw->mac.type == ixgbe_mac_82599EB)
3479 ixgbe_stop_mac_link_on_d3_82599(hw);
3480 /* Turn off the laser - noop with no optics */
3481 ixgbe_disable_tx_laser(hw);
3483 /* Update the stack */
3484 adapter->link_up = FALSE;
3485 ixgbe_if_update_admin_status(ctx);
3487 /* reprogram the RAR[0] in case user changed it. */
3488 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
3491 } /* ixgbe_if_stop */
3493 /************************************************************************
3494 * ixgbe_update_link_status - Update OS on link state
3496 * Note: Only updates the OS on the cached link state.
3497 * The real check of the hardware only happens with
3499 ************************************************************************/
3501 ixgbe_if_update_admin_status(if_ctx_t ctx)
3503 struct adapter *adapter = iflib_get_softc(ctx);
3504 device_t dev = iflib_get_dev(ctx);
3506 if (adapter->link_up) {
3507 if (adapter->link_active == FALSE) {
3509 device_printf(dev, "Link is up %d Gbps %s \n",
3510 ((adapter->link_speed == 128) ? 10 : 1),
3512 adapter->link_active = TRUE;
3513 /* Update any Flow Control changes */
3514 ixgbe_fc_enable(&adapter->hw);
3515 /* Update DMA coalescing config */
3516 ixgbe_config_dmac(adapter);
3517 /* should actually be negotiated value */
3518 iflib_link_state_change(ctx, LINK_STATE_UP, IF_Gbps(10));
3520 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3521 ixgbe_ping_all_vfs(adapter);
3523 } else { /* Link down */
3524 if (adapter->link_active == TRUE) {
3526 device_printf(dev, "Link is Down\n");
3527 iflib_link_state_change(ctx, LINK_STATE_DOWN, 0);
3528 adapter->link_active = FALSE;
3529 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3530 ixgbe_ping_all_vfs(adapter);
3534 ixgbe_update_stats_counters(adapter);
3536 /* Re-enable link interrupts */
3537 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
3538 } /* ixgbe_if_update_admin_status */
3540 /************************************************************************
3541 * ixgbe_config_dmac - Configure DMA Coalescing
3542 ************************************************************************/
3544 ixgbe_config_dmac(struct adapter *adapter)
3546 struct ixgbe_hw *hw = &adapter->hw;
3547 struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
3549 if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
3552 if (dcfg->watchdog_timer ^ adapter->dmac ||
3553 dcfg->link_speed ^ adapter->link_speed) {
3554 dcfg->watchdog_timer = adapter->dmac;
3555 dcfg->fcoe_en = FALSE;
3556 dcfg->link_speed = adapter->link_speed;
3559 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
3560 dcfg->watchdog_timer, dcfg->link_speed);
3562 hw->mac.ops.dmac_config(hw);
3564 } /* ixgbe_config_dmac */
3566 /************************************************************************
3567 * ixgbe_if_enable_intr
3568 ************************************************************************/
3570 ixgbe_if_enable_intr(if_ctx_t ctx)
3572 struct adapter *adapter = iflib_get_softc(ctx);
3573 struct ixgbe_hw *hw = &adapter->hw;
3574 struct ix_rx_queue *que = adapter->rx_queues;
3577 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3579 switch (adapter->hw.mac.type) {
3580 case ixgbe_mac_82599EB:
3581 mask |= IXGBE_EIMS_ECC;
3582 /* Temperature sensor on some adapters */
3583 mask |= IXGBE_EIMS_GPI_SDP0;
3584 /* SFP+ (RX_LOS_N & MOD_ABS_N) */
3585 mask |= IXGBE_EIMS_GPI_SDP1;
3586 mask |= IXGBE_EIMS_GPI_SDP2;
3588 case ixgbe_mac_X540:
3589 /* Detect if Thermal Sensor is enabled */
3590 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
3591 if (fwsm & IXGBE_FWSM_TS_ENABLED)
3592 mask |= IXGBE_EIMS_TS;
3593 mask |= IXGBE_EIMS_ECC;
3595 case ixgbe_mac_X550:
3596 /* MAC thermal sensor is automatically enabled */
3597 mask |= IXGBE_EIMS_TS;
3598 mask |= IXGBE_EIMS_ECC;
3600 case ixgbe_mac_X550EM_x:
3601 case ixgbe_mac_X550EM_a:
3602 /* Some devices use SDP0 for important information */
3603 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
3604 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
3605 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
3606 hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
3607 mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
3608 if (hw->phy.type == ixgbe_phy_x550em_ext_t)
3609 mask |= IXGBE_EICR_GPI_SDP0_X540;
3610 mask |= IXGBE_EIMS_ECC;
3616 /* Enable Fan Failure detection */
3617 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3618 mask |= IXGBE_EIMS_GPI_SDP1;
3620 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3621 mask |= IXGBE_EIMS_MAILBOX;
3622 /* Enable Flow Director */
3623 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
3624 mask |= IXGBE_EIMS_FLOW_DIR;
3626 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3628 /* With MSI-X we use auto clear */
3629 if (adapter->intr_type == IFLIB_INTR_MSIX) {
3630 mask = IXGBE_EIMS_ENABLE_MASK;
3631 /* Don't autoclear Link */
3632 mask &= ~IXGBE_EIMS_OTHER;
3633 mask &= ~IXGBE_EIMS_LSC;
3634 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
3635 mask &= ~IXGBE_EIMS_MAILBOX;
3636 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
3640 * Now enable all queues, this is done separately to
3641 * allow for handling the extended (beyond 32) MSI-X
3642 * vectors that can be used by 82599
3644 for (int i = 0; i < adapter->num_rx_queues; i++, que++)
3645 ixgbe_enable_queue(adapter, que->msix);
3647 IXGBE_WRITE_FLUSH(hw);
3649 } /* ixgbe_if_enable_intr */
3651 /************************************************************************
3652 * ixgbe_disable_intr
3653 ************************************************************************/
3655 ixgbe_if_disable_intr(if_ctx_t ctx)
3657 struct adapter *adapter = iflib_get_softc(ctx);
3659 if (adapter->intr_type == IFLIB_INTR_MSIX)
3660 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
3661 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
3662 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
3664 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
3665 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
3666 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
3668 IXGBE_WRITE_FLUSH(&adapter->hw);
3670 } /* ixgbe_if_disable_intr */
3672 /************************************************************************
3673 * ixgbe_if_rx_queue_intr_enable
3674 ************************************************************************/
3676 ixgbe_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
3678 struct adapter *adapter = iflib_get_softc(ctx);
3679 struct ix_rx_queue *que = &adapter->rx_queues[rxqid];
3681 ixgbe_enable_queue(adapter, que->rxr.me);
3684 } /* ixgbe_if_rx_queue_intr_enable */
3686 /************************************************************************
3687 * ixgbe_enable_queue
3688 ************************************************************************/
3690 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
3692 struct ixgbe_hw *hw = &adapter->hw;
3693 u64 queue = (u64)(1 << vector);
3696 if (hw->mac.type == ixgbe_mac_82598EB) {
3697 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3698 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3700 mask = (queue & 0xFFFFFFFF);
3702 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
3703 mask = (queue >> 32);
3705 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
3707 } /* ixgbe_enable_queue */
3709 /************************************************************************
3710 * ixgbe_disable_queue
3711 ************************************************************************/
3713 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
3715 struct ixgbe_hw *hw = &adapter->hw;
3716 u64 queue = (u64)(1 << vector);
3719 if (hw->mac.type == ixgbe_mac_82598EB) {
3720 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3721 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
3723 mask = (queue & 0xFFFFFFFF);
3725 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
3726 mask = (queue >> 32);
3728 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
3730 } /* ixgbe_disable_queue */
3732 /************************************************************************
3733 * ixgbe_intr - Legacy Interrupt Service Routine
3734 ************************************************************************/
3736 ixgbe_intr(void *arg)
3738 struct adapter *adapter = arg;
3739 struct ix_rx_queue *que = adapter->rx_queues;
3740 struct ixgbe_hw *hw = &adapter->hw;
3741 if_ctx_t ctx = adapter->ctx;
3742 u32 eicr, eicr_mask;
3744 eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
3748 ixgbe_if_enable_intr(ctx);
3749 return (FILTER_HANDLED);
3752 /* Check for fan failure */
3753 if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
3754 (eicr & IXGBE_EICR_GPI_SDP1)) {
3755 device_printf(adapter->dev,
3756 "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
3757 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3760 /* Link status change */
3761 if (eicr & IXGBE_EICR_LSC) {
3762 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
3763 iflib_admin_intr_deferred(ctx);
3766 if (ixgbe_is_sfp(hw)) {
3767 /* Pluggable optics-related interrupt */
3768 if (hw->mac.type >= ixgbe_mac_X540)
3769 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3771 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3773 if (eicr & eicr_mask) {
3774 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
3775 GROUPTASK_ENQUEUE(&adapter->mod_task);
3778 if ((hw->mac.type == ixgbe_mac_82599EB) &&
3779 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3780 IXGBE_WRITE_REG(hw, IXGBE_EICR,
3781 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3782 if (atomic_cmpset_acq_int(&adapter->sfp_reinit, 0, 1))
3783 GROUPTASK_ENQUEUE(&adapter->msf_task);
3787 /* External PHY interrupt */
3788 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3789 (eicr & IXGBE_EICR_GPI_SDP0_X540))
3790 GROUPTASK_ENQUEUE(&adapter->phy_task);
3792 return (FILTER_SCHEDULE_THREAD);
3795 /************************************************************************
3796 * ixgbe_free_pci_resources
3797 ************************************************************************/
3799 ixgbe_free_pci_resources(if_ctx_t ctx)
3801 struct adapter *adapter = iflib_get_softc(ctx);
3802 struct ix_rx_queue *que = adapter->rx_queues;
3803 device_t dev = iflib_get_dev(ctx);
3805 /* Release all msix queue resources */
3806 if (adapter->intr_type == IFLIB_INTR_MSIX)
3807 iflib_irq_free(ctx, &adapter->irq);
3810 for (int i = 0; i < adapter->num_rx_queues; i++, que++) {
3811 iflib_irq_free(ctx, &que->que_irq);
3816 * Free link/admin interrupt
3818 if (adapter->pci_mem != NULL)
3819 bus_release_resource(dev, SYS_RES_MEMORY,
3820 PCIR_BAR(0), adapter->pci_mem);
3822 } /* ixgbe_free_pci_resources */
3824 /************************************************************************
3825 * ixgbe_sysctl_flowcntl
3827 * SYSCTL wrapper around setting Flow Control
3828 ************************************************************************/
3830 ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS)
3832 struct adapter *adapter;
3835 adapter = (struct adapter *)arg1;
3836 fc = adapter->hw.fc.current_mode;
3838 error = sysctl_handle_int(oidp, &fc, 0, req);
3839 if ((error) || (req->newptr == NULL))
3842 /* Don't bother if it's not changed */
3843 if (fc == adapter->hw.fc.current_mode)
3846 return ixgbe_set_flowcntl(adapter, fc);
3847 } /* ixgbe_sysctl_flowcntl */
3849 /************************************************************************
3850 * ixgbe_set_flowcntl - Set flow control
3852 * Flow control values:
3857 ************************************************************************/
3859 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
3862 case ixgbe_fc_rx_pause:
3863 case ixgbe_fc_tx_pause:
3865 adapter->hw.fc.requested_mode = fc;
3866 if (adapter->num_rx_queues > 1)
3867 ixgbe_disable_rx_drop(adapter);
3870 adapter->hw.fc.requested_mode = ixgbe_fc_none;
3871 if (adapter->num_rx_queues > 1)
3872 ixgbe_enable_rx_drop(adapter);
3878 /* Don't autoneg if forcing a value */
3879 adapter->hw.fc.disable_fc_autoneg = TRUE;
3880 ixgbe_fc_enable(&adapter->hw);
3883 } /* ixgbe_set_flowcntl */
3885 /************************************************************************
3886 * ixgbe_enable_rx_drop
3888 * Enable the hardware to drop packets when the buffer is
3889 * full. This is useful with multiqueue, so that no single
3890 * queue being full stalls the entire RX engine. We only
3891 * enable this when Multiqueue is enabled AND Flow Control
3893 ************************************************************************/
3895 ixgbe_enable_rx_drop(struct adapter *adapter)
3897 struct ixgbe_hw *hw = &adapter->hw;
3898 struct rx_ring *rxr;
3901 for (int i = 0; i < adapter->num_rx_queues; i++) {
3902 rxr = &adapter->rx_queues[i].rxr;
3903 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
3904 srrctl |= IXGBE_SRRCTL_DROP_EN;
3905 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
3908 /* enable drop for each vf */
3909 for (int i = 0; i < adapter->num_vfs; i++) {
3910 IXGBE_WRITE_REG(hw, IXGBE_QDE,
3911 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
3914 } /* ixgbe_enable_rx_drop */
3916 /************************************************************************
3917 * ixgbe_disable_rx_drop
3918 ************************************************************************/
3920 ixgbe_disable_rx_drop(struct adapter *adapter)
3922 struct ixgbe_hw *hw = &adapter->hw;
3923 struct rx_ring *rxr;
3926 for (int i = 0; i < adapter->num_rx_queues; i++) {
3927 rxr = &adapter->rx_queues[i].rxr;
3928 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
3929 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
3930 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
3933 /* disable drop for each vf */
3934 for (int i = 0; i < adapter->num_vfs; i++) {
3935 IXGBE_WRITE_REG(hw, IXGBE_QDE,
3936 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
3938 } /* ixgbe_disable_rx_drop */
3940 /************************************************************************
3941 * ixgbe_sysctl_advertise
3943 * SYSCTL wrapper around setting advertised speed
3944 ************************************************************************/
3946 ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS)
3948 struct adapter *adapter;
3949 int error, advertise;
3951 adapter = (struct adapter *)arg1;
3952 advertise = adapter->advertise;
3954 error = sysctl_handle_int(oidp, &advertise, 0, req);
3955 if ((error) || (req->newptr == NULL))
3958 return ixgbe_set_advertise(adapter, advertise);
3959 } /* ixgbe_sysctl_advertise */
3961 /************************************************************************
3962 * ixgbe_set_advertise - Control advertised link speed
3965 * 0x1 - advertise 100 Mb
3966 * 0x2 - advertise 1G
3967 * 0x4 - advertise 10G
3968 * 0x8 - advertise 10 Mb (yes, Mb)
3969 ************************************************************************/
3971 ixgbe_set_advertise(struct adapter *adapter, int advertise)
3973 device_t dev = iflib_get_dev(adapter->ctx);
3974 struct ixgbe_hw *hw;
3975 ixgbe_link_speed speed = 0;
3976 ixgbe_link_speed link_caps = 0;
3977 s32 err = IXGBE_NOT_IMPLEMENTED;
3978 bool negotiate = FALSE;
3980 /* Checks to validate new value */
3981 if (adapter->advertise == advertise) /* no change */
3986 /* No speed changes for backplane media */
3987 if (hw->phy.media_type == ixgbe_media_type_backplane)
3990 if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
3991 (hw->phy.multispeed_fiber))) {
3992 device_printf(dev, "Advertised speed can only be set on copper or multispeed fiber media types.\n");
3996 if (advertise < 0x1 || advertise > 0xF) {
3997 device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0xF\n");
4001 if (hw->mac.ops.get_link_capabilities) {
4002 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
4004 if (err != IXGBE_SUCCESS) {
4005 device_printf(dev, "Unable to determine supported advertise speeds\n");
4010 /* Set new value and report new advertised mode */
4011 if (advertise & 0x1) {
4012 if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
4013 device_printf(dev, "Interface does not support 100Mb advertised speed\n");
4016 speed |= IXGBE_LINK_SPEED_100_FULL;
4018 if (advertise & 0x2) {
4019 if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
4020 device_printf(dev, "Interface does not support 1Gb advertised speed\n");
4023 speed |= IXGBE_LINK_SPEED_1GB_FULL;
4025 if (advertise & 0x4) {
4026 if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
4027 device_printf(dev, "Interface does not support 10Gb advertised speed\n");
4030 speed |= IXGBE_LINK_SPEED_10GB_FULL;
4032 if (advertise & 0x8) {
4033 if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
4034 device_printf(dev, "Interface does not support 10Mb advertised speed\n");
4037 speed |= IXGBE_LINK_SPEED_10_FULL;
4040 hw->mac.autotry_restart = TRUE;
4041 hw->mac.ops.setup_link(hw, speed, TRUE);
4042 adapter->advertise = advertise;
4045 } /* ixgbe_set_advertise */
4047 /************************************************************************
4048 * ixgbe_get_advertise - Get current advertised speed settings
4050 * Formatted for sysctl usage.
4052 * 0x1 - advertise 100 Mb
4053 * 0x2 - advertise 1G
4054 * 0x4 - advertise 10G
4055 * 0x8 - advertise 10 Mb (yes, Mb)
4056 ************************************************************************/
4058 ixgbe_get_advertise(struct adapter *adapter)
4060 struct ixgbe_hw *hw = &adapter->hw;
4062 ixgbe_link_speed link_caps = 0;
4064 bool negotiate = FALSE;
4067 * Advertised speed means nothing unless it's copper or
4070 if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
4071 !(hw->phy.multispeed_fiber))
4074 err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
4075 if (err != IXGBE_SUCCESS)
4079 ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) |
4080 ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) |
4081 ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) |
4082 ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0);
4085 } /* ixgbe_get_advertise */
4087 /************************************************************************
4088 * ixgbe_sysctl_dmac - Manage DMA Coalescing
4091 * 0/1 - off / on (use default value of 1000)
4093 * Legal timer values are:
4094 * 50,100,250,500,1000,2000,5000,10000
4096 * Turning off interrupt moderation will also turn this off.
4097 ************************************************************************/
4099 ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
4101 struct adapter *adapter = (struct adapter *)arg1;
4102 struct ifnet *ifp = iflib_get_ifp(adapter->ctx);
4106 newval = adapter->dmac;
4107 error = sysctl_handle_16(oidp, &newval, 0, req);
4108 if ((error) || (req->newptr == NULL))
4117 /* Enable and use default */
4118 adapter->dmac = 1000;
4128 /* Legal values - allow */
4129 adapter->dmac = newval;
4132 /* Do nothing, illegal value */
4136 /* Re-initialize hardware if it's already running */
4137 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4141 } /* ixgbe_sysctl_dmac */
4144 /************************************************************************
4145 * ixgbe_sysctl_power_state
4147 * Sysctl to test power states
4149 * 0 - set device to D0
4150 * 3 - set device to D3
4151 * (none) - get current device power state
4152 ************************************************************************/
4154 ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS)
4156 struct adapter *adapter = (struct adapter *)arg1;
4157 device_t dev = adapter->dev;
4158 int curr_ps, new_ps, error = 0;
4160 curr_ps = new_ps = pci_get_powerstate(dev);
4162 error = sysctl_handle_int(oidp, &new_ps, 0, req);
4163 if ((error) || (req->newptr == NULL))
4166 if (new_ps == curr_ps)
4169 if (new_ps == 3 && curr_ps == 0)
4170 error = DEVICE_SUSPEND(dev);
4171 else if (new_ps == 0 && curr_ps == 3)
4172 error = DEVICE_RESUME(dev);
4176 device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
4179 } /* ixgbe_sysctl_power_state */
4182 /************************************************************************
4183 * ixgbe_sysctl_wol_enable
4185 * Sysctl to enable/disable the WoL capability,
4186 * if supported by the adapter.
4191 ************************************************************************/
4193 ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
4195 struct adapter *adapter = (struct adapter *)arg1;
4196 struct ixgbe_hw *hw = &adapter->hw;
4197 int new_wol_enabled;
4200 new_wol_enabled = hw->wol_enabled;
4201 error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
4202 if ((error) || (req->newptr == NULL))
4204 new_wol_enabled = !!(new_wol_enabled);
4205 if (new_wol_enabled == hw->wol_enabled)
4208 if (new_wol_enabled > 0 && !adapter->wol_support)
4211 hw->wol_enabled = new_wol_enabled;
4214 } /* ixgbe_sysctl_wol_enable */
4216 /************************************************************************
4217 * ixgbe_sysctl_wufc - Wake Up Filter Control
4219 * Sysctl to enable/disable the types of packets that the
4220 * adapter will wake up on upon receipt.
4222 * 0x1 - Link Status Change
4223 * 0x2 - Magic Packet
4224 * 0x4 - Direct Exact
4225 * 0x8 - Directed Multicast
4227 * 0x20 - ARP/IPv4 Request Packet
4228 * 0x40 - Direct IPv4 Packet
4229 * 0x80 - Direct IPv6 Packet
4231 * Settings not listed above will cause the sysctl to return an error.
4232 ************************************************************************/
4234 ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
4236 struct adapter *adapter = (struct adapter *)arg1;
4240 new_wufc = adapter->wufc;
4242 error = sysctl_handle_32(oidp, &new_wufc, 0, req);
4243 if ((error) || (req->newptr == NULL))
4245 if (new_wufc == adapter->wufc)
4248 if (new_wufc & 0xffffff00)
4252 new_wufc |= (0xffffff & adapter->wufc);
4253 adapter->wufc = new_wufc;
4256 } /* ixgbe_sysctl_wufc */
4259 /************************************************************************
4260 * ixgbe_sysctl_print_rss_config
4261 ************************************************************************/
4263 ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS)
4265 struct adapter *adapter = (struct adapter *)arg1;
4266 struct ixgbe_hw *hw = &adapter->hw;
4267 device_t dev = adapter->dev;
4269 int error = 0, reta_size;
4272 buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4274 device_printf(dev, "Could not allocate sbuf for output.\n");
4278 // TODO: use sbufs to make a string to print out
4279 /* Set multiplier for RETA setup and table size based on MAC */
4280 switch (adapter->hw.mac.type) {
4281 case ixgbe_mac_X550:
4282 case ixgbe_mac_X550EM_x:
4283 case ixgbe_mac_X550EM_a:
4291 /* Print out the redirection table */
4292 sbuf_cat(buf, "\n");
4293 for (int i = 0; i < reta_size; i++) {
4295 reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
4296 sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
4298 reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
4299 sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
4303 // TODO: print more config
4305 error = sbuf_finish(buf);
4307 device_printf(dev, "Error finishing sbuf: %d\n", error);
4312 } /* ixgbe_sysctl_print_rss_config */
4313 #endif /* IXGBE_DEBUG */
4315 /************************************************************************
4316 * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
4318 * For X552/X557-AT devices using an external PHY
4319 ************************************************************************/
4321 ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
4323 struct adapter *adapter = (struct adapter *)arg1;
4324 struct ixgbe_hw *hw = &adapter->hw;
4327 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4328 device_printf(iflib_get_dev(adapter->ctx),
4329 "Device has no supported external thermal sensor.\n");
4333 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
4334 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
4335 device_printf(iflib_get_dev(adapter->ctx),
4336 "Error reading from PHY's current temperature register\n");
4340 /* Shift temp for output */
4343 return (sysctl_handle_16(oidp, NULL, reg, req));
4344 } /* ixgbe_sysctl_phy_temp */
4346 /************************************************************************
4347 * ixgbe_sysctl_phy_overtemp_occurred
4349 * Reports (directly from the PHY) whether the current PHY
4350 * temperature is over the overtemp threshold.
4351 ************************************************************************/
4353 ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
4355 struct adapter *adapter = (struct adapter *)arg1;
4356 struct ixgbe_hw *hw = &adapter->hw;
4359 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4360 device_printf(iflib_get_dev(adapter->ctx),
4361 "Device has no supported external thermal sensor.\n");
4365 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
4366 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
4367 device_printf(iflib_get_dev(adapter->ctx),
4368 "Error reading from PHY's temperature status register\n");
4372 /* Get occurrence bit */
4373 reg = !!(reg & 0x4000);
4375 return (sysctl_handle_16(oidp, 0, reg, req));
4376 } /* ixgbe_sysctl_phy_overtemp_occurred */
4378 /************************************************************************
4379 * ixgbe_sysctl_eee_state
4381 * Sysctl to set EEE power saving feature
4385 * (none) - get current device EEE state
4386 ************************************************************************/
4388 ixgbe_sysctl_eee_state(SYSCTL_HANDLER_ARGS)
4390 struct adapter *adapter = (struct adapter *)arg1;
4391 device_t dev = adapter->dev;
4392 struct ifnet *ifp = iflib_get_ifp(adapter->ctx);
4393 int curr_eee, new_eee, error = 0;
4396 curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
4398 error = sysctl_handle_int(oidp, &new_eee, 0, req);
4399 if ((error) || (req->newptr == NULL))
4403 if (new_eee == curr_eee)
4407 if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
4410 /* Bounds checking */
4411 if ((new_eee < 0) || (new_eee > 1))
4414 retval = adapter->hw.mac.ops.setup_eee(&adapter->hw, new_eee);
4416 device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
4420 /* Restart auto-neg */
4423 device_printf(dev, "New EEE state: %d\n", new_eee);
4425 /* Cache new value */
4427 adapter->feat_en |= IXGBE_FEATURE_EEE;
4429 adapter->feat_en &= ~IXGBE_FEATURE_EEE;
4432 } /* ixgbe_sysctl_eee_state */
4434 /************************************************************************
4435 * ixgbe_init_device_features
4436 ************************************************************************/
4438 ixgbe_init_device_features(struct adapter *adapter)
4440 adapter->feat_cap = IXGBE_FEATURE_NETMAP
4443 | IXGBE_FEATURE_MSIX
4444 | IXGBE_FEATURE_LEGACY_IRQ;
4446 /* Set capabilities first... */
4447 switch (adapter->hw.mac.type) {
4448 case ixgbe_mac_82598EB:
4449 if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
4450 adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
4452 case ixgbe_mac_X540:
4453 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4454 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4455 if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
4456 (adapter->hw.bus.func == 0))
4457 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
4459 case ixgbe_mac_X550:
4460 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4461 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4462 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4464 case ixgbe_mac_X550EM_x:
4465 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4466 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4467 if (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_X_KR)
4468 adapter->feat_cap |= IXGBE_FEATURE_EEE;
4470 case ixgbe_mac_X550EM_a:
4471 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4472 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4473 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4474 if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
4475 (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
4476 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4477 adapter->feat_cap |= IXGBE_FEATURE_EEE;
4480 case ixgbe_mac_82599EB:
4481 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4482 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4483 if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
4484 (adapter->hw.bus.func == 0))
4485 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
4486 if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
4487 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4493 /* Enabled by default... */
4494 /* Fan failure detection */
4495 if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
4496 adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
4498 if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
4499 adapter->feat_en |= IXGBE_FEATURE_NETMAP;
4501 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
4502 adapter->feat_en |= IXGBE_FEATURE_EEE;
4503 /* Thermal Sensor */
4504 if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
4505 adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
4507 /* Enabled via global sysctl... */
4509 if (ixgbe_enable_fdir) {
4510 if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
4511 adapter->feat_en |= IXGBE_FEATURE_FDIR;
4513 device_printf(adapter->dev, "Device does not support Flow Director. Leaving disabled.");
4516 * Message Signal Interrupts - Extended (MSI-X)
4517 * Normal MSI is only enabled if MSI-X calls fail.
4519 if (!ixgbe_enable_msix)
4520 adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
4521 /* Receive-Side Scaling (RSS) */
4522 if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
4523 adapter->feat_en |= IXGBE_FEATURE_RSS;
4525 /* Disable features with unmet dependencies... */
4527 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
4528 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
4529 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
4530 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
4531 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
4533 } /* ixgbe_init_device_features */
4535 /************************************************************************
4536 * ixgbe_check_fan_failure
4537 ************************************************************************/
4539 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
4543 mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
4547 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
4548 } /* ixgbe_check_fan_failure */