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.1-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_1G_T, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
96 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_SFP, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
97 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
98 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
99 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
100 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP_N, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
101 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
102 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
103 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_10G_T, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
104 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
105 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
106 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_BYPASS, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
107 PVID(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS, "Intel(R) PRO/10GbE PCI-Express Network Driver"),
108 /* required last entry */
112 static void *ixgbe_register(device_t dev);
113 static int ixgbe_if_attach_pre(if_ctx_t ctx);
114 static int ixgbe_if_attach_post(if_ctx_t ctx);
115 static int ixgbe_if_detach(if_ctx_t ctx);
116 static int ixgbe_if_shutdown(if_ctx_t ctx);
117 static int ixgbe_if_suspend(if_ctx_t ctx);
118 static int ixgbe_if_resume(if_ctx_t ctx);
120 static void ixgbe_if_stop(if_ctx_t ctx);
121 void ixgbe_if_enable_intr(if_ctx_t ctx);
122 static void ixgbe_if_disable_intr(if_ctx_t ctx);
123 static void ixgbe_link_intr_enable(if_ctx_t ctx);
124 static int ixgbe_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t qid);
125 static void ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr);
126 static int ixgbe_if_media_change(if_ctx_t ctx);
127 static int ixgbe_if_msix_intr_assign(if_ctx_t, int);
128 static int ixgbe_if_mtu_set(if_ctx_t ctx, uint32_t mtu);
129 static void ixgbe_if_crcstrip_set(if_ctx_t ctx, int onoff, int strip);
130 static void ixgbe_if_multi_set(if_ctx_t ctx);
131 static int ixgbe_if_promisc_set(if_ctx_t ctx, int flags);
132 static int ixgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs,
133 uint64_t *paddrs, int nrxqs, int nrxqsets);
134 static int ixgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs,
135 uint64_t *paddrs, int nrxqs, int nrxqsets);
136 static void ixgbe_if_queues_free(if_ctx_t ctx);
137 static void ixgbe_if_timer(if_ctx_t ctx, uint16_t);
138 static void ixgbe_if_update_admin_status(if_ctx_t ctx);
139 static void ixgbe_if_vlan_register(if_ctx_t ctx, u16 vtag);
140 static void ixgbe_if_vlan_unregister(if_ctx_t ctx, u16 vtag);
141 static int ixgbe_if_i2c_req(if_ctx_t ctx, struct ifi2creq *req);
142 static bool ixgbe_if_needs_restart(if_ctx_t ctx, enum iflib_restart_event event);
143 int ixgbe_intr(void *arg);
145 /************************************************************************
146 * Function prototypes
147 ************************************************************************/
148 #if __FreeBSD_version >= 1100036
149 static uint64_t ixgbe_if_get_counter(if_ctx_t, ift_counter);
152 static void ixgbe_enable_queue(struct adapter *adapter, u32 vector);
153 static void ixgbe_disable_queue(struct adapter *adapter, u32 vector);
154 static void ixgbe_add_device_sysctls(if_ctx_t ctx);
155 static int ixgbe_allocate_pci_resources(if_ctx_t ctx);
156 static int ixgbe_setup_low_power_mode(if_ctx_t ctx);
158 static void ixgbe_config_dmac(struct adapter *adapter);
159 static void ixgbe_configure_ivars(struct adapter *adapter);
160 static void ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector,
162 static u8 *ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
163 static bool ixgbe_sfp_probe(if_ctx_t ctx);
165 static void ixgbe_free_pci_resources(if_ctx_t ctx);
167 static int ixgbe_msix_link(void *arg);
168 static int ixgbe_msix_que(void *arg);
169 static void ixgbe_initialize_rss_mapping(struct adapter *adapter);
170 static void ixgbe_initialize_receive_units(if_ctx_t ctx);
171 static void ixgbe_initialize_transmit_units(if_ctx_t ctx);
173 static int ixgbe_setup_interface(if_ctx_t ctx);
174 static void ixgbe_init_device_features(struct adapter *adapter);
175 static void ixgbe_check_fan_failure(struct adapter *, u32, bool);
176 static void ixgbe_add_media_types(if_ctx_t ctx);
177 static void ixgbe_update_stats_counters(struct adapter *adapter);
178 static void ixgbe_config_link(if_ctx_t ctx);
179 static void ixgbe_get_slot_info(struct adapter *);
180 static void ixgbe_check_wol_support(struct adapter *adapter);
181 static void ixgbe_enable_rx_drop(struct adapter *);
182 static void ixgbe_disable_rx_drop(struct adapter *);
184 static void ixgbe_add_hw_stats(struct adapter *adapter);
185 static int ixgbe_set_flowcntl(struct adapter *, int);
186 static int ixgbe_set_advertise(struct adapter *, int);
187 static int ixgbe_get_advertise(struct adapter *);
188 static void ixgbe_setup_vlan_hw_support(if_ctx_t ctx);
189 static void ixgbe_config_gpie(struct adapter *adapter);
190 static void ixgbe_config_delay_values(struct adapter *adapter);
192 /* Sysctl handlers */
193 static int ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS);
194 static int ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS);
195 static int ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS);
196 static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
197 static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
198 static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
200 static int ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS);
201 static int ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS);
203 static int ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS);
204 static int ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS);
205 static int ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS);
206 static int ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS);
207 static int ixgbe_sysctl_eee_state(SYSCTL_HANDLER_ARGS);
208 static int ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
209 static int ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
211 /* Deferred interrupt tasklets */
212 static void ixgbe_handle_msf(void *);
213 static void ixgbe_handle_mod(void *);
214 static void ixgbe_handle_phy(void *);
216 /************************************************************************
217 * FreeBSD Device Interface Entry Points
218 ************************************************************************/
219 static device_method_t ix_methods[] = {
220 /* Device interface */
221 DEVMETHOD(device_register, ixgbe_register),
222 DEVMETHOD(device_probe, iflib_device_probe),
223 DEVMETHOD(device_attach, iflib_device_attach),
224 DEVMETHOD(device_detach, iflib_device_detach),
225 DEVMETHOD(device_shutdown, iflib_device_shutdown),
226 DEVMETHOD(device_suspend, iflib_device_suspend),
227 DEVMETHOD(device_resume, iflib_device_resume),
229 DEVMETHOD(pci_iov_init, iflib_device_iov_init),
230 DEVMETHOD(pci_iov_uninit, iflib_device_iov_uninit),
231 DEVMETHOD(pci_iov_add_vf, iflib_device_iov_add_vf),
236 static driver_t ix_driver = {
237 "ix", ix_methods, sizeof(struct adapter),
240 devclass_t ix_devclass;
241 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
242 IFLIB_PNP_INFO(pci, ix_driver, ixgbe_vendor_info_array);
243 MODULE_DEPEND(ix, pci, 1, 1, 1);
244 MODULE_DEPEND(ix, ether, 1, 1, 1);
245 MODULE_DEPEND(ix, iflib, 1, 1, 1);
247 static device_method_t ixgbe_if_methods[] = {
248 DEVMETHOD(ifdi_attach_pre, ixgbe_if_attach_pre),
249 DEVMETHOD(ifdi_attach_post, ixgbe_if_attach_post),
250 DEVMETHOD(ifdi_detach, ixgbe_if_detach),
251 DEVMETHOD(ifdi_shutdown, ixgbe_if_shutdown),
252 DEVMETHOD(ifdi_suspend, ixgbe_if_suspend),
253 DEVMETHOD(ifdi_resume, ixgbe_if_resume),
254 DEVMETHOD(ifdi_init, ixgbe_if_init),
255 DEVMETHOD(ifdi_stop, ixgbe_if_stop),
256 DEVMETHOD(ifdi_msix_intr_assign, ixgbe_if_msix_intr_assign),
257 DEVMETHOD(ifdi_intr_enable, ixgbe_if_enable_intr),
258 DEVMETHOD(ifdi_intr_disable, ixgbe_if_disable_intr),
259 DEVMETHOD(ifdi_link_intr_enable, ixgbe_link_intr_enable),
260 DEVMETHOD(ifdi_tx_queue_intr_enable, ixgbe_if_rx_queue_intr_enable),
261 DEVMETHOD(ifdi_rx_queue_intr_enable, ixgbe_if_rx_queue_intr_enable),
262 DEVMETHOD(ifdi_tx_queues_alloc, ixgbe_if_tx_queues_alloc),
263 DEVMETHOD(ifdi_rx_queues_alloc, ixgbe_if_rx_queues_alloc),
264 DEVMETHOD(ifdi_queues_free, ixgbe_if_queues_free),
265 DEVMETHOD(ifdi_update_admin_status, ixgbe_if_update_admin_status),
266 DEVMETHOD(ifdi_multi_set, ixgbe_if_multi_set),
267 DEVMETHOD(ifdi_mtu_set, ixgbe_if_mtu_set),
268 DEVMETHOD(ifdi_crcstrip_set, ixgbe_if_crcstrip_set),
269 DEVMETHOD(ifdi_media_status, ixgbe_if_media_status),
270 DEVMETHOD(ifdi_media_change, ixgbe_if_media_change),
271 DEVMETHOD(ifdi_promisc_set, ixgbe_if_promisc_set),
272 DEVMETHOD(ifdi_timer, ixgbe_if_timer),
273 DEVMETHOD(ifdi_vlan_register, ixgbe_if_vlan_register),
274 DEVMETHOD(ifdi_vlan_unregister, ixgbe_if_vlan_unregister),
275 DEVMETHOD(ifdi_get_counter, ixgbe_if_get_counter),
276 DEVMETHOD(ifdi_i2c_req, ixgbe_if_i2c_req),
277 DEVMETHOD(ifdi_needs_restart, ixgbe_if_needs_restart),
279 DEVMETHOD(ifdi_iov_init, ixgbe_if_iov_init),
280 DEVMETHOD(ifdi_iov_uninit, ixgbe_if_iov_uninit),
281 DEVMETHOD(ifdi_iov_vf_add, ixgbe_if_iov_vf_add),
287 * TUNEABLE PARAMETERS:
290 static SYSCTL_NODE(_hw, OID_AUTO, ix, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
291 "IXGBE driver parameters");
292 static driver_t ixgbe_if_driver = {
293 "ixgbe_if", ixgbe_if_methods, sizeof(struct adapter)
296 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
297 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
298 &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
300 /* Flow control setting, default to full */
301 static int ixgbe_flow_control = ixgbe_fc_full;
302 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
303 &ixgbe_flow_control, 0, "Default flow control used for all adapters");
305 /* Advertise Speed, default to 0 (auto) */
306 static int ixgbe_advertise_speed = 0;
307 SYSCTL_INT(_hw_ix, OID_AUTO, advertise_speed, CTLFLAG_RDTUN,
308 &ixgbe_advertise_speed, 0, "Default advertised speed for all adapters");
311 * Smart speed setting, default to on
312 * this only works as a compile option
313 * right now as its during attach, set
314 * this to 'ixgbe_smart_speed_off' to
317 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
320 * MSI-X should be the default for best performance,
321 * but this allows it to be forced off for testing.
323 static int ixgbe_enable_msix = 1;
324 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
325 "Enable MSI-X interrupts");
328 * Defining this on will allow the use
329 * of unsupported SFP+ modules, note that
330 * doing so you are on your own :)
332 static int allow_unsupported_sfp = FALSE;
333 SYSCTL_INT(_hw_ix, OID_AUTO, unsupported_sfp, CTLFLAG_RDTUN,
334 &allow_unsupported_sfp, 0,
335 "Allow unsupported SFP modules...use at your own risk");
338 * Not sure if Flow Director is fully baked,
339 * so we'll default to turning it off.
341 static int ixgbe_enable_fdir = 0;
342 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
343 "Enable Flow Director");
345 /* Receive-Side Scaling */
346 static int ixgbe_enable_rss = 1;
347 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
348 "Enable Receive-Side Scaling (RSS)");
351 /* Keep running tab on them for sanity check */
352 static int ixgbe_total_ports;
355 MALLOC_DEFINE(M_IXGBE, "ix", "ix driver allocations");
358 * For Flow Director: this is the number of TX packets we sample
359 * for the filter pool, this means every 20th packet will be probed.
361 * This feature can be disabled by setting this to 0.
363 static int atr_sample_rate = 20;
365 extern struct if_txrx ixgbe_txrx;
367 static struct if_shared_ctx ixgbe_sctx_init = {
368 .isc_magic = IFLIB_MAGIC,
369 .isc_q_align = PAGE_SIZE,/* max(DBA_ALIGN, PAGE_SIZE) */
370 .isc_tx_maxsize = IXGBE_TSO_SIZE + sizeof(struct ether_vlan_header),
371 .isc_tx_maxsegsize = PAGE_SIZE,
372 .isc_tso_maxsize = IXGBE_TSO_SIZE + sizeof(struct ether_vlan_header),
373 .isc_tso_maxsegsize = PAGE_SIZE,
374 .isc_rx_maxsize = PAGE_SIZE*4,
375 .isc_rx_nsegments = 1,
376 .isc_rx_maxsegsize = PAGE_SIZE*4,
381 .isc_admin_intrcnt = 1,
382 .isc_vendor_info = ixgbe_vendor_info_array,
383 .isc_driver_version = ixgbe_driver_version,
384 .isc_driver = &ixgbe_if_driver,
385 .isc_flags = IFLIB_TSO_INIT_IP,
387 .isc_nrxd_min = {MIN_RXD},
388 .isc_ntxd_min = {MIN_TXD},
389 .isc_nrxd_max = {MAX_RXD},
390 .isc_ntxd_max = {MAX_TXD},
391 .isc_nrxd_default = {DEFAULT_RXD},
392 .isc_ntxd_default = {DEFAULT_TXD},
395 if_shared_ctx_t ixgbe_sctx = &ixgbe_sctx_init;
397 /************************************************************************
398 * ixgbe_if_tx_queues_alloc
399 ************************************************************************/
401 ixgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
402 int ntxqs, int ntxqsets)
404 struct adapter *adapter = iflib_get_softc(ctx);
405 if_softc_ctx_t scctx = adapter->shared;
406 struct ix_tx_queue *que;
409 MPASS(adapter->num_tx_queues > 0);
410 MPASS(adapter->num_tx_queues == ntxqsets);
413 /* Allocate queue structure memory */
415 (struct ix_tx_queue *)malloc(sizeof(struct ix_tx_queue) * ntxqsets,
416 M_IXGBE, M_NOWAIT | M_ZERO);
417 if (!adapter->tx_queues) {
418 device_printf(iflib_get_dev(ctx),
419 "Unable to allocate TX ring memory\n");
423 for (i = 0, que = adapter->tx_queues; i < ntxqsets; i++, que++) {
424 struct tx_ring *txr = &que->txr;
426 /* In case SR-IOV is enabled, align the index properly */
427 txr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
430 txr->adapter = que->adapter = adapter;
432 /* Allocate report status array */
433 txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_IXGBE, M_NOWAIT | M_ZERO);
434 if (txr->tx_rsq == NULL) {
438 for (j = 0; j < scctx->isc_ntxd[0]; j++)
439 txr->tx_rsq[j] = QIDX_INVALID;
440 /* get the virtual and physical address of the hardware queues */
441 txr->tail = IXGBE_TDT(txr->me);
442 txr->tx_base = (union ixgbe_adv_tx_desc *)vaddrs[i];
443 txr->tx_paddr = paddrs[i];
446 txr->total_packets = 0;
448 /* Set the rate at which we sample packets */
449 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
450 txr->atr_sample = atr_sample_rate;
454 device_printf(iflib_get_dev(ctx), "allocated for %d queues\n",
455 adapter->num_tx_queues);
460 ixgbe_if_queues_free(ctx);
463 } /* ixgbe_if_tx_queues_alloc */
465 /************************************************************************
466 * ixgbe_if_rx_queues_alloc
467 ************************************************************************/
469 ixgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs,
470 int nrxqs, int nrxqsets)
472 struct adapter *adapter = iflib_get_softc(ctx);
473 struct ix_rx_queue *que;
476 MPASS(adapter->num_rx_queues > 0);
477 MPASS(adapter->num_rx_queues == nrxqsets);
480 /* Allocate queue structure memory */
482 (struct ix_rx_queue *)malloc(sizeof(struct ix_rx_queue)*nrxqsets,
483 M_IXGBE, M_NOWAIT | M_ZERO);
484 if (!adapter->rx_queues) {
485 device_printf(iflib_get_dev(ctx),
486 "Unable to allocate TX ring memory\n");
490 for (i = 0, que = adapter->rx_queues; i < nrxqsets; i++, que++) {
491 struct rx_ring *rxr = &que->rxr;
493 /* In case SR-IOV is enabled, align the index properly */
494 rxr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
497 rxr->adapter = que->adapter = adapter;
499 /* get the virtual and physical address of the hw queues */
500 rxr->tail = IXGBE_RDT(rxr->me);
501 rxr->rx_base = (union ixgbe_adv_rx_desc *)vaddrs[i];
502 rxr->rx_paddr = paddrs[i];
507 device_printf(iflib_get_dev(ctx), "allocated for %d rx queues\n",
508 adapter->num_rx_queues);
511 } /* ixgbe_if_rx_queues_alloc */
513 /************************************************************************
514 * ixgbe_if_queues_free
515 ************************************************************************/
517 ixgbe_if_queues_free(if_ctx_t ctx)
519 struct adapter *adapter = iflib_get_softc(ctx);
520 struct ix_tx_queue *tx_que = adapter->tx_queues;
521 struct ix_rx_queue *rx_que = adapter->rx_queues;
524 if (tx_que != NULL) {
525 for (i = 0; i < adapter->num_tx_queues; i++, tx_que++) {
526 struct tx_ring *txr = &tx_que->txr;
527 if (txr->tx_rsq == NULL)
530 free(txr->tx_rsq, M_IXGBE);
534 free(adapter->tx_queues, M_IXGBE);
535 adapter->tx_queues = NULL;
537 if (rx_que != NULL) {
538 free(adapter->rx_queues, M_IXGBE);
539 adapter->rx_queues = NULL;
541 } /* ixgbe_if_queues_free */
543 /************************************************************************
544 * ixgbe_initialize_rss_mapping
545 ************************************************************************/
547 ixgbe_initialize_rss_mapping(struct adapter *adapter)
549 struct ixgbe_hw *hw = &adapter->hw;
550 u32 reta = 0, mrqc, rss_key[10];
551 int queue_id, table_size, index_mult;
555 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
556 /* Fetch the configured RSS key */
557 rss_getkey((uint8_t *)&rss_key);
559 /* set up random bits */
560 arc4rand(&rss_key, sizeof(rss_key), 0);
563 /* Set multiplier for RETA setup and table size based on MAC */
566 switch (adapter->hw.mac.type) {
567 case ixgbe_mac_82598EB:
571 case ixgbe_mac_X550EM_x:
572 case ixgbe_mac_X550EM_a:
579 /* Set up the redirection table */
580 for (i = 0, j = 0; i < table_size; i++, j++) {
581 if (j == adapter->num_rx_queues)
584 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
586 * Fetch the RSS bucket id for the given indirection
587 * entry. Cap it at the number of configured buckets
588 * (which is num_rx_queues.)
590 queue_id = rss_get_indirection_to_bucket(i);
591 queue_id = queue_id % adapter->num_rx_queues;
593 queue_id = (j * index_mult);
596 * The low 8 bits are for hash value (n+0);
597 * The next 8 bits are for hash value (n+1), etc.
600 reta = reta | (((uint32_t)queue_id) << 24);
603 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
605 IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
611 /* Now fill our hash function seeds */
612 for (i = 0; i < 10; i++)
613 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
615 /* Perform hash on these packet types */
616 if (adapter->feat_en & IXGBE_FEATURE_RSS)
617 rss_hash_config = rss_gethashconfig();
620 * Disable UDP - IP fragments aren't currently being handled
621 * and so we end up with a mix of 2-tuple and 4-tuple
624 rss_hash_config = RSS_HASHTYPE_RSS_IPV4
625 | RSS_HASHTYPE_RSS_TCP_IPV4
626 | RSS_HASHTYPE_RSS_IPV6
627 | RSS_HASHTYPE_RSS_TCP_IPV6
628 | RSS_HASHTYPE_RSS_IPV6_EX
629 | RSS_HASHTYPE_RSS_TCP_IPV6_EX;
632 mrqc = IXGBE_MRQC_RSSEN;
633 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
634 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
635 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
636 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
637 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
638 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
639 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
640 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
641 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
642 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
643 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
644 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
645 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
646 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
647 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
648 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
649 if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
650 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
651 mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
652 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
653 } /* ixgbe_initialize_rss_mapping */
655 /************************************************************************
656 * ixgbe_initialize_receive_units - Setup receive registers and features.
657 ************************************************************************/
658 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
661 ixgbe_initialize_receive_units(if_ctx_t ctx)
663 struct adapter *adapter = iflib_get_softc(ctx);
664 if_softc_ctx_t scctx = adapter->shared;
665 struct ixgbe_hw *hw = &adapter->hw;
666 struct ifnet *ifp = iflib_get_ifp(ctx);
667 struct ix_rx_queue *que;
669 u32 bufsz, fctrl, srrctl, rxcsum;
673 * Make sure receives are disabled while
674 * setting up the descriptor ring
676 ixgbe_disable_rx(hw);
678 /* Enable broadcasts */
679 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
680 fctrl |= IXGBE_FCTRL_BAM;
681 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
682 fctrl |= IXGBE_FCTRL_DPF;
683 fctrl |= IXGBE_FCTRL_PMCF;
685 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
687 /* Set for Jumbo Frames? */
688 hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
689 if (ifp->if_mtu > ETHERMTU)
690 hlreg |= IXGBE_HLREG0_JUMBOEN;
692 hlreg &= ~IXGBE_HLREG0_JUMBOEN;
693 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
695 bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
696 IXGBE_SRRCTL_BSIZEPKT_SHIFT;
698 /* Setup the Base and Length of the Rx Descriptor Ring */
699 for (i = 0, que = adapter->rx_queues; i < adapter->num_rx_queues; i++, que++) {
700 struct rx_ring *rxr = &que->rxr;
701 u64 rdba = rxr->rx_paddr;
705 /* Setup the Base and Length of the Rx Descriptor Ring */
706 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
707 (rdba & 0x00000000ffffffffULL));
708 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
709 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
710 scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc));
712 /* Set up the SRRCTL register */
713 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
714 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
715 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
717 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
720 * Set DROP_EN iff we have no flow control and >1 queue.
721 * Note that srrctl was cleared shortly before during reset,
722 * so we do not need to clear the bit, but do it just in case
723 * this code is moved elsewhere.
725 if (adapter->num_rx_queues > 1 &&
726 adapter->hw.fc.requested_mode == ixgbe_fc_none) {
727 srrctl |= IXGBE_SRRCTL_DROP_EN;
729 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
732 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
734 /* Setup the HW Rx Head and Tail Descriptor Pointers */
735 IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
736 IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
738 /* Set the driver rx tail address */
739 rxr->tail = IXGBE_RDT(rxr->me);
742 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
743 u32 psrtype = IXGBE_PSRTYPE_TCPHDR
744 | IXGBE_PSRTYPE_UDPHDR
745 | IXGBE_PSRTYPE_IPV4HDR
746 | IXGBE_PSRTYPE_IPV6HDR;
747 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
750 rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
752 ixgbe_initialize_rss_mapping(adapter);
754 if (adapter->num_rx_queues > 1) {
755 /* RSS and RX IPP Checksum are mutually exclusive */
756 rxcsum |= IXGBE_RXCSUM_PCSD;
759 if (ifp->if_capenable & IFCAP_RXCSUM)
760 rxcsum |= IXGBE_RXCSUM_PCSD;
762 /* This is useful for calculating UDP/IP fragment checksums */
763 if (!(rxcsum & IXGBE_RXCSUM_PCSD))
764 rxcsum |= IXGBE_RXCSUM_IPPCSE;
766 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
768 } /* ixgbe_initialize_receive_units */
770 /************************************************************************
771 * ixgbe_initialize_transmit_units - Enable transmit units.
772 ************************************************************************/
774 ixgbe_initialize_transmit_units(if_ctx_t ctx)
776 struct adapter *adapter = iflib_get_softc(ctx);
777 struct ixgbe_hw *hw = &adapter->hw;
778 if_softc_ctx_t scctx = adapter->shared;
779 struct ix_tx_queue *que;
782 /* Setup the Base and Length of the Tx Descriptor Ring */
783 for (i = 0, que = adapter->tx_queues; i < adapter->num_tx_queues;
785 struct tx_ring *txr = &que->txr;
786 u64 tdba = txr->tx_paddr;
790 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
791 (tdba & 0x00000000ffffffffULL));
792 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
793 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
794 scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc));
796 /* Setup the HW Tx Head and Tail descriptor pointers */
797 IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
798 IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
800 /* Cache the tail address */
801 txr->tail = IXGBE_TDT(txr->me);
803 txr->tx_rs_cidx = txr->tx_rs_pidx;
804 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1;
805 for (int k = 0; k < scctx->isc_ntxd[0]; k++)
806 txr->tx_rsq[k] = QIDX_INVALID;
808 /* Disable Head Writeback */
810 * Note: for X550 series devices, these registers are actually
811 * prefixed with TPH_ isntead of DCA_, but the addresses and
812 * fields remain the same.
814 switch (hw->mac.type) {
815 case ixgbe_mac_82598EB:
816 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
819 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
822 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
823 switch (hw->mac.type) {
824 case ixgbe_mac_82598EB:
825 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
828 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
834 if (hw->mac.type != ixgbe_mac_82598EB) {
835 u32 dmatxctl, rttdcs;
837 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
838 dmatxctl |= IXGBE_DMATXCTL_TE;
839 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
840 /* Disable arbiter to set MTQC */
841 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
842 rttdcs |= IXGBE_RTTDCS_ARBDIS;
843 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
844 IXGBE_WRITE_REG(hw, IXGBE_MTQC,
845 ixgbe_get_mtqc(adapter->iov_mode));
846 rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
847 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
850 } /* ixgbe_initialize_transmit_units */
852 /************************************************************************
854 ************************************************************************/
856 ixgbe_register(device_t dev)
859 } /* ixgbe_register */
861 /************************************************************************
862 * ixgbe_if_attach_pre - Device initialization routine, part 1
864 * Called when the driver is being loaded.
865 * Identifies the type of hardware, initializes the hardware,
866 * and initializes iflib structures.
868 * return 0 on success, positive on failure
869 ************************************************************************/
871 ixgbe_if_attach_pre(if_ctx_t ctx)
873 struct adapter *adapter;
875 if_softc_ctx_t scctx;
880 INIT_DEBUGOUT("ixgbe_attach: begin");
882 /* Allocate, clear, and link in our adapter structure */
883 dev = iflib_get_dev(ctx);
884 adapter = iflib_get_softc(ctx);
885 adapter->hw.back = adapter;
888 scctx = adapter->shared = iflib_get_softc_ctx(ctx);
889 adapter->media = iflib_get_media(ctx);
892 /* Determine hardware revision */
893 hw->vendor_id = pci_get_vendor(dev);
894 hw->device_id = pci_get_device(dev);
895 hw->revision_id = pci_get_revid(dev);
896 hw->subsystem_vendor_id = pci_get_subvendor(dev);
897 hw->subsystem_device_id = pci_get_subdevice(dev);
899 /* Do base PCI setup - map BAR0 */
900 if (ixgbe_allocate_pci_resources(ctx)) {
901 device_printf(dev, "Allocation of PCI resources failed\n");
905 /* let hardware know driver is loaded */
906 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
907 ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
908 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
911 * Initialize the shared code
913 if (ixgbe_init_shared_code(hw) != 0) {
914 device_printf(dev, "Unable to initialize the shared code\n");
919 if (hw->mbx.ops.init_params)
920 hw->mbx.ops.init_params(hw);
922 hw->allow_unsupported_sfp = allow_unsupported_sfp;
924 if (hw->mac.type != ixgbe_mac_82598EB)
925 hw->phy.smart_speed = ixgbe_smart_speed;
927 ixgbe_init_device_features(adapter);
929 /* Enable WoL (if supported) */
930 ixgbe_check_wol_support(adapter);
932 /* Verify adapter fan is still functional (if applicable) */
933 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
934 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
935 ixgbe_check_fan_failure(adapter, esdp, FALSE);
938 /* Ensure SW/FW semaphore is free */
939 ixgbe_init_swfw_semaphore(hw);
941 /* Set an initial default flow control value */
942 hw->fc.requested_mode = ixgbe_flow_control;
944 hw->phy.reset_if_overtemp = TRUE;
945 error = ixgbe_reset_hw(hw);
946 hw->phy.reset_if_overtemp = FALSE;
947 if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
949 * No optics in this port, set up
950 * so the timer routine will probe
951 * for later insertion.
953 adapter->sfp_probe = TRUE;
955 } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
956 device_printf(dev, "Unsupported SFP+ module detected!\n");
960 device_printf(dev, "Hardware initialization failed\n");
965 /* Make sure we have a good EEPROM before we read from it */
966 if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
967 device_printf(dev, "The EEPROM Checksum Is Not Valid\n");
972 error = ixgbe_start_hw(hw);
974 case IXGBE_ERR_EEPROM_VERSION:
975 device_printf(dev, "This device is a pre-production adapter/LOM. Please be aware there may be issues associated with your hardware.\nIf you are experiencing problems please contact your Intel or hardware representative who provided you with this hardware.\n");
977 case IXGBE_ERR_SFP_NOT_SUPPORTED:
978 device_printf(dev, "Unsupported SFP+ Module\n");
981 case IXGBE_ERR_SFP_NOT_PRESENT:
982 device_printf(dev, "No SFP+ Module found\n");
988 /* Most of the iflib initialization... */
990 iflib_set_mac(ctx, hw->mac.addr);
991 switch (adapter->hw.mac.type) {
993 case ixgbe_mac_X550EM_x:
994 case ixgbe_mac_X550EM_a:
995 scctx->isc_rss_table_size = 512;
996 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 64;
999 scctx->isc_rss_table_size = 128;
1000 scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max = 16;
1003 /* Allow legacy interrupts */
1004 ixgbe_txrx.ift_legacy_intr = ixgbe_intr;
1006 scctx->isc_txqsizes[0] =
1007 roundup2(scctx->isc_ntxd[0] * sizeof(union ixgbe_adv_tx_desc) +
1008 sizeof(u32), DBA_ALIGN),
1009 scctx->isc_rxqsizes[0] =
1010 roundup2(scctx->isc_nrxd[0] * sizeof(union ixgbe_adv_rx_desc),
1014 scctx->isc_tx_csum_flags = CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_TSO |
1015 CSUM_IP6_TCP | CSUM_IP6_UDP | CSUM_IP6_TSO;
1016 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
1017 scctx->isc_tx_nsegments = IXGBE_82598_SCATTER;
1019 scctx->isc_tx_csum_flags |= CSUM_SCTP |CSUM_IP6_SCTP;
1020 scctx->isc_tx_nsegments = IXGBE_82599_SCATTER;
1023 scctx->isc_msix_bar = pci_msix_table_bar(dev);
1025 scctx->isc_tx_tso_segments_max = scctx->isc_tx_nsegments;
1026 scctx->isc_tx_tso_size_max = IXGBE_TSO_SIZE;
1027 scctx->isc_tx_tso_segsize_max = PAGE_SIZE;
1029 scctx->isc_txrx = &ixgbe_txrx;
1031 scctx->isc_capabilities = scctx->isc_capenable = IXGBE_CAPS;
1036 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
1037 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
1038 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
1039 ixgbe_free_pci_resources(ctx);
1042 } /* ixgbe_if_attach_pre */
1044 /*********************************************************************
1045 * ixgbe_if_attach_post - Device initialization routine, part 2
1047 * Called during driver load, but after interrupts and
1048 * resources have been allocated and configured.
1049 * Sets up some data structures not relevant to iflib.
1051 * return 0 on success, positive on failure
1052 *********************************************************************/
1054 ixgbe_if_attach_post(if_ctx_t ctx)
1057 struct adapter *adapter;
1058 struct ixgbe_hw *hw;
1061 dev = iflib_get_dev(ctx);
1062 adapter = iflib_get_softc(ctx);
1066 if (adapter->intr_type == IFLIB_INTR_LEGACY &&
1067 (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) == 0) {
1068 device_printf(dev, "Device does not support legacy interrupts");
1073 /* Allocate multicast array memory. */
1074 adapter->mta = malloc(sizeof(*adapter->mta) *
1075 MAX_NUM_MULTICAST_ADDRESSES, M_IXGBE, M_NOWAIT);
1076 if (adapter->mta == NULL) {
1077 device_printf(dev, "Can not allocate multicast setup array\n");
1082 /* hw.ix defaults init */
1083 ixgbe_set_advertise(adapter, ixgbe_advertise_speed);
1085 /* Enable the optics for 82599 SFP+ fiber */
1086 ixgbe_enable_tx_laser(hw);
1088 /* Enable power to the phy. */
1089 ixgbe_set_phy_power(hw, TRUE);
1091 ixgbe_initialize_iov(adapter);
1093 error = ixgbe_setup_interface(ctx);
1095 device_printf(dev, "Interface setup failed: %d\n", error);
1099 ixgbe_if_update_admin_status(ctx);
1101 /* Initialize statistics */
1102 ixgbe_update_stats_counters(adapter);
1103 ixgbe_add_hw_stats(adapter);
1105 /* Check PCIE slot type/speed/width */
1106 ixgbe_get_slot_info(adapter);
1109 * Do time init and sysctl init here, but
1110 * only on the first port of a bypass adapter.
1112 ixgbe_bypass_init(adapter);
1114 /* Set an initial dmac value */
1116 /* Set initial advertised speeds (if applicable) */
1117 adapter->advertise = ixgbe_get_advertise(adapter);
1119 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
1120 ixgbe_define_iov_schemas(dev, &error);
1123 ixgbe_add_device_sysctls(ctx);
1128 } /* ixgbe_if_attach_post */
1130 /************************************************************************
1131 * ixgbe_check_wol_support
1133 * Checks whether the adapter's ports are capable of
1134 * Wake On LAN by reading the adapter's NVM.
1136 * Sets each port's hw->wol_enabled value depending
1137 * on the value read here.
1138 ************************************************************************/
1140 ixgbe_check_wol_support(struct adapter *adapter)
1142 struct ixgbe_hw *hw = &adapter->hw;
1145 /* Find out WoL support for port */
1146 adapter->wol_support = hw->wol_enabled = 0;
1147 ixgbe_get_device_caps(hw, &dev_caps);
1148 if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
1149 ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
1151 adapter->wol_support = hw->wol_enabled = 1;
1153 /* Save initial wake up filter configuration */
1154 adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
1157 } /* ixgbe_check_wol_support */
1159 /************************************************************************
1160 * ixgbe_setup_interface
1162 * Setup networking device structure and register an interface.
1163 ************************************************************************/
1165 ixgbe_setup_interface(if_ctx_t ctx)
1167 struct ifnet *ifp = iflib_get_ifp(ctx);
1168 struct adapter *adapter = iflib_get_softc(ctx);
1170 INIT_DEBUGOUT("ixgbe_setup_interface: begin");
1172 if_setbaudrate(ifp, IF_Gbps(10));
1174 adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1176 adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
1178 ixgbe_add_media_types(ctx);
1180 /* Autoselect media by default */
1181 ifmedia_set(adapter->media, IFM_ETHER | IFM_AUTO);
1184 } /* ixgbe_setup_interface */
1186 /************************************************************************
1187 * ixgbe_if_get_counter
1188 ************************************************************************/
1190 ixgbe_if_get_counter(if_ctx_t ctx, ift_counter cnt)
1192 struct adapter *adapter = iflib_get_softc(ctx);
1193 if_t ifp = iflib_get_ifp(ctx);
1196 case IFCOUNTER_IPACKETS:
1197 return (adapter->ipackets);
1198 case IFCOUNTER_OPACKETS:
1199 return (adapter->opackets);
1200 case IFCOUNTER_IBYTES:
1201 return (adapter->ibytes);
1202 case IFCOUNTER_OBYTES:
1203 return (adapter->obytes);
1204 case IFCOUNTER_IMCASTS:
1205 return (adapter->imcasts);
1206 case IFCOUNTER_OMCASTS:
1207 return (adapter->omcasts);
1208 case IFCOUNTER_COLLISIONS:
1210 case IFCOUNTER_IQDROPS:
1211 return (adapter->iqdrops);
1212 case IFCOUNTER_OQDROPS:
1214 case IFCOUNTER_IERRORS:
1215 return (adapter->ierrors);
1217 return (if_get_counter_default(ifp, cnt));
1219 } /* ixgbe_if_get_counter */
1221 /************************************************************************
1223 ************************************************************************/
1225 ixgbe_if_i2c_req(if_ctx_t ctx, struct ifi2creq *req)
1227 struct adapter *adapter = iflib_get_softc(ctx);
1228 struct ixgbe_hw *hw = &adapter->hw;
1232 if (hw->phy.ops.read_i2c_byte == NULL)
1234 for (i = 0; i < req->len; i++)
1235 hw->phy.ops.read_i2c_byte(hw, req->offset + i,
1236 req->dev_addr, &req->data[i]);
1238 } /* ixgbe_if_i2c_req */
1240 /* ixgbe_if_needs_restart - Tell iflib when the driver needs to be reinitialized
1241 * @ctx: iflib context
1242 * @event: event code to check
1244 * Defaults to returning true for unknown events.
1246 * @returns true if iflib needs to reinit the interface
1249 ixgbe_if_needs_restart(if_ctx_t ctx __unused, enum iflib_restart_event event)
1252 case IFLIB_RESTART_VLAN_CONFIG:
1259 /************************************************************************
1260 * ixgbe_add_media_types
1261 ************************************************************************/
1263 ixgbe_add_media_types(if_ctx_t ctx)
1265 struct adapter *adapter = iflib_get_softc(ctx);
1266 struct ixgbe_hw *hw = &adapter->hw;
1267 device_t dev = iflib_get_dev(ctx);
1270 layer = adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
1272 /* Media types with matching FreeBSD media defines */
1273 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
1274 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_T, 0, NULL);
1275 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
1276 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1277 if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
1278 ifmedia_add(adapter->media, IFM_ETHER | IFM_100_TX, 0, NULL);
1279 if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
1280 ifmedia_add(adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
1282 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
1283 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
1284 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0,
1287 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
1288 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
1289 if (hw->phy.multispeed_fiber)
1290 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_LX, 0,
1293 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
1294 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
1295 if (hw->phy.multispeed_fiber)
1296 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_SX, 0,
1298 } else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
1299 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
1300 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
1301 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
1303 #ifdef IFM_ETH_XTYPE
1304 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
1305 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_KR, 0, NULL);
1306 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4)
1307 ifmedia_add( adapter->media, IFM_ETHER | IFM_10G_KX4, 0, NULL);
1308 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
1309 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_KX, 0, NULL);
1310 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX)
1311 ifmedia_add(adapter->media, IFM_ETHER | IFM_2500_KX, 0, NULL);
1313 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
1314 device_printf(dev, "Media supported: 10GbaseKR\n");
1315 device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
1316 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
1318 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
1319 device_printf(dev, "Media supported: 10GbaseKX4\n");
1320 device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
1321 ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
1323 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
1324 device_printf(dev, "Media supported: 1000baseKX\n");
1325 device_printf(dev, "1000baseKX mapped to 1000baseCX\n");
1326 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
1328 if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX) {
1329 device_printf(dev, "Media supported: 2500baseKX\n");
1330 device_printf(dev, "2500baseKX mapped to 2500baseSX\n");
1331 ifmedia_add(adapter->media, IFM_ETHER | IFM_2500_SX, 0, NULL);
1334 if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
1335 device_printf(dev, "Media supported: 1000baseBX\n");
1337 if (hw->device_id == IXGBE_DEV_ID_82598AT) {
1338 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1340 ifmedia_add(adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1343 ifmedia_add(adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1344 } /* ixgbe_add_media_types */
1346 /************************************************************************
1348 ************************************************************************/
1350 ixgbe_is_sfp(struct ixgbe_hw *hw)
1352 switch (hw->mac.type) {
1353 case ixgbe_mac_82598EB:
1354 if (hw->phy.type == ixgbe_phy_nl)
1357 case ixgbe_mac_82599EB:
1358 switch (hw->mac.ops.get_media_type(hw)) {
1359 case ixgbe_media_type_fiber:
1360 case ixgbe_media_type_fiber_qsfp:
1365 case ixgbe_mac_X550EM_x:
1366 case ixgbe_mac_X550EM_a:
1367 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
1373 } /* ixgbe_is_sfp */
1375 /************************************************************************
1377 ************************************************************************/
1379 ixgbe_config_link(if_ctx_t ctx)
1381 struct adapter *adapter = iflib_get_softc(ctx);
1382 struct ixgbe_hw *hw = &adapter->hw;
1383 u32 autoneg, err = 0;
1384 bool sfp, negotiate;
1386 sfp = ixgbe_is_sfp(hw);
1389 adapter->task_requests |= IXGBE_REQUEST_TASK_MOD;
1390 iflib_admin_intr_deferred(ctx);
1392 if (hw->mac.ops.check_link)
1393 err = ixgbe_check_link(hw, &adapter->link_speed,
1394 &adapter->link_up, FALSE);
1397 autoneg = hw->phy.autoneg_advertised;
1398 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
1399 err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
1403 if (hw->mac.ops.setup_link)
1404 err = hw->mac.ops.setup_link(hw, autoneg,
1407 } /* ixgbe_config_link */
1409 /************************************************************************
1410 * ixgbe_update_stats_counters - Update board statistics counters.
1411 ************************************************************************/
1413 ixgbe_update_stats_counters(struct adapter *adapter)
1415 struct ixgbe_hw *hw = &adapter->hw;
1416 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1417 u32 missed_rx = 0, bprc, lxon, lxoff, total;
1419 u64 total_missed_rx = 0;
1421 stats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
1422 stats->illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
1423 stats->errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC);
1424 stats->mspdc += IXGBE_READ_REG(hw, IXGBE_MSPDC);
1425 stats->mpc[0] += IXGBE_READ_REG(hw, IXGBE_MPC(0));
1427 for (int i = 0; i < 16; i++) {
1428 stats->qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
1429 stats->qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
1430 stats->qprdc[i] += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
1432 stats->mlfc += IXGBE_READ_REG(hw, IXGBE_MLFC);
1433 stats->mrfc += IXGBE_READ_REG(hw, IXGBE_MRFC);
1434 stats->rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
1436 /* Hardware workaround, gprc counts missed packets */
1437 stats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
1438 stats->gprc -= missed_rx;
1440 if (hw->mac.type != ixgbe_mac_82598EB) {
1441 stats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL) +
1442 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
1443 stats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
1444 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32);
1445 stats->tor += IXGBE_READ_REG(hw, IXGBE_TORL) +
1446 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
1447 stats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
1448 lxoffrxc = IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
1449 stats->lxoffrxc += lxoffrxc;
1451 stats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
1452 lxoffrxc = IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
1453 stats->lxoffrxc += lxoffrxc;
1454 /* 82598 only has a counter in the high register */
1455 stats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
1456 stats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
1457 stats->tor += IXGBE_READ_REG(hw, IXGBE_TORH);
1461 * For watchdog management we need to know if we have been paused
1462 * during the last interval, so capture that here.
1465 adapter->shared->isc_pause_frames = 1;
1468 * Workaround: mprc hardware is incorrectly counting
1469 * broadcasts, so for now we subtract those.
1471 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
1472 stats->bprc += bprc;
1473 stats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC);
1474 if (hw->mac.type == ixgbe_mac_82598EB)
1475 stats->mprc -= bprc;
1477 stats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64);
1478 stats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127);
1479 stats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255);
1480 stats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511);
1481 stats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023);
1482 stats->prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
1484 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
1485 stats->lxontxc += lxon;
1486 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
1487 stats->lxofftxc += lxoff;
1488 total = lxon + lxoff;
1490 stats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC);
1491 stats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
1492 stats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64);
1493 stats->gptc -= total;
1494 stats->mptc -= total;
1495 stats->ptc64 -= total;
1496 stats->gotc -= total * ETHER_MIN_LEN;
1498 stats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
1499 stats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
1500 stats->roc += IXGBE_READ_REG(hw, IXGBE_ROC);
1501 stats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC);
1502 stats->mngprc += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
1503 stats->mngpdc += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
1504 stats->mngptc += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
1505 stats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR);
1506 stats->tpt += IXGBE_READ_REG(hw, IXGBE_TPT);
1507 stats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127);
1508 stats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255);
1509 stats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511);
1510 stats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023);
1511 stats->ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522);
1512 stats->bptc += IXGBE_READ_REG(hw, IXGBE_BPTC);
1513 stats->xec += IXGBE_READ_REG(hw, IXGBE_XEC);
1514 stats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC);
1515 stats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST);
1516 /* Only read FCOE on 82599 */
1517 if (hw->mac.type != ixgbe_mac_82598EB) {
1518 stats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
1519 stats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
1520 stats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
1521 stats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
1522 stats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
1525 /* Fill out the OS statistics structure */
1526 IXGBE_SET_IPACKETS(adapter, stats->gprc);
1527 IXGBE_SET_OPACKETS(adapter, stats->gptc);
1528 IXGBE_SET_IBYTES(adapter, stats->gorc);
1529 IXGBE_SET_OBYTES(adapter, stats->gotc);
1530 IXGBE_SET_IMCASTS(adapter, stats->mprc);
1531 IXGBE_SET_OMCASTS(adapter, stats->mptc);
1532 IXGBE_SET_COLLISIONS(adapter, 0);
1533 IXGBE_SET_IQDROPS(adapter, total_missed_rx);
1534 IXGBE_SET_IERRORS(adapter, stats->crcerrs + stats->rlec);
1535 } /* ixgbe_update_stats_counters */
1537 /************************************************************************
1538 * ixgbe_add_hw_stats
1540 * Add sysctl variables, one per statistic, to the system.
1541 ************************************************************************/
1543 ixgbe_add_hw_stats(struct adapter *adapter)
1545 device_t dev = iflib_get_dev(adapter->ctx);
1546 struct ix_rx_queue *rx_que;
1547 struct ix_tx_queue *tx_que;
1548 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
1549 struct sysctl_oid *tree = device_get_sysctl_tree(dev);
1550 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
1551 struct ixgbe_hw_stats *stats = &adapter->stats.pf;
1552 struct sysctl_oid *stat_node, *queue_node;
1553 struct sysctl_oid_list *stat_list, *queue_list;
1556 #define QUEUE_NAME_LEN 32
1557 char namebuf[QUEUE_NAME_LEN];
1559 /* Driver Statistics */
1560 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
1561 CTLFLAG_RD, &adapter->dropped_pkts, "Driver dropped packets");
1562 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
1563 CTLFLAG_RD, &adapter->watchdog_events, "Watchdog timeouts");
1564 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
1565 CTLFLAG_RD, &adapter->link_irq, "Link MSI-X IRQ Handled");
1567 for (i = 0, tx_que = adapter->tx_queues; i < adapter->num_tx_queues; i++, tx_que++) {
1568 struct tx_ring *txr = &tx_que->txr;
1569 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1570 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1571 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Queue Name");
1572 queue_list = SYSCTL_CHILDREN(queue_node);
1574 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head",
1575 CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, txr, 0,
1576 ixgbe_sysctl_tdh_handler, "IU", "Transmit Descriptor Head");
1577 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail",
1578 CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, txr, 0,
1579 ixgbe_sysctl_tdt_handler, "IU", "Transmit Descriptor Tail");
1580 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso_tx",
1581 CTLFLAG_RD, &txr->tso_tx, "TSO");
1582 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
1583 CTLFLAG_RD, &txr->total_packets,
1584 "Queue Packets Transmitted");
1587 for (i = 0, rx_que = adapter->rx_queues; i < adapter->num_rx_queues; i++, rx_que++) {
1588 struct rx_ring *rxr = &rx_que->rxr;
1589 snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
1590 queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
1591 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Queue Name");
1592 queue_list = SYSCTL_CHILDREN(queue_node);
1594 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "interrupt_rate",
1595 CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
1596 &adapter->rx_queues[i], 0,
1597 ixgbe_sysctl_interrupt_rate_handler, "IU",
1599 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
1600 CTLFLAG_RD, &(adapter->rx_queues[i].irqs),
1601 "irqs on this queue");
1602 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head",
1603 CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, rxr, 0,
1604 ixgbe_sysctl_rdh_handler, "IU", "Receive Descriptor Head");
1605 SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail",
1606 CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, rxr, 0,
1607 ixgbe_sysctl_rdt_handler, "IU", "Receive Descriptor Tail");
1608 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
1609 CTLFLAG_RD, &rxr->rx_packets, "Queue Packets Received");
1610 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
1611 CTLFLAG_RD, &rxr->rx_bytes, "Queue Bytes Received");
1612 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_copies",
1613 CTLFLAG_RD, &rxr->rx_copies, "Copied RX Frames");
1614 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_discarded",
1615 CTLFLAG_RD, &rxr->rx_discarded, "Discarded RX packets");
1618 /* MAC stats get their own sub node */
1620 stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats",
1621 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "MAC Statistics");
1622 stat_list = SYSCTL_CHILDREN(stat_node);
1624 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "crc_errs",
1625 CTLFLAG_RD, &stats->crcerrs, "CRC Errors");
1626 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "ill_errs",
1627 CTLFLAG_RD, &stats->illerrc, "Illegal Byte Errors");
1628 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "byte_errs",
1629 CTLFLAG_RD, &stats->errbc, "Byte Errors");
1630 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "short_discards",
1631 CTLFLAG_RD, &stats->mspdc, "MAC Short Packets Discarded");
1632 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "local_faults",
1633 CTLFLAG_RD, &stats->mlfc, "MAC Local Faults");
1634 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "remote_faults",
1635 CTLFLAG_RD, &stats->mrfc, "MAC Remote Faults");
1636 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rec_len_errs",
1637 CTLFLAG_RD, &stats->rlec, "Receive Length Errors");
1638 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_missed_packets",
1639 CTLFLAG_RD, &stats->mpc[0], "RX Missed Packet Count");
1641 /* Flow Control stats */
1642 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_txd",
1643 CTLFLAG_RD, &stats->lxontxc, "Link XON Transmitted");
1644 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_recvd",
1645 CTLFLAG_RD, &stats->lxonrxc, "Link XON Received");
1646 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_txd",
1647 CTLFLAG_RD, &stats->lxofftxc, "Link XOFF Transmitted");
1648 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_recvd",
1649 CTLFLAG_RD, &stats->lxoffrxc, "Link XOFF Received");
1651 /* Packet Reception Stats */
1652 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_octets_rcvd",
1653 CTLFLAG_RD, &stats->tor, "Total Octets Received");
1654 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_rcvd",
1655 CTLFLAG_RD, &stats->gorc, "Good Octets Received");
1656 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_rcvd",
1657 CTLFLAG_RD, &stats->tpr, "Total Packets Received");
1658 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_rcvd",
1659 CTLFLAG_RD, &stats->gprc, "Good Packets Received");
1660 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_rcvd",
1661 CTLFLAG_RD, &stats->mprc, "Multicast Packets Received");
1662 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_rcvd",
1663 CTLFLAG_RD, &stats->bprc, "Broadcast Packets Received");
1664 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_64",
1665 CTLFLAG_RD, &stats->prc64, "64 byte frames received ");
1666 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_65_127",
1667 CTLFLAG_RD, &stats->prc127, "65-127 byte frames received");
1668 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_128_255",
1669 CTLFLAG_RD, &stats->prc255, "128-255 byte frames received");
1670 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_256_511",
1671 CTLFLAG_RD, &stats->prc511, "256-511 byte frames received");
1672 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_512_1023",
1673 CTLFLAG_RD, &stats->prc1023, "512-1023 byte frames received");
1674 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
1675 CTLFLAG_RD, &stats->prc1522, "1023-1522 byte frames received");
1676 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_undersized",
1677 CTLFLAG_RD, &stats->ruc, "Receive Undersized");
1678 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_fragmented",
1679 CTLFLAG_RD, &stats->rfc, "Fragmented Packets Received ");
1680 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_oversized",
1681 CTLFLAG_RD, &stats->roc, "Oversized Packets Received");
1682 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabberd",
1683 CTLFLAG_RD, &stats->rjc, "Received Jabber");
1684 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_rcvd",
1685 CTLFLAG_RD, &stats->mngprc, "Management Packets Received");
1686 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_drpd",
1687 CTLFLAG_RD, &stats->mngptc, "Management Packets Dropped");
1688 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "checksum_errs",
1689 CTLFLAG_RD, &stats->xec, "Checksum Errors");
1691 /* Packet Transmission Stats */
1692 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
1693 CTLFLAG_RD, &stats->gotc, "Good Octets Transmitted");
1694 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
1695 CTLFLAG_RD, &stats->tpt, "Total Packets Transmitted");
1696 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
1697 CTLFLAG_RD, &stats->gptc, "Good Packets Transmitted");
1698 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_txd",
1699 CTLFLAG_RD, &stats->bptc, "Broadcast Packets Transmitted");
1700 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_txd",
1701 CTLFLAG_RD, &stats->mptc, "Multicast Packets Transmitted");
1702 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_txd",
1703 CTLFLAG_RD, &stats->mngptc, "Management Packets Transmitted");
1704 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_64",
1705 CTLFLAG_RD, &stats->ptc64, "64 byte frames transmitted ");
1706 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_65_127",
1707 CTLFLAG_RD, &stats->ptc127, "65-127 byte frames transmitted");
1708 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_128_255",
1709 CTLFLAG_RD, &stats->ptc255, "128-255 byte frames transmitted");
1710 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_256_511",
1711 CTLFLAG_RD, &stats->ptc511, "256-511 byte frames transmitted");
1712 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_512_1023",
1713 CTLFLAG_RD, &stats->ptc1023, "512-1023 byte frames transmitted");
1714 SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_1024_1522",
1715 CTLFLAG_RD, &stats->ptc1522, "1024-1522 byte frames transmitted");
1716 } /* ixgbe_add_hw_stats */
1718 /************************************************************************
1719 * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
1721 * Retrieves the TDH value from the hardware
1722 ************************************************************************/
1724 ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS)
1726 struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
1733 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
1734 error = sysctl_handle_int(oidp, &val, 0, req);
1735 if (error || !req->newptr)
1739 } /* ixgbe_sysctl_tdh_handler */
1741 /************************************************************************
1742 * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
1744 * Retrieves the TDT value from the hardware
1745 ************************************************************************/
1747 ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS)
1749 struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
1756 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
1757 error = sysctl_handle_int(oidp, &val, 0, req);
1758 if (error || !req->newptr)
1762 } /* ixgbe_sysctl_tdt_handler */
1764 /************************************************************************
1765 * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
1767 * Retrieves the RDH value from the hardware
1768 ************************************************************************/
1770 ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS)
1772 struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
1779 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
1780 error = sysctl_handle_int(oidp, &val, 0, req);
1781 if (error || !req->newptr)
1785 } /* ixgbe_sysctl_rdh_handler */
1787 /************************************************************************
1788 * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
1790 * Retrieves the RDT value from the hardware
1791 ************************************************************************/
1793 ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS)
1795 struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
1802 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
1803 error = sysctl_handle_int(oidp, &val, 0, req);
1804 if (error || !req->newptr)
1808 } /* ixgbe_sysctl_rdt_handler */
1810 /************************************************************************
1811 * ixgbe_if_vlan_register
1813 * Run via vlan config EVENT, it enables us to use the
1814 * HW Filter table since we can get the vlan id. This
1815 * just creates the entry in the soft version of the
1816 * VFTA, init will repopulate the real table.
1817 ************************************************************************/
1819 ixgbe_if_vlan_register(if_ctx_t ctx, u16 vtag)
1821 struct adapter *adapter = iflib_get_softc(ctx);
1824 index = (vtag >> 5) & 0x7F;
1826 adapter->shadow_vfta[index] |= (1 << bit);
1827 ++adapter->num_vlans;
1828 ixgbe_setup_vlan_hw_support(ctx);
1829 } /* ixgbe_if_vlan_register */
1831 /************************************************************************
1832 * ixgbe_if_vlan_unregister
1834 * Run via vlan unconfig EVENT, remove our entry in the soft vfta.
1835 ************************************************************************/
1837 ixgbe_if_vlan_unregister(if_ctx_t ctx, u16 vtag)
1839 struct adapter *adapter = iflib_get_softc(ctx);
1842 index = (vtag >> 5) & 0x7F;
1844 adapter->shadow_vfta[index] &= ~(1 << bit);
1845 --adapter->num_vlans;
1846 /* Re-init to load the changes */
1847 ixgbe_setup_vlan_hw_support(ctx);
1848 } /* ixgbe_if_vlan_unregister */
1850 /************************************************************************
1851 * ixgbe_setup_vlan_hw_support
1852 ************************************************************************/
1854 ixgbe_setup_vlan_hw_support(if_ctx_t ctx)
1856 struct ifnet *ifp = iflib_get_ifp(ctx);
1857 struct adapter *adapter = iflib_get_softc(ctx);
1858 struct ixgbe_hw *hw = &adapter->hw;
1859 struct rx_ring *rxr;
1865 * We get here thru init_locked, meaning
1866 * a soft reset, this has already cleared
1867 * the VFTA and other state, so if there
1868 * have been no vlan's registered do nothing.
1870 if (adapter->num_vlans == 0)
1873 /* Setup the queues for vlans */
1874 if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) {
1875 for (i = 0; i < adapter->num_rx_queues; i++) {
1876 rxr = &adapter->rx_queues[i].rxr;
1877 /* On 82599 the VLAN enable is per/queue in RXDCTL */
1878 if (hw->mac.type != ixgbe_mac_82598EB) {
1879 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
1880 ctrl |= IXGBE_RXDCTL_VME;
1881 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
1883 rxr->vtag_strip = TRUE;
1887 if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
1890 * A soft reset zero's out the VFTA, so
1891 * we need to repopulate it now.
1893 for (i = 0; i < IXGBE_VFTA_SIZE; i++)
1894 if (adapter->shadow_vfta[i] != 0)
1895 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
1896 adapter->shadow_vfta[i]);
1898 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
1899 /* Enable the Filter Table if enabled */
1900 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) {
1901 ctrl &= ~IXGBE_VLNCTRL_CFIEN;
1902 ctrl |= IXGBE_VLNCTRL_VFE;
1904 if (hw->mac.type == ixgbe_mac_82598EB)
1905 ctrl |= IXGBE_VLNCTRL_VME;
1906 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
1907 } /* ixgbe_setup_vlan_hw_support */
1909 /************************************************************************
1910 * ixgbe_get_slot_info
1912 * Get the width and transaction speed of
1913 * the slot this adapter is plugged into.
1914 ************************************************************************/
1916 ixgbe_get_slot_info(struct adapter *adapter)
1918 device_t dev = iflib_get_dev(adapter->ctx);
1919 struct ixgbe_hw *hw = &adapter->hw;
1920 int bus_info_valid = TRUE;
1924 /* Some devices are behind an internal bridge */
1925 switch (hw->device_id) {
1926 case IXGBE_DEV_ID_82599_SFP_SF_QP:
1927 case IXGBE_DEV_ID_82599_QSFP_SF_QP:
1928 goto get_parent_info;
1933 ixgbe_get_bus_info(hw);
1936 * Some devices don't use PCI-E, but there is no need
1937 * to display "Unknown" for bus speed and width.
1939 switch (hw->mac.type) {
1940 case ixgbe_mac_X550EM_x:
1941 case ixgbe_mac_X550EM_a:
1949 * For the Quad port adapter we need to parse back
1950 * up the PCI tree to find the speed of the expansion
1951 * slot into which this adapter is plugged. A bit more work.
1953 dev = device_get_parent(device_get_parent(dev));
1955 device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
1956 pci_get_slot(dev), pci_get_function(dev));
1958 dev = device_get_parent(device_get_parent(dev));
1960 device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
1961 pci_get_slot(dev), pci_get_function(dev));
1963 /* Now get the PCI Express Capabilities offset */
1964 if (pci_find_cap(dev, PCIY_EXPRESS, &offset)) {
1966 * Hmm...can't get PCI-Express capabilities.
1967 * Falling back to default method.
1969 bus_info_valid = FALSE;
1970 ixgbe_get_bus_info(hw);
1973 /* ...and read the Link Status Register */
1974 link = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
1975 ixgbe_set_pci_config_data_generic(hw, link);
1978 device_printf(dev, "PCI Express Bus: Speed %s %s\n",
1979 ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s" :
1980 (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s" :
1981 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s" :
1983 ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
1984 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
1985 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
1988 if (bus_info_valid) {
1989 if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
1990 ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
1991 (hw->bus.speed == ixgbe_bus_speed_2500))) {
1992 device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
1993 device_printf(dev, "For optimal performance a x8 PCIE, or x4 PCIE Gen2 slot is required.\n");
1995 if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
1996 ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
1997 (hw->bus.speed < ixgbe_bus_speed_8000))) {
1998 device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
1999 device_printf(dev, "For optimal performance a x8 PCIE Gen3 slot is required.\n");
2002 device_printf(dev, "Unable to determine slot speed/width. The speed/width reported are that of the internal switch.\n");
2005 } /* ixgbe_get_slot_info */
2007 /************************************************************************
2008 * ixgbe_if_msix_intr_assign
2010 * Setup MSI-X Interrupt resources and handlers
2011 ************************************************************************/
2013 ixgbe_if_msix_intr_assign(if_ctx_t ctx, int msix)
2015 struct adapter *adapter = iflib_get_softc(ctx);
2016 struct ix_rx_queue *rx_que = adapter->rx_queues;
2017 struct ix_tx_queue *tx_que;
2018 int error, rid, vector = 0;
2022 /* Admin Que is vector 0*/
2024 for (int i = 0; i < adapter->num_rx_queues; i++, vector++, rx_que++) {
2027 snprintf(buf, sizeof(buf), "rxq%d", i);
2028 error = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
2029 IFLIB_INTR_RX, ixgbe_msix_que, rx_que, rx_que->rxr.me, buf);
2032 device_printf(iflib_get_dev(ctx),
2033 "Failed to allocate que int %d err: %d", i, error);
2034 adapter->num_rx_queues = i + 1;
2038 rx_que->msix = vector;
2039 if (adapter->feat_en & IXGBE_FEATURE_RSS) {
2041 * The queue ID is used as the RSS layer bucket ID.
2042 * We look up the queue ID -> RSS CPU ID and select
2045 cpu_id = rss_getcpu(i % rss_getnumbuckets());
2048 * Bind the MSI-X vector, and thus the
2049 * rings to the corresponding cpu.
2051 * This just happens to match the default RSS
2052 * round-robin bucket -> queue -> CPU allocation.
2054 if (adapter->num_rx_queues > 1)
2059 for (int i = 0; i < adapter->num_tx_queues; i++) {
2060 snprintf(buf, sizeof(buf), "txq%d", i);
2061 tx_que = &adapter->tx_queues[i];
2062 tx_que->msix = i % adapter->num_rx_queues;
2063 iflib_softirq_alloc_generic(ctx,
2064 &adapter->rx_queues[tx_que->msix].que_irq,
2065 IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
2068 error = iflib_irq_alloc_generic(ctx, &adapter->irq, rid,
2069 IFLIB_INTR_ADMIN, ixgbe_msix_link, adapter, 0, "aq");
2071 device_printf(iflib_get_dev(ctx),
2072 "Failed to register admin handler");
2076 adapter->vector = vector;
2080 iflib_irq_free(ctx, &adapter->irq);
2081 rx_que = adapter->rx_queues;
2082 for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++)
2083 iflib_irq_free(ctx, &rx_que->que_irq);
2086 } /* ixgbe_if_msix_intr_assign */
2088 /*********************************************************************
2089 * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
2090 **********************************************************************/
2092 ixgbe_msix_que(void *arg)
2094 struct ix_rx_queue *que = arg;
2095 struct adapter *adapter = que->adapter;
2096 struct ifnet *ifp = iflib_get_ifp(que->adapter->ctx);
2098 /* Protect against spurious interrupts */
2099 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2100 return (FILTER_HANDLED);
2102 ixgbe_disable_queue(adapter, que->msix);
2105 return (FILTER_SCHEDULE_THREAD);
2106 } /* ixgbe_msix_que */
2108 /************************************************************************
2109 * ixgbe_media_status - Media Ioctl callback
2111 * Called whenever the user queries the status of
2112 * the interface using ifconfig.
2113 ************************************************************************/
2115 ixgbe_if_media_status(if_ctx_t ctx, struct ifmediareq * ifmr)
2117 struct adapter *adapter = iflib_get_softc(ctx);
2118 struct ixgbe_hw *hw = &adapter->hw;
2121 INIT_DEBUGOUT("ixgbe_if_media_status: begin");
2123 ifmr->ifm_status = IFM_AVALID;
2124 ifmr->ifm_active = IFM_ETHER;
2126 if (!adapter->link_active)
2129 ifmr->ifm_status |= IFM_ACTIVE;
2130 layer = adapter->phy_layer;
2132 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
2133 layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
2134 layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
2135 layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
2136 switch (adapter->link_speed) {
2137 case IXGBE_LINK_SPEED_10GB_FULL:
2138 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
2140 case IXGBE_LINK_SPEED_1GB_FULL:
2141 ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
2143 case IXGBE_LINK_SPEED_100_FULL:
2144 ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
2146 case IXGBE_LINK_SPEED_10_FULL:
2147 ifmr->ifm_active |= IFM_10_T | IFM_FDX;
2150 if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
2151 layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
2152 switch (adapter->link_speed) {
2153 case IXGBE_LINK_SPEED_10GB_FULL:
2154 ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
2157 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
2158 switch (adapter->link_speed) {
2159 case IXGBE_LINK_SPEED_10GB_FULL:
2160 ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
2162 case IXGBE_LINK_SPEED_1GB_FULL:
2163 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2166 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
2167 switch (adapter->link_speed) {
2168 case IXGBE_LINK_SPEED_10GB_FULL:
2169 ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
2171 case IXGBE_LINK_SPEED_1GB_FULL:
2172 ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
2175 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
2176 layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
2177 switch (adapter->link_speed) {
2178 case IXGBE_LINK_SPEED_10GB_FULL:
2179 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2181 case IXGBE_LINK_SPEED_1GB_FULL:
2182 ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
2185 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
2186 switch (adapter->link_speed) {
2187 case IXGBE_LINK_SPEED_10GB_FULL:
2188 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2192 * XXX: These need to use the proper media types once
2195 #ifndef IFM_ETH_XTYPE
2196 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2197 switch (adapter->link_speed) {
2198 case IXGBE_LINK_SPEED_10GB_FULL:
2199 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
2201 case IXGBE_LINK_SPEED_2_5GB_FULL:
2202 ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2204 case IXGBE_LINK_SPEED_1GB_FULL:
2205 ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2208 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2209 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2210 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2211 switch (adapter->link_speed) {
2212 case IXGBE_LINK_SPEED_10GB_FULL:
2213 ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
2215 case IXGBE_LINK_SPEED_2_5GB_FULL:
2216 ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
2218 case IXGBE_LINK_SPEED_1GB_FULL:
2219 ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
2223 if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
2224 switch (adapter->link_speed) {
2225 case IXGBE_LINK_SPEED_10GB_FULL:
2226 ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
2228 case IXGBE_LINK_SPEED_2_5GB_FULL:
2229 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2231 case IXGBE_LINK_SPEED_1GB_FULL:
2232 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2235 else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
2236 layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
2237 layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
2238 switch (adapter->link_speed) {
2239 case IXGBE_LINK_SPEED_10GB_FULL:
2240 ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
2242 case IXGBE_LINK_SPEED_2_5GB_FULL:
2243 ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
2245 case IXGBE_LINK_SPEED_1GB_FULL:
2246 ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
2251 /* If nothing is recognized... */
2252 if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
2253 ifmr->ifm_active |= IFM_UNKNOWN;
2255 /* Display current flow control setting used on link */
2256 if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
2257 hw->fc.current_mode == ixgbe_fc_full)
2258 ifmr->ifm_active |= IFM_ETH_RXPAUSE;
2259 if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
2260 hw->fc.current_mode == ixgbe_fc_full)
2261 ifmr->ifm_active |= IFM_ETH_TXPAUSE;
2262 } /* ixgbe_media_status */
2264 /************************************************************************
2265 * ixgbe_media_change - Media Ioctl callback
2267 * Called when the user changes speed/duplex using
2268 * media/mediopt option with ifconfig.
2269 ************************************************************************/
2271 ixgbe_if_media_change(if_ctx_t ctx)
2273 struct adapter *adapter = iflib_get_softc(ctx);
2274 struct ifmedia *ifm = iflib_get_media(ctx);
2275 struct ixgbe_hw *hw = &adapter->hw;
2276 ixgbe_link_speed speed = 0;
2278 INIT_DEBUGOUT("ixgbe_if_media_change: begin");
2280 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
2283 if (hw->phy.media_type == ixgbe_media_type_backplane)
2287 * We don't actually need to check against the supported
2288 * media types of the adapter; ifmedia will take care of
2291 switch (IFM_SUBTYPE(ifm->ifm_media)) {
2294 speed |= IXGBE_LINK_SPEED_100_FULL;
2295 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2296 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2300 #ifndef IFM_ETH_XTYPE
2301 case IFM_10G_SR: /* KR, too */
2302 case IFM_10G_CX4: /* KX4 */
2307 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2308 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2310 #ifndef IFM_ETH_XTYPE
2311 case IFM_1000_CX: /* KX */
2317 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2320 speed |= IXGBE_LINK_SPEED_100_FULL;
2321 speed |= IXGBE_LINK_SPEED_1GB_FULL;
2323 case IFM_10G_TWINAX:
2324 speed |= IXGBE_LINK_SPEED_10GB_FULL;
2327 speed |= IXGBE_LINK_SPEED_100_FULL;
2330 speed |= IXGBE_LINK_SPEED_10_FULL;
2336 hw->mac.autotry_restart = TRUE;
2337 hw->mac.ops.setup_link(hw, speed, TRUE);
2338 adapter->advertise =
2339 ((speed & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) |
2340 ((speed & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) |
2341 ((speed & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) |
2342 ((speed & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0);
2347 device_printf(iflib_get_dev(ctx), "Invalid media type!\n");
2350 } /* ixgbe_if_media_change */
2352 /************************************************************************
2354 ************************************************************************/
2356 ixgbe_if_promisc_set(if_ctx_t ctx, int flags)
2358 struct adapter *adapter = iflib_get_softc(ctx);
2359 struct ifnet *ifp = iflib_get_ifp(ctx);
2363 rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
2364 rctl &= (~IXGBE_FCTRL_UPE);
2365 if (ifp->if_flags & IFF_ALLMULTI)
2366 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
2368 mcnt = min(if_llmaddr_count(ifp), MAX_NUM_MULTICAST_ADDRESSES);
2370 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
2371 rctl &= (~IXGBE_FCTRL_MPE);
2372 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2374 if (ifp->if_flags & IFF_PROMISC) {
2375 rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
2376 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2377 } else if (ifp->if_flags & IFF_ALLMULTI) {
2378 rctl |= IXGBE_FCTRL_MPE;
2379 rctl &= ~IXGBE_FCTRL_UPE;
2380 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
2383 } /* ixgbe_if_promisc_set */
2385 /************************************************************************
2386 * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
2387 ************************************************************************/
2389 ixgbe_msix_link(void *arg)
2391 struct adapter *adapter = arg;
2392 struct ixgbe_hw *hw = &adapter->hw;
2393 u32 eicr, eicr_mask;
2396 ++adapter->link_irq;
2398 /* Pause other interrupts */
2399 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
2401 /* First get the cause */
2402 eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
2403 /* Be sure the queue bits are not cleared */
2404 eicr &= ~IXGBE_EICR_RTX_QUEUE;
2405 /* Clear interrupt with write */
2406 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
2408 /* Link status change */
2409 if (eicr & IXGBE_EICR_LSC) {
2410 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
2411 adapter->task_requests |= IXGBE_REQUEST_TASK_LSC;
2414 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
2415 if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
2416 (eicr & IXGBE_EICR_FLOW_DIR)) {
2417 /* This is probably overkill :) */
2418 if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
2419 return (FILTER_HANDLED);
2420 /* Disable the interrupt */
2421 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
2422 adapter->task_requests |= IXGBE_REQUEST_TASK_FDIR;
2424 if (eicr & IXGBE_EICR_ECC) {
2425 device_printf(iflib_get_dev(adapter->ctx),
2426 "\nCRITICAL: ECC ERROR!! Please Reboot!!\n");
2427 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
2430 /* Check for over temp condition */
2431 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
2432 switch (adapter->hw.mac.type) {
2433 case ixgbe_mac_X550EM_a:
2434 if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
2436 IXGBE_WRITE_REG(hw, IXGBE_EIMC,
2437 IXGBE_EICR_GPI_SDP0_X550EM_a);
2438 IXGBE_WRITE_REG(hw, IXGBE_EICR,
2439 IXGBE_EICR_GPI_SDP0_X550EM_a);
2440 retval = hw->phy.ops.check_overtemp(hw);
2441 if (retval != IXGBE_ERR_OVERTEMP)
2443 device_printf(iflib_get_dev(adapter->ctx),
2444 "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2445 device_printf(iflib_get_dev(adapter->ctx),
2446 "System shutdown required!\n");
2449 if (!(eicr & IXGBE_EICR_TS))
2451 retval = hw->phy.ops.check_overtemp(hw);
2452 if (retval != IXGBE_ERR_OVERTEMP)
2454 device_printf(iflib_get_dev(adapter->ctx),
2455 "\nCRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
2456 device_printf(iflib_get_dev(adapter->ctx),
2457 "System shutdown required!\n");
2458 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
2463 /* Check for VF message */
2464 if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
2465 (eicr & IXGBE_EICR_MAILBOX))
2466 adapter->task_requests |= IXGBE_REQUEST_TASK_MBX;
2469 if (ixgbe_is_sfp(hw)) {
2470 /* Pluggable optics-related interrupt */
2471 if (hw->mac.type >= ixgbe_mac_X540)
2472 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
2474 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
2476 if (eicr & eicr_mask) {
2477 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
2478 adapter->task_requests |= IXGBE_REQUEST_TASK_MOD;
2481 if ((hw->mac.type == ixgbe_mac_82599EB) &&
2482 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
2483 IXGBE_WRITE_REG(hw, IXGBE_EICR,
2484 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2485 adapter->task_requests |= IXGBE_REQUEST_TASK_MSF;
2489 /* Check for fan failure */
2490 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
2491 ixgbe_check_fan_failure(adapter, eicr, TRUE);
2492 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
2495 /* External PHY interrupt */
2496 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
2497 (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
2498 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
2499 adapter->task_requests |= IXGBE_REQUEST_TASK_PHY;
2502 return (adapter->task_requests != 0) ? FILTER_SCHEDULE_THREAD : FILTER_HANDLED;
2503 } /* ixgbe_msix_link */
2505 /************************************************************************
2506 * ixgbe_sysctl_interrupt_rate_handler
2507 ************************************************************************/
2509 ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
2511 struct ix_rx_queue *que = ((struct ix_rx_queue *)oidp->oid_arg1);
2513 unsigned int reg, usec, rate;
2515 reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
2516 usec = ((reg & 0x0FF8) >> 3);
2518 rate = 500000 / usec;
2521 error = sysctl_handle_int(oidp, &rate, 0, req);
2522 if (error || !req->newptr)
2524 reg &= ~0xfff; /* default, no limitation */
2525 ixgbe_max_interrupt_rate = 0;
2526 if (rate > 0 && rate < 500000) {
2529 ixgbe_max_interrupt_rate = rate;
2530 reg |= ((4000000/rate) & 0xff8);
2532 IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
2535 } /* ixgbe_sysctl_interrupt_rate_handler */
2537 /************************************************************************
2538 * ixgbe_add_device_sysctls
2539 ************************************************************************/
2541 ixgbe_add_device_sysctls(if_ctx_t ctx)
2543 struct adapter *adapter = iflib_get_softc(ctx);
2544 device_t dev = iflib_get_dev(ctx);
2545 struct ixgbe_hw *hw = &adapter->hw;
2546 struct sysctl_oid_list *child;
2547 struct sysctl_ctx_list *ctx_list;
2549 ctx_list = device_get_sysctl_ctx(dev);
2550 child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
2552 /* Sysctls for all devices */
2553 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "fc",
2554 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2555 adapter, 0, ixgbe_sysctl_flowcntl, "I",
2556 IXGBE_SYSCTL_DESC_SET_FC);
2558 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "advertise_speed",
2559 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2560 adapter, 0, ixgbe_sysctl_advertise, "I",
2561 IXGBE_SYSCTL_DESC_ADV_SPEED);
2564 /* testing sysctls (for all devices) */
2565 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "power_state",
2566 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2567 adapter, 0, ixgbe_sysctl_power_state,
2568 "I", "PCI Power State");
2570 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "print_rss_config",
2571 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, adapter, 0,
2572 ixgbe_sysctl_print_rss_config, "A", "Prints RSS Configuration");
2574 /* for X550 series devices */
2575 if (hw->mac.type >= ixgbe_mac_X550)
2576 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "dmac",
2577 CTLTYPE_U16 | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2578 adapter, 0, ixgbe_sysctl_dmac,
2579 "I", "DMA Coalesce");
2581 /* for WoL-capable devices */
2582 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2583 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wol_enable",
2584 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0,
2585 ixgbe_sysctl_wol_enable, "I", "Enable/Disable Wake on LAN");
2587 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "wufc",
2588 CTLTYPE_U32 | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
2589 adapter, 0, ixgbe_sysctl_wufc,
2590 "I", "Enable/Disable Wake Up Filters");
2593 /* for X552/X557-AT devices */
2594 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
2595 struct sysctl_oid *phy_node;
2596 struct sysctl_oid_list *phy_list;
2598 phy_node = SYSCTL_ADD_NODE(ctx_list, child, OID_AUTO, "phy",
2599 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "External PHY sysctls");
2600 phy_list = SYSCTL_CHILDREN(phy_node);
2602 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO, "temp",
2603 CTLTYPE_U16 | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
2604 adapter, 0, ixgbe_sysctl_phy_temp,
2605 "I", "Current External PHY Temperature (Celsius)");
2607 SYSCTL_ADD_PROC(ctx_list, phy_list, OID_AUTO,
2608 "overtemp_occurred",
2609 CTLTYPE_U16 | CTLFLAG_RD | CTLFLAG_NEEDGIANT, adapter, 0,
2610 ixgbe_sysctl_phy_overtemp_occurred, "I",
2611 "External PHY High Temperature Event Occurred");
2614 if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
2615 SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "eee_state",
2616 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0,
2617 ixgbe_sysctl_eee_state, "I", "EEE Power Save State");
2619 } /* ixgbe_add_device_sysctls */
2621 /************************************************************************
2622 * ixgbe_allocate_pci_resources
2623 ************************************************************************/
2625 ixgbe_allocate_pci_resources(if_ctx_t ctx)
2627 struct adapter *adapter = iflib_get_softc(ctx);
2628 device_t dev = iflib_get_dev(ctx);
2632 adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
2635 if (!(adapter->pci_mem)) {
2636 device_printf(dev, "Unable to allocate bus resource: memory\n");
2640 /* Save bus_space values for READ/WRITE_REG macros */
2641 adapter->osdep.mem_bus_space_tag = rman_get_bustag(adapter->pci_mem);
2642 adapter->osdep.mem_bus_space_handle =
2643 rman_get_bushandle(adapter->pci_mem);
2644 /* Set hw values for shared code */
2645 adapter->hw.hw_addr = (u8 *)&adapter->osdep.mem_bus_space_handle;
2648 } /* ixgbe_allocate_pci_resources */
2650 /************************************************************************
2651 * ixgbe_detach - Device removal routine
2653 * Called when the driver is being removed.
2654 * Stops the adapter and deallocates all the resources
2655 * that were allocated for driver operation.
2657 * return 0 on success, positive on failure
2658 ************************************************************************/
2660 ixgbe_if_detach(if_ctx_t ctx)
2662 struct adapter *adapter = iflib_get_softc(ctx);
2663 device_t dev = iflib_get_dev(ctx);
2666 INIT_DEBUGOUT("ixgbe_detach: begin");
2668 if (ixgbe_pci_iov_detach(dev) != 0) {
2669 device_printf(dev, "SR-IOV in use; detach first.\n");
2673 ixgbe_setup_low_power_mode(ctx);
2675 /* let hardware know driver is unloading */
2676 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
2677 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
2678 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
2680 ixgbe_free_pci_resources(ctx);
2681 free(adapter->mta, M_IXGBE);
2684 } /* ixgbe_if_detach */
2686 /************************************************************************
2687 * ixgbe_setup_low_power_mode - LPLU/WoL preparation
2689 * Prepare the adapter/port for LPLU and/or WoL
2690 ************************************************************************/
2692 ixgbe_setup_low_power_mode(if_ctx_t ctx)
2694 struct adapter *adapter = iflib_get_softc(ctx);
2695 struct ixgbe_hw *hw = &adapter->hw;
2696 device_t dev = iflib_get_dev(ctx);
2699 if (!hw->wol_enabled)
2700 ixgbe_set_phy_power(hw, FALSE);
2702 /* Limit power management flow to X550EM baseT */
2703 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
2704 hw->phy.ops.enter_lplu) {
2705 /* Turn off support for APM wakeup. (Using ACPI instead) */
2706 IXGBE_WRITE_REG(hw, IXGBE_GRC,
2707 IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
2710 * Clear Wake Up Status register to prevent any previous wakeup
2711 * events from waking us up immediately after we suspend.
2713 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2716 * Program the Wakeup Filter Control register with user filter
2719 IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
2721 /* Enable wakeups and power management in Wakeup Control */
2722 IXGBE_WRITE_REG(hw, IXGBE_WUC,
2723 IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
2725 /* X550EM baseT adapters need a special LPLU flow */
2726 hw->phy.reset_disable = TRUE;
2728 error = hw->phy.ops.enter_lplu(hw);
2730 device_printf(dev, "Error entering LPLU: %d\n", error);
2731 hw->phy.reset_disable = FALSE;
2733 /* Just stop for other adapters */
2738 } /* ixgbe_setup_low_power_mode */
2740 /************************************************************************
2741 * ixgbe_shutdown - Shutdown entry point
2742 ************************************************************************/
2744 ixgbe_if_shutdown(if_ctx_t ctx)
2748 INIT_DEBUGOUT("ixgbe_shutdown: begin");
2750 error = ixgbe_setup_low_power_mode(ctx);
2753 } /* ixgbe_if_shutdown */
2755 /************************************************************************
2759 ************************************************************************/
2761 ixgbe_if_suspend(if_ctx_t ctx)
2765 INIT_DEBUGOUT("ixgbe_suspend: begin");
2767 error = ixgbe_setup_low_power_mode(ctx);
2770 } /* ixgbe_if_suspend */
2772 /************************************************************************
2776 ************************************************************************/
2778 ixgbe_if_resume(if_ctx_t ctx)
2780 struct adapter *adapter = iflib_get_softc(ctx);
2781 device_t dev = iflib_get_dev(ctx);
2782 struct ifnet *ifp = iflib_get_ifp(ctx);
2783 struct ixgbe_hw *hw = &adapter->hw;
2786 INIT_DEBUGOUT("ixgbe_resume: begin");
2788 /* Read & clear WUS register */
2789 wus = IXGBE_READ_REG(hw, IXGBE_WUS);
2791 device_printf(dev, "Woken up by (WUS): %#010x\n",
2792 IXGBE_READ_REG(hw, IXGBE_WUS));
2793 IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
2794 /* And clear WUFC until next low-power transition */
2795 IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
2798 * Required after D3->D0 transition;
2799 * will re-advertise all previous advertised speeds
2801 if (ifp->if_flags & IFF_UP)
2805 } /* ixgbe_if_resume */
2807 /************************************************************************
2808 * ixgbe_if_mtu_set - Ioctl mtu entry point
2810 * Return 0 on success, EINVAL on failure
2811 ************************************************************************/
2813 ixgbe_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
2815 struct adapter *adapter = iflib_get_softc(ctx);
2818 IOCTL_DEBUGOUT("ioctl: SIOCIFMTU (Set Interface MTU)");
2820 if (mtu > IXGBE_MAX_MTU) {
2823 adapter->max_frame_size = mtu + IXGBE_MTU_HDR;
2827 } /* ixgbe_if_mtu_set */
2829 /************************************************************************
2830 * ixgbe_if_crcstrip_set
2831 ************************************************************************/
2833 ixgbe_if_crcstrip_set(if_ctx_t ctx, int onoff, int crcstrip)
2835 struct adapter *sc = iflib_get_softc(ctx);
2836 struct ixgbe_hw *hw = &sc->hw;
2837 /* crc stripping is set in two places:
2838 * IXGBE_HLREG0 (modified on init_locked and hw reset)
2839 * IXGBE_RDRXCTL (set by the original driver in
2840 * ixgbe_setup_hw_rsc() called in init_locked.
2841 * We disable the setting when netmap is compiled in).
2842 * We update the values here, but also in ixgbe.c because
2843 * init_locked sometimes is called outside our control.
2847 hl = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2848 rxc = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2851 D("%s read HLREG 0x%x rxc 0x%x",
2852 onoff ? "enter" : "exit", hl, rxc);
2854 /* hw requirements ... */
2855 rxc &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
2856 rxc |= IXGBE_RDRXCTL_RSCACKC;
2857 if (onoff && !crcstrip) {
2858 /* keep the crc. Fast rx */
2859 hl &= ~IXGBE_HLREG0_RXCRCSTRP;
2860 rxc &= ~IXGBE_RDRXCTL_CRCSTRIP;
2862 /* reset default mode */
2863 hl |= IXGBE_HLREG0_RXCRCSTRP;
2864 rxc |= IXGBE_RDRXCTL_CRCSTRIP;
2868 D("%s write HLREG 0x%x rxc 0x%x",
2869 onoff ? "enter" : "exit", hl, rxc);
2871 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hl);
2872 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rxc);
2873 } /* ixgbe_if_crcstrip_set */
2875 /*********************************************************************
2876 * ixgbe_if_init - Init entry point
2878 * Used in two ways: It is used by the stack as an init
2879 * entry point in network interface structure. It is also
2880 * used by the driver as a hw/sw initialization routine to
2881 * get to a consistent state.
2883 * Return 0 on success, positive on failure
2884 **********************************************************************/
2886 ixgbe_if_init(if_ctx_t ctx)
2888 struct adapter *adapter = iflib_get_softc(ctx);
2889 struct ifnet *ifp = iflib_get_ifp(ctx);
2890 device_t dev = iflib_get_dev(ctx);
2891 struct ixgbe_hw *hw = &adapter->hw;
2892 struct ix_rx_queue *rx_que;
2893 struct ix_tx_queue *tx_que;
2900 INIT_DEBUGOUT("ixgbe_if_init: begin");
2902 /* Queue indices may change with IOV mode */
2903 ixgbe_align_all_queue_indices(adapter);
2905 /* reprogram the RAR[0] in case user changed it. */
2906 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
2908 /* Get the latest mac address, User can use a LAA */
2909 bcopy(IF_LLADDR(ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
2910 ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
2911 hw->addr_ctrl.rar_used_count = 1;
2915 ixgbe_initialize_iov(adapter);
2917 ixgbe_initialize_transmit_units(ctx);
2919 /* Setup Multicast table */
2920 ixgbe_if_multi_set(ctx);
2922 /* Determine the correct mbuf pool, based on frame size */
2923 adapter->rx_mbuf_sz = iflib_get_rx_mbuf_sz(ctx);
2925 /* Configure RX settings */
2926 ixgbe_initialize_receive_units(ctx);
2929 * Initialize variable holding task enqueue requests
2930 * from MSI-X interrupts
2932 adapter->task_requests = 0;
2934 /* Enable SDP & MSI-X interrupts based on adapter */
2935 ixgbe_config_gpie(adapter);
2938 if (ifp->if_mtu > ETHERMTU) {
2939 /* aka IXGBE_MAXFRS on 82599 and newer */
2940 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
2941 mhadd &= ~IXGBE_MHADD_MFS_MASK;
2942 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
2943 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
2946 /* Now enable all the queues */
2947 for (i = 0, tx_que = adapter->tx_queues; i < adapter->num_tx_queues; i++, tx_que++) {
2948 struct tx_ring *txr = &tx_que->txr;
2950 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
2951 txdctl |= IXGBE_TXDCTL_ENABLE;
2952 /* Set WTHRESH to 8, burst writeback */
2953 txdctl |= (8 << 16);
2955 * When the internal queue falls below PTHRESH (32),
2956 * start prefetching as long as there are at least
2957 * HTHRESH (1) buffers ready. The values are taken
2958 * from the Intel linux driver 3.8.21.
2959 * Prefetching enables tx line rate even with 1 queue.
2961 txdctl |= (32 << 0) | (1 << 8);
2962 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
2965 for (i = 0, rx_que = adapter->rx_queues; i < adapter->num_rx_queues; i++, rx_que++) {
2966 struct rx_ring *rxr = &rx_que->rxr;
2968 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
2969 if (hw->mac.type == ixgbe_mac_82598EB) {
2975 rxdctl &= ~0x3FFFFF;
2978 rxdctl |= IXGBE_RXDCTL_ENABLE;
2979 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
2980 for (j = 0; j < 10; j++) {
2981 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
2982 IXGBE_RXDCTL_ENABLE)
2990 /* Enable Receive engine */
2991 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
2992 if (hw->mac.type == ixgbe_mac_82598EB)
2993 rxctrl |= IXGBE_RXCTRL_DMBYPS;
2994 rxctrl |= IXGBE_RXCTRL_RXEN;
2995 ixgbe_enable_rx_dma(hw, rxctrl);
2997 /* Set up MSI/MSI-X routing */
2998 if (ixgbe_enable_msix) {
2999 ixgbe_configure_ivars(adapter);
3000 /* Set up auto-mask */
3001 if (hw->mac.type == ixgbe_mac_82598EB)
3002 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
3004 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
3005 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
3007 } else { /* Simple settings for Legacy/MSI */
3008 ixgbe_set_ivar(adapter, 0, 0, 0);
3009 ixgbe_set_ivar(adapter, 0, 0, 1);
3010 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
3013 ixgbe_init_fdir(adapter);
3016 * Check on any SFP devices that
3017 * need to be kick-started
3019 if (hw->phy.type == ixgbe_phy_none) {
3020 err = hw->phy.ops.identify(hw);
3021 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3023 "Unsupported SFP+ module type was detected.\n");
3028 /* Set moderation on the Link interrupt */
3029 IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->vector), IXGBE_LINK_ITR);
3031 /* Enable power to the phy. */
3032 ixgbe_set_phy_power(hw, TRUE);
3034 /* Config/Enable Link */
3035 ixgbe_config_link(ctx);
3037 /* Hardware Packet Buffer & Flow Control setup */
3038 ixgbe_config_delay_values(adapter);
3040 /* Initialize the FC settings */
3043 /* Set up VLAN support and filter */
3044 ixgbe_setup_vlan_hw_support(ctx);
3046 /* Setup DMA Coalescing */
3047 ixgbe_config_dmac(adapter);
3049 /* And now turn on interrupts */
3050 ixgbe_if_enable_intr(ctx);
3052 /* Enable the use of the MBX by the VF's */
3053 if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
3054 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
3055 ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
3056 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
3059 } /* ixgbe_init_locked */
3061 /************************************************************************
3064 * Setup the correct IVAR register for a particular MSI-X interrupt
3065 * (yes this is all very magic and confusing :)
3066 * - entry is the register array entry
3067 * - vector is the MSI-X vector for this queue
3068 * - type is RX/TX/MISC
3069 ************************************************************************/
3071 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
3073 struct ixgbe_hw *hw = &adapter->hw;
3076 vector |= IXGBE_IVAR_ALLOC_VAL;
3078 switch (hw->mac.type) {
3079 case ixgbe_mac_82598EB:
3081 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
3083 entry += (type * 64);
3084 index = (entry >> 2) & 0x1F;
3085 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
3086 ivar &= ~(0xFF << (8 * (entry & 0x3)));
3087 ivar |= (vector << (8 * (entry & 0x3)));
3088 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
3090 case ixgbe_mac_82599EB:
3091 case ixgbe_mac_X540:
3092 case ixgbe_mac_X550:
3093 case ixgbe_mac_X550EM_x:
3094 case ixgbe_mac_X550EM_a:
3095 if (type == -1) { /* MISC IVAR */
3096 index = (entry & 1) * 8;
3097 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
3098 ivar &= ~(0xFF << index);
3099 ivar |= (vector << index);
3100 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
3101 } else { /* RX/TX IVARS */
3102 index = (16 * (entry & 1)) + (8 * type);
3103 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
3104 ivar &= ~(0xFF << index);
3105 ivar |= (vector << index);
3106 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
3111 } /* ixgbe_set_ivar */
3113 /************************************************************************
3114 * ixgbe_configure_ivars
3115 ************************************************************************/
3117 ixgbe_configure_ivars(struct adapter *adapter)
3119 struct ix_rx_queue *rx_que = adapter->rx_queues;
3120 struct ix_tx_queue *tx_que = adapter->tx_queues;
3123 if (ixgbe_max_interrupt_rate > 0)
3124 newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
3127 * Disable DMA coalescing if interrupt moderation is
3134 for (int i = 0; i < adapter->num_rx_queues; i++, rx_que++) {
3135 struct rx_ring *rxr = &rx_que->rxr;
3137 /* First the RX queue entry */
3138 ixgbe_set_ivar(adapter, rxr->me, rx_que->msix, 0);
3140 /* Set an Initial EITR value */
3141 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(rx_que->msix), newitr);
3143 for (int i = 0; i < adapter->num_tx_queues; i++, tx_que++) {
3144 struct tx_ring *txr = &tx_que->txr;
3146 /* ... and the TX */
3147 ixgbe_set_ivar(adapter, txr->me, tx_que->msix, 1);
3149 /* For the Link interrupt */
3150 ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
3151 } /* ixgbe_configure_ivars */
3153 /************************************************************************
3155 ************************************************************************/
3157 ixgbe_config_gpie(struct adapter *adapter)
3159 struct ixgbe_hw *hw = &adapter->hw;
3162 gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
3164 if (adapter->intr_type == IFLIB_INTR_MSIX) {
3165 /* Enable Enhanced MSI-X mode */
3166 gpie |= IXGBE_GPIE_MSIX_MODE
3168 | IXGBE_GPIE_PBA_SUPPORT
3172 /* Fan Failure Interrupt */
3173 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3174 gpie |= IXGBE_SDP1_GPIEN;
3176 /* Thermal Sensor Interrupt */
3177 if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
3178 gpie |= IXGBE_SDP0_GPIEN_X540;
3180 /* Link detection */
3181 switch (hw->mac.type) {
3182 case ixgbe_mac_82599EB:
3183 gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
3185 case ixgbe_mac_X550EM_x:
3186 case ixgbe_mac_X550EM_a:
3187 gpie |= IXGBE_SDP0_GPIEN_X540;
3193 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
3195 } /* ixgbe_config_gpie */
3197 /************************************************************************
3198 * ixgbe_config_delay_values
3200 * Requires adapter->max_frame_size to be set.
3201 ************************************************************************/
3203 ixgbe_config_delay_values(struct adapter *adapter)
3205 struct ixgbe_hw *hw = &adapter->hw;
3206 u32 rxpb, frame, size, tmp;
3208 frame = adapter->max_frame_size;
3210 /* Calculate High Water */
3211 switch (hw->mac.type) {
3212 case ixgbe_mac_X540:
3213 case ixgbe_mac_X550:
3214 case ixgbe_mac_X550EM_x:
3215 case ixgbe_mac_X550EM_a:
3216 tmp = IXGBE_DV_X540(frame, frame);
3219 tmp = IXGBE_DV(frame, frame);
3222 size = IXGBE_BT2KB(tmp);
3223 rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
3224 hw->fc.high_water[0] = rxpb - size;
3226 /* Now calculate Low Water */
3227 switch (hw->mac.type) {
3228 case ixgbe_mac_X540:
3229 case ixgbe_mac_X550:
3230 case ixgbe_mac_X550EM_x:
3231 case ixgbe_mac_X550EM_a:
3232 tmp = IXGBE_LOW_DV_X540(frame);
3235 tmp = IXGBE_LOW_DV(frame);
3238 hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
3240 hw->fc.pause_time = IXGBE_FC_PAUSE;
3241 hw->fc.send_xon = TRUE;
3242 } /* ixgbe_config_delay_values */
3244 /************************************************************************
3245 * ixgbe_set_multi - Multicast Update
3247 * Called whenever multicast address list is updated.
3248 ************************************************************************/
3250 ixgbe_mc_filter_apply(void *arg, struct sockaddr_dl *sdl, u_int count)
3252 struct adapter *adapter = arg;
3253 struct ixgbe_mc_addr *mta = adapter->mta;
3255 if (count == MAX_NUM_MULTICAST_ADDRESSES)
3257 bcopy(LLADDR(sdl), mta[count].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
3258 mta[count].vmdq = adapter->pool;
3261 } /* ixgbe_mc_filter_apply */
3264 ixgbe_if_multi_set(if_ctx_t ctx)
3266 struct adapter *adapter = iflib_get_softc(ctx);
3267 struct ixgbe_mc_addr *mta;
3268 struct ifnet *ifp = iflib_get_ifp(ctx);
3273 IOCTL_DEBUGOUT("ixgbe_if_multi_set: begin");
3276 bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
3278 mcnt = if_foreach_llmaddr(iflib_get_ifp(ctx), ixgbe_mc_filter_apply,
3281 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
3282 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3283 if (ifp->if_flags & IFF_PROMISC)
3284 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3285 else if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES ||
3286 ifp->if_flags & IFF_ALLMULTI) {
3287 fctrl |= IXGBE_FCTRL_MPE;
3288 fctrl &= ~IXGBE_FCTRL_UPE;
3290 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
3292 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
3294 if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
3295 update_ptr = (u8 *)mta;
3296 ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
3297 ixgbe_mc_array_itr, TRUE);
3300 } /* ixgbe_if_multi_set */
3302 /************************************************************************
3303 * ixgbe_mc_array_itr
3305 * An iterator function needed by the multicast shared code.
3306 * It feeds the shared code routine the addresses in the
3307 * array of ixgbe_set_multi() one by one.
3308 ************************************************************************/
3310 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
3312 struct ixgbe_mc_addr *mta;
3314 mta = (struct ixgbe_mc_addr *)*update_ptr;
3317 *update_ptr = (u8*)(mta + 1);
3320 } /* ixgbe_mc_array_itr */
3322 /************************************************************************
3323 * ixgbe_local_timer - Timer routine
3325 * Checks for link status, updates statistics,
3326 * and runs the watchdog check.
3327 ************************************************************************/
3329 ixgbe_if_timer(if_ctx_t ctx, uint16_t qid)
3331 struct adapter *adapter = iflib_get_softc(ctx);
3336 /* Check for pluggable optics */
3337 if (adapter->sfp_probe)
3338 if (!ixgbe_sfp_probe(ctx))
3339 return; /* Nothing to do */
3341 ixgbe_check_link(&adapter->hw, &adapter->link_speed,
3342 &adapter->link_up, 0);
3344 /* Fire off the adminq task */
3345 iflib_admin_intr_deferred(ctx);
3347 } /* ixgbe_if_timer */
3349 /************************************************************************
3352 * Determine if a port had optics inserted.
3353 ************************************************************************/
3355 ixgbe_sfp_probe(if_ctx_t ctx)
3357 struct adapter *adapter = iflib_get_softc(ctx);
3358 struct ixgbe_hw *hw = &adapter->hw;
3359 device_t dev = iflib_get_dev(ctx);
3360 bool result = FALSE;
3362 if ((hw->phy.type == ixgbe_phy_nl) &&
3363 (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
3364 s32 ret = hw->phy.ops.identify_sfp(hw);
3367 ret = hw->phy.ops.reset(hw);
3368 adapter->sfp_probe = FALSE;
3369 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3370 device_printf(dev, "Unsupported SFP+ module detected!");
3372 "Reload driver with supported module.\n");
3375 device_printf(dev, "SFP+ module detected!\n");
3376 /* We now have supported optics */
3382 } /* ixgbe_sfp_probe */
3384 /************************************************************************
3385 * ixgbe_handle_mod - Tasklet for SFP module interrupts
3386 ************************************************************************/
3388 ixgbe_handle_mod(void *context)
3390 if_ctx_t ctx = context;
3391 struct adapter *adapter = iflib_get_softc(ctx);
3392 struct ixgbe_hw *hw = &adapter->hw;
3393 device_t dev = iflib_get_dev(ctx);
3394 u32 err, cage_full = 0;
3396 if (adapter->hw.need_crosstalk_fix) {
3397 switch (hw->mac.type) {
3398 case ixgbe_mac_82599EB:
3399 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3402 case ixgbe_mac_X550EM_x:
3403 case ixgbe_mac_X550EM_a:
3404 cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
3412 goto handle_mod_out;
3415 err = hw->phy.ops.identify_sfp(hw);
3416 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3418 "Unsupported SFP+ module type was detected.\n");
3419 goto handle_mod_out;
3422 if (hw->mac.type == ixgbe_mac_82598EB)
3423 err = hw->phy.ops.reset(hw);
3425 err = hw->mac.ops.setup_sfp(hw);
3427 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
3429 "Setup failure - unsupported SFP+ module type.\n");
3430 goto handle_mod_out;
3432 adapter->task_requests |= IXGBE_REQUEST_TASK_MSF;
3436 adapter->task_requests &= ~(IXGBE_REQUEST_TASK_MSF);
3437 } /* ixgbe_handle_mod */
3440 /************************************************************************
3441 * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
3442 ************************************************************************/
3444 ixgbe_handle_msf(void *context)
3446 if_ctx_t ctx = context;
3447 struct adapter *adapter = iflib_get_softc(ctx);
3448 struct ixgbe_hw *hw = &adapter->hw;
3452 /* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
3453 adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
3455 autoneg = hw->phy.autoneg_advertised;
3456 if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
3457 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
3458 if (hw->mac.ops.setup_link)
3459 hw->mac.ops.setup_link(hw, autoneg, TRUE);
3461 /* Adjust media types shown in ifconfig */
3462 ifmedia_removeall(adapter->media);
3463 ixgbe_add_media_types(adapter->ctx);
3464 ifmedia_set(adapter->media, IFM_ETHER | IFM_AUTO);
3465 } /* ixgbe_handle_msf */
3467 /************************************************************************
3468 * ixgbe_handle_phy - Tasklet for external PHY interrupts
3469 ************************************************************************/
3471 ixgbe_handle_phy(void *context)
3473 if_ctx_t ctx = context;
3474 struct adapter *adapter = iflib_get_softc(ctx);
3475 struct ixgbe_hw *hw = &adapter->hw;
3478 error = hw->phy.ops.handle_lasi(hw);
3479 if (error == IXGBE_ERR_OVERTEMP)
3480 device_printf(adapter->dev, "CRITICAL: EXTERNAL PHY OVER TEMP!! PHY will downshift to lower power state!\n");
3482 device_printf(adapter->dev,
3483 "Error handling LASI interrupt: %d\n", error);
3484 } /* ixgbe_handle_phy */
3486 /************************************************************************
3487 * ixgbe_if_stop - Stop the hardware
3489 * Disables all traffic on the adapter by issuing a
3490 * global reset on the MAC and deallocates TX/RX buffers.
3491 ************************************************************************/
3493 ixgbe_if_stop(if_ctx_t ctx)
3495 struct adapter *adapter = iflib_get_softc(ctx);
3496 struct ixgbe_hw *hw = &adapter->hw;
3498 INIT_DEBUGOUT("ixgbe_if_stop: begin\n");
3501 hw->adapter_stopped = FALSE;
3502 ixgbe_stop_adapter(hw);
3503 if (hw->mac.type == ixgbe_mac_82599EB)
3504 ixgbe_stop_mac_link_on_d3_82599(hw);
3505 /* Turn off the laser - noop with no optics */
3506 ixgbe_disable_tx_laser(hw);
3508 /* Update the stack */
3509 adapter->link_up = FALSE;
3510 ixgbe_if_update_admin_status(ctx);
3512 /* reprogram the RAR[0] in case user changed it. */
3513 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
3516 } /* ixgbe_if_stop */
3518 /************************************************************************
3519 * ixgbe_update_link_status - Update OS on link state
3521 * Note: Only updates the OS on the cached link state.
3522 * The real check of the hardware only happens with
3524 ************************************************************************/
3526 ixgbe_if_update_admin_status(if_ctx_t ctx)
3528 struct adapter *adapter = iflib_get_softc(ctx);
3529 device_t dev = iflib_get_dev(ctx);
3531 if (adapter->link_up) {
3532 if (adapter->link_active == FALSE) {
3534 device_printf(dev, "Link is up %d Gbps %s \n",
3535 ((adapter->link_speed == 128) ? 10 : 1),
3537 adapter->link_active = TRUE;
3538 /* Update any Flow Control changes */
3539 ixgbe_fc_enable(&adapter->hw);
3540 /* Update DMA coalescing config */
3541 ixgbe_config_dmac(adapter);
3542 /* should actually be negotiated value */
3543 iflib_link_state_change(ctx, LINK_STATE_UP, IF_Gbps(10));
3545 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3546 ixgbe_ping_all_vfs(adapter);
3548 } else { /* Link down */
3549 if (adapter->link_active == TRUE) {
3551 device_printf(dev, "Link is Down\n");
3552 iflib_link_state_change(ctx, LINK_STATE_DOWN, 0);
3553 adapter->link_active = FALSE;
3554 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3555 ixgbe_ping_all_vfs(adapter);
3559 /* Handle task requests from msix_link() */
3560 if (adapter->task_requests & IXGBE_REQUEST_TASK_MOD)
3561 ixgbe_handle_mod(ctx);
3562 if (adapter->task_requests & IXGBE_REQUEST_TASK_MSF)
3563 ixgbe_handle_msf(ctx);
3564 if (adapter->task_requests & IXGBE_REQUEST_TASK_MBX)
3565 ixgbe_handle_mbx(ctx);
3566 if (adapter->task_requests & IXGBE_REQUEST_TASK_FDIR)
3567 ixgbe_reinit_fdir(ctx);
3568 if (adapter->task_requests & IXGBE_REQUEST_TASK_PHY)
3569 ixgbe_handle_phy(ctx);
3570 adapter->task_requests = 0;
3572 ixgbe_update_stats_counters(adapter);
3573 } /* ixgbe_if_update_admin_status */
3575 /************************************************************************
3576 * ixgbe_config_dmac - Configure DMA Coalescing
3577 ************************************************************************/
3579 ixgbe_config_dmac(struct adapter *adapter)
3581 struct ixgbe_hw *hw = &adapter->hw;
3582 struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
3584 if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
3587 if (dcfg->watchdog_timer ^ adapter->dmac ||
3588 dcfg->link_speed ^ adapter->link_speed) {
3589 dcfg->watchdog_timer = adapter->dmac;
3590 dcfg->fcoe_en = FALSE;
3591 dcfg->link_speed = adapter->link_speed;
3594 INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
3595 dcfg->watchdog_timer, dcfg->link_speed);
3597 hw->mac.ops.dmac_config(hw);
3599 } /* ixgbe_config_dmac */
3601 /************************************************************************
3602 * ixgbe_if_enable_intr
3603 ************************************************************************/
3605 ixgbe_if_enable_intr(if_ctx_t ctx)
3607 struct adapter *adapter = iflib_get_softc(ctx);
3608 struct ixgbe_hw *hw = &adapter->hw;
3609 struct ix_rx_queue *que = adapter->rx_queues;
3612 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3614 switch (adapter->hw.mac.type) {
3615 case ixgbe_mac_82599EB:
3616 mask |= IXGBE_EIMS_ECC;
3617 /* Temperature sensor on some adapters */
3618 mask |= IXGBE_EIMS_GPI_SDP0;
3619 /* SFP+ (RX_LOS_N & MOD_ABS_N) */
3620 mask |= IXGBE_EIMS_GPI_SDP1;
3621 mask |= IXGBE_EIMS_GPI_SDP2;
3623 case ixgbe_mac_X540:
3624 /* Detect if Thermal Sensor is enabled */
3625 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
3626 if (fwsm & IXGBE_FWSM_TS_ENABLED)
3627 mask |= IXGBE_EIMS_TS;
3628 mask |= IXGBE_EIMS_ECC;
3630 case ixgbe_mac_X550:
3631 /* MAC thermal sensor is automatically enabled */
3632 mask |= IXGBE_EIMS_TS;
3633 mask |= IXGBE_EIMS_ECC;
3635 case ixgbe_mac_X550EM_x:
3636 case ixgbe_mac_X550EM_a:
3637 /* Some devices use SDP0 for important information */
3638 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
3639 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
3640 hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
3641 hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
3642 mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
3643 if (hw->phy.type == ixgbe_phy_x550em_ext_t)
3644 mask |= IXGBE_EICR_GPI_SDP0_X540;
3645 mask |= IXGBE_EIMS_ECC;
3651 /* Enable Fan Failure detection */
3652 if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
3653 mask |= IXGBE_EIMS_GPI_SDP1;
3655 if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
3656 mask |= IXGBE_EIMS_MAILBOX;
3657 /* Enable Flow Director */
3658 if (adapter->feat_en & IXGBE_FEATURE_FDIR)
3659 mask |= IXGBE_EIMS_FLOW_DIR;
3661 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3663 /* With MSI-X we use auto clear */
3664 if (adapter->intr_type == IFLIB_INTR_MSIX) {
3665 mask = IXGBE_EIMS_ENABLE_MASK;
3666 /* Don't autoclear Link */
3667 mask &= ~IXGBE_EIMS_OTHER;
3668 mask &= ~IXGBE_EIMS_LSC;
3669 if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
3670 mask &= ~IXGBE_EIMS_MAILBOX;
3671 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
3675 * Now enable all queues, this is done separately to
3676 * allow for handling the extended (beyond 32) MSI-X
3677 * vectors that can be used by 82599
3679 for (int i = 0; i < adapter->num_rx_queues; i++, que++)
3680 ixgbe_enable_queue(adapter, que->msix);
3682 IXGBE_WRITE_FLUSH(hw);
3684 } /* ixgbe_if_enable_intr */
3686 /************************************************************************
3687 * ixgbe_disable_intr
3688 ************************************************************************/
3690 ixgbe_if_disable_intr(if_ctx_t ctx)
3692 struct adapter *adapter = iflib_get_softc(ctx);
3694 if (adapter->intr_type == IFLIB_INTR_MSIX)
3695 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
3696 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
3697 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
3699 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
3700 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
3701 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
3703 IXGBE_WRITE_FLUSH(&adapter->hw);
3705 } /* ixgbe_if_disable_intr */
3707 /************************************************************************
3708 * ixgbe_link_intr_enable
3709 ************************************************************************/
3711 ixgbe_link_intr_enable(if_ctx_t ctx)
3713 struct ixgbe_hw *hw = &((struct adapter *)iflib_get_softc(ctx))->hw;
3715 /* Re-enable other interrupts */
3716 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
3717 } /* ixgbe_link_intr_enable */
3719 /************************************************************************
3720 * ixgbe_if_rx_queue_intr_enable
3721 ************************************************************************/
3723 ixgbe_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
3725 struct adapter *adapter = iflib_get_softc(ctx);
3726 struct ix_rx_queue *que = &adapter->rx_queues[rxqid];
3728 ixgbe_enable_queue(adapter, que->msix);
3731 } /* ixgbe_if_rx_queue_intr_enable */
3733 /************************************************************************
3734 * ixgbe_enable_queue
3735 ************************************************************************/
3737 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
3739 struct ixgbe_hw *hw = &adapter->hw;
3740 u64 queue = 1ULL << vector;
3743 if (hw->mac.type == ixgbe_mac_82598EB) {
3744 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3745 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
3747 mask = (queue & 0xFFFFFFFF);
3749 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
3750 mask = (queue >> 32);
3752 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
3754 } /* ixgbe_enable_queue */
3756 /************************************************************************
3757 * ixgbe_disable_queue
3758 ************************************************************************/
3760 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
3762 struct ixgbe_hw *hw = &adapter->hw;
3763 u64 queue = 1ULL << vector;
3766 if (hw->mac.type == ixgbe_mac_82598EB) {
3767 mask = (IXGBE_EIMS_RTX_QUEUE & queue);
3768 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
3770 mask = (queue & 0xFFFFFFFF);
3772 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
3773 mask = (queue >> 32);
3775 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
3777 } /* ixgbe_disable_queue */
3779 /************************************************************************
3780 * ixgbe_intr - Legacy Interrupt Service Routine
3781 ************************************************************************/
3783 ixgbe_intr(void *arg)
3785 struct adapter *adapter = arg;
3786 struct ix_rx_queue *que = adapter->rx_queues;
3787 struct ixgbe_hw *hw = &adapter->hw;
3788 if_ctx_t ctx = adapter->ctx;
3789 u32 eicr, eicr_mask;
3791 eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
3795 ixgbe_if_enable_intr(ctx);
3796 return (FILTER_HANDLED);
3799 /* Check for fan failure */
3800 if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
3801 (eicr & IXGBE_EICR_GPI_SDP1)) {
3802 device_printf(adapter->dev,
3803 "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
3804 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3807 /* Link status change */
3808 if (eicr & IXGBE_EICR_LSC) {
3809 IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
3810 iflib_admin_intr_deferred(ctx);
3813 if (ixgbe_is_sfp(hw)) {
3814 /* Pluggable optics-related interrupt */
3815 if (hw->mac.type >= ixgbe_mac_X540)
3816 eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
3818 eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
3820 if (eicr & eicr_mask) {
3821 IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
3822 adapter->task_requests |= IXGBE_REQUEST_TASK_MOD;
3825 if ((hw->mac.type == ixgbe_mac_82599EB) &&
3826 (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
3827 IXGBE_WRITE_REG(hw, IXGBE_EICR,
3828 IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3829 adapter->task_requests |= IXGBE_REQUEST_TASK_MSF;
3833 /* External PHY interrupt */
3834 if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
3835 (eicr & IXGBE_EICR_GPI_SDP0_X540))
3836 adapter->task_requests |= IXGBE_REQUEST_TASK_PHY;
3838 return (FILTER_SCHEDULE_THREAD);
3841 /************************************************************************
3842 * ixgbe_free_pci_resources
3843 ************************************************************************/
3845 ixgbe_free_pci_resources(if_ctx_t ctx)
3847 struct adapter *adapter = iflib_get_softc(ctx);
3848 struct ix_rx_queue *que = adapter->rx_queues;
3849 device_t dev = iflib_get_dev(ctx);
3851 /* Release all MSI-X queue resources */
3852 if (adapter->intr_type == IFLIB_INTR_MSIX)
3853 iflib_irq_free(ctx, &adapter->irq);
3856 for (int i = 0; i < adapter->num_rx_queues; i++, que++) {
3857 iflib_irq_free(ctx, &que->que_irq);
3861 if (adapter->pci_mem != NULL)
3862 bus_release_resource(dev, SYS_RES_MEMORY,
3863 rman_get_rid(adapter->pci_mem), adapter->pci_mem);
3864 } /* ixgbe_free_pci_resources */
3866 /************************************************************************
3867 * ixgbe_sysctl_flowcntl
3869 * SYSCTL wrapper around setting Flow Control
3870 ************************************************************************/
3872 ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS)
3874 struct adapter *adapter;
3877 adapter = (struct adapter *)arg1;
3878 fc = adapter->hw.fc.current_mode;
3880 error = sysctl_handle_int(oidp, &fc, 0, req);
3881 if ((error) || (req->newptr == NULL))
3884 /* Don't bother if it's not changed */
3885 if (fc == adapter->hw.fc.current_mode)
3888 return ixgbe_set_flowcntl(adapter, fc);
3889 } /* ixgbe_sysctl_flowcntl */
3891 /************************************************************************
3892 * ixgbe_set_flowcntl - Set flow control
3894 * Flow control values:
3899 ************************************************************************/
3901 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
3904 case ixgbe_fc_rx_pause:
3905 case ixgbe_fc_tx_pause:
3907 adapter->hw.fc.requested_mode = fc;
3908 if (adapter->num_rx_queues > 1)
3909 ixgbe_disable_rx_drop(adapter);
3912 adapter->hw.fc.requested_mode = ixgbe_fc_none;
3913 if (adapter->num_rx_queues > 1)
3914 ixgbe_enable_rx_drop(adapter);
3920 /* Don't autoneg if forcing a value */
3921 adapter->hw.fc.disable_fc_autoneg = TRUE;
3922 ixgbe_fc_enable(&adapter->hw);
3925 } /* ixgbe_set_flowcntl */
3927 /************************************************************************
3928 * ixgbe_enable_rx_drop
3930 * Enable the hardware to drop packets when the buffer is
3931 * full. This is useful with multiqueue, so that no single
3932 * queue being full stalls the entire RX engine. We only
3933 * enable this when Multiqueue is enabled AND Flow Control
3935 ************************************************************************/
3937 ixgbe_enable_rx_drop(struct adapter *adapter)
3939 struct ixgbe_hw *hw = &adapter->hw;
3940 struct rx_ring *rxr;
3943 for (int i = 0; i < adapter->num_rx_queues; i++) {
3944 rxr = &adapter->rx_queues[i].rxr;
3945 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
3946 srrctl |= IXGBE_SRRCTL_DROP_EN;
3947 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
3950 /* enable drop for each vf */
3951 for (int i = 0; i < adapter->num_vfs; i++) {
3952 IXGBE_WRITE_REG(hw, IXGBE_QDE,
3953 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
3956 } /* ixgbe_enable_rx_drop */
3958 /************************************************************************
3959 * ixgbe_disable_rx_drop
3960 ************************************************************************/
3962 ixgbe_disable_rx_drop(struct adapter *adapter)
3964 struct ixgbe_hw *hw = &adapter->hw;
3965 struct rx_ring *rxr;
3968 for (int i = 0; i < adapter->num_rx_queues; i++) {
3969 rxr = &adapter->rx_queues[i].rxr;
3970 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
3971 srrctl &= ~IXGBE_SRRCTL_DROP_EN;
3972 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
3975 /* disable drop for each vf */
3976 for (int i = 0; i < adapter->num_vfs; i++) {
3977 IXGBE_WRITE_REG(hw, IXGBE_QDE,
3978 (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
3980 } /* ixgbe_disable_rx_drop */
3982 /************************************************************************
3983 * ixgbe_sysctl_advertise
3985 * SYSCTL wrapper around setting advertised speed
3986 ************************************************************************/
3988 ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS)
3990 struct adapter *adapter;
3991 int error, advertise;
3993 adapter = (struct adapter *)arg1;
3994 advertise = adapter->advertise;
3996 error = sysctl_handle_int(oidp, &advertise, 0, req);
3997 if ((error) || (req->newptr == NULL))
4000 return ixgbe_set_advertise(adapter, advertise);
4001 } /* ixgbe_sysctl_advertise */
4003 /************************************************************************
4004 * ixgbe_set_advertise - Control advertised link speed
4007 * 0x1 - advertise 100 Mb
4008 * 0x2 - advertise 1G
4009 * 0x4 - advertise 10G
4010 * 0x8 - advertise 10 Mb (yes, Mb)
4011 ************************************************************************/
4013 ixgbe_set_advertise(struct adapter *adapter, int advertise)
4015 device_t dev = iflib_get_dev(adapter->ctx);
4016 struct ixgbe_hw *hw;
4017 ixgbe_link_speed speed = 0;
4018 ixgbe_link_speed link_caps = 0;
4019 s32 err = IXGBE_NOT_IMPLEMENTED;
4020 bool negotiate = FALSE;
4022 /* Checks to validate new value */
4023 if (adapter->advertise == advertise) /* no change */
4028 /* No speed changes for backplane media */
4029 if (hw->phy.media_type == ixgbe_media_type_backplane)
4032 if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
4033 (hw->phy.multispeed_fiber))) {
4034 device_printf(dev, "Advertised speed can only be set on copper or multispeed fiber media types.\n");
4038 if (advertise < 0x1 || advertise > 0xF) {
4039 device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0xF\n");
4043 if (hw->mac.ops.get_link_capabilities) {
4044 err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
4046 if (err != IXGBE_SUCCESS) {
4047 device_printf(dev, "Unable to determine supported advertise speeds\n");
4052 /* Set new value and report new advertised mode */
4053 if (advertise & 0x1) {
4054 if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
4055 device_printf(dev, "Interface does not support 100Mb advertised speed\n");
4058 speed |= IXGBE_LINK_SPEED_100_FULL;
4060 if (advertise & 0x2) {
4061 if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
4062 device_printf(dev, "Interface does not support 1Gb advertised speed\n");
4065 speed |= IXGBE_LINK_SPEED_1GB_FULL;
4067 if (advertise & 0x4) {
4068 if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
4069 device_printf(dev, "Interface does not support 10Gb advertised speed\n");
4072 speed |= IXGBE_LINK_SPEED_10GB_FULL;
4074 if (advertise & 0x8) {
4075 if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
4076 device_printf(dev, "Interface does not support 10Mb advertised speed\n");
4079 speed |= IXGBE_LINK_SPEED_10_FULL;
4082 hw->mac.autotry_restart = TRUE;
4083 hw->mac.ops.setup_link(hw, speed, TRUE);
4084 adapter->advertise = advertise;
4087 } /* ixgbe_set_advertise */
4089 /************************************************************************
4090 * ixgbe_get_advertise - Get current advertised speed settings
4092 * Formatted for sysctl usage.
4094 * 0x1 - advertise 100 Mb
4095 * 0x2 - advertise 1G
4096 * 0x4 - advertise 10G
4097 * 0x8 - advertise 10 Mb (yes, Mb)
4098 ************************************************************************/
4100 ixgbe_get_advertise(struct adapter *adapter)
4102 struct ixgbe_hw *hw = &adapter->hw;
4104 ixgbe_link_speed link_caps = 0;
4106 bool negotiate = FALSE;
4109 * Advertised speed means nothing unless it's copper or
4112 if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
4113 !(hw->phy.multispeed_fiber))
4116 err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
4117 if (err != IXGBE_SUCCESS)
4121 ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) |
4122 ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) |
4123 ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) |
4124 ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0);
4127 } /* ixgbe_get_advertise */
4129 /************************************************************************
4130 * ixgbe_sysctl_dmac - Manage DMA Coalescing
4133 * 0/1 - off / on (use default value of 1000)
4135 * Legal timer values are:
4136 * 50,100,250,500,1000,2000,5000,10000
4138 * Turning off interrupt moderation will also turn this off.
4139 ************************************************************************/
4141 ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
4143 struct adapter *adapter = (struct adapter *)arg1;
4144 struct ifnet *ifp = iflib_get_ifp(adapter->ctx);
4148 newval = adapter->dmac;
4149 error = sysctl_handle_16(oidp, &newval, 0, req);
4150 if ((error) || (req->newptr == NULL))
4159 /* Enable and use default */
4160 adapter->dmac = 1000;
4170 /* Legal values - allow */
4171 adapter->dmac = newval;
4174 /* Do nothing, illegal value */
4178 /* Re-initialize hardware if it's already running */
4179 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4183 } /* ixgbe_sysctl_dmac */
4186 /************************************************************************
4187 * ixgbe_sysctl_power_state
4189 * Sysctl to test power states
4191 * 0 - set device to D0
4192 * 3 - set device to D3
4193 * (none) - get current device power state
4194 ************************************************************************/
4196 ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS)
4198 struct adapter *adapter = (struct adapter *)arg1;
4199 device_t dev = adapter->dev;
4200 int curr_ps, new_ps, error = 0;
4202 curr_ps = new_ps = pci_get_powerstate(dev);
4204 error = sysctl_handle_int(oidp, &new_ps, 0, req);
4205 if ((error) || (req->newptr == NULL))
4208 if (new_ps == curr_ps)
4211 if (new_ps == 3 && curr_ps == 0)
4212 error = DEVICE_SUSPEND(dev);
4213 else if (new_ps == 0 && curr_ps == 3)
4214 error = DEVICE_RESUME(dev);
4218 device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
4221 } /* ixgbe_sysctl_power_state */
4224 /************************************************************************
4225 * ixgbe_sysctl_wol_enable
4227 * Sysctl to enable/disable the WoL capability,
4228 * if supported by the adapter.
4233 ************************************************************************/
4235 ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
4237 struct adapter *adapter = (struct adapter *)arg1;
4238 struct ixgbe_hw *hw = &adapter->hw;
4239 int new_wol_enabled;
4242 new_wol_enabled = hw->wol_enabled;
4243 error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
4244 if ((error) || (req->newptr == NULL))
4246 new_wol_enabled = !!(new_wol_enabled);
4247 if (new_wol_enabled == hw->wol_enabled)
4250 if (new_wol_enabled > 0 && !adapter->wol_support)
4253 hw->wol_enabled = new_wol_enabled;
4256 } /* ixgbe_sysctl_wol_enable */
4258 /************************************************************************
4259 * ixgbe_sysctl_wufc - Wake Up Filter Control
4261 * Sysctl to enable/disable the types of packets that the
4262 * adapter will wake up on upon receipt.
4264 * 0x1 - Link Status Change
4265 * 0x2 - Magic Packet
4266 * 0x4 - Direct Exact
4267 * 0x8 - Directed Multicast
4269 * 0x20 - ARP/IPv4 Request Packet
4270 * 0x40 - Direct IPv4 Packet
4271 * 0x80 - Direct IPv6 Packet
4273 * Settings not listed above will cause the sysctl to return an error.
4274 ************************************************************************/
4276 ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
4278 struct adapter *adapter = (struct adapter *)arg1;
4282 new_wufc = adapter->wufc;
4284 error = sysctl_handle_32(oidp, &new_wufc, 0, req);
4285 if ((error) || (req->newptr == NULL))
4287 if (new_wufc == adapter->wufc)
4290 if (new_wufc & 0xffffff00)
4294 new_wufc |= (0xffffff & adapter->wufc);
4295 adapter->wufc = new_wufc;
4298 } /* ixgbe_sysctl_wufc */
4301 /************************************************************************
4302 * ixgbe_sysctl_print_rss_config
4303 ************************************************************************/
4305 ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS)
4307 struct adapter *adapter = (struct adapter *)arg1;
4308 struct ixgbe_hw *hw = &adapter->hw;
4309 device_t dev = adapter->dev;
4311 int error = 0, reta_size;
4314 buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4316 device_printf(dev, "Could not allocate sbuf for output.\n");
4320 // TODO: use sbufs to make a string to print out
4321 /* Set multiplier for RETA setup and table size based on MAC */
4322 switch (adapter->hw.mac.type) {
4323 case ixgbe_mac_X550:
4324 case ixgbe_mac_X550EM_x:
4325 case ixgbe_mac_X550EM_a:
4333 /* Print out the redirection table */
4334 sbuf_cat(buf, "\n");
4335 for (int i = 0; i < reta_size; i++) {
4337 reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
4338 sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
4340 reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
4341 sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
4345 // TODO: print more config
4347 error = sbuf_finish(buf);
4349 device_printf(dev, "Error finishing sbuf: %d\n", error);
4354 } /* ixgbe_sysctl_print_rss_config */
4355 #endif /* IXGBE_DEBUG */
4357 /************************************************************************
4358 * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
4360 * For X552/X557-AT devices using an external PHY
4361 ************************************************************************/
4363 ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
4365 struct adapter *adapter = (struct adapter *)arg1;
4366 struct ixgbe_hw *hw = &adapter->hw;
4369 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4370 device_printf(iflib_get_dev(adapter->ctx),
4371 "Device has no supported external thermal sensor.\n");
4375 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
4376 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
4377 device_printf(iflib_get_dev(adapter->ctx),
4378 "Error reading from PHY's current temperature register\n");
4382 /* Shift temp for output */
4385 return (sysctl_handle_16(oidp, NULL, reg, req));
4386 } /* ixgbe_sysctl_phy_temp */
4388 /************************************************************************
4389 * ixgbe_sysctl_phy_overtemp_occurred
4391 * Reports (directly from the PHY) whether the current PHY
4392 * temperature is over the overtemp threshold.
4393 ************************************************************************/
4395 ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
4397 struct adapter *adapter = (struct adapter *)arg1;
4398 struct ixgbe_hw *hw = &adapter->hw;
4401 if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
4402 device_printf(iflib_get_dev(adapter->ctx),
4403 "Device has no supported external thermal sensor.\n");
4407 if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
4408 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, ®)) {
4409 device_printf(iflib_get_dev(adapter->ctx),
4410 "Error reading from PHY's temperature status register\n");
4414 /* Get occurrence bit */
4415 reg = !!(reg & 0x4000);
4417 return (sysctl_handle_16(oidp, 0, reg, req));
4418 } /* ixgbe_sysctl_phy_overtemp_occurred */
4420 /************************************************************************
4421 * ixgbe_sysctl_eee_state
4423 * Sysctl to set EEE power saving feature
4427 * (none) - get current device EEE state
4428 ************************************************************************/
4430 ixgbe_sysctl_eee_state(SYSCTL_HANDLER_ARGS)
4432 struct adapter *adapter = (struct adapter *)arg1;
4433 device_t dev = adapter->dev;
4434 struct ifnet *ifp = iflib_get_ifp(adapter->ctx);
4435 int curr_eee, new_eee, error = 0;
4438 curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
4440 error = sysctl_handle_int(oidp, &new_eee, 0, req);
4441 if ((error) || (req->newptr == NULL))
4445 if (new_eee == curr_eee)
4449 if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
4452 /* Bounds checking */
4453 if ((new_eee < 0) || (new_eee > 1))
4456 retval = ixgbe_setup_eee(&adapter->hw, new_eee);
4458 device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
4462 /* Restart auto-neg */
4465 device_printf(dev, "New EEE state: %d\n", new_eee);
4467 /* Cache new value */
4469 adapter->feat_en |= IXGBE_FEATURE_EEE;
4471 adapter->feat_en &= ~IXGBE_FEATURE_EEE;
4474 } /* ixgbe_sysctl_eee_state */
4476 /************************************************************************
4477 * ixgbe_init_device_features
4478 ************************************************************************/
4480 ixgbe_init_device_features(struct adapter *adapter)
4482 adapter->feat_cap = IXGBE_FEATURE_NETMAP
4485 | IXGBE_FEATURE_MSIX
4486 | IXGBE_FEATURE_LEGACY_IRQ;
4488 /* Set capabilities first... */
4489 switch (adapter->hw.mac.type) {
4490 case ixgbe_mac_82598EB:
4491 if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
4492 adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
4494 case ixgbe_mac_X540:
4495 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4496 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4497 if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
4498 (adapter->hw.bus.func == 0))
4499 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
4501 case ixgbe_mac_X550:
4502 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4503 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4504 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4506 case ixgbe_mac_X550EM_x:
4507 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4508 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4510 case ixgbe_mac_X550EM_a:
4511 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4512 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4513 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4514 if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
4515 (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
4516 adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
4517 adapter->feat_cap |= IXGBE_FEATURE_EEE;
4520 case ixgbe_mac_82599EB:
4521 adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
4522 adapter->feat_cap |= IXGBE_FEATURE_FDIR;
4523 if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
4524 (adapter->hw.bus.func == 0))
4525 adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
4526 if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
4527 adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
4533 /* Enabled by default... */
4534 /* Fan failure detection */
4535 if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
4536 adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
4538 if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
4539 adapter->feat_en |= IXGBE_FEATURE_NETMAP;
4541 if (adapter->feat_cap & IXGBE_FEATURE_EEE)
4542 adapter->feat_en |= IXGBE_FEATURE_EEE;
4543 /* Thermal Sensor */
4544 if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
4545 adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
4547 /* Enabled via global sysctl... */
4549 if (ixgbe_enable_fdir) {
4550 if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
4551 adapter->feat_en |= IXGBE_FEATURE_FDIR;
4553 device_printf(adapter->dev, "Device does not support Flow Director. Leaving disabled.");
4556 * Message Signal Interrupts - Extended (MSI-X)
4557 * Normal MSI is only enabled if MSI-X calls fail.
4559 if (!ixgbe_enable_msix)
4560 adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
4561 /* Receive-Side Scaling (RSS) */
4562 if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
4563 adapter->feat_en |= IXGBE_FEATURE_RSS;
4565 /* Disable features with unmet dependencies... */
4567 if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
4568 adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
4569 adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
4570 adapter->feat_en &= ~IXGBE_FEATURE_RSS;
4571 adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
4573 } /* ixgbe_init_device_features */
4575 /************************************************************************
4576 * ixgbe_check_fan_failure
4577 ************************************************************************/
4579 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
4583 mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
4587 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
4588 } /* ixgbe_check_fan_failure */